diff --git a/docs/compiler.md b/docs/compiler.md
index 7141ee8638..ecbc4eb750 100644
--- a/docs/compiler.md
+++ b/docs/compiler.md
@@ -107,19 +107,20 @@ puyapy [-h] [--version] [-O {0,1,2}]
### Options
| Option | Description | Default |
-|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------------------- |
+|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
| `-h`, `--help` | Show the help message and exit | N/A |
| `--version` | Show program's version number and exit | N/A |
| `-O {0,1,2}`
`--optimization-level {0,1,2}` | Set optimization level of output TEAL / AVM bytecode | `1` |
| `--output-teal`, `--no-output-teal` | Output TEAL | `True` |
| `--output-arc32`, `--no-output-arc32` | Output {contract}.arc32.json ARC-32 app spec file if the contract is an ARC-4 contract | `True` |
+| `--output-arc56`, `--no-output-arc56` | Output {contract}.arc56.json ARC-56 app spec file if the contract is an ARC-4 contract | `False` |
| `--output-client`, `--no-output-client` | Output Algorand Python contract client for typed ARC4 ABI calls | `False` |
| `--output-bytecode`, `--no-output-bytecode` | Output AVM bytecode | `False` |
| `--out-dir OUT_DIR` | The path for outputting artefacts | Same folder as contract |
| `--log-level {notset,debug,info,warning,error,critical}` | Minimum level to log to console | `info` |
| `-g {0,1,2}`, `--debug-level {0,1,2}` | Output debug information level
`0` = No debug annotations
`1` = Output debug annotations
`2` = Reserved for future use, currently the same as `1` | `1` |
-| `--template-var` | Allows specifying template values. Can be used multiple times, see below for examples | N/A |
-| `--template-vars-prefix` | Prefix to use for template variables | "TMPL_" |
+| `--template-var` | Allows specifying template values. Can be used multiple times, see below for examples | N/A |
+| `--template-vars-prefix` | Prefix to use for template variables | "TMPL_" |
### Defining template values
diff --git a/docs/lg-arc4.md b/docs/lg-arc4.md
index a51377fea6..84c66e268d 100644
--- a/docs/lg-arc4.md
+++ b/docs/lg-arc4.md
@@ -11,12 +11,12 @@ class HelloWorldContract(ARC4Contract):
...
```
-## ARC-32
+## ARC-32 and ARC-56
[ARC32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) extends the concepts in ARC4 to include an Application Specification which more holistically describes a smart contract and its associated state.
-ARC32 Application Specification files are automatically generated by the compiler for ARC4
-contracts as `.arc32.json`
+ARC-32/ARC-56 Application Specification files are automatically generated by the compiler for ARC4
+contracts as `.arc32.json` or `.arc56.json`
## Methods
@@ -24,6 +24,8 @@ Individual methods on a smart contract should be annotated with an `abimethod` d
A method that should not be externally available should be annotated with a `subroutine` decorator.
+Method docstrings will be used when outputting ARC-32 or ARC-56 application specifications, the following docstrings styles are supported ReST, Google, Numpydoc-style and Epydoc.
+
```python
from algopy import ARC4Contract, subroutine, arc4
diff --git a/examples/amm/out/ConstantProductAMM.approval.mir b/examples/amm/out/ConstantProductAMM.approval.mir
index f64ab37889..5fe5a4979a 100644
--- a/examples/amm/out/ConstantProductAMM.approval.mir
+++ b/examples/amm/out/ConstantProductAMM.approval.mir
@@ -82,9 +82,9 @@ __puya_arc4_router___set_governor_route@2:
// @arc4.abimethod()
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -101,9 +101,9 @@ __puya_arc4_router___bootstrap_route@3:
// @arc4.abimethod()
txn OnCompletion tmp%10#0
! tmp%11#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%12#0
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex tmp%14#0
@@ -145,9 +145,9 @@ __puya_arc4_router___mint_route@4:
// )
txn OnCompletion tmp%22#0
! tmp%23#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%24#0
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex tmp%26#0
@@ -203,9 +203,9 @@ __puya_arc4_router___burn_route@5:
// )
txn OnCompletion tmp%37#0
! tmp%38#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%39#0
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex tmp%41#0
@@ -251,9 +251,9 @@ __puya_arc4_router___swap_route@6:
// )
txn OnCompletion tmp%51#0
! tmp%52#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%53#0
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex tmp%55#0
@@ -294,7 +294,7 @@ __puya_arc4_router___bare_routing@9:
__puya_arc4_router_____algopy_default_create@10:
txn ApplicationID tmp%63#0
! tmp%64#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/examples/amm/out/ConstantProductAMM.approval.teal b/examples/amm/out/ConstantProductAMM.approval.teal
index c13c3edde7..bce9b102c8 100644
--- a/examples/amm/out/ConstantProductAMM.approval.teal
+++ b/examples/amm/out/ConstantProductAMM.approval.teal
@@ -68,9 +68,9 @@ __puya_arc4_router___set_governor_route@2:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txna ApplicationArgs 1
@@ -87,9 +87,9 @@ __puya_arc4_router___bootstrap_route@3:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex
@@ -128,9 +128,9 @@ __puya_arc4_router___mint_route@4:
// )
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex
@@ -181,9 +181,9 @@ __puya_arc4_router___burn_route@5:
// )
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex
@@ -225,9 +225,9 @@ __puya_arc4_router___swap_route@6:
// )
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex
@@ -262,7 +262,7 @@ __puya_arc4_router___bare_routing@9:
bnz __puya_arc4_router___after_if_else@13
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/examples/amm/out/ConstantProductAMM.arc32.json b/examples/amm/out/ConstantProductAMM.arc32.json
index a4b753ad08..576d8bd863 100644
--- a/examples/amm/out/ConstantProductAMM.arc32.json
+++ b/examples/amm/out/ConstantProductAMM.arc32.json
@@ -65,7 +65,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAgNCAxMDAwMDAwMDAwMAogICAgYnl0ZWNibG9jayAiYXNzZXRfYSIgImFzc2V0X2IiICJwb29sX3Rva2VuIiAiZ292ZXJub3IiICJyYXRpbyIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBBCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBBc3NldCgpCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEIKICAgIC8vIHNlbGYuYXNzZXRfYiA9IEFzc2V0KCkKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBUaGUgY3VycmVudCBnb3Zlcm5vciBvZiB0aGlzIGNvbnRyYWN0LCBhbGxvd2VkIHRvIGRvIGFkbWluIHR5cGUgYWN0aW9ucwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozOC0zOQogICAgLy8gIyBUaGUgYXNzZXQgaWQgb2YgdGhlIFBvb2wgVG9rZW4sIHVzZWQgdG8gdHJhY2sgc2hhcmUgb2YgcG9vbCB0aGUgaG9sZGVyIG1heSByZWNvdmVyCiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBBc3NldCgpCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDAtNDEKICAgIC8vICMgVGhlIHJhdGlvIGJldHdlZW4gYXNzZXRzIChBKlNjYWxlL0IpCiAgICAvLyBzZWxmLnJhdGlvID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHgwOGE5NTZmNyAweDZiNTlkOTY1IDB4NWNiZjFlMmQgMHgxNDM2YzJhYyAweDRhODhlMDU1IC8vIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiLCBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfZ292ZXJub3Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fYnVybl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N3YXBfcm91dGVANgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2dvdmVybm9yX3JvdXRlQDI6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIGFtbS9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2dvdmVybm9yCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMzoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6ODEtODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBtaW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idXJuX3JvdXRlQDU6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIGNhbGxzdWIgYnVybgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc3dhcF9yb3V0ZUA2OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDk6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc2V0X2dvdmVybm9yKG5ld19nb3Zlcm5vcjogYnl0ZXMpIC0+IHZvaWQ6CnNldF9nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzZXRfZ292ZXJub3Ioc2VsZiwgbmV3X2dvdmVybm9yOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDYKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDcKICAgIC8vIHNlbGYuZ292ZXJub3IgPSBuZXdfZ292ZXJub3IKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfaXNfZ292ZXJub3IoKSAtPiB2b2lkOgpfY2hlY2tfaXNfZ292ZXJub3I6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYyLTI2MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfaXNfZ292ZXJub3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLmdvdmVybm9yCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ292ZXJub3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ292ZXJub3IgZXhpc3RzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLmdvdmVybm9yCiAgICAvLyApLCAiT25seSB0aGUgYWNjb3VudCBzZXQgaW4gZ2xvYmFsX3N0YXRlLmdvdmVybm9yIG1heSBjYWxsIHRoaXMgbWV0aG9kIgogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIGFjY291bnQgc2V0IGluIGdsb2JhbF9zdGF0ZS5nb3Zlcm5vciBtYXkgY2FsbCB0aGlzIG1ldGhvZAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5ib290c3RyYXAoc2VlZDogdWludDY0LCBhX2Fzc2V0OiB1aW50NjQsIGJfYXNzZXQ6IHVpbnQ2NCkgLT4gdWludDY0Ogpib290c3RyYXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDktNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYm9vdHN0cmFwKHNlbGYsIHNlZWQ6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLCBhX2Fzc2V0OiBBc3NldCwgYl9hc3NldDogQXNzZXQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYucG9vbF90b2tlbiwgImFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGJvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLl9jaGVja19pc19nb3Zlcm5vcigpCiAgICBjYWxsc3ViIF9jaGVja19pc19nb3Zlcm5vcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBhc3NlcnQgR2xvYmFsLmdyb3VwX3NpemUgPT0gMiwgImdyb3VwIHNpemUgbm90IDIiCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBncm91cCBzaXplIG5vdCAyCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBzZWVkLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weTo3MQogICAgLy8gYXNzZXJ0IHNlZWQuYW1vdW50ID49IDMwMF8wMDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IiAgIyAwLjMgQWxnb3MKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDMwMDAwMCAvLyAzMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhc3NlcnQgYV9hc3NldC5pZCA8IGJfYXNzZXQuaWQsICJhc3NldCBhIG11c3QgYmUgbGVzcyB0aGFuIGFzc2V0IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYXNzZXJ0IC8vIGFzc2V0IGEgbXVzdCBiZSBsZXNzIHRoYW4gYXNzZXQgYgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBhX2Fzc2V0CiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBzZWxmLmFzc2V0X2IgPSBiX2Fzc2V0CiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBzZWxmLl9jcmVhdGVfcG9vbF90b2tlbigpCiAgICBjYWxsc3ViIF9jcmVhdGVfcG9vbF90b2tlbgogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzcKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2EpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgY2FsbHN1YiBfZG9fb3B0X2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzgKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgY2FsbHN1YiBfZG9fb3B0X2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzkKICAgIC8vIHJldHVybiBzZWxmLnBvb2xfdG9rZW4uaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jcmVhdGVfcG9vbF90b2tlbigpIC0+IHVpbnQ2NDoKX2NyZWF0ZV9wb29sX3Rva2VuOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2OC0yNjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NyZWF0ZV9wb29sX3Rva2VuKHNlbGYpIC0+IEFzc2V0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxLTI3OQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcyCiAgICAvLyBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBwdXNoYnl0ZXMgMHg0NDUwNTQyZAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgyZAogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzYKICAgIC8vIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc3CiAgICAvLyByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gZGVjaW1hbHM9MywKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzQKICAgIC8vIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjczCiAgICAvLyB1bml0X25hbWU9YiJkYnQiLAogICAgcHVzaGJ5dGVzIDB4NjQ2Mjc0CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MS0yNzkKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEtMjgwCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2Fzc2V0CiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcwLTI4MQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2Fzc2V0CiAgICAvLyApCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9kb19vcHRfaW4oYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2RvX29wdF9pbjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyODMtMjg0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9kb19vcHRfaW4oc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg2CiAgICAvLyByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToyODUtMjg5CiAgICAvLyBkb19hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0PWFzc2V0LAogICAgLy8gICAgIGFtb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGFtbS9jb250cmFjdC5weToyODgKICAgIC8vIGFtb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4NS0yODkKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5kb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcjogYnl0ZXMsIGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0KSAtPiB2b2lkOgpkb19hc3NldF90cmFuc2ZlcjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTYtMzU3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRvX2Fzc2V0X3RyYW5zZmVyKCosIHJlY2VpdmVyOiBBY2NvdW50LCBhc3NldDogQXNzZXQsIGFtb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzU4LTM2MgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzU4LTM2MgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLm1pbnQoYV94ZmVyOiB1aW50NjQsIGJfeGZlcjogdWludDY0LCBwb29sX2Fzc2V0OiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgptaW50OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIG1pbnQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIGJfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgcG9vbF9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYV9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYl9hc3NldDogQXNzZXQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA1IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTEKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIHdlbGwtZm9ybWVkIG1pbnQKICAgIC8vIGFzc2VydCBwb29sX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExNQogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCBhX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgYl94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gYV94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTIwLTEyMwogICAgLy8gIyB2YWxpZCBhc3NldCBhIHhmZXIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYV94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTI0CiAgICAvLyBhc3NlcnQgYV94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjUKICAgIC8vIGFzc2VydCBhX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTI5CiAgICAvLyBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxMjctMTMwCiAgICAvLyAjIHZhbGlkIGFzc2V0IGIgeGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzEKICAgIC8vIGFzc2VydCBiX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzUKICAgIC8vIHBvb2xfYmFsYW5jZT1zZWxmLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9wb29sX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzYKICAgIC8vIGFfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzcKICAgIC8vIGJfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzQtMTQwCiAgICAvLyB0b19taW50ID0gdG9rZW5zX3RvX21pbnQoCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCksCiAgICAvLyAgICAgYV9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICAvLyAgICAgYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICAvLyAgICAgYV9hbW91bnQ9YV94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICAgICBiX2Ftb3VudD1iX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgdG9rZW5zX3RvX21pbnQKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDEKICAgIC8vIGFzc2VydCB0b19taW50ID4gMCwgInNlbmQgYW1vdW50IHRvbyBsb3ciCiAgICBkdXAKICAgIGFzc2VydCAvLyBzZW5kIGFtb3VudCB0b28gbG93CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQzLTE0NAogICAgLy8gIyBtaW50IHRva2VucwogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5wb29sX3Rva2VuLCBhbW91bnQ9dG9fbWludCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDUKICAgIC8vIHNlbGYuX3VwZGF0ZV9yYXRpbygpCiAgICBjYWxsc3ViIF91cGRhdGVfcmF0aW8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2NoZWNrX2Jvb3RzdHJhcHBlZCgpIC0+IHZvaWQ6Cl9jaGVja19ib290c3RyYXBwZWQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjUxLTI1MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfYm9vdHN0cmFwcGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTMKICAgIC8vIGFzc2VydCBzZWxmLnBvb2xfdG9rZW4sICJib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBhc3NlcnQgLy8gYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9wb29sX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9wb29sX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjkzCiAgICAvLyByZXR1cm4gc2VsZi5wb29sX3Rva2VuLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X2FfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfYV9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2N1cnJlbnRfYV9iYWxhbmNlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfYS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9iX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X2JfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jdXJyZW50X2JfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X2IuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC50b2tlbnNfdG9fbWludChwb29sX2JhbGFuY2U6IHVpbnQ2NCwgYV9iYWxhbmNlOiB1aW50NjQsIGJfYmFsYW5jZTogdWludDY0LCBhX2Ftb3VudDogdWludDY0LCBiX2Ftb3VudDogdWludDY0KSAtPiB1aW50NjQ6CnRva2Vuc190b19taW50OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyMi0zMzAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdG9rZW5zX3RvX21pbnQoCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBwb29sX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBhX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBiX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBhX2Ftb3VudDogVUludDY0LAogICAgLy8gICAgIGJfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDUgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzEKICAgIC8vIGlzX2luaXRpYWxfbWludCA9IGFfYmFsYW5jZSA9PSBhX2Ftb3VudCBhbmQgYl9iYWxhbmNlID09IGJfYW1vdW50CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IHRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiB0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICBiIHRva2Vuc190b19taW50X2Jvb2xfbWVyZ2VANAoKdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKCnRva2Vuc190b19taW50X2Jvb2xfbWVyZ2VANDoKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzIKICAgIC8vIGlmIGlzX2luaXRpYWxfbWludDoKICAgIGJ6IHRva2Vuc190b19taW50X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMwogICAgLy8gcmV0dXJuIG9wLnNxcnQoYV9hbW91bnQgKiBiX2Ftb3VudCkgLSBTQ0FMRQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHNxcnQKICAgIGludGNfMiAvLyAxMDAwCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9rZW5zX3RvX21pbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlCiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtNQogICAgLQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNQogICAgLy8gYV9yYXRpbyA9IFNDQUxFICogYV9hbW91bnQgLy8gKGFfYmFsYW5jZSAtIGFfYW1vdW50KQogICAgaW50Y18yIC8vIDEwMDAKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIC8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM2CiAgICAvLyBiX3JhdGlvID0gU0NBTEUgKiBiX2Ftb3VudCAvLyAoYl9iYWxhbmNlIC0gYl9hbW91bnQpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzcKICAgIC8vIGlmIGFfcmF0aW8gPCBiX3JhdGlvOgogICAgPAogICAgYnogdG9rZW5zX3RvX21pbnRfZWxzZV9ib2R5QDgKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzgKICAgIC8vIHJldHVybiBhX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICBmcmFtZV9kaWcgMAogICAgKgogICAgaW50Y18yIC8vIDEwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b2tlbnNfdG9fbWludF9lbHNlX2JvZHlAODoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDAKICAgIC8vIHJldHVybiBiX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICBmcmFtZV9kaWcgMQogICAgKgogICAgaW50Y18yIC8vIDEwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fdXBkYXRlX3JhdGlvKCkgLT4gdm9pZDoKX3VwZGF0ZV9yYXRpbzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTUtMjU2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF91cGRhdGVfcmF0aW8oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gYV9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTgKICAgIC8vIGJfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLnJhdGlvID0gYV9iYWxhbmNlICogU0NBTEUgLy8gYl9iYWxhbmNlCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTAwMAogICAgKgogICAgc3dhcAogICAgLwogICAgYnl0ZWMgNCAvLyAicmF0aW8iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5idXJuKHBvb2xfeGZlcjogdWludDY0LCBwb29sX2Fzc2V0OiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgpidXJuOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0Ny0xNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICAvLyBkZWYgYnVybigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHBvb2xfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgcG9vbF9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYV9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYl9hc3NldDogQXNzZXQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzAKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzIKICAgIC8vIGFzc2VydCBwb29sX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzcKICAgIC8vIHBvb2xfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3Ni0xNzgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc5CiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gYXNzZXJ0IHBvb2xfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgxCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4My0xODUKICAgIC8vICMgR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzc3VlZAogICAgLy8gIyAhaW1wb3J0YW50OiB0aGlzIGhhcHBlbnMgcHJpb3IgdG8gcmVjZWl2aW5nIHRoZSBjdXJyZW50IGF4ZmVyIG9mIHBvb2wgdG9rZW5zCiAgICAvLyBwb29sX2JhbGFuY2UgPSBzZWxmLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X3Bvb2xfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc3VwcGx5PXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4Ni0xOTAKICAgIC8vIGFfYW10ID0gdG9rZW5zX3RvX2J1cm4oCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXBvb2xfYmFsYW5jZSwKICAgIC8vICAgICBzdXBwbHk9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBhbW91bnQ9cG9vbF94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxCiAgICBzd2FwCiAgICBkaWcgMwogICAgY2FsbHN1YiB0b2tlbnNfdG9fYnVybgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gc3VwcGx5PXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE5MS0xOTUKICAgIC8vIGJfYW10ID0gdG9rZW5zX3RvX2J1cm4oCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXBvb2xfYmFsYW5jZSwKICAgIC8vICAgICBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhbW91bnQ9cG9vbF94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBTZW5kIGJhY2sgY29tbWVuc3VyYXRlIGFtdCBvZiBhCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLmFzc2V0X2EsIGFtb3VudD1hX2FtdCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIC8vIGFtbS9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGIKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYiwgYW1vdW50PWJfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19idXJuKHBvb2xfYmFsYW5jZTogdWludDY0LCBzdXBwbHk6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX2J1cm46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQzLTM0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fYnVybigqLCBwb29sX2JhbGFuY2U6IFVJbnQ2NCwgc3VwcGx5OiBVSW50NjQsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDUKICAgIC8vIGlzc3VlZCA9IFRPVEFMX1NVUFBMWSAtIHBvb2xfYmFsYW5jZSAtIGFtb3VudAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gcmV0dXJuIHN1cHBseSAqIGFtb3VudCAvLyBpc3N1ZWQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLnN3YXAoc3dhcF94ZmVyOiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgpzd2FwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBzd2FwKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc3dhcF94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjMKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjUKICAgIC8vIGFzc2VydCBhX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gYXNzZXJ0IGJfYXNzZXQgPT0gc2VsZi5hc3NldF9iLCAiYXNzZXQgYiBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI4CiAgICAvLyBhc3NlcnQgc3dhcF94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHN3YXBfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzIKICAgIC8vIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzYKICAgIC8vIGNhc2Ugc2VsZi5hc3NldF9iOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzEKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBYZmVyQXNzZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzEtMjQxCiAgICAvLyBtYXRjaCBzd2FwX3hmZXIueGZlcl9hc3NldDoKICAgIC8vICAgICBjYXNlIHNlbGYuYXNzZXRfYToKICAgIC8vICAgICAgICAgaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIC8vICAgICBjYXNlIHNlbGYuYXNzZXRfYjoKICAgIC8vICAgICAgICAgaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2IKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIG1hdGNoIHN3YXBfc3dpdGNoX2Nhc2VfMEAxIHN3YXBfc3dpdGNoX2Nhc2VfMUAyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQxCiAgICAvLyBhc3NlcnQgRmFsc2UsICJhc3NldCBpZCBpbmNvcnJlY3QiCiAgICBlcnIgLy8gYXNzZXQgaWQgaW5jb3JyZWN0Cgpzd2FwX3N3aXRjaF9jYXNlXzBAMToKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzMKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzQKICAgIC8vIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9hCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBiIHN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0Cgpzd2FwX3N3aXRjaF9jYXNlXzFAMjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzcKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzgKICAgIC8vIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9iCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCgpzd2FwX3N3aXRjaF9jYXNlX25leHRANDoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyB0b19zd2FwID0gdG9rZW5zX3RvX3N3YXAoCiAgICAvLyAgICAgaW5fYW1vdW50PXN3YXBfeGZlci5hc3NldF9hbW91bnQsIGluX3N1cHBseT1pbl9zdXBwbHksIG91dF9zdXBwbHk9b3V0X3N1cHBseQogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdG9rZW5zX3RvX3N3YXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDYKICAgIC8vIGFzc2VydCB0b19zd2FwID4gMCwgInNlbmQgYW1vdW50IHRvbyBsb3ciCiAgICBkdXAKICAgIGFzc2VydCAvLyBzZW5kIGFtb3VudCB0b28gbG93CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ4CiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1vdXRfYXNzZXQsIGFtb3VudD10b19zd2FwKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDEKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19zd2FwKGluX2Ftb3VudDogdWludDY0LCBpbl9zdXBwbHk6IHVpbnQ2NCwgb3V0X3N1cHBseTogdWludDY0KSAtPiB1aW50NjQ6CnRva2Vuc190b19zd2FwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0OS0zNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdG9rZW5zX3RvX3N3YXAoKiwgaW5fYW1vdW50OiBVSW50NjQsIGluX3N1cHBseTogVUludDY0LCBvdXRfc3VwcGx5OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaW5fdG90YWwgPSBTQ0FMRSAqIChpbl9zdXBwbHkgLSBpbl9hbW91bnQpICsgKGluX2Ftb3VudCAqIEZBQ1RPUikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICAtCiAgICBpbnRjXzIgLy8gMTAwMAogICAgKgogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoaW50IDk5NSAvLyA5OTUKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzUyCiAgICAvLyBvdXRfdG90YWwgPSBpbl9hbW91bnQgKiBGQUNUT1IgKiBvdXRfc3VwcGx5CiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTMKICAgIC8vIHJldHVybiBvdXRfdG90YWwgLy8gaW5fdG90YWwKICAgIHN3YXAKICAgIC8KICAgIHJldHN1Ygo=",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAgNCAxMDAwMDAwMDAwMAogICAgYnl0ZWNibG9jayAiYXNzZXRfYSIgImFzc2V0X2IiICJwb29sX3Rva2VuIiAiZ292ZXJub3IiICJyYXRpbyIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBBCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBBc3NldCgpCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEIKICAgIC8vIHNlbGYuYXNzZXRfYiA9IEFzc2V0KCkKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBUaGUgY3VycmVudCBnb3Zlcm5vciBvZiB0aGlzIGNvbnRyYWN0LCBhbGxvd2VkIHRvIGRvIGFkbWluIHR5cGUgYWN0aW9ucwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozOC0zOQogICAgLy8gIyBUaGUgYXNzZXQgaWQgb2YgdGhlIFBvb2wgVG9rZW4sIHVzZWQgdG8gdHJhY2sgc2hhcmUgb2YgcG9vbCB0aGUgaG9sZGVyIG1heSByZWNvdmVyCiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBBc3NldCgpCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDAtNDEKICAgIC8vICMgVGhlIHJhdGlvIGJldHdlZW4gYXNzZXRzIChBKlNjYWxlL0IpCiAgICAvLyBzZWxmLnJhdGlvID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHgwOGE5NTZmNyAweDZiNTlkOTY1IDB4NWNiZjFlMmQgMHgxNDM2YzJhYyAweDRhODhlMDU1IC8vIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiLCBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfZ292ZXJub3Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fYnVybl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N3YXBfcm91dGVANgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2dvdmVybm9yX3JvdXRlQDI6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfZ292ZXJub3IKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWludF9yb3V0ZUA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBtaW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idXJuX3JvdXRlQDU6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDctMTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBidXJuCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zd2FwX3JvdXRlQDY6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0LTIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMDQtMjA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICBjYWxsc3ViIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A5OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5zZXRfZ292ZXJub3IobmV3X2dvdmVybm9yOiBieXRlcykgLT4gdm9pZDoKc2V0X2dvdmVybm9yOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzLTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHNldF9nb3Zlcm5vcihzZWxmLCBuZXdfZ292ZXJub3I6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTo0NgogICAgLy8gc2VsZi5fY2hlY2tfaXNfZ292ZXJub3IoKQogICAgY2FsbHN1YiBfY2hlY2tfaXNfZ292ZXJub3IKICAgIC8vIGFtbS9jb250cmFjdC5weTo0NwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IG5ld19nb3Zlcm5vcgogICAgYnl0ZWNfMyAvLyAiZ292ZXJub3IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jaGVja19pc19nb3Zlcm5vcigpIC0+IHZvaWQ6Cl9jaGVja19pc19nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19pc19nb3Zlcm5vcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY1CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb3Zlcm5vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nb3Zlcm5vciBleGlzdHMKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIC8vICksICJPbmx5IHRoZSBhY2NvdW50IHNldCBpbiBnbG9iYWxfc3RhdGUuZ292ZXJub3IgbWF5IGNhbGwgdGhpcyBtZXRob2QiCiAgICBhc3NlcnQgLy8gT25seSB0aGUgYWNjb3VudCBzZXQgaW4gZ2xvYmFsX3N0YXRlLmdvdmVybm9yIG1heSBjYWxsIHRoaXMgbWV0aG9kCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJvb3RzdHJhcChzZWVkOiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB1aW50NjQ6CmJvb3RzdHJhcDoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OS01MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZiwgc2VlZDogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sIGFfYXNzZXQ6IEFzc2V0LCBiX2Fzc2V0OiBBc3NldCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5wb29sX3Rva2VuLCAiYXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjcKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAyLCAiZ3JvdXAgc2l6ZSBub3QgMiIKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGdyb3VwIHNpemUgbm90IDIKICAgIC8vIGFtbS9jb250cmFjdC5weTo2OQogICAgLy8gYXNzZXJ0IHNlZWQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgc2VlZC5hbW91bnQgPj0gMzAwXzAwMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiICAjIDAuMyBBbGdvcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMzAwMDAwIC8vIDMwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzIKICAgIC8vIGFzc2VydCBhX2Fzc2V0LmlkIDwgYl9hc3NldC5pZCwgImFzc2V0IGEgbXVzdCBiZSBsZXNzIHRoYW4gYXNzZXQgYiIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBtdXN0IGJlIGxlc3MgdGhhbiBhc3NldCBiCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzMKICAgIC8vIHNlbGYuYXNzZXRfYSA9IGFfYXNzZXQKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuYXNzZXRfYiA9IGJfYXNzZXQKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzUKICAgIC8vIHNlbGYucG9vbF90b2tlbiA9IHNlbGYuX2NyZWF0ZV9wb29sX3Rva2VuKCkKICAgIGNhbGxzdWIgX2NyZWF0ZV9wb29sX3Rva2VuCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo3OAogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo3OQogICAgLy8gcmV0dXJuIHNlbGYucG9vbF90b2tlbi5pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2NyZWF0ZV9wb29sX3Rva2VuKCkgLT4gdWludDY0OgpfY3JlYXRlX3Bvb2xfdG9rZW46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY4LTI2OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3JlYXRlX3Bvb2xfdG9rZW4oc2VsZikgLT4gQXNzZXQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEtMjc5CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFtbS9jb250cmFjdC5weToyNzIKICAgIC8vIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIHB1c2hieXRlcyAweDQ0NTA1NDJkCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDJkCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNvbmNhdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzcKICAgIC8vIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc1CiAgICAvLyBkZWNpbWFscz0zLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gdG90YWw9VE9UQUxfU1VQUExZLAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzMKICAgIC8vIHVuaXRfbmFtZT1iImRidCIsCiAgICBwdXNoYnl0ZXMgMHg2NDYyNzQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxLTI3OQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MS0yODAKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXNzZXQKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzAtMjgxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICApCiAgICAvLyAgICAgLnN1Ym1pdCgpCiAgICAvLyAgICAgLmNyZWF0ZWRfYXNzZXQKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2RvX29wdF9pbihhc3NldDogdWludDY0KSAtPiB2b2lkOgpfZG9fb3B0X2luOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4My0yODQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2RvX29wdF9pbihzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyODYKICAgIC8vIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4NS0yODkKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4OAogICAgLy8gYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg1LTI4OQogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldD1hc3NldCwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LmRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRvX2Fzc2V0X3RyYW5zZmVyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1Ni0zNTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZG9fYXNzZXRfdHJhbnNmZXIoKiwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiBBc3NldCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgtMzYyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1OAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18zIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgtMzYyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0ubWludChhX3hmZXI6IHVpbnQ2NCwgYl94ZmVyOiB1aW50NjQsIHBvb2xfYXNzZXQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6Cm1pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6ODEtOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICAvLyBkZWYgbWludCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGFfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgYl94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBwb29sX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDUgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExMy0xMTQKICAgIC8vICMgd2VsbC1mb3JtZWQgbWludAogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE1CiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTYKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IGFfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBiX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTIyCiAgICAvLyBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxMjAtMTIzCiAgICAvLyAjIHZhbGlkIGFzc2V0IGEgeGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjQKICAgIC8vIGFzc2VydCBhX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gYXNzZXJ0IGFfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjkKICAgIC8vIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNy0xMzAKICAgIC8vICMgdmFsaWQgYXNzZXQgYiB4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gYXNzZXJ0IGJfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgYl94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gcG9vbF9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X3Bvb2xfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYV9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNC0xNDAKICAgIC8vIHRvX21pbnQgPSB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICBwb29sX2JhbGFuY2U9c2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2JhbGFuY2U9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBiX2JhbGFuY2U9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2Ftb3VudD1hX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gICAgIGJfYW1vdW50PWJfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiB0b2tlbnNfdG9fbWludAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gYXNzZXJ0IHRvX21pbnQgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyAjIG1pbnQgdG9rZW5zCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLnBvb2xfdG9rZW4sIGFtb3VudD10b19taW50KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfYm9vdHN0cmFwcGVkKCkgLT4gdm9pZDoKX2NoZWNrX2Jvb3RzdHJhcHBlZDoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTEtMjUyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19ib290c3RyYXBwZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gYXNzZXJ0IHNlbGYucG9vbF90b2tlbiwgImJvb3RzdHJhcCBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIGZpcnN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGFzc2VydCAvLyBib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9wb29sX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X3Bvb2xfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jdXJyZW50X3Bvb2xfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTMKICAgIC8vIHJldHVybiBzZWxmLnBvb2xfdG9rZW4uYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfYV9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9hX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk1LTI5NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9hX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9hLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X2JfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfYl9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5OS0zMDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2N1cnJlbnRfYl9iYWxhbmNlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfYi5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19taW50KHBvb2xfYmFsYW5jZTogdWludDY0LCBhX2JhbGFuY2U6IHVpbnQ2NCwgYl9iYWxhbmNlOiB1aW50NjQsIGFfYW1vdW50OiB1aW50NjQsIGJfYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX21pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzIyLTMzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICAqLAogICAgLy8gICAgIHBvb2xfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGJfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYW1vdW50OiBVSW50NjQsCiAgICAvLyAgICAgYl9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gNSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gaXNfaW5pdGlhbF9taW50ID0gYV9iYWxhbmNlID09IGFfYW1vdW50IGFuZCBiX2JhbGFuY2UgPT0gYl9hbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IHRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIGIgdG9rZW5zX3RvX21pbnRfYm9vbF9tZXJnZUA0Cgp0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAoKdG9rZW5zX3RvX21pbnRfYm9vbF9tZXJnZUA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gaWYgaXNfaW5pdGlhbF9taW50OgogICAgYnogdG9rZW5zX3RvX21pbnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzMzCiAgICAvLyByZXR1cm4gb3Auc3FydChhX2Ftb3VudCAqIGJfYW1vdW50KSAtIFNDQUxFCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgc3FydAogICAgaW50Y18yIC8vIDEwMDAKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b2tlbnNfdG9fbWludF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM0CiAgICAvLyBpc3N1ZWQgPSBUT1RBTF9TVVBQTFkgLSBwb29sX2JhbGFuY2UKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMAogICAgZnJhbWVfZGlnIC01CiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM1CiAgICAvLyBhX3JhdGlvID0gU0NBTEUgKiBhX2Ftb3VudCAvLyAoYV9iYWxhbmNlIC0gYV9hbW91bnQpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgLQogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzYKICAgIC8vIGJfcmF0aW8gPSBTQ0FMRSAqIGJfYW1vdW50IC8vIChiX2JhbGFuY2UgLSBiX2Ftb3VudCkKICAgIGludGNfMiAvLyAxMDAwCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gaWYgYV9yYXRpbyA8IGJfcmF0aW86CiAgICA8CiAgICBieiB0b2tlbnNfdG9fbWludF9lbHNlX2JvZHlAOAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gcmV0dXJuIGFfcmF0aW8gKiBpc3N1ZWQgLy8gU0NBTEUKICAgIGZyYW1lX2RpZyAwCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRva2Vuc190b19taW50X2Vsc2VfYm9keUA4OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gcmV0dXJuIGJfcmF0aW8gKiBpc3N1ZWQgLy8gU0NBTEUKICAgIGZyYW1lX2RpZyAxCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl91cGRhdGVfcmF0aW8oKSAtPiB2b2lkOgpfdXBkYXRlX3JhdGlvOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1NS0yNTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3VwZGF0ZV9yYXRpbyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjU3CiAgICAvLyBhX2JhbGFuY2UgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gYl9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYucmF0aW8gPSBhX2JhbGFuY2UgKiBTQ0FMRSAvLyBiX2JhbGFuY2UKICAgIHN3YXAKICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJ1cm4ocG9vbF94ZmVyOiB1aW50NjQsIHBvb2xfYXNzZXQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmJ1cm46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBidXJuKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgcG9vbF94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBwb29sX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDQgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTczCiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc2LTE3OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwb29sX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzkKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgcG9vbCBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxODEKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgzLTE4NQogICAgLy8gIyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgaXNzdWVkCiAgICAvLyAjICFpbXBvcnRhbnQ6IHRoaXMgaGFwcGVucyBwcmlvciB0byByZWNlaXZpbmcgdGhlIGN1cnJlbnQgYXhmZXIgb2YgcG9vbCB0b2tlbnMKICAgIC8vIHBvb2xfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfcG9vbF9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg4CiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg2LTE5MAogICAgLy8gYV9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkzCiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkxLTE5NQogICAgLy8gYl9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgdG9rZW5zX3RvX2J1cm4KICAgIC8vIGFtbS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGEKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYSwgYW1vdW50PWFfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vICMgU2VuZCBiYWNrIGNvbW1lbnN1cmF0ZSBhbXQgb2YgYgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5hc3NldF9iLCBhbW91bnQ9Yl9hbXQpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjAyCiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX2J1cm4ocG9vbF9iYWxhbmNlOiB1aW50NjQsIHN1cHBseTogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogp0b2tlbnNfdG9fYnVybjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDMtMzQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRva2Vuc190b19idXJuKCosIHBvb2xfYmFsYW5jZTogVUludDY0LCBzdXBwbHk6IFVJbnQ2NCwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0NQogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlIC0gYW1vdW50CiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ2CiAgICAvLyByZXR1cm4gc3VwcGx5ICogYW1vdW50IC8vIGlzc3VlZAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHN3YXAKICAgIC8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc3dhcChzd2FwX3hmZXI6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0LTIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIHN3YXAoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzd2FwX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIGFfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGJfYXNzZXQ6IEFzc2V0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI2CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBzd2FwX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgc3dhcF94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2E6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gbWF0Y2ggc3dhcF94ZmVyLnhmZXJfYXNzZXQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMS0yNDEKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYQogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9iOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYgogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiYXNzZXQgaWQgaW5jb3JyZWN0IgogICAgbWF0Y2ggc3dhcF9zd2l0Y2hfY2FzZV8wQDEgc3dhcF9zd2l0Y2hfY2FzZV8xQDIKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDEKICAgIC8vIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIGVyciAvLyBhc3NldCBpZCBpbmNvcnJlY3QKCnN3YXBfc3dpdGNoX2Nhc2VfMEAxOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM1CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGIgc3dhcF9zd2l0Y2hfY2FzZV9uZXh0QDQKCnN3YXBfc3dpdGNoX2Nhc2VfMUAyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM5CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKCnN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vIHRvX3N3YXAgPSB0b2tlbnNfdG9fc3dhcCgKICAgIC8vICAgICBpbl9hbW91bnQ9c3dhcF94ZmVyLmFzc2V0X2Ftb3VudCwgaW5fc3VwcGx5PWluX3N1cHBseSwgb3V0X3N1cHBseT1vdXRfc3VwcGx5CiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0b2tlbnNfdG9fc3dhcAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHRvX3N3YXAgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDgKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PW91dF9hc3NldCwgYW1vdW50PXRvX3N3YXApCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ5CiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX3N3YXAoaW5fYW1vdW50OiB1aW50NjQsIGluX3N1cHBseTogdWludDY0LCBvdXRfc3VwcGx5OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX3N3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ5LTM1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fc3dhcCgqLCBpbl9hbW91bnQ6IFVJbnQ2NCwgaW5fc3VwcGx5OiBVSW50NjQsIG91dF9zdXBwbHk6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzUxCiAgICAvLyBpbl90b3RhbCA9IFNDQUxFICogKGluX3N1cHBseSAtIGluX2Ftb3VudCkgKyAoaW5fYW1vdW50ICogRkFDVE9SKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgOTk1IC8vIDk5NQogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgICsKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTIKICAgIC8vIG91dF90b3RhbCA9IGluX2Ftb3VudCAqIEZBQ1RPUiAqIG91dF9zdXBwbHkKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gcmV0dXJuIG91dF90b3RhbCAvLyBpbl90b3RhbAogICAgc3dhcAogICAgLwogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
diff --git a/examples/amm/out/ConstantProductAMM.arc56.json b/examples/amm/out/ConstantProductAMM.arc56.json
new file mode 100644
index 0000000000..4638da7049
--- /dev/null
+++ b/examples/amm/out/ConstantProductAMM.arc56.json
@@ -0,0 +1,506 @@
+{
+ "name": "ConstantProductAMM",
+ "structs": {},
+ "methods": [
+ {
+ "name": "set_governor",
+ "args": [
+ {
+ "type": "account",
+ "name": "new_governor"
+ }
+ ],
+ "returns": {
+ "type": "void"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "desc": "sets the governor of the contract, may only be called by the current governor",
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "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,
+ "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.",
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "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,
+ "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.",
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "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,
+ "desc": "burn pool tokens to get back some amount of asset A and asset B",
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "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,
+ "desc": "Swap some amount of either asset A or asset B for the other",
+ "events": [],
+ "recommendations": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 145,
+ 163,
+ 207,
+ 258,
+ 298
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 363
+ ],
+ "errorMessage": "Only the account set in global_state.governor may call this method"
+ },
+ {
+ "pc": [
+ 689,
+ 702,
+ 715
+ ],
+ "errorMessage": "account opted into asset"
+ },
+ {
+ "pc": [
+ 400,
+ 611,
+ 635,
+ 871,
+ 990
+ ],
+ "errorMessage": "amount minimum not met"
+ },
+ {
+ "pc": [
+ 373
+ ],
+ "errorMessage": "application has already been bootstrapped"
+ },
+ {
+ "pc": [
+ 563,
+ 605,
+ 849,
+ 976
+ ],
+ "errorMessage": "asset a incorrect"
+ },
+ {
+ "pc": [
+ 406
+ ],
+ "errorMessage": "asset a must be less than asset b"
+ },
+ {
+ "pc": [
+ 571,
+ 629,
+ 857,
+ 984
+ ],
+ "errorMessage": "asset b incorrect"
+ },
+ {
+ "pc": [
+ 450,
+ 469
+ ],
+ "errorMessage": "asset exists"
+ },
+ {
+ "pc": [
+ 1017
+ ],
+ "errorMessage": "asset id incorrect"
+ },
+ {
+ "pc": [
+ 555,
+ 841,
+ 881
+ ],
+ "errorMessage": "asset pool incorrect"
+ },
+ {
+ "pc": [
+ 676
+ ],
+ "errorMessage": "bootstrap method needs to be called first"
+ },
+ {
+ "pc": [
+ 337
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 148,
+ 166,
+ 210,
+ 261,
+ 301
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 424,
+ 447,
+ 559,
+ 603,
+ 699,
+ 845,
+ 920,
+ 972,
+ 1002,
+ 1032
+ ],
+ "errorMessage": "check self.asset_a exists"
+ },
+ {
+ "pc": [
+ 431,
+ 466,
+ 567,
+ 627,
+ 712,
+ 853,
+ 931,
+ 980,
+ 1006,
+ 1050
+ ],
+ "errorMessage": "check self.asset_b exists"
+ },
+ {
+ "pc": [
+ 361
+ ],
+ "errorMessage": "check self.governor exists"
+ },
+ {
+ "pc": [
+ 371,
+ 438,
+ 551,
+ 659,
+ 675,
+ 686,
+ 837,
+ 879
+ ],
+ "errorMessage": "check self.pool_token exists"
+ },
+ {
+ "pc": [
+ 382
+ ],
+ "errorMessage": "group size not 2"
+ },
+ {
+ "pc": [
+ 390,
+ 595,
+ 619,
+ 865
+ ],
+ "errorMessage": "receiver not app address"
+ },
+ {
+ "pc": [
+ 653,
+ 1061
+ ],
+ "errorMessage": "send amount too low"
+ },
+ {
+ "pc": [
+ 579,
+ 587,
+ 889,
+ 998
+ ],
+ "errorMessage": "sender invalid"
+ },
+ {
+ "pc": [
+ 221,
+ 231,
+ 271,
+ 311
+ ],
+ "errorMessage": "transaction type is axfer"
+ },
+ {
+ "pc": [
+ 176
+ ],
+ "errorMessage": "transaction type is pay"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAgNCAxMDAwMDAwMDAwMAogICAgYnl0ZWNibG9jayAiYXNzZXRfYSIgImFzc2V0X2IiICJwb29sX3Rva2VuIiAiZ292ZXJub3IiICJyYXRpbyIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBBCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBBc3NldCgpCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEIKICAgIC8vIHNlbGYuYXNzZXRfYiA9IEFzc2V0KCkKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBUaGUgY3VycmVudCBnb3Zlcm5vciBvZiB0aGlzIGNvbnRyYWN0LCBhbGxvd2VkIHRvIGRvIGFkbWluIHR5cGUgYWN0aW9ucwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozOC0zOQogICAgLy8gIyBUaGUgYXNzZXQgaWQgb2YgdGhlIFBvb2wgVG9rZW4sIHVzZWQgdG8gdHJhY2sgc2hhcmUgb2YgcG9vbCB0aGUgaG9sZGVyIG1heSByZWNvdmVyCiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBBc3NldCgpCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDAtNDEKICAgIC8vICMgVGhlIHJhdGlvIGJldHdlZW4gYXNzZXRzIChBKlNjYWxlL0IpCiAgICAvLyBzZWxmLnJhdGlvID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHgwOGE5NTZmNyAweDZiNTlkOTY1IDB4NWNiZjFlMmQgMHgxNDM2YzJhYyAweDRhODhlMDU1IC8vIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiLCBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfZ292ZXJub3Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fYnVybl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N3YXBfcm91dGVANgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2dvdmVybm9yX3JvdXRlQDI6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfZ292ZXJub3IKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWludF9yb3V0ZUA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBtaW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idXJuX3JvdXRlQDU6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDctMTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBidXJuCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zd2FwX3JvdXRlQDY6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0LTIwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMDQtMjA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICBjYWxsc3ViIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A5OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjbGFzcyBDb25zdGFudFByb2R1Y3RBTU0oQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5zZXRfZ292ZXJub3IobmV3X2dvdmVybm9yOiBieXRlcykgLT4gdm9pZDoKc2V0X2dvdmVybm9yOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzLTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHNldF9nb3Zlcm5vcihzZWxmLCBuZXdfZ292ZXJub3I6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTo0NgogICAgLy8gc2VsZi5fY2hlY2tfaXNfZ292ZXJub3IoKQogICAgY2FsbHN1YiBfY2hlY2tfaXNfZ292ZXJub3IKICAgIC8vIGFtbS9jb250cmFjdC5weTo0NwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IG5ld19nb3Zlcm5vcgogICAgYnl0ZWNfMyAvLyAiZ292ZXJub3IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jaGVja19pc19nb3Zlcm5vcigpIC0+IHZvaWQ6Cl9jaGVja19pc19nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjItMjYzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19pc19nb3Zlcm5vcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY1CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb3Zlcm5vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nb3Zlcm5vciBleGlzdHMKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIC8vICksICJPbmx5IHRoZSBhY2NvdW50IHNldCBpbiBnbG9iYWxfc3RhdGUuZ292ZXJub3IgbWF5IGNhbGwgdGhpcyBtZXRob2QiCiAgICBhc3NlcnQgLy8gT25seSB0aGUgYWNjb3VudCBzZXQgaW4gZ2xvYmFsX3N0YXRlLmdvdmVybm9yIG1heSBjYWxsIHRoaXMgbWV0aG9kCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJvb3RzdHJhcChzZWVkOiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB1aW50NjQ6CmJvb3RzdHJhcDoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OS01MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZiwgc2VlZDogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sIGFfYXNzZXQ6IEFzc2V0LCBiX2Fzc2V0OiBBc3NldCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5wb29sX3Rva2VuLCAiYXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYm9vdHN0cmFwcGVkCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjcKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjgKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAyLCAiZ3JvdXAgc2l6ZSBub3QgMiIKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGdyb3VwIHNpemUgbm90IDIKICAgIC8vIGFtbS9jb250cmFjdC5weTo2OQogICAgLy8gYXNzZXJ0IHNlZWQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgc2VlZC5hbW91bnQgPj0gMzAwXzAwMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiICAjIDAuMyBBbGdvcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMzAwMDAwIC8vIDMwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzIKICAgIC8vIGFzc2VydCBhX2Fzc2V0LmlkIDwgYl9hc3NldC5pZCwgImFzc2V0IGEgbXVzdCBiZSBsZXNzIHRoYW4gYXNzZXQgYiIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBtdXN0IGJlIGxlc3MgdGhhbiBhc3NldCBiCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzMKICAgIC8vIHNlbGYuYXNzZXRfYSA9IGFfYXNzZXQKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuYXNzZXRfYiA9IGJfYXNzZXQKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzUKICAgIC8vIHNlbGYucG9vbF90b2tlbiA9IHNlbGYuX2NyZWF0ZV9wb29sX3Rva2VuKCkKICAgIGNhbGxzdWIgX2NyZWF0ZV9wb29sX3Rva2VuCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo3OAogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBjYWxsc3ViIF9kb19vcHRfaW4KICAgIC8vIGFtbS9jb250cmFjdC5weTo3OQogICAgLy8gcmV0dXJuIHNlbGYucG9vbF90b2tlbi5pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2NyZWF0ZV9wb29sX3Rva2VuKCkgLT4gdWludDY0OgpfY3JlYXRlX3Bvb2xfdG9rZW46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY4LTI2OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3JlYXRlX3Bvb2xfdG9rZW4oc2VsZikgLT4gQXNzZXQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEtMjc5CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFtbS9jb250cmFjdC5weToyNzIKICAgIC8vIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIHB1c2hieXRlcyAweDQ0NTA1NDJkCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDJkCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNvbmNhdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NgogICAgLy8gbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzcKICAgIC8vIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc1CiAgICAvLyBkZWNpbWFscz0zLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NAogICAgLy8gdG90YWw9VE9UQUxfU1VQUExZLAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzMKICAgIC8vIHVuaXRfbmFtZT1iImRidCIsCiAgICBwdXNoYnl0ZXMgMHg2NDYyNzQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxLTI3OQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MS0yODAKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXNzZXQKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzAtMjgxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICApCiAgICAvLyAgICAgLnN1Ym1pdCgpCiAgICAvLyAgICAgLmNyZWF0ZWRfYXNzZXQKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2RvX29wdF9pbihhc3NldDogdWludDY0KSAtPiB2b2lkOgpfZG9fb3B0X2luOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4My0yODQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2RvX29wdF9pbihzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyODYKICAgIC8vIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4NS0yODkKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4OAogICAgLy8gYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg1LTI4OQogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldD1hc3NldCwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LmRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRvX2Fzc2V0X3RyYW5zZmVyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1Ni0zNTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZG9fYXNzZXRfdHJhbnNmZXIoKiwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiBBc3NldCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgtMzYyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1OAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18zIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgtMzYyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0ubWludChhX3hmZXI6IHVpbnQ2NCwgYl94ZmVyOiB1aW50NjQsIHBvb2xfYXNzZXQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6Cm1pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6ODEtOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICAvLyBkZWYgbWludCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGFfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgYl94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBwb29sX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDUgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExMQogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExMy0xMTQKICAgIC8vICMgd2VsbC1mb3JtZWQgbWludAogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE1CiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTYKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IGFfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBiX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTIyCiAgICAvLyBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC01CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxMjAtMTIzCiAgICAvLyAjIHZhbGlkIGFzc2V0IGEgeGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjQKICAgIC8vIGFzc2VydCBhX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gYXNzZXJ0IGFfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjkKICAgIC8vIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNy0xMzAKICAgIC8vICMgdmFsaWQgYXNzZXQgYiB4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gYXNzZXJ0IGJfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgYl94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gcG9vbF9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X3Bvb2xfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gYV9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNC0xNDAKICAgIC8vIHRvX21pbnQgPSB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICBwb29sX2JhbGFuY2U9c2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2JhbGFuY2U9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBiX2JhbGFuY2U9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2Ftb3VudD1hX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gICAgIGJfYW1vdW50PWJfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiB0b2tlbnNfdG9fbWludAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gYXNzZXJ0IHRvX21pbnQgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDMtMTQ0CiAgICAvLyAjIG1pbnQgdG9rZW5zCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLnBvb2xfdG9rZW4sIGFtb3VudD10b19taW50KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfYm9vdHN0cmFwcGVkKCkgLT4gdm9pZDoKX2NoZWNrX2Jvb3RzdHJhcHBlZDoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTEtMjUyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jaGVja19ib290c3RyYXBwZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gYXNzZXJ0IHNlbGYucG9vbF90b2tlbiwgImJvb3RzdHJhcCBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIGZpcnN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGFzc2VydCAvLyBib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9wb29sX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X3Bvb2xfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jdXJyZW50X3Bvb2xfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTMKICAgIC8vIHJldHVybiBzZWxmLnBvb2xfdG9rZW4uYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfYV9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9hX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk1LTI5NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9hX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjk3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9hLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X2JfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfYl9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5OS0zMDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2N1cnJlbnRfYl9iYWxhbmNlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfYi5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19taW50KHBvb2xfYmFsYW5jZTogdWludDY0LCBhX2JhbGFuY2U6IHVpbnQ2NCwgYl9iYWxhbmNlOiB1aW50NjQsIGFfYW1vdW50OiB1aW50NjQsIGJfYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX21pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzIyLTMzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICAqLAogICAgLy8gICAgIHBvb2xfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGJfYmFsYW5jZTogVUludDY0LAogICAgLy8gICAgIGFfYW1vdW50OiBVSW50NjQsCiAgICAvLyAgICAgYl9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gNSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gaXNfaW5pdGlhbF9taW50ID0gYV9iYWxhbmNlID09IGFfYW1vdW50IGFuZCBiX2JhbGFuY2UgPT0gYl9hbW91bnQKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGJ6IHRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIGIgdG9rZW5zX3RvX21pbnRfYm9vbF9tZXJnZUA0Cgp0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAoKdG9rZW5zX3RvX21pbnRfYm9vbF9tZXJnZUA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gaWYgaXNfaW5pdGlhbF9taW50OgogICAgYnogdG9rZW5zX3RvX21pbnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzMzCiAgICAvLyByZXR1cm4gb3Auc3FydChhX2Ftb3VudCAqIGJfYW1vdW50KSAtIFNDQUxFCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgc3FydAogICAgaW50Y18yIC8vIDEwMDAKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b2tlbnNfdG9fbWludF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM0CiAgICAvLyBpc3N1ZWQgPSBUT1RBTF9TVVBQTFkgLSBwb29sX2JhbGFuY2UKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMAogICAgZnJhbWVfZGlnIC01CiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM1CiAgICAvLyBhX3JhdGlvID0gU0NBTEUgKiBhX2Ftb3VudCAvLyAoYV9iYWxhbmNlIC0gYV9hbW91bnQpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgLQogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzYKICAgIC8vIGJfcmF0aW8gPSBTQ0FMRSAqIGJfYW1vdW50IC8vIChiX2JhbGFuY2UgLSBiX2Ftb3VudCkKICAgIGludGNfMiAvLyAxMDAwCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gaWYgYV9yYXRpbyA8IGJfcmF0aW86CiAgICA8CiAgICBieiB0b2tlbnNfdG9fbWludF9lbHNlX2JvZHlAOAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gcmV0dXJuIGFfcmF0aW8gKiBpc3N1ZWQgLy8gU0NBTEUKICAgIGZyYW1lX2RpZyAwCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRva2Vuc190b19taW50X2Vsc2VfYm9keUA4OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gcmV0dXJuIGJfcmF0aW8gKiBpc3N1ZWQgLy8gU0NBTEUKICAgIGZyYW1lX2RpZyAxCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl91cGRhdGVfcmF0aW8oKSAtPiB2b2lkOgpfdXBkYXRlX3JhdGlvOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1NS0yNTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3VwZGF0ZV9yYXRpbyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjU3CiAgICAvLyBhX2JhbGFuY2UgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gYl9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYucmF0aW8gPSBhX2JhbGFuY2UgKiBTQ0FMRSAvLyBiX2JhbGFuY2UKICAgIHN3YXAKICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJ1cm4ocG9vbF94ZmVyOiB1aW50NjQsIHBvb2xfYXNzZXQ6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmJ1cm46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBidXJuKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgcG9vbF94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBwb29sX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDQgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTczCiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc2LTE3OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwb29sX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzkKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgwCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgcG9vbCBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxODEKICAgIC8vIGFzc2VydCBwb29sX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgzLTE4NQogICAgLy8gIyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgaXNzdWVkCiAgICAvLyAjICFpbXBvcnRhbnQ6IHRoaXMgaGFwcGVucyBwcmlvciB0byByZWNlaXZpbmcgdGhlIGN1cnJlbnQgYXhmZXIgb2YgcG9vbCB0b2tlbnMKICAgIC8vIHBvb2xfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfcG9vbF9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg4CiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTg2LTE5MAogICAgLy8gYV9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIHN3YXAKICAgIGRpZyAzCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkzCiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTkxLTE5NQogICAgLy8gYl9hbXQgPSB0b2tlbnNfdG9fYnVybigKICAgIC8vICAgICBwb29sX2JhbGFuY2U9cG9vbF9iYWxhbmNlLAogICAgLy8gICAgIHN1cHBseT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgLy8gICAgIGFtb3VudD1wb29sX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgdG9rZW5zX3RvX2J1cm4KICAgIC8vIGFtbS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGEKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYSwgYW1vdW50PWFfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwMC0yMDEKICAgIC8vICMgU2VuZCBiYWNrIGNvbW1lbnN1cmF0ZSBhbXQgb2YgYgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5hc3NldF9iLCBhbW91bnQ9Yl9hbXQpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjAyCiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX2J1cm4ocG9vbF9iYWxhbmNlOiB1aW50NjQsIHN1cHBseTogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogp0b2tlbnNfdG9fYnVybjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDMtMzQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRva2Vuc190b19idXJuKCosIHBvb2xfYmFsYW5jZTogVUludDY0LCBzdXBwbHk6IFVJbnQ2NCwgYW1vdW50OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0NQogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlIC0gYW1vdW50CiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ2CiAgICAvLyByZXR1cm4gc3VwcGx5ICogYW1vdW50IC8vIGlzc3VlZAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHN3YXAKICAgIC8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc3dhcChzd2FwX3hmZXI6IHVpbnQ2NCwgYV9hc3NldDogdWludDY0LCBiX2Fzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0LTIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIHN3YXAoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzd2FwX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIGFfYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGJfYXNzZXQ6IEFzc2V0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gc2VsZi5fY2hlY2tfYm9vdHN0cmFwcGVkKCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI2CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBzd2FwX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgc3dhcF94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2E6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gY2FzZSBzZWxmLmFzc2V0X2I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gbWF0Y2ggc3dhcF94ZmVyLnhmZXJfYXNzZXQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMS0yNDEKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYQogICAgLy8gICAgIGNhc2Ugc2VsZi5hc3NldF9iOgogICAgLy8gICAgICAgICBpbl9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICAvLyAgICAgICAgIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYgogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiYXNzZXQgaWQgaW5jb3JyZWN0IgogICAgbWF0Y2ggc3dhcF9zd2l0Y2hfY2FzZV8wQDEgc3dhcF9zd2l0Y2hfY2FzZV8xQDIKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDEKICAgIC8vIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIGVyciAvLyBhc3NldCBpZCBpbmNvcnJlY3QKCnN3YXBfc3dpdGNoX2Nhc2VfMEAxOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM1CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGIgc3dhcF9zd2l0Y2hfY2FzZV9uZXh0QDQKCnN3YXBfc3dpdGNoX2Nhc2VfMUAyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gb3V0X3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM5CiAgICAvLyBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKCnN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0My0yNDUKICAgIC8vIHRvX3N3YXAgPSB0b2tlbnNfdG9fc3dhcCgKICAgIC8vICAgICBpbl9hbW91bnQ9c3dhcF94ZmVyLmFzc2V0X2Ftb3VudCwgaW5fc3VwcGx5PWluX3N1cHBseSwgb3V0X3N1cHBseT1vdXRfc3VwcGx5CiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0b2tlbnNfdG9fc3dhcAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gYXNzZXJ0IHRvX3N3YXAgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDgKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PW91dF9hc3NldCwgYW1vdW50PXRvX3N3YXApCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ5CiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX3N3YXAoaW5fYW1vdW50OiB1aW50NjQsIGluX3N1cHBseTogdWludDY0LCBvdXRfc3VwcGx5OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX3N3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ5LTM1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fc3dhcCgqLCBpbl9hbW91bnQ6IFVJbnQ2NCwgaW5fc3VwcGx5OiBVSW50NjQsIG91dF9zdXBwbHk6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzUxCiAgICAvLyBpbl90b3RhbCA9IFNDQUxFICogKGluX3N1cHBseSAtIGluX2Ftb3VudCkgKyAoaW5fYW1vdW50ICogRkFDVE9SKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgOTk1IC8vIDk5NQogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgICsKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTIKICAgIC8vIG91dF90b3RhbCA9IGluX2Ftb3VudCAqIEZBQ1RPUiAqIG91dF9zdXBwbHkKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gcmV0dXJuIG91dF90b3RhbCAvLyBpbl90b3RhbAogICAgc3dhcAogICAgLwogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiAFAAHoBwSAyK+gJSYFB2Fzc2V0X2EHYXNzZXRfYgpwb29sX3Rva2VuCGdvdmVybm9yBXJhdGlvMRhAAAOIAASIABZDigAAKCJnKSJnKzEAZyoiZycEImeJigABMRtBAOeCBQQIqVb3BGtZ2WUEXL8eLQQUNsKsBEqI4FU2GgCOBQACABQAQABzAJsiiTEZFEQxGEQ2GgEXwByIALgjiTEZFEQxGEQxFiMJSTgQIxJENhoBF8AwNhoCF8AwiACtFoAEFR98dUxQsCOJMRkURDEYRDEWgQIJSTgQJRJEMRYjCUk4ECUSRDYaARfAMDYaAhfAMDYaAxfAMIgBISOJMRkURDEYRDEWIwlJOBAlEkQ2GgEXwDA2GgIXwDA2GgMXwDCIAhcjiTEZFEQxGEQxFiMJSTgQJRJENhoBF8AwNhoCF8AwiAJ5I4kxGUAABjEYFEQjiSKJigEAiAAFK4v/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/C0wKiQ==",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/examples/amm/out/ConstantProductAMM.destructured.ir b/examples/amm/out/ConstantProductAMM.destructured.ir
index bc63039488..99941b7517 100644
--- a/examples/amm/out/ConstantProductAMM.destructured.ir
+++ b/examples/amm/out/ConstantProductAMM.destructured.ir
@@ -31,9 +31,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@2: // set_governor_route_L43
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0)
@@ -42,9 +42,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@3: // bootstrap_route_L49
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (! tmp%10#0)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%14#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -64,9 +64,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@4: // mint_route_L81
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (! tmp%22#0)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -91,9 +91,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@5: // burn_route_L147
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
let tmp%41#0: uint64 = (txn GroupIndex)
let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u)
let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0)
@@ -113,9 +113,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@6: // swap_route_L204
let tmp%51#0: uint64 = (txn OnCompletion)
let tmp%52#0: bool = (! tmp%51#0)
- (assert tmp%52#0) // OnCompletion is NoOp
+ (assert tmp%52#0) // OnCompletion is not NoOp
let tmp%53#0: uint64 = (txn ApplicationID)
- (assert tmp%53#0) // is not creating
+ (assert tmp%53#0) // can only call when not creating
let tmp%55#0: uint64 = (txn GroupIndex)
let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u)
let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0)
@@ -135,7 +135,7 @@ contract examples.amm.contract.ConstantProductAMM:
block@10: // __algopy_default_create_L1
let tmp%63#0: uint64 = (txn ApplicationID)
let tmp%64#0: bool = (! tmp%63#0)
- (assert tmp%64#0) // is creating
+ (assert tmp%64#0) // can only call when creating
return 1u
block@13: // after_if_else_L27
return 0u
diff --git a/examples/amm/out/ConstantProductAMM.ssa.ir b/examples/amm/out/ConstantProductAMM.ssa.ir
index 0fb962fb89..8835783656 100644
--- a/examples/amm/out/ConstantProductAMM.ssa.ir
+++ b/examples/amm/out/ConstantProductAMM.ssa.ir
@@ -32,10 +32,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@2: // set_governor_route_L43
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0)
@@ -44,10 +44,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@3: // bootstrap_route_L49
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (== tmp%10#0 NoOp)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
let tmp%13#0: bool = (!= tmp%12#0 0u)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%14#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -67,10 +67,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@4: // mint_route_L81
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (== tmp%22#0 NoOp)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (!= tmp%24#0 0u)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -95,10 +95,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@5: // burn_route_L147
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (== tmp%37#0 NoOp)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
let tmp%40#0: bool = (!= tmp%39#0 0u)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
let tmp%41#0: uint64 = (txn GroupIndex)
let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u)
let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0)
@@ -118,10 +118,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@6: // swap_route_L204
let tmp%51#0: uint64 = (txn OnCompletion)
let tmp%52#0: bool = (== tmp%51#0 NoOp)
- (assert tmp%52#0) // OnCompletion is NoOp
+ (assert tmp%52#0) // OnCompletion is not NoOp
let tmp%53#0: uint64 = (txn ApplicationID)
let tmp%54#0: bool = (!= tmp%53#0 0u)
- (assert tmp%54#0) // is not creating
+ (assert tmp%54#0) // can only call when not creating
let tmp%55#0: uint64 = (txn GroupIndex)
let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u)
let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0)
@@ -145,7 +145,7 @@ contract examples.amm.contract.ConstantProductAMM:
block@10: // __algopy_default_create_L1
let tmp%63#0: uint64 = (txn ApplicationID)
let tmp%64#0: bool = (== tmp%63#0 0u)
- (assert tmp%64#0) // is creating
+ (assert tmp%64#0) // can only call when creating
examples.amm.contract.ConstantProductAMM.__algopy_default_create()
return 1u
block@11: // switch_case_default_L27
diff --git a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir
index 1b160b38ef..05561550b6 100644
--- a/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir
+++ b/examples/amm/out/ConstantProductAMM.ssa.opt_pass_1.ir
@@ -31,9 +31,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@2: // set_governor_route_L43
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0)
@@ -42,9 +42,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@3: // bootstrap_route_L49
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (! tmp%10#0)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%14#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -64,9 +64,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@4: // mint_route_L81
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (! tmp%22#0)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -91,9 +91,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@5: // burn_route_L147
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
let tmp%41#0: uint64 = (txn GroupIndex)
let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u)
let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0)
@@ -113,9 +113,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@6: // swap_route_L204
let tmp%51#0: uint64 = (txn OnCompletion)
let tmp%52#0: bool = (! tmp%51#0)
- (assert tmp%52#0) // OnCompletion is NoOp
+ (assert tmp%52#0) // OnCompletion is not NoOp
let tmp%53#0: uint64 = (txn ApplicationID)
- (assert tmp%53#0) // is not creating
+ (assert tmp%53#0) // can only call when not creating
let tmp%55#0: uint64 = (txn GroupIndex)
let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u)
let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0)
@@ -135,7 +135,7 @@ contract examples.amm.contract.ConstantProductAMM:
block@10: // __algopy_default_create_L1
let tmp%63#0: uint64 = (txn ApplicationID)
let tmp%64#0: bool = (! tmp%63#0)
- (assert tmp%64#0) // is creating
+ (assert tmp%64#0) // can only call when creating
return 1u
block@13: // after_if_else_L27
return 0u
diff --git a/examples/amm/out/client_ConstantProductAMM.py b/examples/amm/out/client_ConstantProductAMM.py
index 27dddb37a5..1ce44d23e3 100644
--- a/examples/amm/out/client_ConstantProductAMM.py
+++ b/examples/amm/out/client_ConstantProductAMM.py
@@ -21,7 +21,7 @@ def bootstrap(
b_asset: algopy.Asset,
) -> algopy.arc4.UIntN[typing.Literal[64]]: ...
- @algopy.arc4.abimethod(default_args={'pool_asset': 'pool_token', 'a_asset': 'asset_a', 'b_asset': 'asset_b'})
+ @algopy.arc4.abimethod
def mint(
self,
a_xfer: algopy.gtxn.AssetTransferTransaction,
@@ -31,7 +31,7 @@ def mint(
b_asset: algopy.Asset,
) -> None: ...
- @algopy.arc4.abimethod(default_args={'pool_asset': 'pool_token', 'a_asset': 'asset_a', 'b_asset': 'asset_b'})
+ @algopy.arc4.abimethod
def burn(
self,
pool_xfer: algopy.gtxn.AssetTransferTransaction,
@@ -40,7 +40,7 @@ def burn(
b_asset: algopy.Asset,
) -> None: ...
- @algopy.arc4.abimethod(default_args={'a_asset': 'asset_a', 'b_asset': 'asset_b'})
+ @algopy.arc4.abimethod
def swap(
self,
swap_xfer: algopy.gtxn.AssetTransferTransaction,
diff --git a/examples/amm/out_O2/ConstantProductAMM.approval.teal b/examples/amm/out_O2/ConstantProductAMM.approval.teal
index f05c0010f7..bbc709265f 100644
--- a/examples/amm/out_O2/ConstantProductAMM.approval.teal
+++ b/examples/amm/out_O2/ConstantProductAMM.approval.teal
@@ -47,9 +47,9 @@ __puya_arc4_router__:
__puya_arc4_router___set_governor_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txnas Accounts
@@ -60,9 +60,9 @@ __puya_arc4_router___set_governor_route@2:
__puya_arc4_router___bootstrap_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txn GroupIndex
intc_1 // 1
-
@@ -89,9 +89,9 @@ __puya_arc4_router___bootstrap_route@3:
__puya_arc4_router___mint_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txn GroupIndex
pushint 2 // 2
-
@@ -124,9 +124,9 @@ __puya_arc4_router___mint_route@4:
__puya_arc4_router___burn_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txn GroupIndex
intc_1 // 1
-
@@ -151,9 +151,9 @@ __puya_arc4_router___burn_route@5:
__puya_arc4_router___swap_route@6:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txn GroupIndex
intc_1 // 1
-
@@ -177,7 +177,7 @@ __puya_arc4_router___bare_routing@9:
bnz __puya_arc4_router___after_if_else@13
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/examples/amm/out_O2/ConstantProductAMM.destructured.ir b/examples/amm/out_O2/ConstantProductAMM.destructured.ir
index bc63039488..99941b7517 100644
--- a/examples/amm/out_O2/ConstantProductAMM.destructured.ir
+++ b/examples/amm/out_O2/ConstantProductAMM.destructured.ir
@@ -31,9 +31,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@2: // set_governor_route_L43
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0)
@@ -42,9 +42,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@3: // bootstrap_route_L49
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (! tmp%10#0)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%14#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -64,9 +64,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@4: // mint_route_L81
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (! tmp%22#0)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -91,9 +91,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@5: // burn_route_L147
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
let tmp%41#0: uint64 = (txn GroupIndex)
let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u)
let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0)
@@ -113,9 +113,9 @@ contract examples.amm.contract.ConstantProductAMM:
block@6: // swap_route_L204
let tmp%51#0: uint64 = (txn OnCompletion)
let tmp%52#0: bool = (! tmp%51#0)
- (assert tmp%52#0) // OnCompletion is NoOp
+ (assert tmp%52#0) // OnCompletion is not NoOp
let tmp%53#0: uint64 = (txn ApplicationID)
- (assert tmp%53#0) // is not creating
+ (assert tmp%53#0) // can only call when not creating
let tmp%55#0: uint64 = (txn GroupIndex)
let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u)
let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0)
@@ -135,7 +135,7 @@ contract examples.amm.contract.ConstantProductAMM:
block@10: // __algopy_default_create_L1
let tmp%63#0: uint64 = (txn ApplicationID)
let tmp%64#0: bool = (! tmp%63#0)
- (assert tmp%64#0) // is creating
+ (assert tmp%64#0) // can only call when creating
return 1u
block@13: // after_if_else_L27
return 0u
diff --git a/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal b/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal
index 514bb3a8b5..742adae4f7 100644
--- a/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal
+++ b/examples/amm/out_unoptimized/ConstantProductAMM.approval.teal
@@ -76,11 +76,11 @@ __puya_arc4_router___set_governor_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txna ApplicationArgs 1
@@ -98,11 +98,11 @@ __puya_arc4_router___bootstrap_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex
@@ -145,11 +145,11 @@ __puya_arc4_router___mint_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex
@@ -206,11 +206,11 @@ __puya_arc4_router___burn_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex
@@ -257,11 +257,11 @@ __puya_arc4_router___swap_route@6:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// amm/contract.py:27
// class ConstantProductAMM(ARC4Contract):
txn GroupIndex
@@ -308,7 +308,7 @@ __puya_arc4_router_____algopy_default_create@10:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir
index 8955b74db2..47e2d1bf7b 100644
--- a/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir
+++ b/examples/amm/out_unoptimized/ConstantProductAMM.destructured.ir
@@ -32,10 +32,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@2: // set_governor_route_L43
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = ((txnas Accounts) tmp%8#0)
@@ -44,10 +44,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@3: // bootstrap_route_L49
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (== tmp%10#0 NoOp)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
let tmp%13#0: bool = (!= tmp%12#0 0u)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%14#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%14#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -67,10 +67,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@4: // mint_route_L81
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (== tmp%22#0 NoOp)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (!= tmp%24#0 0u)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%26#0 2u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -95,10 +95,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@5: // burn_route_L147
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (== tmp%37#0 NoOp)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
let tmp%40#0: bool = (!= tmp%39#0 0u)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
let tmp%41#0: uint64 = (txn GroupIndex)
let gtxn_idx%3#0: uint64 = (- tmp%41#0 1u)
let gtxn_type%3#0: uint64 = ((gtxns TypeEnum) gtxn_idx%3#0)
@@ -118,10 +118,10 @@ contract examples.amm.contract.ConstantProductAMM:
block@6: // swap_route_L204
let tmp%51#0: uint64 = (txn OnCompletion)
let tmp%52#0: bool = (== tmp%51#0 NoOp)
- (assert tmp%52#0) // OnCompletion is NoOp
+ (assert tmp%52#0) // OnCompletion is not NoOp
let tmp%53#0: uint64 = (txn ApplicationID)
let tmp%54#0: bool = (!= tmp%53#0 0u)
- (assert tmp%54#0) // is not creating
+ (assert tmp%54#0) // can only call when not creating
let tmp%55#0: uint64 = (txn GroupIndex)
let gtxn_idx%4#0: uint64 = (- tmp%55#0 1u)
let gtxn_type%4#0: uint64 = ((gtxns TypeEnum) gtxn_idx%4#0)
@@ -145,7 +145,7 @@ contract examples.amm.contract.ConstantProductAMM:
block@10: // __algopy_default_create_L1
let tmp%63#0: uint64 = (txn ApplicationID)
let tmp%64#0: bool = (== tmp%63#0 0u)
- (assert tmp%64#0) // is creating
+ (assert tmp%64#0) // can only call when creating
examples.amm.contract.ConstantProductAMM.__algopy_default_create()
return 1u
block@11: // switch_case_default_L27
diff --git a/examples/amm/puya.log b/examples/amm/puya.log
index b5410c8e19..c7720866d6 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 845c7aaaaf..2bb6b91697 100644
--- a/examples/arc_28/out/EventEmitter.approval.mir
+++ b/examples/arc_28/out/EventEmitter.approval.mir
@@ -34,9 +34,9 @@ __puya_arc4_router___emit_swapped_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// arc_28/contract.py:11
// class EventEmitter(ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -54,9 +54,9 @@ __puya_arc4_router___emit_ufixed_route@3:
// @arc4.abimethod()
txn OnCompletion tmp%9#0
! tmp%10#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%11#0
- assert // is not creating
+ assert // can only call when not creating
// arc_28/contract.py:11
// class EventEmitter(ARC4Contract):
txna ApplicationArgs 1 tmp%13#0
@@ -79,7 +79,7 @@ __puya_arc4_router___bare_routing@6:
__puya_arc4_router_____algopy_default_create@7:
txn ApplicationID tmp%16#0
! tmp%17#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
@@ -105,16 +105,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
@@ -138,7 +138,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.approval.teal b/examples/arc_28/out/EventEmitter.approval.teal
index a9149fc187..0a4eeb8d08 100644
--- a/examples/arc_28/out/EventEmitter.approval.teal
+++ b/examples/arc_28/out/EventEmitter.approval.teal
@@ -24,9 +24,9 @@ __puya_arc4_router___emit_swapped_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// arc_28/contract.py:11
// class EventEmitter(ARC4Contract):
txna ApplicationArgs 1
@@ -42,9 +42,9 @@ __puya_arc4_router___emit_ufixed_route@3:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// arc_28/contract.py:11
// class EventEmitter(ARC4Contract):
txna ApplicationArgs 1
@@ -62,7 +62,7 @@ __puya_arc4_router___bare_routing@6:
bnz __puya_arc4_router___after_if_else@10
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/examples/arc_28/out/EventEmitter.arc32.json b/examples/arc_28/out/EventEmitter.arc32.json
index a4a51beaa0..efa6c58bd0 100644
--- a/examples/arc_28/out/EventEmitter.arc32.json
+++ b/examples/arc_28/out/EventEmitter.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDBhOTU0MmNkIDB4NzFhMzE1MWYgLy8gbWV0aG9kICJlbWl0X3N3YXBwZWQodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJlbWl0X3VmaXhlZCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4Mil2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDI6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBFdmVudEVtaXR0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVtaXRfc3dhcHBlZAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGVtaXRfdWZpeGVkCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXJjXzI4LmNvbnRyYWN0LkV2ZW50RW1pdHRlci5lbWl0X3N3YXBwZWQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgplbWl0X3N3YXBwZWQ6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTItMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVtaXRfc3dhcHBlZChzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxNAogICAgLy8gYXJjNC5lbWl0KFN3YXBwZWQoYiwgYSkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxY2NiZDkyNSAvLyBtZXRob2QgIlN3YXBwZWQodWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTUKICAgIC8vIGFyYzQuZW1pdCgiU3dhcHBlZCh1aW50NjQsdWludDY0KSIsIGIsIGEpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhcmM0LmVtaXQoIlN3YXBwZWQiLCBiLCBhKQogICAgbG9nCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmVtaXRfdWZpeGVkKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdm9pZDoKZW1pdF91Zml4ZWQ6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTgtMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZW1pdF91Zml4ZWQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhOiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLAogICAgLy8gICAgIGI6IGFyYzQuVUZpeGVkTnhNW3R5cGluZy5MaXRlcmFsWzY0XSwgdHlwaW5nLkxpdGVyYWxbMl1dLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MjQKICAgIC8vIGFyYzQuZW1pdCgiQW5FdmVudCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4MikiLCBhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NzM4OWIxYmEgLy8gbWV0aG9kICJBbkV2ZW50KHVmaXhlZDI1NngxNix1Zml4ZWQ2NHgyKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDBhOTU0MmNkIDB4NzFhMzE1MWYgLy8gbWV0aG9kICJlbWl0X3N3YXBwZWQodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJlbWl0X3VmaXhlZCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4Mil2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDI6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZW1pdF9zd2FwcGVkCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0X3VmaXhlZF9yb3V0ZUAzOgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBlbWl0X3VmaXhlZAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBFdmVudEVtaXR0ZXIoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmVtaXRfc3dhcHBlZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CmVtaXRfc3dhcHBlZDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZW1pdF9zd2FwcGVkKHNlbGYsIGE6IGFyYzQuVUludDY0LCBiOiBhcmM0LlVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE0CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZChiLCBhKSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDFjY2JkOTI1IC8vIG1ldGhvZCAiU3dhcHBlZCh1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxNQogICAgLy8gYXJjNC5lbWl0KCJTd2FwcGVkKHVpbnQ2NCx1aW50NjQpIiwgYiwgYSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTYKICAgIC8vIGFyYzQuZW1pdCgiU3dhcHBlZCIsIGIsIGEpCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFyY18yOC5jb250cmFjdC5FdmVudEVtaXR0ZXIuZW1pdF91Zml4ZWQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgplbWl0X3VmaXhlZDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxOC0yMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBlbWl0X3VmaXhlZCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGE6IGFyYzQuQmlnVUZpeGVkTnhNW3R5cGluZy5MaXRlcmFsWzI1Nl0sIHR5cGluZy5MaXRlcmFsWzE2XV0sCiAgICAvLyAgICAgYjogYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbNjRdLCB0eXBpbmcuTGl0ZXJhbFsyXV0sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToyNAogICAgLy8gYXJjNC5lbWl0KCJBbkV2ZW50KHVmaXhlZDI1NngxNix1Zml4ZWQ2NHgyKSIsIGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg3Mzg5YjFiYSAvLyBtZXRob2QgIkFuRXZlbnQodWZpeGVkMjU2eDE2LHVmaXhlZDY0eDIpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
diff --git a/examples/arc_28/out/EventEmitter.arc56.json b/examples/arc_28/out/EventEmitter.arc56.json
new file mode 100644
index 0000000000..19d5c6d073
--- /dev/null
+++ b/examples/arc_28/out/EventEmitter.arc56.json
@@ -0,0 +1,219 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 43,
+ 61
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 84
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 46,
+ 64
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDBhOTU0MmNkIDB4NzFhMzE1MWYgLy8gbWV0aG9kICJlbWl0X3N3YXBwZWQodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJlbWl0X3VmaXhlZCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4Mil2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDI6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZW1pdF9zd2FwcGVkCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0X3VmaXhlZF9yb3V0ZUAzOgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBlbWl0X3VmaXhlZAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIEV2ZW50RW1pdHRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBFdmVudEVtaXR0ZXIoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmVtaXRfc3dhcHBlZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CmVtaXRfc3dhcHBlZDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZW1pdF9zd2FwcGVkKHNlbGYsIGE6IGFyYzQuVUludDY0LCBiOiBhcmM0LlVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE0CiAgICAvLyBhcmM0LmVtaXQoU3dhcHBlZChiLCBhKSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDFjY2JkOTI1IC8vIG1ldGhvZCAiU3dhcHBlZCh1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxNQogICAgLy8gYXJjNC5lbWl0KCJTd2FwcGVkKHVpbnQ2NCx1aW50NjQpIiwgYiwgYSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTYKICAgIC8vIGFyYzQuZW1pdCgiU3dhcHBlZCIsIGIsIGEpCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFyY18yOC5jb250cmFjdC5FdmVudEVtaXR0ZXIuZW1pdF91Zml4ZWQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgplbWl0X3VmaXhlZDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxOC0yMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBlbWl0X3VmaXhlZCgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGE6IGFyYzQuQmlnVUZpeGVkTnhNW3R5cGluZy5MaXRlcmFsWzI1Nl0sIHR5cGluZy5MaXRlcmFsWzE2XV0sCiAgICAvLyAgICAgYjogYXJjNC5VRml4ZWROeE1bdHlwaW5nLkxpdGVyYWxbNjRdLCB0eXBpbmcuTGl0ZXJhbFsyXV0sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToyNAogICAgLy8gYXJjNC5lbWl0KCJBbkV2ZW50KHVmaXhlZDI1NngxNix1Zml4ZWQ2NHgyKSIsIGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg3Mzg5YjFiYSAvLyBtZXRob2QgIkFuRXZlbnQodWZpeGVkMjU2eDE2LHVmaXhlZDY0eDIpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiACAQCIAAFDigABMRtBADuCAgQKlULNBHGjFR82GgCOAgACABQjiTEZFEQxGEQ2GgE2GgKIACEiiTEZFEQxGEQ2GgE2GgKIACUiiTEZQAAGMRgURCKJI4mKAgCL/4v+UIAEHMvZJUxQSbBJsLCJigIAi/6L/1CABHOJsbpMULCJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "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": {}
+}
\ 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 e6398ae78b..e7262f2440 100644
--- a/examples/arc_28/out/EventEmitter.destructured.ir
+++ b/examples/arc_28/out/EventEmitter.destructured.ir
@@ -15,9 +15,9 @@ contract examples.arc_28.contract.EventEmitter:
block@2: // emit_swapped_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0)
@@ -25,9 +25,9 @@ contract examples.arc_28.contract.EventEmitter:
block@3: // emit_ufixed_route_L18
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = (txna ApplicationArgs 1)
let tmp%14#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0)
@@ -38,7 +38,7 @@ contract examples.arc_28.contract.EventEmitter:
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L11
return 0u
@@ -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 d6ab7c516c..51c871040d 100644
--- a/examples/arc_28/out/EventEmitter.ssa.ir
+++ b/examples/arc_28/out/EventEmitter.ssa.ir
@@ -16,10 +16,10 @@ contract examples.arc_28.contract.EventEmitter:
block@2: // emit_swapped_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0)
@@ -27,10 +27,10 @@ contract examples.arc_28.contract.EventEmitter:
block@3: // emit_ufixed_route_L18
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 NoOp)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (!= tmp%11#0 0u)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%13#0: bytes = (txna ApplicationArgs 1)
let tmp%14#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0)
@@ -45,7 +45,7 @@ contract examples.arc_28.contract.EventEmitter:
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (== tmp%16#0 0u)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
examples.arc_28.contract.EventEmitter.__algopy_default_create()
return 1u
block@8: // switch_case_default_L11
@@ -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 eec5395287..87af5ba3f5 100644
--- a/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir
+++ b/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir
@@ -15,9 +15,9 @@ contract examples.arc_28.contract.EventEmitter:
block@2: // emit_swapped_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0)
@@ -25,9 +25,9 @@ contract examples.arc_28.contract.EventEmitter:
block@3: // emit_ufixed_route_L18
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = (txna ApplicationArgs 1)
let tmp%14#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0)
@@ -38,7 +38,7 @@ contract examples.arc_28.contract.EventEmitter:
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L11
return 0u
@@ -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 e6398ae78b..e7262f2440 100644
--- a/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir
+++ b/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir
@@ -15,9 +15,9 @@ contract examples.arc_28.contract.EventEmitter:
block@2: // emit_swapped_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0)
@@ -25,9 +25,9 @@ contract examples.arc_28.contract.EventEmitter:
block@3: // emit_ufixed_route_L18
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = (txna ApplicationArgs 1)
let tmp%14#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0)
@@ -38,7 +38,7 @@ contract examples.arc_28.contract.EventEmitter:
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L11
return 0u
@@ -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 e8e5c520b1..283892aa07 100644
--- a/examples/arc_28/out/module.awst
+++ b/examples/arc_28/out/module.awst
@@ -16,14 +16,14 @@ contract EventEmitter
abimethod examples.arc_28.contract.EventEmitter.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 examples.arc_28.contract.EventEmitter.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))
}
baremethod examples.arc_28.contract.EventEmitter.__algopy_default_create(): void
diff --git a/examples/arc_28/out_O2/EventEmitter.approval.teal b/examples/arc_28/out_O2/EventEmitter.approval.teal
index a804dc0069..8378c10ee5 100644
--- a/examples/arc_28/out_O2/EventEmitter.approval.teal
+++ b/examples/arc_28/out_O2/EventEmitter.approval.teal
@@ -20,9 +20,9 @@ __puya_arc4_router__:
__puya_arc4_router___emit_swapped_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
txna ApplicationArgs 2
callsub emit_swapped
@@ -32,9 +32,9 @@ __puya_arc4_router___emit_swapped_route@2:
__puya_arc4_router___emit_ufixed_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
txna ApplicationArgs 2
callsub emit_ufixed
@@ -46,7 +46,7 @@ __puya_arc4_router___bare_routing@6:
bnz __puya_arc4_router___after_if_else@10
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/examples/arc_28/out_O2/EventEmitter.destructured.ir b/examples/arc_28/out_O2/EventEmitter.destructured.ir
index e6398ae78b..e7262f2440 100644
--- a/examples/arc_28/out_O2/EventEmitter.destructured.ir
+++ b/examples/arc_28/out_O2/EventEmitter.destructured.ir
@@ -15,9 +15,9 @@ contract examples.arc_28.contract.EventEmitter:
block@2: // emit_swapped_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0)
@@ -25,9 +25,9 @@ contract examples.arc_28.contract.EventEmitter:
block@3: // emit_ufixed_route_L18
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = (txna ApplicationArgs 1)
let tmp%14#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0)
@@ -38,7 +38,7 @@ contract examples.arc_28.contract.EventEmitter:
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L11
return 0u
@@ -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.approval.teal b/examples/arc_28/out_unoptimized/EventEmitter.approval.teal
index abe41c22a7..b58ee4e527 100644
--- a/examples/arc_28/out_unoptimized/EventEmitter.approval.teal
+++ b/examples/arc_28/out_unoptimized/EventEmitter.approval.teal
@@ -29,11 +29,11 @@ __puya_arc4_router___emit_swapped_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// arc_28/contract.py:11
// class EventEmitter(ARC4Contract):
txna ApplicationArgs 1
@@ -50,11 +50,11 @@ __puya_arc4_router___emit_ufixed_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// arc_28/contract.py:11
// class EventEmitter(ARC4Contract):
txna ApplicationArgs 1
@@ -81,7 +81,7 @@ __puya_arc4_router_____algopy_default_create@7:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir b/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir
index 18b6675a5f..877104a918 100644
--- a/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir
+++ b/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir
@@ -16,10 +16,10 @@ contract examples.arc_28.contract.EventEmitter:
block@2: // emit_swapped_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_swapped(tmp%7#0, tmp%8#0)
@@ -27,10 +27,10 @@ contract examples.arc_28.contract.EventEmitter:
block@3: // emit_ufixed_route_L18
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 NoOp)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (!= tmp%11#0 0u)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%13#0: bytes = (txna ApplicationArgs 1)
let tmp%14#0: bytes = (txna ApplicationArgs 2)
examples.arc_28.contract.EventEmitter.emit_ufixed(tmp%13#0, tmp%14#0)
@@ -45,7 +45,7 @@ contract examples.arc_28.contract.EventEmitter:
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (== tmp%16#0 0u)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
examples.arc_28.contract.EventEmitter.__algopy_default_create()
return 1u
block@8: // switch_case_default_L11
@@ -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 82741a52ea..edf4abd904 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.approval.mir b/examples/auction/out/Auction.approval.mir
index 9426d2a5e7..66ed5d16aa 100644
--- a/examples/auction/out/Auction.approval.mir
+++ b/examples/auction/out/Auction.approval.mir
@@ -83,9 +83,9 @@ __puya_arc4_router___opt_into_asset_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -102,9 +102,9 @@ __puya_arc4_router___start_auction_route@3:
// @arc4.abimethod
txn OnCompletion tmp%10#0
! tmp%11#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%12#0
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1 tmp%14#0
@@ -133,9 +133,9 @@ __puya_arc4_router___opt_in_route@4:
// @arc4.abimethod
txn OnCompletion tmp%19#0
! tmp%20#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%21#0
- assert // is not creating
+ assert // can only call when not creating
int 1 1
retsub 1
@@ -144,9 +144,9 @@ __puya_arc4_router___bid_route@5:
// @arc4.abimethod
txn OnCompletion tmp%23#0
! tmp%24#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%25#0
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txn GroupIndex tmp%27#0
@@ -169,9 +169,9 @@ __puya_arc4_router___claim_bids_route@6:
// @arc4.abimethod
txn OnCompletion tmp%28#0
! tmp%29#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%30#0
- assert // is not creating
+ assert // can only call when not creating
callsub claim_bids
int 1 1
retsub 1
@@ -181,9 +181,9 @@ __puya_arc4_router___claim_asset_route@7:
// @arc4.abimethod
txn OnCompletion tmp%32#0
! tmp%33#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%34#0
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1 tmp%36#0
@@ -205,7 +205,7 @@ __puya_arc4_router___bare_routing@10:
__puya_arc4_router_____algopy_default_create@11:
txn ApplicationID tmp%40#0
! tmp%41#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/examples/auction/out/Auction.approval.teal b/examples/auction/out/Auction.approval.teal
index e62e2862a0..20301c8c04 100644
--- a/examples/auction/out/Auction.approval.teal
+++ b/examples/auction/out/Auction.approval.teal
@@ -63,9 +63,9 @@ __puya_arc4_router___opt_into_asset_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1
@@ -82,9 +82,9 @@ __puya_arc4_router___start_auction_route@3:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1
@@ -110,9 +110,9 @@ __puya_arc4_router___opt_in_route@4:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_1 // 1
retsub
@@ -121,9 +121,9 @@ __puya_arc4_router___bid_route@5:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txn GroupIndex
@@ -145,9 +145,9 @@ __puya_arc4_router___claim_bids_route@6:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub claim_bids
intc_1 // 1
retsub
@@ -157,9 +157,9 @@ __puya_arc4_router___claim_asset_route@7:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1
@@ -178,7 +178,7 @@ __puya_arc4_router___bare_routing@10:
bnz __puya_arc4_router___after_if_else@14
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/examples/auction/out/Auction.arc32.json b/examples/auction/out/Auction.arc32.json
index ff28182475..2ac484c7a8 100644
--- a/examples/auction/out/Auction.arc32.json
+++ b/examples/auction/out/Auction.arc32.json
@@ -32,7 +32,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgNAogICAgYnl0ZWNibG9jayAiYXVjdGlvbl9lbmQiICJwcmV2aW91c19iaWQiICJwcmV2aW91c19iaWRkZXIiICJhc2FfYW1vdW50IiAiYXNhIiAiY2xhaW0iCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImF1Y3Rpb25fZW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmFzYV9hbW91bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzMgLy8gImFzYV9hbW91bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjEKICAgIC8vIHNlbGYuYXNhID0gQXNzZXQoKQogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEFjY291bnQoKQogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweDI4MjZiMjAyIDB4ZjBhYTcwMjMgMHgzMGM2ZDU4YSAweGRiN2ZlODQzIDB4ZTY1NDYyNWIgMHgxZWMxMmJlZiAvLyBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiLCBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJvcHRfaW4oKXZvaWQiLCBtZXRob2QgImJpZChwYXkpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RhcnRfYXVjdGlvbl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NsYWltX2JpZHNfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9hc3NldF9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW50b19hc3NldF9yb3V0ZUAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcHRfaW50b19hc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc3RhcnRfYXVjdGlvbl9yb3V0ZUAzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc3RhcnRfYXVjdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luX3JvdXRlQDQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBiaWQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NsYWltX2JpZHNfcm91dGVANjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBjbGFpbV9iaWRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9hc3NldF9yb3V0ZUA3OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbGFpbV9hc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLm9wdF9pbnRvX2Fzc2V0KGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6Cm9wdF9pbnRvX2Fzc2V0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNS0yNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3B0X2ludG9fYXNzZXQoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjI3LTI4CiAgICAvLyAjIE9ubHkgYWxsb3cgYXBwIGNyZWF0b3IgdG8gb3B0IHRoZSBhcHAgYWNjb3VudCBpbnRvIGEgQVNBCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIGNhbiBvcHQgaW4gdG8gQVNBIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyOS0zMAogICAgLy8gIyBWZXJpZnkgYSBBU0EgaGFzbid0IGFscmVhZHkgYmVlbiBvcHRlZCBpbnRvCiAgICAvLyBhc3NlcnQgc2VsZi5hc2EuaWQgPT0gMCwgIkFTQSBhbHJlYWR5IG9wdGVkIGluIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2EgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQVNBIGFscmVhZHkgb3B0ZWQgaW4KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzEtMzIKICAgIC8vICMgU2F2ZSBBU0EgSUQgaW4gZ2xvYmFsIHN0YXRlCiAgICAvLyBzZWxmLmFzYSA9IGFzc2V0CiAgICBieXRlYyA0IC8vICJhc2EiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM4CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM1CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MzQtMzgKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5zdGFydF9hdWN0aW9uKHN0YXJ0aW5nX3ByaWNlOiB1aW50NjQsIGxlbmd0aDogdWludDY0LCBheGZlcjogdWludDY0KSAtPiB2b2lkOgpzdGFydF9hdWN0aW9uOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MC00NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc3RhcnRfYXVjdGlvbigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHN0YXJ0aW5nX3ByaWNlOiBVSW50NjQsCiAgICAvLyAgICAgbGVuZ3RoOiBVSW50NjQsCiAgICAvLyAgICAgYXhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBhdWN0aW9uIG11c3QgYmUgc3RhcnRlZCBieSBjcmVhdG9yCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQ5LTUwCiAgICAvLyAjIEVuc3VyZSB0aGUgYXVjdGlvbiBoYXNuJ3QgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKICAgIC8vIGFzc2VydCBzZWxmLmF1Y3Rpb25fZW5kID09IDAsICJhdWN0aW9uIGFscmVhZHkgc3RhcnRlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhdWN0aW9uIGFscmVhZHkgc3RhcnRlZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo1NAogICAgLy8gYXhmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTItNTUKICAgIC8vICMgVmVyaWZ5IGF4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwIgogICAgYXNzZXJ0IC8vIGF4ZmVyIG11c3QgdHJhbnNmZXIgdG8gdGhpcyBhcHAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTctNTgKICAgIC8vICMgU2V0IGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2FfYW1vdW50ID0gYXhmZXIuYXNzZXRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBieXRlY18zIC8vICJhc2FfYW1vdW50IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTkKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGxlbmd0aAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IHN0YXJ0aW5nX3ByaWNlCiAgICBieXRlY18xIC8vICJwcmV2aW91c19iaWQiCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYmlkKHBheTogdWludDY0KSAtPiB2b2lkOgpiaWQ6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjY2LTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBiaWQoc2VsZiwgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBFbnN1cmUgYXVjdGlvbiBoYXNuJ3QgZW5kZWQKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuYXVjdGlvbl9lbmQsICJhdWN0aW9uIGhhcyBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgIDwKICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBlbmRlZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3MS03MgogICAgLy8gIyBWZXJpZnkgcGF5bWVudCB0cmFuc2FjdGlvbgogICAgLy8gYXNzZXJ0IHBheS5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInBheW1lbnQgc2VuZGVyIG11c3QgbWF0Y2ggdHJhbnNhY3Rpb24gc2VuZGVyIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBTZW5kZXIKICAgIGR1cAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3MwogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgPiBzZWxmLnByZXZpb3VzX2JpZCwgIkJpZCBtdXN0IGJlIGhpZ2hlciB0aGFuIHByZXZpb3VzIGJpZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByZXZpb3VzX2JpZCBleGlzdHMKICAgIGRpZyAxCiAgICA8CiAgICBhc3NlcnQgLy8gQmlkIG11c3QgYmUgaGlnaGVyIHRoYW4gcHJldmlvdXMgYmlkCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIHNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkID0gcGF5LmFtb3VudAogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IHBheS5zZW5kZXIKICAgIGJ5dGVjXzIgLy8gInByZXZpb3VzX2JpZGRlciIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzktODAKICAgIC8vICMgVXBkYXRlIGNsYWltYWJsZSBhbW91bnQKICAgIC8vIHNlbGYuY2xhaW1hYmxlX2Ftb3VudFtUeG4uc2VuZGVyXSA9IHBheS5hbW91bnQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjIDUgLy8gImNsYWltIgogICAgdW5jb3ZlciAyCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xhaW1fYmlkcygpIC0+IHZvaWQ6CmNsYWltX2JpZHM6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjgyLTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbGFpbV9iaWRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODQKICAgIC8vIGFtb3VudCA9IG9yaWdpbmFsX2Ftb3VudCA9IHNlbGYuY2xhaW1hYmxlX2Ftb3VudFtUeG4uc2VuZGVyXQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNsYWltIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNsYWltYWJsZV9hbW91bnQgZXhpc3RzIGZvciBhY2NvdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyAjIHN1YnRyYWN0IHByZXZpb3VzIGJpZCBpZiBzZW5kZXIgaXMgcHJldmlvdXMgYmlkZGVyCiAgICAvLyBpZiBUeG4uc2VuZGVyID09IHNlbGYucHJldmlvdXNfYmlkZGVyOgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWRkZXIgZXhpc3RzCiAgICA9PQogICAgYnogY2xhaW1fYmlkc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6ODgKICAgIC8vIGFtb3VudCAtPSBzZWxmLnByZXZpb3VzX2JpZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpjbGFpbV9iaWRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAtOTMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkyCiAgICAvLyByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MC05MwogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIGFtb3VudD1hbW91bnQsCiAgICAvLyAgICAgcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0gPSBvcmlnaW5hbF9hbW91bnQgLSBhbW91bnQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAwCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGJ5dGVjIDUgLy8gImNsYWltIgogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2Fzc2V0KGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmNsYWltX2Fzc2V0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5Ny05OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYXNzZXQoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgbm90IGVuZGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImF1Y3Rpb25fZW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1Y3Rpb25fZW5kIGV4aXN0cwogICAgPgogICAgYXNzZXJ0IC8vIGF1Y3Rpb24gaGFzIG5vdCBlbmRlZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTA2CiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NldF9jbG9zZV90bz1zZWxmLnByZXZpb3VzX2JpZGRlciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInByZXZpb3VzX2JpZGRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWRkZXIgZXhpc3RzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhc2FfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzYV9hbW91bnQgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwMC0xMDEKICAgIC8vICMgU2VuZCBBU0EgdG8gcHJldmlvdXMgYmlkZGVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTA2CiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PXNlbGYuYXNhX2Ftb3VudCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgNAogICAgYnl0ZWNibG9jayAiYXVjdGlvbl9lbmQiICJwcmV2aW91c19iaWQiICJwcmV2aW91c19iaWRkZXIiICJhc2FfYW1vdW50IiAiYXNhIiAiY2xhaW0iCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImF1Y3Rpb25fZW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmFzYV9hbW91bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzMgLy8gImFzYV9hbW91bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjEKICAgIC8vIHNlbGYuYXNhID0gQXNzZXQoKQogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEFjY291bnQoKQogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweDI4MjZiMjAyIDB4ZjBhYTcwMjMgMHgzMGM2ZDU4YSAweGRiN2ZlODQzIDB4ZTY1NDYyNWIgMHgxZWMxMmJlZiAvLyBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiLCBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJvcHRfaW4oKXZvaWQiLCBtZXRob2QgImJpZChwYXkpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RhcnRfYXVjdGlvbl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NsYWltX2JpZHNfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9hc3NldF9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW50b19hc3NldF9yb3V0ZUAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wdF9pbnRvX2Fzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zdGFydF9hdWN0aW9uX3JvdXRlQDM6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJpZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYmlkc19yb3V0ZUA2OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1fYmlkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYXNzZXRfcm91dGVANzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbGFpbV9hc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmlkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFTQSBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zOAogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zNQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMiAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM4CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uc3RhcnRfYXVjdGlvbihzdGFydGluZ19wcmljZTogdWludDY0LCBsZW5ndGg6IHVpbnQ2NCwgYXhmZXI6IHVpbnQ2NCkgLT4gdm9pZDoKc3RhcnRfYXVjdGlvbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDAtNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHN0YXJ0X2F1Y3Rpb24oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzdGFydGluZ19wcmljZTogVUludDY0LAogICAgLy8gICAgIGxlbmd0aDogVUludDY0LAogICAgLy8gICAgIGF4ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0NwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImF1Y3Rpb24gbXVzdCBiZSBzdGFydGVkIGJ5IGNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0OS01MAogICAgLy8gIyBFbnN1cmUgdGhlIGF1Y3Rpb24gaGFzbid0IGFscmVhZHkgYmVlbiBzdGFydGVkCiAgICAvLyBhc3NlcnQgc2VsZi5hdWN0aW9uX2VuZCA9PSAwLCAiYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTQKICAgIC8vIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUyLTU1CiAgICAvLyAjIFZlcmlmeSBheGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiYXhmZXIgbXVzdCB0cmFuc2ZlciB0byB0aGlzIGFwcCIKICAgIGFzc2VydCAvLyBheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU3LTU4CiAgICAvLyAjIFNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IGF4ZmVyLmFzc2V0X2Ftb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYnl0ZWNfMyAvLyAiYXNhX2Ftb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBsZW5ndGgKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBzdGFydGluZ19wcmljZQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmJpZChwYXk6IHVpbnQ2NCkgLT4gdm9pZDoKYmlkOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYmlkKHNlbGYsIHBheTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgRW5zdXJlIGF1Y3Rpb24gaGFzbid0IGVuZGVkCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgZW5kZWQiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBoYXMgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzEtNzIKICAgIC8vICMgVmVyaWZ5IHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXkuc2VuZGVyID09IFR4bi5zZW5kZXIsICJwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID4gc2VsZi5wcmV2aW91c19iaWQsICJCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIEJpZCBtdXN0IGJlIGhpZ2hlciB0aGFuIHByZXZpb3VzIGJpZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NS03NgogICAgLy8gIyBzZXQgZ2xvYmFsIHN0YXRlCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IHBheS5hbW91bnQKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5wcmV2aW91c19iaWRkZXIgPSBwYXkuc2VuZGVyCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyAjIFVwZGF0ZSBjbGFpbWFibGUgYW1vdW50CiAgICAvLyBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0gPSBwYXkuYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2JpZHMoKSAtPiB2b2lkOgpjbGFpbV9iaWRzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYmlkcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBhbW91bnQgPSBvcmlnaW5hbF9hbW91bnQgPSBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0KICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGFpbWFibGVfYW1vdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Ni04NwogICAgLy8gIyBzdWJ0cmFjdCBwcmV2aW91cyBiaWQgaWYgc2VuZGVyIGlzIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLnByZXZpb3VzX2JpZGRlcjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgPT0KICAgIGJ6IGNsYWltX2JpZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhbW91bnQgLT0gc2VsZi5wcmV2aW91c19iaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwcmV2aW91c19iaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMQoKY2xhaW1fYmlkc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwLTkzCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAtOTMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gb3JpZ2luYWxfYW1vdW50IC0gYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTctOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsYWltX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5hdWN0aW9uX2VuZCwgImF1Y3Rpb24gaGFzIG5vdCBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByZXZpb3VzX2JpZGRlciBleGlzdHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NldF9yZWNlaXZlcj1zZWxmLnByZXZpb3VzX2JpZGRlciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYXNhX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfYW1vdW50IGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTE2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
diff --git a/examples/auction/out/Auction.arc56.json b/examples/auction/out/Auction.arc56.json
new file mode 100644
index 0000000000..41a1ff759d
--- /dev/null
+++ b/examples/auction/out/Auction.arc56.json
@@ -0,0 +1,360 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 299
+ ],
+ "errorMessage": "ASA already opted in"
+ },
+ {
+ "pc": [
+ 396
+ ],
+ "errorMessage": "Bid must be higher than previous bid"
+ },
+ {
+ "pc": [
+ 165,
+ 183,
+ 213,
+ 222,
+ 244,
+ 256
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 292
+ ],
+ "errorMessage": "Only creator can opt in to ASA"
+ },
+ {
+ "pc": [
+ 336
+ ],
+ "errorMessage": "auction already started"
+ },
+ {
+ "pc": [
+ 375
+ ],
+ "errorMessage": "auction has ended"
+ },
+ {
+ "pc": [
+ 486
+ ],
+ "errorMessage": "auction has not ended"
+ },
+ {
+ "pc": [
+ 330
+ ],
+ "errorMessage": "auction must be started by creator"
+ },
+ {
+ "pc": [
+ 344
+ ],
+ "errorMessage": "axfer must transfer to this app"
+ },
+ {
+ "pc": [
+ 279
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 168,
+ 186,
+ 216,
+ 225,
+ 247,
+ 259
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 297
+ ],
+ "errorMessage": "check self.asa exists"
+ },
+ {
+ "pc": [
+ 499
+ ],
+ "errorMessage": "check self.asa_amount exists"
+ },
+ {
+ "pc": [
+ 334,
+ 373,
+ 484
+ ],
+ "errorMessage": "check self.auction_end exists"
+ },
+ {
+ "pc": [
+ 426
+ ],
+ "errorMessage": "check self.claimable_amount exists for account"
+ },
+ {
+ "pc": [
+ 392,
+ 440
+ ],
+ "errorMessage": "check self.previous_bid exists"
+ },
+ {
+ "pc": [
+ 432,
+ 491,
+ 495
+ ],
+ "errorMessage": "check self.previous_bidder exists"
+ },
+ {
+ "pc": [
+ 384
+ ],
+ "errorMessage": "payment sender must match transaction sender"
+ },
+ {
+ "pc": [
+ 204
+ ],
+ "errorMessage": "transaction type is axfer"
+ },
+ {
+ "pc": [
+ 235
+ ],
+ "errorMessage": "transaction type is pay"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgNAogICAgYnl0ZWNibG9jayAiYXVjdGlvbl9lbmQiICJwcmV2aW91c19iaWQiICJwcmV2aW91c19iaWRkZXIiICJhc2FfYW1vdW50IiAiYXNhIiAiY2xhaW0iCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTgKICAgIC8vIHNlbGYuYXVjdGlvbl9lbmQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImF1Y3Rpb25fZW5kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmFzYV9hbW91bnQgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzMgLy8gImFzYV9hbW91bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjEKICAgIC8vIHNlbGYuYXNhID0gQXNzZXQoKQogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZGRlciA9IEFjY291bnQoKQogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweDI4MjZiMjAyIDB4ZjBhYTcwMjMgMHgzMGM2ZDU4YSAweGRiN2ZlODQzIDB4ZTY1NDYyNWIgMHgxZWMxMmJlZiAvLyBtZXRob2QgIm9wdF9pbnRvX2Fzc2V0KGFzc2V0KXZvaWQiLCBtZXRob2QgInN0YXJ0X2F1Y3Rpb24odWludDY0LHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJvcHRfaW4oKXZvaWQiLCBtZXRob2QgImJpZChwYXkpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYmlkcygpdm9pZCIsIG1ldGhvZCAiY2xhaW1fYXNzZXQoYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RhcnRfYXVjdGlvbl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NsYWltX2JpZHNfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9hc3NldF9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW50b19hc3NldF9yb3V0ZUAyOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wdF9pbnRvX2Fzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zdGFydF9hdWN0aW9uX3JvdXRlQDM6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JpZF9yb3V0ZUA1OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJpZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYmlkc19yb3V0ZUA2OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1fYmlkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYXNzZXRfcm91dGVANzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbGFpbV9hc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmlkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFTQSBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWMgNCAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zOAogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zNQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMiAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM4CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uc3RhcnRfYXVjdGlvbihzdGFydGluZ19wcmljZTogdWludDY0LCBsZW5ndGg6IHVpbnQ2NCwgYXhmZXI6IHVpbnQ2NCkgLT4gdm9pZDoKc3RhcnRfYXVjdGlvbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDAtNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHN0YXJ0X2F1Y3Rpb24oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzdGFydGluZ19wcmljZTogVUludDY0LAogICAgLy8gICAgIGxlbmd0aDogVUludDY0LAogICAgLy8gICAgIGF4ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0NwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImF1Y3Rpb24gbXVzdCBiZSBzdGFydGVkIGJ5IGNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0OS01MAogICAgLy8gIyBFbnN1cmUgdGhlIGF1Y3Rpb24gaGFzbid0IGFscmVhZHkgYmVlbiBzdGFydGVkCiAgICAvLyBhc3NlcnQgc2VsZi5hdWN0aW9uX2VuZCA9PSAwLCAiYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTQKICAgIC8vIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUyLTU1CiAgICAvLyAjIFZlcmlmeSBheGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiYXhmZXIgbXVzdCB0cmFuc2ZlciB0byB0aGlzIGFwcCIKICAgIGFzc2VydCAvLyBheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU3LTU4CiAgICAvLyAjIFNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IGF4ZmVyLmFzc2V0X2Ftb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYnl0ZWNfMyAvLyAiYXNhX2Ftb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBsZW5ndGgKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBzdGFydGluZ19wcmljZQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmJpZChwYXk6IHVpbnQ2NCkgLT4gdm9pZDoKYmlkOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYmlkKHNlbGYsIHBheTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgRW5zdXJlIGF1Y3Rpb24gaGFzbid0IGVuZGVkCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgZW5kZWQiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBoYXMgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzEtNzIKICAgIC8vICMgVmVyaWZ5IHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXkuc2VuZGVyID09IFR4bi5zZW5kZXIsICJwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID4gc2VsZi5wcmV2aW91c19iaWQsICJCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIEJpZCBtdXN0IGJlIGhpZ2hlciB0aGFuIHByZXZpb3VzIGJpZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NS03NgogICAgLy8gIyBzZXQgZ2xvYmFsIHN0YXRlCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IHBheS5hbW91bnQKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5wcmV2aW91c19iaWRkZXIgPSBwYXkuc2VuZGVyCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyAjIFVwZGF0ZSBjbGFpbWFibGUgYW1vdW50CiAgICAvLyBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0gPSBwYXkuYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2JpZHMoKSAtPiB2b2lkOgpjbGFpbV9iaWRzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYmlkcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBhbW91bnQgPSBvcmlnaW5hbF9hbW91bnQgPSBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0KICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGFpbWFibGVfYW1vdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Ni04NwogICAgLy8gIyBzdWJ0cmFjdCBwcmV2aW91cyBiaWQgaWYgc2VuZGVyIGlzIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLnByZXZpb3VzX2JpZGRlcjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgPT0KICAgIGJ6IGNsYWltX2JpZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhbW91bnQgLT0gc2VsZi5wcmV2aW91c19iaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwcmV2aW91c19iaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMQoKY2xhaW1fYmlkc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwLTkzCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAtOTMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gb3JpZ2luYWxfYW1vdW50IC0gYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTctOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsYWltX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5hdWN0aW9uX2VuZCwgImF1Y3Rpb24gaGFzIG5vdCBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByZXZpb3VzX2JpZGRlciBleGlzdHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NldF9yZWNlaXZlcj1zZWxmLnByZXZpb3VzX2JpZGRlciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiYXNhX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfYW1vdW50IGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTE2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "byteCode": {
+ "approval": "CiADAAEEJgYLYXVjdGlvbl9lbmQMcHJldmlvdXNfYmlkD3ByZXZpb3VzX2JpZGRlcgphc2FfYW1vdW50A2FzYQVjbGFpbTEYQAADiAAEiAAWQ4oAACgiZykiZysiZycEImcqMgNniYoAATEbQQCgggYEKCayAgTwqnAjBDDG1YoE23/oQwTmVGJbBB7BK+82GgCOBgACABQAMgA7AFEAXSKJMRkURDEYRDYaARfAMIgAaiOJMRkURDEYRDYaARc2GgIXMRYjCUk4ECQSRIgAciOJMRkURDEYRCOJMRkURDEYRDEWIwlJOBAjEkSIAH4jiTEZFEQxGESIAKIjiTEZFEQxGEQ2GgEXwDCIAM8jiTEZQAAGMRgURCOJIomKAQAxADIJEkQiJwRlRBREJwSL/2exMgqL/7IRshQkshAisgGziYoDADEAMgkSRCIoZUQURIv/OBQyChJEi/84EitMZzIHi/4IKExnKYv9Z4mKAQAyByIoZUQMRIv/OABJMQASRIv/OAgiKWVESwEMRClLAWcqTwJnMQAnBU8CZomKAAAxACInBWNMSU8CRDEAIiplRBJBAAoiKWVEiwBMCYwBsTEAsgeLAUmyCCOyECKyAbMxAIsATwIJJwVMZomKAQAyByIoZUQNRLEiKmVEIiplRCIrZUSyErIUshWL/7IRJLIQIrIBs4k=",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/examples/auction/out/Auction.destructured.ir b/examples/auction/out/Auction.destructured.ir
index fbc0ab2858..b387e33b2c 100644
--- a/examples/auction/out/Auction.destructured.ir
+++ b/examples/auction/out/Auction.destructured.ir
@@ -31,9 +31,9 @@ contract examples.auction.contract.Auction:
block@2: // opt_into_asset_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0)
@@ -42,9 +42,9 @@ contract examples.auction.contract.Auction:
block@3: // start_auction_route_L40
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (! tmp%10#0)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%14#0: bytes = (txna ApplicationArgs 1)
let tmp%15#0: uint64 = (btoi tmp%14#0)
let tmp%16#0: bytes = (txna ApplicationArgs 2)
@@ -59,16 +59,16 @@ contract examples.auction.contract.Auction:
block@4: // opt_in_route_L62
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
return 1u
block@5: // bid_route_L66
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
let tmp%27#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -79,17 +79,17 @@ contract examples.auction.contract.Auction:
block@6: // claim_bids_route_L82
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
examples.auction.contract.Auction.claim_bids()
return 1u
block@7: // claim_asset_route_L97
let tmp%32#0: uint64 = (txn OnCompletion)
let tmp%33#0: bool = (! tmp%32#0)
- (assert tmp%33#0) // OnCompletion is NoOp
+ (assert tmp%33#0) // OnCompletion is not NoOp
let tmp%34#0: uint64 = (txn ApplicationID)
- (assert tmp%34#0) // is not creating
+ (assert tmp%34#0) // can only call when not creating
let tmp%36#0: bytes = (txna ApplicationArgs 1)
let tmp%37#0: uint64 = (btoi tmp%36#0)
let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0)
@@ -101,7 +101,7 @@ contract examples.auction.contract.Auction:
block@11: // __algopy_default_create_L1
let tmp%40#0: uint64 = (txn ApplicationID)
let tmp%41#0: bool = (! tmp%40#0)
- (assert tmp%41#0) // is creating
+ (assert tmp%41#0) // can only call when creating
return 1u
block@14: // after_if_else_L16
return 0u
diff --git a/examples/auction/out/Auction.ssa.ir b/examples/auction/out/Auction.ssa.ir
index e8695f632c..591591e97d 100644
--- a/examples/auction/out/Auction.ssa.ir
+++ b/examples/auction/out/Auction.ssa.ir
@@ -32,10 +32,10 @@ contract examples.auction.contract.Auction:
block@2: // opt_into_asset_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0)
@@ -44,10 +44,10 @@ contract examples.auction.contract.Auction:
block@3: // start_auction_route_L40
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (== tmp%10#0 NoOp)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
let tmp%13#0: bool = (!= tmp%12#0 0u)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%14#0: bytes = (txna ApplicationArgs 1)
let tmp%15#0: uint64 = (btoi tmp%14#0)
let tmp%16#0: bytes = (txna ApplicationArgs 2)
@@ -62,19 +62,19 @@ contract examples.auction.contract.Auction:
block@4: // opt_in_route_L62
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (== tmp%19#0 NoOp)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
examples.auction.contract.Auction.opt_in()
return 1u
block@5: // bid_route_L66
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (== tmp%23#0 NoOp)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
let tmp%26#0: bool = (!= tmp%25#0 0u)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let tmp%27#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -85,19 +85,19 @@ contract examples.auction.contract.Auction:
block@6: // claim_bids_route_L82
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (== tmp%28#0 NoOp)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
let tmp%31#0: bool = (!= tmp%30#0 0u)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.auction.contract.Auction.claim_bids()
return 1u
block@7: // claim_asset_route_L97
let tmp%32#0: uint64 = (txn OnCompletion)
let tmp%33#0: bool = (== tmp%32#0 NoOp)
- (assert tmp%33#0) // OnCompletion is NoOp
+ (assert tmp%33#0) // OnCompletion is not NoOp
let tmp%34#0: uint64 = (txn ApplicationID)
let tmp%35#0: bool = (!= tmp%34#0 0u)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
let tmp%36#0: bytes = (txna ApplicationArgs 1)
let tmp%37#0: uint64 = (btoi tmp%36#0)
let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0)
@@ -113,7 +113,7 @@ contract examples.auction.contract.Auction:
block@11: // __algopy_default_create_L1
let tmp%40#0: uint64 = (txn ApplicationID)
let tmp%41#0: bool = (== tmp%40#0 0u)
- (assert tmp%41#0) // is creating
+ (assert tmp%41#0) // can only call when creating
examples.auction.contract.Auction.__algopy_default_create()
return 1u
block@12: // switch_case_default_L16
diff --git a/examples/auction/out/Auction.ssa.opt_pass_1.ir b/examples/auction/out/Auction.ssa.opt_pass_1.ir
index 90d31666f7..0a5fa81bd2 100644
--- a/examples/auction/out/Auction.ssa.opt_pass_1.ir
+++ b/examples/auction/out/Auction.ssa.opt_pass_1.ir
@@ -31,9 +31,9 @@ contract examples.auction.contract.Auction:
block@2: // opt_into_asset_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0)
@@ -42,9 +42,9 @@ contract examples.auction.contract.Auction:
block@3: // start_auction_route_L40
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (! tmp%10#0)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%14#0: bytes = (txna ApplicationArgs 1)
let tmp%15#0: uint64 = (btoi tmp%14#0)
let tmp%16#0: bytes = (txna ApplicationArgs 2)
@@ -59,16 +59,16 @@ contract examples.auction.contract.Auction:
block@4: // opt_in_route_L62
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
return 1u
block@5: // bid_route_L66
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
let tmp%27#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -79,17 +79,17 @@ contract examples.auction.contract.Auction:
block@6: // claim_bids_route_L82
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
examples.auction.contract.Auction.claim_bids()
return 1u
block@7: // claim_asset_route_L97
let tmp%32#0: uint64 = (txn OnCompletion)
let tmp%33#0: bool = (! tmp%32#0)
- (assert tmp%33#0) // OnCompletion is NoOp
+ (assert tmp%33#0) // OnCompletion is not NoOp
let tmp%34#0: uint64 = (txn ApplicationID)
- (assert tmp%34#0) // is not creating
+ (assert tmp%34#0) // can only call when not creating
let tmp%36#0: bytes = (txna ApplicationArgs 1)
let tmp%37#0: uint64 = (btoi tmp%36#0)
let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0)
@@ -101,7 +101,7 @@ contract examples.auction.contract.Auction:
block@11: // __algopy_default_create_L1
let tmp%40#0: uint64 = (txn ApplicationID)
let tmp%41#0: bool = (! tmp%40#0)
- (assert tmp%41#0) // is creating
+ (assert tmp%41#0) // can only call when creating
return 1u
block@14: // after_if_else_L16
return 0u
diff --git a/examples/auction/out_O2/Auction.approval.teal b/examples/auction/out_O2/Auction.approval.teal
index 6ba5f4b68a..eaf1718140 100644
--- a/examples/auction/out_O2/Auction.approval.teal
+++ b/examples/auction/out_O2/Auction.approval.teal
@@ -47,9 +47,9 @@ __puya_arc4_router__:
__puya_arc4_router___opt_into_asset_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txnas Assets
@@ -60,9 +60,9 @@ __puya_arc4_router___opt_into_asset_route@2:
__puya_arc4_router___start_auction_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txna ApplicationArgs 2
@@ -82,18 +82,18 @@ __puya_arc4_router___start_auction_route@3:
__puya_arc4_router___opt_in_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_1 // 1
retsub
__puya_arc4_router___bid_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txn GroupIndex
intc_1 // 1
-
@@ -109,9 +109,9 @@ __puya_arc4_router___bid_route@5:
__puya_arc4_router___claim_bids_route@6:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub claim_bids
intc_1 // 1
retsub
@@ -119,9 +119,9 @@ __puya_arc4_router___claim_bids_route@6:
__puya_arc4_router___claim_asset_route@7:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txnas Assets
@@ -134,7 +134,7 @@ __puya_arc4_router___bare_routing@10:
bnz __puya_arc4_router___after_if_else@14
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/examples/auction/out_O2/Auction.destructured.ir b/examples/auction/out_O2/Auction.destructured.ir
index fbc0ab2858..b387e33b2c 100644
--- a/examples/auction/out_O2/Auction.destructured.ir
+++ b/examples/auction/out_O2/Auction.destructured.ir
@@ -31,9 +31,9 @@ contract examples.auction.contract.Auction:
block@2: // opt_into_asset_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0)
@@ -42,9 +42,9 @@ contract examples.auction.contract.Auction:
block@3: // start_auction_route_L40
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (! tmp%10#0)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%14#0: bytes = (txna ApplicationArgs 1)
let tmp%15#0: uint64 = (btoi tmp%14#0)
let tmp%16#0: bytes = (txna ApplicationArgs 2)
@@ -59,16 +59,16 @@ contract examples.auction.contract.Auction:
block@4: // opt_in_route_L62
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
return 1u
block@5: // bid_route_L66
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
let tmp%27#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -79,17 +79,17 @@ contract examples.auction.contract.Auction:
block@6: // claim_bids_route_L82
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
examples.auction.contract.Auction.claim_bids()
return 1u
block@7: // claim_asset_route_L97
let tmp%32#0: uint64 = (txn OnCompletion)
let tmp%33#0: bool = (! tmp%32#0)
- (assert tmp%33#0) // OnCompletion is NoOp
+ (assert tmp%33#0) // OnCompletion is not NoOp
let tmp%34#0: uint64 = (txn ApplicationID)
- (assert tmp%34#0) // is not creating
+ (assert tmp%34#0) // can only call when not creating
let tmp%36#0: bytes = (txna ApplicationArgs 1)
let tmp%37#0: uint64 = (btoi tmp%36#0)
let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0)
@@ -101,7 +101,7 @@ contract examples.auction.contract.Auction:
block@11: // __algopy_default_create_L1
let tmp%40#0: uint64 = (txn ApplicationID)
let tmp%41#0: bool = (! tmp%40#0)
- (assert tmp%41#0) // is creating
+ (assert tmp%41#0) // can only call when creating
return 1u
block@14: // after_if_else_L16
return 0u
diff --git a/examples/auction/out_unoptimized/Auction.approval.teal b/examples/auction/out_unoptimized/Auction.approval.teal
index 69e38d504b..3a9b1e4dad 100644
--- a/examples/auction/out_unoptimized/Auction.approval.teal
+++ b/examples/auction/out_unoptimized/Auction.approval.teal
@@ -72,11 +72,11 @@ __puya_arc4_router___opt_into_asset_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1
@@ -94,11 +94,11 @@ __puya_arc4_router___start_auction_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1
@@ -128,11 +128,11 @@ __puya_arc4_router___opt_in_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub opt_in
intc_1 // 1
retsub
@@ -143,11 +143,11 @@ __puya_arc4_router___bid_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txn GroupIndex
@@ -170,11 +170,11 @@ __puya_arc4_router___claim_bids_route@6:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub claim_bids
intc_1 // 1
retsub
@@ -185,11 +185,11 @@ __puya_arc4_router___claim_asset_route@7:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// auction/contract.py:16
// class Auction(ARC4Contract):
txna ApplicationArgs 1
@@ -217,7 +217,7 @@ __puya_arc4_router_____algopy_default_create@11:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/examples/auction/out_unoptimized/Auction.destructured.ir b/examples/auction/out_unoptimized/Auction.destructured.ir
index 22ed8e5563..9efadc17a6 100644
--- a/examples/auction/out_unoptimized/Auction.destructured.ir
+++ b/examples/auction/out_unoptimized/Auction.destructured.ir
@@ -32,10 +32,10 @@ contract examples.auction.contract.Auction:
block@2: // opt_into_asset_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: uint64 = ((txnas Assets) tmp%8#0)
@@ -44,10 +44,10 @@ contract examples.auction.contract.Auction:
block@3: // start_auction_route_L40
let tmp%10#0: uint64 = (txn OnCompletion)
let tmp%11#0: bool = (== tmp%10#0 NoOp)
- (assert tmp%11#0) // OnCompletion is NoOp
+ (assert tmp%11#0) // OnCompletion is not NoOp
let tmp%12#0: uint64 = (txn ApplicationID)
let tmp%13#0: bool = (!= tmp%12#0 0u)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%14#0: bytes = (txna ApplicationArgs 1)
let tmp%15#0: uint64 = (btoi tmp%14#0)
let tmp%16#0: bytes = (txna ApplicationArgs 2)
@@ -62,19 +62,19 @@ contract examples.auction.contract.Auction:
block@4: // opt_in_route_L62
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (== tmp%19#0 NoOp)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
examples.auction.contract.Auction.opt_in()
return 1u
block@5: // bid_route_L66
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (== tmp%23#0 NoOp)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
let tmp%26#0: bool = (!= tmp%25#0 0u)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let tmp%27#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%27#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
@@ -85,19 +85,19 @@ contract examples.auction.contract.Auction:
block@6: // claim_bids_route_L82
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (== tmp%28#0 NoOp)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
let tmp%31#0: bool = (!= tmp%30#0 0u)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.auction.contract.Auction.claim_bids()
return 1u
block@7: // claim_asset_route_L97
let tmp%32#0: uint64 = (txn OnCompletion)
let tmp%33#0: bool = (== tmp%32#0 NoOp)
- (assert tmp%33#0) // OnCompletion is NoOp
+ (assert tmp%33#0) // OnCompletion is not NoOp
let tmp%34#0: uint64 = (txn ApplicationID)
let tmp%35#0: bool = (!= tmp%34#0 0u)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
let tmp%36#0: bytes = (txna ApplicationArgs 1)
let tmp%37#0: uint64 = (btoi tmp%36#0)
let tmp%38#0: uint64 = ((txnas Assets) tmp%37#0)
@@ -113,7 +113,7 @@ contract examples.auction.contract.Auction:
block@11: // __algopy_default_create_L1
let tmp%40#0: uint64 = (txn ApplicationID)
let tmp%41#0: bool = (== tmp%40#0 0u)
- (assert tmp%41#0) // is creating
+ (assert tmp%41#0) // can only call when creating
examples.auction.contract.Auction.__algopy_default_create()
return 1u
block@12: // switch_case_default_L16
diff --git a/examples/auction/puya.log b/examples/auction/puya.log
index b047c30db9..3072366120 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.approval.mir b/examples/box_storage/out/BoxContract.approval.mir
index 42960caf55..6cef8213ad 100644
--- a/examples/box_storage/out/BoxContract.approval.mir
+++ b/examples/box_storage/out/BoxContract.approval.mir
@@ -45,9 +45,9 @@ __puya_arc4_router___set_boxes_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -68,9 +68,9 @@ __puya_arc4_router___check_keys_route@3:
// @arc4.abimethod
txn OnCompletion tmp%11#0
! tmp%12#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%13#0
- assert // is not creating
+ assert // can only call when not creating
int 1 1
retsub 1
@@ -79,9 +79,9 @@ __puya_arc4_router___delete_boxes_route@4:
// @arc4.abimethod
txn OnCompletion tmp%15#0
! tmp%16#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%17#0
- assert // is not creating
+ assert // can only call when not creating
callsub delete_boxes
int 1 1
retsub 1
@@ -91,9 +91,9 @@ __puya_arc4_router___read_boxes_route@5:
// @arc4.abimethod
txn OnCompletion tmp%19#0
! tmp%20#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%21#0
- assert // is not creating
+ assert // can only call when not creating
callsub read_boxes elements_to_encode%0#0,elements_to_encode%1#0,elements_to_encode%2#0
l-load elements_to_encode%0#0 2 elements_to_encode%1#0,elements_to_encode%2#0,elements_to_encode%0#0
itob elements_to_encode%1#0,elements_to_encode%2#0,val_as_bytes%0#0
@@ -132,9 +132,9 @@ __puya_arc4_router___boxes_exist_route@6:
// @arc4.abimethod
txn OnCompletion tmp%24#0
! tmp%25#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%26#0
- assert // is not creating
+ assert // can only call when not creating
callsub boxes_exist elements_to_encode%3#0,elements_to_encode%4#0,elements_to_encode%5#0
byte 0x00 elements_to_encode%3#0,elements_to_encode%4#0,elements_to_encode%5#0,0x00
int 0 elements_to_encode%3#0,elements_to_encode%4#0,elements_to_encode%5#0,0x00,0
@@ -174,9 +174,9 @@ __puya_arc4_router___slice_box_route@7:
// @arc4.abimethod
txn OnCompletion tmp%29#0
! tmp%30#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%31#0
- assert // is not creating
+ assert // can only call when not creating
callsub slice_box
int 1 1
retsub 1
@@ -186,9 +186,9 @@ __puya_arc4_router___arc4_box_route@8:
// @arc4.abimethod
txn OnCompletion tmp%33#0
! tmp%34#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%35#0
- assert // is not creating
+ assert // can only call when not creating
callsub arc4_box
int 1 1
retsub 1
@@ -198,9 +198,9 @@ __puya_arc4_router___test_box_ref_route@9:
// @arc4.abimethod
txn OnCompletion tmp%37#0
! tmp%38#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%39#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_box_ref
int 1 1
retsub 1
@@ -210,9 +210,9 @@ __puya_arc4_router___box_map_test_route@10:
// @arc4.abimethod
txn OnCompletion tmp%41#0
! tmp%42#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%43#0
- assert // is not creating
+ assert // can only call when not creating
callsub box_map_test
int 1 1
retsub 1
@@ -222,9 +222,9 @@ __puya_arc4_router___box_map_set_route@11:
// @arc4.abimethod
txn OnCompletion tmp%45#0
! tmp%46#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%47#0
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%49#0
@@ -244,9 +244,9 @@ __puya_arc4_router___box_map_get_route@12:
// @arc4.abimethod
txn OnCompletion tmp%53#0
! tmp%54#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%55#0
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%57#0
@@ -272,9 +272,9 @@ __puya_arc4_router___box_map_del_route@13:
// @arc4.abimethod
txn OnCompletion tmp%60#0
! tmp%61#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%62#0
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%64#0
@@ -290,9 +290,9 @@ __puya_arc4_router___box_map_exists_route@14:
// @arc4.abimethod
txn OnCompletion tmp%66#0
! tmp%67#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%68#0
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%70#0
@@ -321,7 +321,7 @@ __puya_arc4_router___bare_routing@17:
__puya_arc4_router_____algopy_default_create@18:
txn ApplicationID tmp%74#0
! tmp%75#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/examples/box_storage/out/BoxContract.approval.teal b/examples/box_storage/out/BoxContract.approval.teal
index 2e7d419bf5..4da7c1077c 100644
--- a/examples/box_storage/out/BoxContract.approval.teal
+++ b/examples/box_storage/out/BoxContract.approval.teal
@@ -25,9 +25,9 @@ __puya_arc4_router___set_boxes_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -45,9 +45,9 @@ __puya_arc4_router___check_keys_route@3:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
@@ -56,9 +56,9 @@ __puya_arc4_router___delete_boxes_route@4:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub delete_boxes
intc_0 // 1
retsub
@@ -68,9 +68,9 @@ __puya_arc4_router___read_boxes_route@5:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub read_boxes
uncover 2
itob
@@ -106,9 +106,9 @@ __puya_arc4_router___boxes_exist_route@6:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub boxes_exist
bytec 5 // 0x00
intc_1 // 0
@@ -147,9 +147,9 @@ __puya_arc4_router___slice_box_route@7:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub slice_box
intc_0 // 1
retsub
@@ -159,9 +159,9 @@ __puya_arc4_router___arc4_box_route@8:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub arc4_box
intc_0 // 1
retsub
@@ -171,9 +171,9 @@ __puya_arc4_router___test_box_ref_route@9:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_box_ref
intc_0 // 1
retsub
@@ -183,9 +183,9 @@ __puya_arc4_router___box_map_test_route@10:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub box_map_test
intc_0 // 1
retsub
@@ -195,9 +195,9 @@ __puya_arc4_router___box_map_set_route@11:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -215,9 +215,9 @@ __puya_arc4_router___box_map_get_route@12:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -243,9 +243,9 @@ __puya_arc4_router___box_map_del_route@13:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -261,9 +261,9 @@ __puya_arc4_router___box_map_exists_route@14:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -289,7 +289,7 @@ __puya_arc4_router___bare_routing@17:
bnz __puya_arc4_router___after_if_else@21
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/examples/box_storage/out/BoxContract.arc32.json b/examples/box_storage/out/BoxContract.arc32.json
index 2d76cd02f8..e7c69b0684 100644
--- a/examples/box_storage/out/BoxContract.arc32.json
+++ b/examples/box_storage/out/BoxContract.arc32.json
@@ -67,7 +67,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAyIDUKICAgIGJ5dGVjYmxvY2sgMHg0MjRmNTg1ZjQzIDB4NjI2YzZmNjIgImJveF9kIiAiYm94X2EiICJiIiAweDAwIDB4NjQgMHgxNTFmN2M3NSAiMCIgMHg2ODY1NmM2YzZmIDB4MDAwMjM0MzIgImJveF9yZWYiICJkZWZhdWx0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE3CiAgICBwdXNoYnl0ZXNzIDB4N2QzNzI5NmUgMHgzMzMyNWQzZCAweGQ1NjZjNjMyIDB4ZmJkYTliYTAgMHhlNWEzZWQ1MiAweDA0ZWY0OTcxIDB4MjNlY2IzMmMgMHhlZWY3NTgxNiAweGI1MzI5MTNhIDB4YzI5ZjE2NjkgMHg5Yzg4OGMwOSAweGU2ZjY4NTA2IDB4OGVlMmMzNjQgLy8gbWV0aG9kICJzZXRfYm94ZXModWludDY0LGJ5dGVbXSxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY2hlY2tfa2V5cygpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcpIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAic2xpY2VfYm94KCl2b2lkIiwgbWV0aG9kICJhcmM0X2JveCgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib3hfcmVmKCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2JveGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2hlY2tfa2V5c19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9ib3hlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlYWRfYm94ZXNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ib3hfcmVmX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZ2V0X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZGVsX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZXhpc3RzX3JvdXRlQDE0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYm94ZXNfcm91dGVAMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jaGVja19rZXlzX3JvdXRlQDM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfYm94ZXNfcm91dGVANDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlX2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWFkX2JveGVzX3JvdXRlQDU6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHJlYWRfYm94ZXMKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDBjCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hlc19leGlzdAogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIGludGNfMiAvLyAyCiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzbGljZV9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzRfYm94CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2JveF9yZWZfcm91dGVAOToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9ib3hfcmVmCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX3Rlc3Rfcm91dGVAMTA6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hfbWFwX3Rlc3QKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9nZXRfcm91dGVAMTI6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm94X21hcF9nZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX2RlbF9yb3V0ZUAxMzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2RlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9leGlzdHNfcm91dGVAMTQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm94X21hcF9leGlzdHMKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTc6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXMoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMpIC0+IHZvaWQ6CnNldF9ib3hlczoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3LTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYm94ZXMoc2VsZiwgYTogVUludDY0LCBiOiBhcmM0LkR5bmFtaWNCeXRlcywgYzogYXJjNC5TdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlID0gYQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmJveF9iLnZhbHVlID0gYi5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBzZWxmLmJveF9jLnZhbHVlID0gYwogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjIKICAgIC8vIHNlbGYuYm94X2QudmFsdWUgPSBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBiX3ZhbHVlID0gc2VsZi5ib3hfYi52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi52YWx1ZS5sZW5ndGggPT0gYl92YWx1ZS5sZW5ndGgsICJkaXJlY3QgcmVmZXJlbmNlIHNob3VsZCBtYXRjaCBjb3B5IgogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgID09CiAgICBhc3NlcnQgLy8gZGlyZWN0IHJlZmVyZW5jZSBzaG91bGQgbWF0Y2ggY29weQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjcKICAgIC8vIHNlbGYuYm94X2EudmFsdWUgKz0gMwogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYSBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2EgZXhpc3RzCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBzZWxmLmJveF9iLmxlbmd0aCA9PSBiLmJ5dGVzLmxlbmd0aAogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2QgZXhpc3RzCiAgICBkaWcgMgogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgdGVzdCAudmFsdWUuYnl0ZXMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzBdID09IGMuYnl0ZXNbMF0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzEgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6LTFdID09IGMuYnl0ZXNbOi0xXQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAxCiAgICA8CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDMKICAgID49CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyB0ZXN0IC52YWx1ZSB3aXRoIEJ5dGVzIHR5cGUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzBdID09IGIubmF0aXZlWzBdCiAgICBieXRlY18yIC8vICJib3hfZCIKICAgIGludGNfMSAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWy0xXSA9PSBiLm5hdGl2ZVstMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZGlnIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6LTFdID09IGIubmF0aXZlWzotMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICBzd2FwCiAgICAtCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzo1XSA9PSBiLm5hdGl2ZVs6NV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gNQogICAgZGlnIDEKICAgIDwKICAgIGludGNfMyAvLyA1CiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMyAvLyA1CiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMyAvLyA1CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGRlbGV0ZV9ib3hlcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NgogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NwogICAgLy8gZGVsIHNlbGYuYm94X2IudmFsdWUKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBkZWwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IuZ2V0KGRlZmF1bHQ9YXJjNC5EeW5hbWljQnl0ZXMoYiI0MiIpKS5uYXRpdmUgPT0gYiI0MiIKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MuZ2V0KGRlZmF1bHQ9YXJjNC5TdHJpbmcoIjQyIikpID09ICI0MiIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMjM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhLCBhX2V4aXN0cyA9IHNlbGYuYm94X2EubWF5YmUoKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MwogICAgLy8gYXNzZXJ0IG5vdCBhX2V4aXN0cwogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGEgPT0gMAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5yZWFkX2JveGVzKCkgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CnJlYWRfYm94ZXM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmVhZF9ib3hlcyhzZWxmKSAtPiB0dXBsZVtVSW50NjQsIEJ5dGVzLCBhcmM0LlN0cmluZ106CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gZ2V0X2JveF92YWx1ZV9wbHVzXzEoc2VsZi5ib3hfYSkgLSAxLCBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBjYWxsc3ViIGdldF9ib3hfdmFsdWVfcGx1c18xCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LmdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X2JveF92YWx1ZV9wbHVzXzE6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzktMTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogQm94W1VJbnQ2NF0pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gYm94LnZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0KCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NDoKYm94ZXNfZXhpc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MC03MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm94ZXNfZXhpc3Qoc2VsZikgLT4gdHVwbGVbYm9vbCwgYm9vbCwgYm9vbF06CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjcyCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LnNsaWNlX2JveCgpIC0+IHZvaWQ6CnNsaWNlX2JveDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0LTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzbGljZV9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3NgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDggLy8gIjAiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3OAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBkaWcgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDcgLy8gNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzgKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHB1c2hieXRlcyAweDAwMDU0ODY1NmM2YzZmCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMjoxMF0gPT0gYiJIZWxsbyIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmFyYzRfYm94KCkgLT4gdm9pZDoKYXJjNF9ib3g6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4My04NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXJjNF9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODYKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAyMDMKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMF0gPT0gMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODkKICAgIC8vIGFzc2VydCBib3hfZC52YWx1ZVsxXSA9PSAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMl0gPT0gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4NQogICAgLy8gYm94X2QgPSBCb3goU3RhdGljSW50cywga2V5PUJ5dGVzKGIiZCIpKQogICAgYnl0ZWMgNiAvLyAweDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IGJveF9kLnZhbHVlWzNdID09IDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QudGVzdF9ib3hfcmVmKCkgLT4gdm9pZDoKdGVzdF9ib3hfcmVmOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMtOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYm94X3JlZihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NS05NgogICAgLy8gIyBpbml0IHJlZiwgd2l0aCB2YWxpZCBrZXkgdHlwZXMKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PSJibG9iIikKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1iImJsb2IiKQogICAgYnl0ZWNfMSAvLyAweDYyNmM2ZjYyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9Qnl0ZXMoYiJibG9iIikpCiAgICBieXRlY18xIC8vIDB4NjI2YzZmNjIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDUtMTA2CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9MzIpCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgYm94X3JlZiwgImhhcyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gaGFzIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTEKICAgIC8vIGFwcF9hZGRyZXNzID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEzCiAgICAvLyBib3hfcmVmLnJlcGxhY2UoMCwgc2VuZGVyX2J5dGVzKQogICAgaW50Y18xIC8vIDAKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTQKICAgIC8vIGJveF9yZWYucmVzaXplKDgwMDApCiAgICBwdXNoaW50IDgwMDAgLy8gODAwMAogICAgYm94X3Jlc2l6ZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTUKICAgIC8vIGJveF9yZWYuc3BsaWNlKDAsIDAsIGFwcF9hZGRyZXNzKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgZGlnIDMKICAgIGJveF9zcGxpY2UKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE2CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTIKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDkgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTYKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIGJveF9yZXBsYWNlCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcHJlZml4ID0gYm94X3JlZi5leHRyYWN0KDAsIDMyICogMiArIHZhbHVlXzMubGVuZ3RoKQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hpbnQgNjkgLy8gNjkKICAgIGJveF9leHRyYWN0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEyCiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyA5IC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyMC0xMjEKICAgIC8vICMgZGVsZXRlCiAgICAvLyBhc3NlcnQgYm94X3JlZi5kZWxldGUoKQogICAgYm94X2RlbAogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYiIiCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI4CiAgICAvLyBhc3NlcnQgYm94X3JlZi5nZXQoZGVmYXVsdD1zZW5kZXJfYnl0ZXMpID09IHNlbmRlcl9ieXRlcwogICAgYm94X2dldAogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMC0xMzEKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnB1dChzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcykKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi5wdXQoc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MpCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJsb2IgZXhpc3RzCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94UmVmIGV4aXN0cwogICAgcHVzaGludCA2NCAvLyA2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBnZXRfYm94X3JlZl9sZW5ndGgoYm94X3JlZikgPT0gNjQKICAgIGNhbGxzdWIgZ2V0X2JveF9yZWZfbGVuZ3RoCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGluc3RhbmNlIGJveCByZWYKICAgIC8vIHNlbGYuYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X3JlZiwgImhhcyBkYXRhIgogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBoYXMgZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmJveF9yZWYuZGVsZXRlKCkKICAgIGJ5dGVjIDExIC8vICJib3hfcmVmIgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X3JlZl9sZW5ndGgocmVmOiBieXRlcykgLT4gdWludDY0OgpnZXRfYm94X3JlZl9sZW5ndGg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfcmVmX2xlbmd0aChyZWY6IEJveFJlZikgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiByZWYubGVuZ3RoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBCb3hSZWYgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3Rlc3QoKSAtPiB2b2lkOgpib3hfbWFwX3Rlc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX3Rlc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQzCiAgICAvLyBrZXlfMCA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDUKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDYKICAgIC8vIHNlbGYuYm94X21hcFtrZXlfMF0gPSB2YWx1ZQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwW2tleV8wXS5ieXRlcy5sZW5ndGggPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwLmxlbmd0aChrZXlfMCkgPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ0CiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X21hcC5nZXQoa2V5XzEsIGRlZmF1bHQ9U3RyaW5nKCJkZWZhdWx0IikpID09IFN0cmluZygiZGVmYXVsdCIpCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGJ5dGVjIDEyIC8vICJkZWZhdWx0IgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMiAvLyAiZGVmYXVsdCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IHNlbGYuYm94X21hcC5tYXliZShrZXlfMSkKICAgIGR1cAogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IGtleV8wIGluIHNlbGYuYm94X21hcAogICAgc3dhcAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gdG1wX2JveF9tYXBba2V5XzFdID0gU3RyaW5nKCJoZWxsbyIpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1Ni0xNTcKICAgIC8vICMgdGVzdCBib3ggbWFwIG5vdCBhc3NpZ25lZCB0byB0aGUgY2xhc3MgYW5kIHBhc3NlZCB0byBzdWJyb3V0aW5lCiAgICAvLyB0bXBfYm94X21hcCA9IEJveE1hcChVSW50NjQsIFN0cmluZywga2V5X3ByZWZpeD1CeXRlcygpKQogICAgcHVzaGJ5dGVzIDB4CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEodG1wX2JveF9tYXAsIFVJbnQ2NCgwKSkgPT0gImhlbGxvIgogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogYnl0ZXMsIGtleTogdWludDY0KSAtPiBieXRlczoKZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTg5LTE5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogQm94TWFwW1VJbnQ2NCwgU3RyaW5nXSwga2V5OiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDIgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTkxCiAgICAvLyByZXR1cm4gYm94X21hcFtrZXkgKyAxXQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3NldChrZXk6IHVpbnQ2NCwgdmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfc2V0KHNlbGYsIGtleTogVUludDY0LCB2YWx1ZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjQKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXQoa2V5OiB1aW50NjQpIC0+IGJ5dGVzOgpib3hfbWFwX2dldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Ni0xNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZ2V0KHNlbGYsIGtleTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbChrZXk6IHVpbnQ2NCkgLT4gdm9pZDoKYm94X21hcF9kZWw6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAtMTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX2RlbChzZWxmLCBrZXk6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcyCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2V4aXN0cyhrZXk6IHVpbnQ2NCkgLT4gdWludDY0Ogpib3hfbWFwX2V4aXN0czoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3NC0xNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZXhpc3RzKHNlbGYsIGtleTogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAyIDUKICAgIGJ5dGVjYmxvY2sgMHg0MjRmNTg1ZjQzIDB4NjI2YzZmNjIgImJveF9kIiAiYm94X2EiICJiIiAweDAwIDB4NjQgMHgxNTFmN2M3NSAiMCIgMHg2ODY1NmM2YzZmIDB4MDAwMjM0MzIgImJveF9yZWYiICJkZWZhdWx0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE3CiAgICBwdXNoYnl0ZXNzIDB4N2QzNzI5NmUgMHgzMzMyNWQzZCAweGQ1NjZjNjMyIDB4ZmJkYTliYTAgMHhlNWEzZWQ1MiAweDA0ZWY0OTcxIDB4MjNlY2IzMmMgMHhlZWY3NTgxNiAweGI1MzI5MTNhIDB4YzI5ZjE2NjkgMHg5Yzg4OGMwOSAweGU2ZjY4NTA2IDB4OGVlMmMzNjQgLy8gbWV0aG9kICJzZXRfYm94ZXModWludDY0LGJ5dGVbXSxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY2hlY2tfa2V5cygpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcpIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAic2xpY2VfYm94KCl2b2lkIiwgbWV0aG9kICJhcmM0X2JveCgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib3hfcmVmKCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2JveGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2hlY2tfa2V5c19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9ib3hlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlYWRfYm94ZXNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ib3hfcmVmX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZ2V0X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZGVsX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZXhpc3RzX3JvdXRlQDE0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYm94ZXNfcm91dGVAMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYm94ZXMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NoZWNrX2tleXNfcm91dGVAMzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX2JveGVzX3JvdXRlQDQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlX2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWFkX2JveGVzX3JvdXRlQDU6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgcmVhZF9ib3hlcwogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMGMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAxMiAvLyAxMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveGVzX2V4aXN0X3JvdXRlQDY6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYm94ZXNfZXhpc3QKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjXzIgLy8gMgogICAgc3dhcAogICAgc2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zbGljZV9ib3hfcm91dGVANzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzbGljZV9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjNF9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYm94X3JlZl9yb3V0ZUA5OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYm94X3JlZgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hfbWFwX3Rlc3QKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJveF9tYXBfc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX2dldF9yb3V0ZUAxMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJveF9tYXBfZ2V0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9kZWxfcm91dGVAMTM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2RlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9leGlzdHNfcm91dGVAMTQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2V4aXN0cwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXMoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMpIC0+IHZvaWQ6CnNldF9ib3hlczoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3LTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYm94ZXMoc2VsZiwgYTogVUludDY0LCBiOiBhcmM0LkR5bmFtaWNCeXRlcywgYzogYXJjNC5TdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlID0gYQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmJveF9iLnZhbHVlID0gYi5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBzZWxmLmJveF9jLnZhbHVlID0gYwogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjIKICAgIC8vIHNlbGYuYm94X2QudmFsdWUgPSBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBiX3ZhbHVlID0gc2VsZi5ib3hfYi52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi52YWx1ZS5sZW5ndGggPT0gYl92YWx1ZS5sZW5ndGgsICJkaXJlY3QgcmVmZXJlbmNlIHNob3VsZCBtYXRjaCBjb3B5IgogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgID09CiAgICBhc3NlcnQgLy8gZGlyZWN0IHJlZmVyZW5jZSBzaG91bGQgbWF0Y2ggY29weQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjcKICAgIC8vIHNlbGYuYm94X2EudmFsdWUgKz0gMwogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYSBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2EgZXhpc3RzCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBzZWxmLmJveF9iLmxlbmd0aCA9PSBiLmJ5dGVzLmxlbmd0aAogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2QgZXhpc3RzCiAgICBkaWcgMgogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgdGVzdCAudmFsdWUuYnl0ZXMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzBdID09IGMuYnl0ZXNbMF0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzEgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6LTFdID09IGMuYnl0ZXNbOi0xXQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAxCiAgICA8CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDMKICAgID49CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyB0ZXN0IC52YWx1ZSB3aXRoIEJ5dGVzIHR5cGUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzBdID09IGIubmF0aXZlWzBdCiAgICBieXRlY18yIC8vICJib3hfZCIKICAgIGludGNfMSAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWy0xXSA9PSBiLm5hdGl2ZVstMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZGlnIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6LTFdID09IGIubmF0aXZlWzotMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICBzd2FwCiAgICAtCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzo1XSA9PSBiLm5hdGl2ZVs6NV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gNQogICAgZGlnIDEKICAgIDwKICAgIGludGNfMyAvLyA1CiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMyAvLyA1CiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMyAvLyA1CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGRlbGV0ZV9ib3hlcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NgogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NwogICAgLy8gZGVsIHNlbGYuYm94X2IudmFsdWUKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBkZWwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IuZ2V0KGRlZmF1bHQ9YXJjNC5EeW5hbWljQnl0ZXMoYiI0MiIpKS5uYXRpdmUgPT0gYiI0MiIKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MuZ2V0KGRlZmF1bHQ9YXJjNC5TdHJpbmcoIjQyIikpID09ICI0MiIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMjM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhLCBhX2V4aXN0cyA9IHNlbGYuYm94X2EubWF5YmUoKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MwogICAgLy8gYXNzZXJ0IG5vdCBhX2V4aXN0cwogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGEgPT0gMAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5yZWFkX2JveGVzKCkgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CnJlYWRfYm94ZXM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmVhZF9ib3hlcyhzZWxmKSAtPiB0dXBsZVtVSW50NjQsIEJ5dGVzLCBhcmM0LlN0cmluZ106CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gZ2V0X2JveF92YWx1ZV9wbHVzXzEoc2VsZi5ib3hfYSkgLSAxLCBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBjYWxsc3ViIGdldF9ib3hfdmFsdWVfcGx1c18xCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LmdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X2JveF92YWx1ZV9wbHVzXzE6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzktMTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogQm94W1VJbnQ2NF0pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gYm94LnZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0KCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NDoKYm94ZXNfZXhpc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MC03MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm94ZXNfZXhpc3Qoc2VsZikgLT4gdHVwbGVbYm9vbCwgYm9vbCwgYm9vbF06CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjcyCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LnNsaWNlX2JveCgpIC0+IHZvaWQ6CnNsaWNlX2JveDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0LTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzbGljZV9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3NgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDggLy8gIjAiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3OAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBkaWcgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDcgLy8gNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzgKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHB1c2hieXRlcyAweDAwMDU0ODY1NmM2YzZmCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMjoxMF0gPT0gYiJIZWxsbyIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmFyYzRfYm94KCkgLT4gdm9pZDoKYXJjNF9ib3g6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4My04NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXJjNF9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODYKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAyMDMKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMF0gPT0gMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODkKICAgIC8vIGFzc2VydCBib3hfZC52YWx1ZVsxXSA9PSAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMl0gPT0gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4NQogICAgLy8gYm94X2QgPSBCb3goU3RhdGljSW50cywga2V5PUJ5dGVzKGIiZCIpKQogICAgYnl0ZWMgNiAvLyAweDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IGJveF9kLnZhbHVlWzNdID09IDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QudGVzdF9ib3hfcmVmKCkgLT4gdm9pZDoKdGVzdF9ib3hfcmVmOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMtOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYm94X3JlZihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NS05NgogICAgLy8gIyBpbml0IHJlZiwgd2l0aCB2YWxpZCBrZXkgdHlwZXMKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PSJibG9iIikKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1iImJsb2IiKQogICAgYnl0ZWNfMSAvLyAweDYyNmM2ZjYyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9Qnl0ZXMoYiJibG9iIikpCiAgICBieXRlY18xIC8vIDB4NjI2YzZmNjIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDUtMTA2CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9MzIpCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgYm94X3JlZiwgImhhcyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gaGFzIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTEKICAgIC8vIGFwcF9hZGRyZXNzID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEzCiAgICAvLyBib3hfcmVmLnJlcGxhY2UoMCwgc2VuZGVyX2J5dGVzKQogICAgaW50Y18xIC8vIDAKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTQKICAgIC8vIGJveF9yZWYucmVzaXplKDgwMDApCiAgICBwdXNoaW50IDgwMDAgLy8gODAwMAogICAgYm94X3Jlc2l6ZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTUKICAgIC8vIGJveF9yZWYuc3BsaWNlKDAsIDAsIGFwcF9hZGRyZXNzKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgZGlnIDMKICAgIGJveF9zcGxpY2UKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE2CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTIKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDkgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTYKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIGJveF9yZXBsYWNlCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcHJlZml4ID0gYm94X3JlZi5leHRyYWN0KDAsIDMyICogMiArIHZhbHVlXzMubGVuZ3RoKQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hpbnQgNjkgLy8gNjkKICAgIGJveF9leHRyYWN0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEyCiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyA5IC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyMC0xMjEKICAgIC8vICMgZGVsZXRlCiAgICAvLyBhc3NlcnQgYm94X3JlZi5kZWxldGUoKQogICAgYm94X2RlbAogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYiIiCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI4CiAgICAvLyBhc3NlcnQgYm94X3JlZi5nZXQoZGVmYXVsdD1zZW5kZXJfYnl0ZXMpID09IHNlbmRlcl9ieXRlcwogICAgYm94X2dldAogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMC0xMzEKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnB1dChzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcykKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi5wdXQoc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MpCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJsb2IgZXhpc3RzCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94UmVmIGV4aXN0cwogICAgcHVzaGludCA2NCAvLyA2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBnZXRfYm94X3JlZl9sZW5ndGgoYm94X3JlZikgPT0gNjQKICAgIGNhbGxzdWIgZ2V0X2JveF9yZWZfbGVuZ3RoCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGluc3RhbmNlIGJveCByZWYKICAgIC8vIHNlbGYuYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X3JlZiwgImhhcyBkYXRhIgogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBoYXMgZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmJveF9yZWYuZGVsZXRlKCkKICAgIGJ5dGVjIDExIC8vICJib3hfcmVmIgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X3JlZl9sZW5ndGgocmVmOiBieXRlcykgLT4gdWludDY0OgpnZXRfYm94X3JlZl9sZW5ndGg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfcmVmX2xlbmd0aChyZWY6IEJveFJlZikgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiByZWYubGVuZ3RoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBCb3hSZWYgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3Rlc3QoKSAtPiB2b2lkOgpib3hfbWFwX3Rlc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX3Rlc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQzCiAgICAvLyBrZXlfMCA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDUKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDYKICAgIC8vIHNlbGYuYm94X21hcFtrZXlfMF0gPSB2YWx1ZQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwW2tleV8wXS5ieXRlcy5sZW5ndGggPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwLmxlbmd0aChrZXlfMCkgPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ0CiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X21hcC5nZXQoa2V5XzEsIGRlZmF1bHQ9U3RyaW5nKCJkZWZhdWx0IikpID09IFN0cmluZygiZGVmYXVsdCIpCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGJ5dGVjIDEyIC8vICJkZWZhdWx0IgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMiAvLyAiZGVmYXVsdCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IHNlbGYuYm94X21hcC5tYXliZShrZXlfMSkKICAgIGR1cAogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IGtleV8wIGluIHNlbGYuYm94X21hcAogICAgc3dhcAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gdG1wX2JveF9tYXBba2V5XzFdID0gU3RyaW5nKCJoZWxsbyIpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1Ni0xNTcKICAgIC8vICMgdGVzdCBib3ggbWFwIG5vdCBhc3NpZ25lZCB0byB0aGUgY2xhc3MgYW5kIHBhc3NlZCB0byBzdWJyb3V0aW5lCiAgICAvLyB0bXBfYm94X21hcCA9IEJveE1hcChVSW50NjQsIFN0cmluZywga2V5X3ByZWZpeD1CeXRlcygpKQogICAgcHVzaGJ5dGVzIDB4CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEodG1wX2JveF9tYXAsIFVJbnQ2NCgwKSkgPT0gImhlbGxvIgogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogYnl0ZXMsIGtleTogdWludDY0KSAtPiBieXRlczoKZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTg5LTE5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogQm94TWFwW1VJbnQ2NCwgU3RyaW5nXSwga2V5OiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDIgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTkxCiAgICAvLyByZXR1cm4gYm94X21hcFtrZXkgKyAxXQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3NldChrZXk6IHVpbnQ2NCwgdmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfc2V0KHNlbGYsIGtleTogVUludDY0LCB2YWx1ZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjQKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXQoa2V5OiB1aW50NjQpIC0+IGJ5dGVzOgpib3hfbWFwX2dldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Ni0xNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZ2V0KHNlbGYsIGtleTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbChrZXk6IHVpbnQ2NCkgLT4gdm9pZDoKYm94X21hcF9kZWw6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAtMTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX2RlbChzZWxmLCBrZXk6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcyCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2V4aXN0cyhrZXk6IHVpbnQ2NCkgLT4gdWludDY0Ogpib3hfbWFwX2V4aXN0czoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3NC0xNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZXhpc3RzKHNlbGYsIGtleTogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
diff --git a/examples/box_storage/out/BoxContract.arc56.json b/examples/box_storage/out/BoxContract.arc56.json
new file mode 100644
index 0000000000..d2ed0d114f
--- /dev/null
+++ b/examples/box_storage/out/BoxContract.arc56.json
@@ -0,0 +1,475 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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": []
+ },
+ "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 not NoOp"
+ },
+ {
+ "pc": [
+ 478
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 190,
+ 212,
+ 221,
+ 233,
+ 284,
+ 334,
+ 346,
+ 358,
+ 370,
+ 382,
+ 404,
+ 433,
+ 449
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "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": [
+ 1146,
+ 1152,
+ 1158,
+ 1164
+ ],
+ "errorMessage": "no data"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAyIDUKICAgIGJ5dGVjYmxvY2sgMHg0MjRmNTg1ZjQzIDB4NjI2YzZmNjIgImJveF9kIiAiYm94X2EiICJiIiAweDAwIDB4NjQgMHgxNTFmN2M3NSAiMCIgMHg2ODY1NmM2YzZmIDB4MDAwMjM0MzIgImJveF9yZWYiICJkZWZhdWx0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE3CiAgICBwdXNoYnl0ZXNzIDB4N2QzNzI5NmUgMHgzMzMyNWQzZCAweGQ1NjZjNjMyIDB4ZmJkYTliYTAgMHhlNWEzZWQ1MiAweDA0ZWY0OTcxIDB4MjNlY2IzMmMgMHhlZWY3NTgxNiAweGI1MzI5MTNhIDB4YzI5ZjE2NjkgMHg5Yzg4OGMwOSAweGU2ZjY4NTA2IDB4OGVlMmMzNjQgLy8gbWV0aG9kICJzZXRfYm94ZXModWludDY0LGJ5dGVbXSxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY2hlY2tfa2V5cygpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcpIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAic2xpY2VfYm94KCl2b2lkIiwgbWV0aG9kICJhcmM0X2JveCgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib3hfcmVmKCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2JveGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2hlY2tfa2V5c19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9ib3hlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlYWRfYm94ZXNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ib3hfcmVmX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZ2V0X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZGVsX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZXhpc3RzX3JvdXRlQDE0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYm94ZXNfcm91dGVAMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYm94ZXMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NoZWNrX2tleXNfcm91dGVAMzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX2JveGVzX3JvdXRlQDQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlX2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWFkX2JveGVzX3JvdXRlQDU6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgcmVhZF9ib3hlcwogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMGMKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAxMiAvLyAxMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveGVzX2V4aXN0X3JvdXRlQDY6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYm94ZXNfZXhpc3QKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjXzIgLy8gMgogICAgc3dhcAogICAgc2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zbGljZV9ib3hfcm91dGVANzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzbGljZV9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjNF9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYm94X3JlZl9yb3V0ZUA5OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYm94X3JlZgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hfbWFwX3Rlc3QKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJveF9tYXBfc2V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX2dldF9yb3V0ZUAxMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGJveF9tYXBfZ2V0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9kZWxfcm91dGVAMTM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2RlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9leGlzdHNfcm91dGVAMTQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2V4aXN0cwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXMoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMpIC0+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": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/examples/box_storage/out/BoxContract.destructured.ir b/examples/box_storage/out/BoxContract.destructured.ir
index fc48967125..9020472452 100644
--- a/examples/box_storage/out/BoxContract.destructured.ir
+++ b/examples/box_storage/out/BoxContract.destructured.ir
@@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (! tmp%74#0)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
return 1u
block@21: // after_if_else_L8
return 0u
diff --git a/examples/box_storage/out/BoxContract.ssa.ir b/examples/box_storage/out/BoxContract.ssa.ir
index 3663cf9b35..3160737f17 100644
--- a/examples/box_storage/out/BoxContract.ssa.ir
+++ b/examples/box_storage/out/BoxContract.ssa.ir
@@ -26,10 +26,10 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -39,28 +39,28 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
examples.box_storage.contract.BoxContract.check_keys()
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (== tmp%15#0 NoOp)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (!= tmp%17#0 0u)
- (assert tmp%18#0) // is not creating
+ (assert tmp%18#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (== tmp%19#0 NoOp)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -88,10 +88,10 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (== tmp%24#0 NoOp)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
let tmp%27#0: bool = (!= tmp%26#0 0u)
- (assert tmp%27#0) // is not creating
+ (assert tmp%27#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -109,46 +109,46 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (== tmp%29#0 NoOp)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
let tmp%32#0: bool = (!= tmp%31#0 0u)
- (assert tmp%32#0) // is not creating
+ (assert tmp%32#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (== tmp%33#0 NoOp)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
let tmp%36#0: bool = (!= tmp%35#0 0u)
- (assert tmp%36#0) // is not creating
+ (assert tmp%36#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (== tmp%37#0 NoOp)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
let tmp%40#0: bool = (!= tmp%39#0 0u)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (== tmp%41#0 NoOp)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
let tmp%44#0: bool = (!= tmp%43#0 0u)
- (assert tmp%44#0) // is not creating
+ (assert tmp%44#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (== tmp%45#0 NoOp)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
let tmp%48#0: bool = (!= tmp%47#0 0u)
- (assert tmp%48#0) // is not creating
+ (assert tmp%48#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -158,10 +158,10 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (== tmp%53#0 NoOp)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
let tmp%56#0: bool = (!= tmp%55#0 0u)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -175,10 +175,10 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (== tmp%60#0 NoOp)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
let tmp%63#0: bool = (!= tmp%62#0 0u)
- (assert tmp%63#0) // is not creating
+ (assert tmp%63#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -186,10 +186,10 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (== tmp%66#0 NoOp)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
let tmp%69#0: bool = (!= tmp%68#0 0u)
- (assert tmp%69#0) // is not creating
+ (assert tmp%69#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -207,7 +207,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (== tmp%74#0 0u)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
examples.box_storage.contract.BoxContract.__algopy_default_create()
return 1u
block@19: // switch_case_default_L8
diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_1.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_1.ir
index 724953a488..53fb490666 100644
--- a/examples/box_storage/out/BoxContract.ssa.opt_pass_1.ir
+++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_1.ir
@@ -20,9 +20,9 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -32,25 +32,25 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
examples.box_storage.contract.BoxContract.check_keys()
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -74,9 +74,9 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -92,41 +92,41 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -136,9 +136,9 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -162,9 +162,9 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -178,7 +178,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (! tmp%74#0)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
return 1u
block@21: // after_if_else_L8
return 0u
diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_2.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_2.ir
index 65497ece24..5bfe8bbceb 100644
--- a/examples/box_storage/out/BoxContract.ssa.opt_pass_2.ir
+++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_2.ir
@@ -18,9 +18,9 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -30,25 +30,25 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
examples.box_storage.contract.BoxContract.check_keys()
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -69,9 +69,9 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -86,41 +86,41 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -130,9 +130,9 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -146,9 +146,9 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -156,9 +156,9 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -172,7 +172,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (! tmp%74#0)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
return 1u
block@21: // after_if_else_L8
return 0u
diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_3.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_3.ir
index bf671e0db4..8e9588244a 100644
--- a/examples/box_storage/out/BoxContract.ssa.opt_pass_3.ir
+++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_3.ir
@@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (! tmp%74#0)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
return 1u
block@21: // after_if_else_L8
return 0u
diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_4.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_4.ir
index baddc6d5a2..521718d01b 100644
--- a/examples/box_storage/out/BoxContract.ssa.opt_pass_4.ir
+++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_4.ir
@@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (! tmp%74#0)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
return 1u
block@21: // after_if_else_L8
return 0u
diff --git a/examples/box_storage/out/BoxContract.ssa.opt_pass_5.ir b/examples/box_storage/out/BoxContract.ssa.opt_pass_5.ir
index fc48967125..9020472452 100644
--- a/examples/box_storage/out/BoxContract.ssa.opt_pass_5.ir
+++ b/examples/box_storage/out/BoxContract.ssa.opt_pass_5.ir
@@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (! tmp%74#0)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
return 1u
block@21: // after_if_else_L8
return 0u
diff --git a/examples/box_storage/out_O2/BoxContract.approval.teal b/examples/box_storage/out_O2/BoxContract.approval.teal
index b99ca97b68..98c8a9a16b 100644
--- a/examples/box_storage/out_O2/BoxContract.approval.teal
+++ b/examples/box_storage/out_O2/BoxContract.approval.teal
@@ -21,9 +21,9 @@ __puya_arc4_router__:
__puya_arc4_router___set_boxes_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txna ApplicationArgs 2
@@ -35,18 +35,18 @@ __puya_arc4_router___set_boxes_route@2:
__puya_arc4_router___check_keys_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
__puya_arc4_router___delete_boxes_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub delete_boxes
intc_0 // 1
retsub
@@ -54,9 +54,9 @@ __puya_arc4_router___delete_boxes_route@4:
__puya_arc4_router___read_boxes_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub read_boxes
uncover 2
itob
@@ -90,9 +90,9 @@ __puya_arc4_router___read_boxes_route@5:
__puya_arc4_router___boxes_exist_route@6:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub boxes_exist
bytec 5 // 0x00
intc_1 // 0
@@ -129,9 +129,9 @@ __puya_arc4_router___boxes_exist_route@6:
__puya_arc4_router___slice_box_route@7:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub slice_box
intc_0 // 1
retsub
@@ -139,9 +139,9 @@ __puya_arc4_router___slice_box_route@7:
__puya_arc4_router___arc4_box_route@8:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub arc4_box
intc_0 // 1
retsub
@@ -149,9 +149,9 @@ __puya_arc4_router___arc4_box_route@8:
__puya_arc4_router___test_box_ref_route@9:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_box_ref
intc_0 // 1
retsub
@@ -159,9 +159,9 @@ __puya_arc4_router___test_box_ref_route@9:
__puya_arc4_router___box_map_test_route@10:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub box_map_test
intc_0 // 1
retsub
@@ -169,9 +169,9 @@ __puya_arc4_router___box_map_test_route@10:
__puya_arc4_router___box_map_set_route@11:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txna ApplicationArgs 2
@@ -183,9 +183,9 @@ __puya_arc4_router___box_map_set_route@11:
__puya_arc4_router___box_map_get_route@12:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
callsub box_map_get
@@ -205,9 +205,9 @@ __puya_arc4_router___box_map_get_route@12:
__puya_arc4_router___box_map_del_route@13:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
callsub box_map_del
@@ -217,9 +217,9 @@ __puya_arc4_router___box_map_del_route@13:
__puya_arc4_router___box_map_exists_route@14:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
callsub box_map_exists
@@ -239,7 +239,7 @@ __puya_arc4_router___bare_routing@17:
bnz __puya_arc4_router___after_if_else@21
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/examples/box_storage/out_O2/BoxContract.destructured.ir b/examples/box_storage/out_O2/BoxContract.destructured.ir
index fc48967125..9020472452 100644
--- a/examples/box_storage/out_O2/BoxContract.destructured.ir
+++ b/examples/box_storage/out_O2/BoxContract.destructured.ir
@@ -15,9 +15,9 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -27,24 +27,24 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -65,9 +65,9 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -82,41 +82,41 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -126,9 +126,9 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -142,9 +142,9 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -152,9 +152,9 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -168,7 +168,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (! tmp%74#0)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
return 1u
block@21: // after_if_else_L8
return 0u
diff --git a/examples/box_storage/out_unoptimized/BoxContract.approval.teal b/examples/box_storage/out_unoptimized/BoxContract.approval.teal
index 7a3959adf3..095da0b933 100644
--- a/examples/box_storage/out_unoptimized/BoxContract.approval.teal
+++ b/examples/box_storage/out_unoptimized/BoxContract.approval.teal
@@ -53,11 +53,11 @@ __puya_arc4_router___set_boxes_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -79,11 +79,11 @@ __puya_arc4_router___check_keys_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub check_keys
intc_1 // 1
retsub
@@ -94,11 +94,11 @@ __puya_arc4_router___delete_boxes_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub delete_boxes
intc_1 // 1
retsub
@@ -109,11 +109,11 @@ __puya_arc4_router___read_boxes_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub read_boxes
cover 2
swap
@@ -157,11 +157,11 @@ __puya_arc4_router___boxes_exist_route@6:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub boxes_exist
cover 2
swap
@@ -209,11 +209,11 @@ __puya_arc4_router___slice_box_route@7:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub slice_box
intc_1 // 1
retsub
@@ -224,11 +224,11 @@ __puya_arc4_router___arc4_box_route@8:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub arc4_box
intc_1 // 1
retsub
@@ -239,11 +239,11 @@ __puya_arc4_router___test_box_ref_route@9:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_box_ref
intc_1 // 1
retsub
@@ -254,11 +254,11 @@ __puya_arc4_router___box_map_test_route@10:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub box_map_test
intc_1 // 1
retsub
@@ -269,11 +269,11 @@ __puya_arc4_router___box_map_set_route@11:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -292,11 +292,11 @@ __puya_arc4_router___box_map_get_route@12:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -323,11 +323,11 @@ __puya_arc4_router___box_map_del_route@13:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -344,11 +344,11 @@ __puya_arc4_router___box_map_exists_route@14:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// box_storage/contract.py:8
// class BoxContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -383,7 +383,7 @@ __puya_arc4_router_____algopy_default_create@18:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/examples/box_storage/out_unoptimized/BoxContract.destructured.ir b/examples/box_storage/out_unoptimized/BoxContract.destructured.ir
index 594aec4b7f..261d2d3099 100644
--- a/examples/box_storage/out_unoptimized/BoxContract.destructured.ir
+++ b/examples/box_storage/out_unoptimized/BoxContract.destructured.ir
@@ -26,10 +26,10 @@ contract examples.box_storage.contract.BoxContract:
block@2: // set_boxes_route_L17
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -39,28 +39,28 @@ contract examples.box_storage.contract.BoxContract:
block@3: // check_keys_route_L48
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
examples.box_storage.contract.BoxContract.check_keys()
return 1u
block@4: // delete_boxes_route_L54
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (== tmp%15#0 NoOp)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (!= tmp%17#0 0u)
- (assert tmp%18#0) // is not creating
+ (assert tmp%18#0) // can only call when not creating
examples.box_storage.contract.BoxContract.delete_boxes()
return 1u
block@5: // read_boxes_route_L66
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (== tmp%19#0 NoOp)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
let (elements_to_encode%0#0: uint64, elements_to_encode%1#0: bytes, elements_to_encode%2#0: bytes) = examples.box_storage.contract.BoxContract.read_boxes()
let val_as_bytes%0#0: bytes = (itob elements_to_encode%0#0)
let length%0#0: uint64 = (len elements_to_encode%1#0)
@@ -84,10 +84,10 @@ contract examples.box_storage.contract.BoxContract:
block@6: // boxes_exist_route_L70
let tmp%24#0: uint64 = (txn OnCompletion)
let tmp%25#0: bool = (== tmp%24#0 NoOp)
- (assert tmp%25#0) // OnCompletion is NoOp
+ (assert tmp%25#0) // OnCompletion is not NoOp
let tmp%26#0: uint64 = (txn ApplicationID)
let tmp%27#0: bool = (!= tmp%26#0 0u)
- (assert tmp%27#0) // is not creating
+ (assert tmp%27#0) // can only call when not creating
let (elements_to_encode%3#0: bool, elements_to_encode%4#0: bool, elements_to_encode%5#0: bool) = examples.box_storage.contract.BoxContract.boxes_exist()
let encoded_bool%0#0: bytes = (setbit 0x00 0u elements_to_encode%3#0)
let encoded_bool%1#0: bytes = (setbit 0x00 0u elements_to_encode%4#0)
@@ -103,46 +103,46 @@ contract examples.box_storage.contract.BoxContract:
block@7: // slice_box_route_L74
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (== tmp%29#0 NoOp)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
let tmp%32#0: bool = (!= tmp%31#0 0u)
- (assert tmp%32#0) // is not creating
+ (assert tmp%32#0) // can only call when not creating
examples.box_storage.contract.BoxContract.slice_box()
return 1u
block@8: // arc4_box_route_L83
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (== tmp%33#0 NoOp)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
let tmp%36#0: bool = (!= tmp%35#0 0u)
- (assert tmp%36#0) // is not creating
+ (assert tmp%36#0) // can only call when not creating
examples.box_storage.contract.BoxContract.arc4_box()
return 1u
block@9: // test_box_ref_route_L93
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (== tmp%37#0 NoOp)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
let tmp%40#0: bool = (!= tmp%39#0 0u)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
examples.box_storage.contract.BoxContract.test_box_ref()
return 1u
block@10: // box_map_test_route_L141
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (== tmp%41#0 NoOp)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
let tmp%44#0: bool = (!= tmp%43#0 0u)
- (assert tmp%44#0) // is not creating
+ (assert tmp%44#0) // can only call when not creating
examples.box_storage.contract.BoxContract.box_map_test()
return 1u
block@11: // box_map_set_route_L162
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (== tmp%45#0 NoOp)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
let tmp%48#0: bool = (!= tmp%47#0 0u)
- (assert tmp%48#0) // is not creating
+ (assert tmp%48#0) // can only call when not creating
let tmp%49#0: bytes = (txna ApplicationArgs 1)
let tmp%50#0: uint64 = (btoi tmp%49#0)
let tmp%51#0: bytes = (txna ApplicationArgs 2)
@@ -152,10 +152,10 @@ contract examples.box_storage.contract.BoxContract:
block@12: // box_map_get_route_L166
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (== tmp%53#0 NoOp)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
let tmp%56#0: bool = (!= tmp%55#0 0u)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
let tmp%57#0: bytes = (txna ApplicationArgs 1)
let tmp%58#0: uint64 = (btoi tmp%57#0)
let to_encode%0#0: bytes = examples.box_storage.contract.BoxContract.box_map_get(tmp%58#0)
@@ -169,10 +169,10 @@ contract examples.box_storage.contract.BoxContract:
block@13: // box_map_del_route_L170
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (== tmp%60#0 NoOp)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
let tmp%63#0: bool = (!= tmp%62#0 0u)
- (assert tmp%63#0) // is not creating
+ (assert tmp%63#0) // can only call when not creating
let tmp%64#0: bytes = (txna ApplicationArgs 1)
let tmp%65#0: uint64 = (btoi tmp%64#0)
examples.box_storage.contract.BoxContract.box_map_del(tmp%65#0)
@@ -180,10 +180,10 @@ contract examples.box_storage.contract.BoxContract:
block@14: // box_map_exists_route_L174
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (== tmp%66#0 NoOp)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
let tmp%69#0: bool = (!= tmp%68#0 0u)
- (assert tmp%69#0) // is not creating
+ (assert tmp%69#0) // can only call when not creating
let tmp%70#0: bytes = (txna ApplicationArgs 1)
let tmp%71#0: uint64 = (btoi tmp%70#0)
let to_encode%1#0: bool = examples.box_storage.contract.BoxContract.box_map_exists(tmp%71#0)
@@ -201,7 +201,7 @@ contract examples.box_storage.contract.BoxContract:
block@18: // __algopy_default_create_L1
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (== tmp%74#0 0u)
- (assert tmp%75#0) // is creating
+ (assert tmp%75#0) // can only call when creating
examples.box_storage.contract.BoxContract.__algopy_default_create()
return 1u
block@19: // switch_case_default_L8
diff --git a/examples/box_storage/puya.log b/examples/box_storage/puya.log
index fe20507477..5ab445610d 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 3b1b785fcb..6776bdcb90 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.approval.mir b/examples/hello_world_arc4/out/HelloWorldContract.approval.mir
index 62fa77b311..ba2c8a93b4 100644
--- a/examples/hello_world_arc4/out/HelloWorldContract.approval.mir
+++ b/examples/hello_world_arc4/out/HelloWorldContract.approval.mir
@@ -33,9 +33,9 @@ __puya_arc4_router___hello_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// hello_world_arc4/contract.py:9
// class HelloWorldContract(ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -66,7 +66,7 @@ __puya_arc4_router___bare_routing@5:
__puya_arc4_router_____algopy_default_create@6:
txn ApplicationID tmp%11#0
! tmp%12#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/examples/hello_world_arc4/out/HelloWorldContract.approval.teal b/examples/hello_world_arc4/out/HelloWorldContract.approval.teal
index e8b5466cb7..5bcab5519d 100644
--- a/examples/hello_world_arc4/out/HelloWorldContract.approval.teal
+++ b/examples/hello_world_arc4/out/HelloWorldContract.approval.teal
@@ -24,9 +24,9 @@ __puya_arc4_router___hello_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// hello_world_arc4/contract.py:9
// class HelloWorldContract(ARC4Contract):
txna ApplicationArgs 1
@@ -54,7 +54,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/examples/hello_world_arc4/out/HelloWorldContract.arc32.json b/examples/hello_world_arc4/out/HelloWorldContract.arc32.json
index 4044021872..966adc7ba2 100644
--- a/examples/hello_world_arc4/out/HelloWorldContract.arc32.json
+++ b/examples/hello_world_arc4/out/HelloWorldContract.arc32.json
@@ -7,7 +7,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuaGVsbG9fd29ybGRfYXJjNC5jb250cmFjdC5IZWxsb1dvcmxkQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBoZWxsb193b3JsZF9hcmM0L2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIEhlbGxvV29ybGRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBoZWxsbwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBoZWxsb193b3JsZF9hcmM0L2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIEhlbGxvV29ybGRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5oZWxsbyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaGVsbG8oc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuaGVsbG9fd29ybGRfYXJjNC5jb250cmFjdC5IZWxsb1dvcmxkQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgSGVsbG9Xb3JsZENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGhlbGxvCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgSGVsbG9Xb3JsZENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5oZWxsbyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaGVsbG8oc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
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..d4b3c07a88
--- /dev/null
+++ b/examples/hello_world_arc4/out/HelloWorldContract.arc56.json
@@ -0,0 +1,107 @@
+{
+ "name": "HelloWorldContract",
+ "structs": {},
+ "methods": [
+ {
+ "name": "hello",
+ "args": [
+ {
+ "type": "string",
+ "name": "name"
+ }
+ ],
+ "returns": {
+ "type": "string"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [],
+ "recommendations": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 35
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 75
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 38
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuaGVsbG9fd29ybGRfYXJjNC5jb250cmFjdC5IZWxsb1dvcmxkQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgSGVsbG9Xb3JsZENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGhlbGxvCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgSGVsbG9Xb3JsZENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5oZWxsbyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaGVsbG8oc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "byteCode": {
+ "approval": "CiACAAGIAAFDigABMRtBADKABAK+zhE2GgCOAQACIokxGRREMRhENhoBVwIAiAAgSRUWVwYCTFCABBUffHVMULAjiTEZQAAGMRgURCOJIomKAQGAB0hlbGxvLCCL/1CJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/examples/hello_world_arc4/out/HelloWorldContract.destructured.ir b/examples/hello_world_arc4/out/HelloWorldContract.destructured.ir
index f2fea01a83..63cc073c78 100644
--- a/examples/hello_world_arc4/out/HelloWorldContract.destructured.ir
+++ b/examples/hello_world_arc4/out/HelloWorldContract.destructured.ir
@@ -15,9 +15,9 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@2: // hello_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0)
@@ -34,7 +34,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
return 1u
block@9: // after_if_else_L9
return 0u
diff --git a/examples/hello_world_arc4/out/HelloWorldContract.ssa.ir b/examples/hello_world_arc4/out/HelloWorldContract.ssa.ir
index 033f7f3f2e..74084d8c9a 100644
--- a/examples/hello_world_arc4/out/HelloWorldContract.ssa.ir
+++ b/examples/hello_world_arc4/out/HelloWorldContract.ssa.ir
@@ -16,10 +16,10 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@2: // hello_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0)
@@ -40,7 +40,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (== tmp%11#0 0u)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
examples.hello_world_arc4.contract.HelloWorldContract.__algopy_default_create()
return 1u
block@7: // switch_case_default_L9
diff --git a/examples/hello_world_arc4/out/HelloWorldContract.ssa.opt_pass_1.ir b/examples/hello_world_arc4/out/HelloWorldContract.ssa.opt_pass_1.ir
index f2fea01a83..63cc073c78 100644
--- a/examples/hello_world_arc4/out/HelloWorldContract.ssa.opt_pass_1.ir
+++ b/examples/hello_world_arc4/out/HelloWorldContract.ssa.opt_pass_1.ir
@@ -15,9 +15,9 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@2: // hello_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0)
@@ -34,7 +34,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
return 1u
block@9: // after_if_else_L9
return 0u
diff --git a/examples/hello_world_arc4/out_O2/HelloWorldContract.approval.teal b/examples/hello_world_arc4/out_O2/HelloWorldContract.approval.teal
index 45cce1c8b4..006d7de069 100644
--- a/examples/hello_world_arc4/out_O2/HelloWorldContract.approval.teal
+++ b/examples/hello_world_arc4/out_O2/HelloWorldContract.approval.teal
@@ -20,9 +20,9 @@ __puya_arc4_router__:
__puya_arc4_router___hello_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
extract 2 0
callsub hello
@@ -44,7 +44,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/examples/hello_world_arc4/out_O2/HelloWorldContract.destructured.ir b/examples/hello_world_arc4/out_O2/HelloWorldContract.destructured.ir
index f2fea01a83..63cc073c78 100644
--- a/examples/hello_world_arc4/out_O2/HelloWorldContract.destructured.ir
+++ b/examples/hello_world_arc4/out_O2/HelloWorldContract.destructured.ir
@@ -15,9 +15,9 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@2: // hello_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0)
@@ -34,7 +34,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
return 1u
block@9: // after_if_else_L9
return 0u
diff --git a/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.approval.teal b/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.approval.teal
index c59d2896df..ddb27fcf9f 100644
--- a/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.approval.teal
+++ b/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.approval.teal
@@ -27,11 +27,11 @@ __puya_arc4_router___hello_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// hello_world_arc4/contract.py:9
// class HelloWorldContract(ARC4Contract):
txna ApplicationArgs 1
@@ -68,7 +68,7 @@ __puya_arc4_router_____algopy_default_create@6:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.destructured.ir b/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.destructured.ir
index 033f7f3f2e..74084d8c9a 100644
--- a/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.destructured.ir
+++ b/examples/hello_world_arc4/out_unoptimized/HelloWorldContract.destructured.ir
@@ -16,10 +16,10 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@2: // hello_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let to_encode%0#0: bytes = examples.hello_world_arc4.contract.HelloWorldContract.hello(tmp%8#0)
@@ -40,7 +40,7 @@ contract examples.hello_world_arc4.contract.HelloWorldContract:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (== tmp%11#0 0u)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
examples.hello_world_arc4.contract.HelloWorldContract.__algopy_default_create()
return 1u
block@7: // switch_case_default_L9
diff --git a/examples/hello_world_arc4/puya.log b/examples/hello_world_arc4/puya.log
index 1d778d7d32..db708443bc 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 c1e40a7a55..338e2023a2 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.approval.mir b/examples/merkle/out/MerkleTree.approval.mir
index 413d03897e..6a8de05a99 100644
--- a/examples/merkle/out/MerkleTree.approval.mir
+++ b/examples/merkle/out/MerkleTree.approval.mir
@@ -34,10 +34,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
// merkle/contract.py:9
// class MerkleTree(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -52,9 +52,9 @@ __puya_arc4_router___verify_route@3:
// @arc4.abimethod
txn OnCompletion tmp%8#0
! tmp%9#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%10#0
- assert // is not creating
+ assert // can only call when not creating
// merkle/contract.py:9
// class MerkleTree(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%12#0
diff --git a/examples/merkle/out/MerkleTree.approval.teal b/examples/merkle/out/MerkleTree.approval.teal
index 346e511416..d715c32e04 100644
--- a/examples/merkle/out/MerkleTree.approval.teal
+++ b/examples/merkle/out/MerkleTree.approval.teal
@@ -25,10 +25,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
// merkle/contract.py:9
// class MerkleTree(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -43,9 +43,9 @@ __puya_arc4_router___verify_route@3:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// merkle/contract.py:9
// class MerkleTree(arc4.ARC4Contract):
txna ApplicationArgs 1
diff --git a/examples/merkle/out/MerkleTree.arc32.json b/examples/merkle/out/MerkleTree.arc32.json
index 3c6dfa9d92..40a12cdd88 100644
--- a/examples/merkle/out/MerkleTree.arc32.json
+++ b/examples/merkle/out/MerkleTree.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAzMgogICAgYnl0ZWNibG9jayAicm9vdCIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDg0MjQyMDNiIDB4YzAyOTBhZDUgLy8gbWV0aG9kICJjcmVhdGUoYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAidmVyaWZ5KGJ5dGVbMzJdW10sYnl0ZVszMl0pYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3JvdXRlQDM6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIE1lcmtsZVRyZWUoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdmVyaWZ5CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5jcmVhdGUocm9vdDogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYsIHJvb3Q6IEJ5dGVzMzIpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMgogICAgLy8gc2VsZi5yb290ID0gcm9vdC5ieXRlcwogICAgYnl0ZWNfMCAvLyAicm9vdCIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLnZlcmlmeShwcm9vZjogYnl0ZXMsIGxlYWY6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeToKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNC0xNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdmVyaWZ5KHNlbGYsIHByb29mOiBQcm9vZiwgbGVhZjogQnl0ZXMzMikgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE2CiAgICAvLyByZXR1cm4gc2VsZi5yb290ID09IGNvbXB1dGVfcm9vdF9oYXNoKHByb29mLCBsZWFmLmJ5dGVzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInJvb3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucm9vdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvbXB1dGVfcm9vdF9oYXNoCiAgICBmcmFtZV9idXJ5IC0yCiAgICA9PQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0LmNvbXB1dGVfcm9vdF9oYXNoKHByb29mOiBieXRlcywgbGVhZjogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKY29tcHV0ZV9yb290X2hhc2g6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTktMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY29tcHV0ZV9yb290X2hhc2gocHJvb2Y6IFByb29mLCBsZWFmOiBCeXRlcykgLT4gQnl0ZXM6CiAgICBwcm90byAyIDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UocHJvb2YubGVuZ3RoKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCgpjb21wdXRlX3Jvb3RfaGFzaF9mb3JfaGVhZGVyQDE6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGNvbXB1dGVfcm9vdF9oYXNoX2FmdGVyX2ZvckA0CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjMKICAgIC8vIGNvbXB1dGVkID0gaGFzaF9wYWlyKGNvbXB1dGVkLCBwcm9vZltpZHhdLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgaGFzaF9wYWlyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UocHJvb2YubGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY29tcHV0ZV9yb290X2hhc2hfZm9yX2hlYWRlckAxCgpjb21wdXRlX3Jvb3RfaGFzaF9hZnRlcl9mb3JANDoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyNAogICAgLy8gcmV0dXJuIGNvbXB1dGVkCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0Lmhhc2hfcGFpcihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpoYXNoX3BhaXI6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjctMjgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaGFzaF9wYWlyKGE6IEJ5dGVzLCBiOiBCeXRlcykgLT4gQnl0ZXM6CiAgICBwcm90byAyIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPAogICAgYnogaGFzaF9wYWlyX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYiBoYXNoX3BhaXJfdGVybmFyeV9tZXJnZUAzCgpoYXNoX3BhaXJfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KGEgKyBiIGlmIEJpZ1VJbnQuZnJvbV9ieXRlcyhhKSA8IEJpZ1VJbnQuZnJvbV9ieXRlcyhiKSBlbHNlIGIgKyBhKQogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAoKaGFzaF9wYWlyX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIHNoYTI1NgogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAzMgogICAgYnl0ZWNibG9jayAicm9vdCIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDg0MjQyMDNiIDB4YzAyOTBhZDUgLy8gbWV0aG9kICJjcmVhdGUoYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAidmVyaWZ5KGJ5dGVbMzJdW10sYnl0ZVszMl0pYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIE1lcmtsZVRyZWUoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcm91dGVAMzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHZlcmlmeQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgTWVya2xlVHJlZShhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0Lk1lcmtsZVRyZWUuY3JlYXRlKHJvb3Q6IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmLCByb290OiBCeXRlczMyKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTIKICAgIC8vIHNlbGYucm9vdCA9IHJvb3QuYnl0ZXMKICAgIGJ5dGVjXzAgLy8gInJvb3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS52ZXJpZnkocHJvb2Y6IGJ5dGVzLCBsZWFmOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnk6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTQtMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHZlcmlmeShzZWxmLCBwcm9vZjogUHJvb2YsIGxlYWY6IEJ5dGVzMzIpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNgogICAgLy8gcmV0dXJuIHNlbGYucm9vdCA9PSBjb21wdXRlX3Jvb3RfaGFzaChwcm9vZiwgbGVhZi5ieXRlcykKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJyb290IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJvb3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb21wdXRlX3Jvb3RfaGFzaAogICAgZnJhbWVfYnVyeSAtMgogICAgPT0KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5jb21wdXRlX3Jvb3RfaGFzaChwcm9vZjogYnl0ZXMsIGxlYWY6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmNvbXB1dGVfcm9vdF9oYXNoOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE5LTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNvbXB1dGVfcm9vdF9oYXNoKHByb29mOiBQcm9vZiwgbGVhZjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAyCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQoKY29tcHV0ZV9yb290X2hhc2hfZm9yX2hlYWRlckAxOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShwcm9vZi5sZW5ndGgpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBjb21wdXRlX3Jvb3RfaGFzaF9hZnRlcl9mb3JANAogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBjb21wdXRlZCA9IGhhc2hfcGFpcihjb21wdXRlZCwgcHJvb2ZbaWR4XS5ieXRlcykKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBjYWxsc3ViIGhhc2hfcGFpcgogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNvbXB1dGVfcm9vdF9oYXNoX2Zvcl9oZWFkZXJAMQoKY29tcHV0ZV9yb290X2hhc2hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjQKICAgIC8vIHJldHVybiBjb21wdXRlZAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5oYXNoX3BhaXIoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKaGFzaF9wYWlyOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjI3LTI4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGhhc2hfcGFpcihhOiBCeXRlcywgYjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAxCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBvcC5zaGEyNTYoYSArIGIgaWYgQmlnVUludC5mcm9tX2J5dGVzKGEpIDwgQmlnVUludC5mcm9tX2J5dGVzKGIpIGVsc2UgYiArIGEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYjwKICAgIGJ6IGhhc2hfcGFpcl90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGIgaGFzaF9wYWlyX3Rlcm5hcnlfbWVyZ2VAMwoKaGFzaF9wYWlyX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKCmhhc2hfcGFpcl90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBvcC5zaGEyNTYoYSArIGIgaWYgQmlnVUludC5mcm9tX2J5dGVzKGEpIDwgQmlnVUludC5mcm9tX2J5dGVzKGIpIGVsc2UgYiArIGEpCiAgICBzaGEyNTYKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
diff --git a/examples/merkle/out/MerkleTree.arc56.json b/examples/merkle/out/MerkleTree.arc56.json
new file mode 100644
index 0000000000..ac98e02f4c
--- /dev/null
+++ b/examples/merkle/out/MerkleTree.arc56.json
@@ -0,0 +1,143 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 51,
+ 67
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 55
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 70
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 114
+ ],
+ "errorMessage": "check self.root exists"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAzMgogICAgYnl0ZWNibG9jayAicm9vdCIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDg0MjQyMDNiIDB4YzAyOTBhZDUgLy8gbWV0aG9kICJjcmVhdGUoYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAidmVyaWZ5KGJ5dGVbMzJdW10sYnl0ZVszMl0pYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIE1lcmtsZVRyZWUoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcm91dGVAMzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHZlcmlmeQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6OQogICAgLy8gY2xhc3MgTWVya2xlVHJlZShhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0Lk1lcmtsZVRyZWUuY3JlYXRlKHJvb3Q6IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmLCByb290OiBCeXRlczMyKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTIKICAgIC8vIHNlbGYucm9vdCA9IHJvb3QuYnl0ZXMKICAgIGJ5dGVjXzAgLy8gInJvb3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS52ZXJpZnkocHJvb2Y6IGJ5dGVzLCBsZWFmOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnk6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTQtMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHZlcmlmeShzZWxmLCBwcm9vZjogUHJvb2YsIGxlYWY6IEJ5dGVzMzIpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNgogICAgLy8gcmV0dXJuIHNlbGYucm9vdCA9PSBjb21wdXRlX3Jvb3RfaGFzaChwcm9vZiwgbGVhZi5ieXRlcykKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJyb290IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJvb3QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb21wdXRlX3Jvb3RfaGFzaAogICAgZnJhbWVfYnVyeSAtMgogICAgPT0KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5jb21wdXRlX3Jvb3RfaGFzaChwcm9vZjogYnl0ZXMsIGxlYWY6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmNvbXB1dGVfcm9vdF9oYXNoOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE5LTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNvbXB1dGVfcm9vdF9oYXNoKHByb29mOiBQcm9vZiwgbGVhZjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAyCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQoKY29tcHV0ZV9yb290X2hhc2hfZm9yX2hlYWRlckAxOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShwcm9vZi5sZW5ndGgpOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiBjb21wdXRlX3Jvb3RfaGFzaF9hZnRlcl9mb3JANAogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBjb21wdXRlZCA9IGhhc2hfcGFpcihjb21wdXRlZCwgcHJvb2ZbaWR4XS5ieXRlcykKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBjYWxsc3ViIGhhc2hfcGFpcgogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNvbXB1dGVfcm9vdF9oYXNoX2Zvcl9oZWFkZXJAMQoKY29tcHV0ZV9yb290X2hhc2hfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjQKICAgIC8vIHJldHVybiBjb21wdXRlZAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5oYXNoX3BhaXIoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKaGFzaF9wYWlyOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjI3LTI4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGhhc2hfcGFpcihhOiBCeXRlcywgYjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAxCiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBvcC5zaGEyNTYoYSArIGIgaWYgQmlnVUludC5mcm9tX2J5dGVzKGEpIDwgQmlnVUludC5mcm9tX2J5dGVzKGIpIGVsc2UgYiArIGEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYjwKICAgIGJ6IGhhc2hfcGFpcl90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGIgaGFzaF9wYWlyX3Rlcm5hcnlfbWVyZ2VAMwoKaGFzaF9wYWlyX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKCmhhc2hfcGFpcl90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjkKICAgIC8vIHJldHVybiBvcC5zaGEyNTYoYSArIGIgaWYgQmlnVUludC5mcm9tX2J5dGVzKGEpIDwgQmlnVUludC5mcm9tX2J5dGVzKGIpIGVsc2UgYiArIGEpCiAgICBzaGEyNTYKICAgIHJldHN1Ygo=",
+ "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": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/examples/merkle/out/MerkleTree.destructured.ir b/examples/merkle/out/MerkleTree.destructured.ir
index da2243e555..d0306eadf4 100644
--- a/examples/merkle/out/MerkleTree.destructured.ir
+++ b/examples/merkle/out/MerkleTree.destructured.ir
@@ -15,19 +15,19 @@ contract examples.merkle.contract.MerkleTree:
block@2: // create_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.merkle.contract.MerkleTree.create(tmp%7#0)
return 1u
block@3: // verify_route_L14
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0)
diff --git a/examples/merkle/out/MerkleTree.ssa.ir b/examples/merkle/out/MerkleTree.ssa.ir
index fbbad61d1e..e92b3e84f7 100644
--- a/examples/merkle/out/MerkleTree.ssa.ir
+++ b/examples/merkle/out/MerkleTree.ssa.ir
@@ -16,20 +16,20 @@ contract examples.merkle.contract.MerkleTree:
block@2: // create_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.merkle.contract.MerkleTree.create(tmp%7#0)
return 1u
block@3: // verify_route_L14
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 NoOp)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0)
diff --git a/examples/merkle/out/MerkleTree.ssa.opt_pass_1.ir b/examples/merkle/out/MerkleTree.ssa.opt_pass_1.ir
index cee6b41a69..10e5af4c57 100644
--- a/examples/merkle/out/MerkleTree.ssa.opt_pass_1.ir
+++ b/examples/merkle/out/MerkleTree.ssa.opt_pass_1.ir
@@ -15,19 +15,19 @@ contract examples.merkle.contract.MerkleTree:
block@2: // create_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.merkle.contract.MerkleTree.create(tmp%7#0)
return 1u
block@3: // verify_route_L14
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0)
diff --git a/examples/merkle/out_O2/MerkleTree.approval.teal b/examples/merkle/out_O2/MerkleTree.approval.teal
index 6312f7abdd..9876c35926 100644
--- a/examples/merkle/out_O2/MerkleTree.approval.teal
+++ b/examples/merkle/out_O2/MerkleTree.approval.teal
@@ -21,10 +21,10 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
txna ApplicationArgs 1
callsub create
intc_1 // 1
@@ -33,9 +33,9 @@ __puya_arc4_router___create_route@2:
__puya_arc4_router___verify_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
txna ApplicationArgs 2
callsub verify
diff --git a/examples/merkle/out_O2/MerkleTree.destructured.ir b/examples/merkle/out_O2/MerkleTree.destructured.ir
index da2243e555..d0306eadf4 100644
--- a/examples/merkle/out_O2/MerkleTree.destructured.ir
+++ b/examples/merkle/out_O2/MerkleTree.destructured.ir
@@ -15,19 +15,19 @@ contract examples.merkle.contract.MerkleTree:
block@2: // create_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.merkle.contract.MerkleTree.create(tmp%7#0)
return 1u
block@3: // verify_route_L14
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0)
diff --git a/examples/merkle/out_unoptimized/MerkleTree.approval.teal b/examples/merkle/out_unoptimized/MerkleTree.approval.teal
index 539a3dc009..45e7238a58 100644
--- a/examples/merkle/out_unoptimized/MerkleTree.approval.teal
+++ b/examples/merkle/out_unoptimized/MerkleTree.approval.teal
@@ -29,11 +29,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
// merkle/contract.py:9
// class MerkleTree(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -49,11 +49,11 @@ __puya_arc4_router___verify_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// merkle/contract.py:9
// class MerkleTree(arc4.ARC4Contract):
txna ApplicationArgs 1
diff --git a/examples/merkle/out_unoptimized/MerkleTree.destructured.ir b/examples/merkle/out_unoptimized/MerkleTree.destructured.ir
index 10c2f53428..4631ecfc08 100644
--- a/examples/merkle/out_unoptimized/MerkleTree.destructured.ir
+++ b/examples/merkle/out_unoptimized/MerkleTree.destructured.ir
@@ -16,20 +16,20 @@ contract examples.merkle.contract.MerkleTree:
block@2: // create_route_L10
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.merkle.contract.MerkleTree.create(tmp%7#0)
return 1u
block@3: // verify_route_L14
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 NoOp)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let to_encode%0#0: bool = examples.merkle.contract.MerkleTree.verify(tmp%12#0, tmp%13#0)
diff --git a/examples/merkle/puya.log b/examples/merkle/puya.log
index b2436746ce..060e09c6ae 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
@@ -751,6 +751,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 84e945e831..8979984697 100644
--- a/examples/sizes.txt
+++ b/examples/sizes.txt
@@ -22,6 +22,7 @@
arc4_types/Arc4TuplesType 795 136 - | 537 58 -
arc4_types/MutableParams2 334 202 - | 193 97 -
arc_28/EventEmitter 186 133 - | 100 64 -
+ 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 -
@@ -133,4 +134,4 @@
unssa/UnSSA 432 368 - | 241 204 -
voting/VotingRoundApp 1590 1483 - | 733 649 -
with_reentrancy/WithReentrancy 255 242 - | 132 122 -
- Total 70460 54247 54188 | 33630 22152 22108
\ No newline at end of file
+ Total 71138 54712 54653 | 33985 22342 22298
\ No newline at end of file
diff --git a/examples/struct_in_box/out/ExampleContract.approval.mir b/examples/struct_in_box/out/ExampleContract.approval.mir
index b4397f848e..1e9dc933c4 100644
--- a/examples/struct_in_box/out/ExampleContract.approval.mir
+++ b/examples/struct_in_box/out/ExampleContract.approval.mir
@@ -35,9 +35,9 @@ __puya_arc4_router___add_user_route@2:
// @arc4.abimethod()
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -52,9 +52,9 @@ __puya_arc4_router___attach_asset_to_user_route@3:
// @arc4.abimethod()
txn OnCompletion tmp%8#0
! tmp%9#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%10#0
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1 tmp%12#0
@@ -74,9 +74,9 @@ __puya_arc4_router___get_user_route@4:
// @arc4.abimethod()
txn OnCompletion tmp%16#0
! tmp%17#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%18#0
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1 tmp%20#0
@@ -100,7 +100,7 @@ __puya_arc4_router___bare_routing@7:
__puya_arc4_router_____algopy_default_create@8:
txn ApplicationID tmp%24#0
! tmp%25#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/examples/struct_in_box/out/ExampleContract.approval.teal b/examples/struct_in_box/out/ExampleContract.approval.teal
index 98a53adbd3..37a55b2278 100644
--- a/examples/struct_in_box/out/ExampleContract.approval.teal
+++ b/examples/struct_in_box/out/ExampleContract.approval.teal
@@ -24,9 +24,9 @@ __puya_arc4_router___add_user_route@2:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1
@@ -41,9 +41,9 @@ __puya_arc4_router___attach_asset_to_user_route@3:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1
@@ -61,9 +61,9 @@ __puya_arc4_router___get_user_route@4:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1
@@ -84,7 +84,7 @@ __puya_arc4_router___bare_routing@7:
bnz __puya_arc4_router___after_if_else@11
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/examples/struct_in_box/out/ExampleContract.arc32.json b/examples/struct_in_box/out/ExampleContract.arc32.json
index 6f2e34573c..2cb76bad67 100644
--- a/examples/struct_in_box/out/ExampleContract.arc32.json
+++ b/examples/struct_in_box/out/ExampleContract.arc32.json
@@ -55,7 +55,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGRhODUzNGJkIDB4NGViNGU5ZjEgMHgxNjU0NTg4MCAvLyBtZXRob2QgImFkZF91c2VyKChzdHJpbmcsdWludDY0LHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAiYXR0YWNoX2Fzc2V0X3RvX3VzZXIodWludDY0LGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF91c2VyKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX3VzZXJfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF91c2VyX3JvdXRlQDI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfdXNlcgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYXR0YWNoX2Fzc2V0X3RvX3VzZXJfcm91dGVAMzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXR0YWNoX2Fzc2V0X3RvX3VzZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQ6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfdXNlcgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTAKICAgIC8vIGNsYXNzIEV4YW1wbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hZGRfdXNlcih1c2VyOiBieXRlcykgLT4gdm9pZDoKYWRkX3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF91c2VyKHNlbGYsIHVzZXI6IFVzZXJTdHJ1Y3QpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5ib3hfZXhpc3RzKHVzZXIuaWQpLCAiVXNlciB3aXRoIGlkIG11c3Qgbm90IGV4aXN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNhbGxzdWIgYm94X2V4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFVzZXIgd2l0aCBpZCBtdXN0IG5vdCBleGlzdAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNAogICAgLy8gc2VsZi53cml0ZV90b19ib3godXNlcikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiB3cml0ZV90b19ib3gKICAgIGZyYW1lX2J1cnkgLTEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LmJveF9leGlzdHModXNlcl9pZDogYnl0ZXMpIC0+IHVpbnQ2NDoKYm94X2V4aXN0czoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjYtMjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYm94X2V4aXN0cyhzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyOAogICAgLy8gX2RhdGEsIGV4aXN0cyA9IG9wLkJveC5nZXQodXNlcl9pZC5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXR1cm4gZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC53cml0ZV90b19ib3godXNlcjogYnl0ZXMpIC0+IGJ5dGVzOgp3cml0ZV90b19ib3g6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHdyaXRlX3RvX2JveChzZWxmLCB1c2VyOiBVc2VyU3RydWN0KSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjIwCiAgICAvLyBib3hfa2V5ID0gdXNlci5pZC5ieXRlcwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjEtMjIKICAgIC8vICMgRGVsZXRlIGV4aXN0aW5nIGRhdGEsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgcmVzaXppbmcgdGhlIGJveAogICAgLy8gb3AuQm94LmRlbGV0ZShib3hfa2V5KQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjQKICAgIC8vIG9wLkJveC5wdXQoYm94X2tleSwgdXNlci5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hdHRhY2hfYXNzZXRfdG9fdXNlcih1c2VyX2lkOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYXR0YWNoX2Fzc2V0X3RvX3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGF0dGFjaF9hc3NldF90b191c2VyKHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0LCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzgKICAgIC8vIHVzZXIgPSBzZWxmLnJlYWRfZnJvbV9ib3godXNlcl9pZCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiByZWFkX2Zyb21fYm94CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM5CiAgICAvLyB1c2VyLmFzc2V0ID0gYXJjNC5VSW50NjQoYXNzZXQuaWQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQwCiAgICAvLyBzZWxmLndyaXRlX3RvX2JveCh1c2VyKQogICAgY2FsbHN1YiB3cml0ZV90b19ib3gKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QucmVhZF9mcm9tX2JveCh1c2VyX2lkOiBieXRlcykgLT4gYnl0ZXM6CnJlYWRfZnJvbV9ib3g6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEyLTEzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHJlYWRfZnJvbV9ib3goc2VsZiwgdXNlcl9pZDogYXJjNC5VSW50NjQpIC0+IFVzZXJTdHJ1Y3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTQKICAgIC8vIGJveF9kYXRhLCBleGlzdHMgPSBvcC5Cb3guZ2V0KHVzZXJfaWQuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBleGlzdHMsICJVc2VyIHdpdGggdGhhdCBpZCBkb2VzIG5vdCBleGlzdCIKICAgIGFzc2VydCAvLyBVc2VyIHdpdGggdGhhdCBpZCBkb2VzIG5vdCBleGlzdAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxNgogICAgLy8gcmV0dXJuIFVzZXJTdHJ1Y3QuZnJvbV9ieXRlcyhib3hfZGF0YSkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LmdldF91c2VyKHVzZXJfaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyLTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF91c2VyKHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0KSAtPiBVc2VyU3RydWN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXR1cm4gc2VsZi5yZWFkX2Zyb21fYm94KHVzZXJfaWQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVhZF9mcm9tX2JveAogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGRhODUzNGJkIDB4NGViNGU5ZjEgMHgxNjU0NTg4MCAvLyBtZXRob2QgImFkZF91c2VyKChzdHJpbmcsdWludDY0LHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAiYXR0YWNoX2Fzc2V0X3RvX3VzZXIodWludDY0LGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF91c2VyKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX3VzZXJfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF91c2VyX3JvdXRlQDI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF91c2VyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGF0dGFjaF9hc3NldF90b191c2VyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfdXNlcl9yb3V0ZUA0OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfdXNlcgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTAKICAgIC8vIGNsYXNzIEV4YW1wbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuYWRkX3VzZXIodXNlcjogYnl0ZXMpIC0+IHZvaWQ6CmFkZF91c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozMS0zMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfdXNlcihzZWxmLCB1c2VyOiBVc2VyU3RydWN0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYm94X2V4aXN0cyh1c2VyLmlkKSwgIlVzZXIgd2l0aCBpZCBtdXN0IG5vdCBleGlzdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjYWxsc3ViIGJveF9leGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBVc2VyIHdpdGggaWQgbXVzdCBub3QgZXhpc3QKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzQKICAgIC8vIHNlbGYud3JpdGVfdG9fYm94KHVzZXIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgd3JpdGVfdG9fYm94CiAgICBmcmFtZV9idXJ5IC0xCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5ib3hfZXhpc3RzKHVzZXJfaWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmJveF9leGlzdHM6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI2LTI3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGJveF9leGlzdHMoc2VsZiwgdXNlcl9pZDogYXJjNC5VSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjgKICAgIC8vIF9kYXRhLCBleGlzdHMgPSBvcC5Cb3guZ2V0KHVzZXJfaWQuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGJ1cnkgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3Qud3JpdGVfdG9fYm94KHVzZXI6IGJ5dGVzKSAtPiBieXRlczoKd3JpdGVfdG9fYm94OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxOC0xOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB3cml0ZV90b19ib3goc2VsZiwgdXNlcjogVXNlclN0cnVjdCkgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyMAogICAgLy8gYm94X2tleSA9IHVzZXIuaWQuYnl0ZXMKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjIxLTIyCiAgICAvLyAjIERlbGV0ZSBleGlzdGluZyBkYXRhLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHJlc2l6aW5nIHRoZSBib3gKICAgIC8vIG9wLkJveC5kZWxldGUoYm94X2tleSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBvcC5Cb3gucHV0KGJveF9rZXksIHVzZXIuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuYXR0YWNoX2Fzc2V0X3RvX3VzZXIodXNlcl9pZDogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmF0dGFjaF9hc3NldF90b191c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNi0zNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhdHRhY2hfYXNzZXRfdG9fdXNlcihzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM4CiAgICAvLyB1c2VyID0gc2VsZi5yZWFkX2Zyb21fYm94KHVzZXJfaWQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgcmVhZF9mcm9tX2JveAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozOQogICAgLy8gdXNlci5hc3NldCA9IGFyYzQuVUludDY0KGFzc2V0LmlkKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi53cml0ZV90b19ib3godXNlcikKICAgIGNhbGxzdWIgd3JpdGVfdG9fYm94CiAgICBwb3AKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LnJlYWRfZnJvbV9ib3godXNlcl9pZDogYnl0ZXMpIC0+IGJ5dGVzOgpyZWFkX2Zyb21fYm94OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMi0xMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiByZWFkX2Zyb21fYm94KHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0KSAtPiBVc2VyU3RydWN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE0CiAgICAvLyBib3hfZGF0YSwgZXhpc3RzID0gb3AuQm94LmdldCh1c2VyX2lkLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhc3NlcnQgZXhpc3RzLCAiVXNlciB3aXRoIHRoYXQgaWQgZG9lcyBub3QgZXhpc3QiCiAgICBhc3NlcnQgLy8gVXNlciB3aXRoIHRoYXQgaWQgZG9lcyBub3QgZXhpc3QKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTYKICAgIC8vIHJldHVybiBVc2VyU3RydWN0LmZyb21fYnl0ZXMoYm94X2RhdGEpCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5nZXRfdXNlcih1c2VyX2lkOiBieXRlcykgLT4gYnl0ZXM6CmdldF91c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0Mi00MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfdXNlcihzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCkgLT4gVXNlclN0cnVjdDoKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0NAogICAgLy8gcmV0dXJuIHNlbGYucmVhZF9mcm9tX2JveCh1c2VyX2lkKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlYWRfZnJvbV9ib3gKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
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..977e89f1a5
--- /dev/null
+++ b/examples/struct_in_box/out/ExampleContract.arc56.json
@@ -0,0 +1,186 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 50,
+ 65,
+ 86
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 132
+ ],
+ "errorMessage": "User with id must not exist"
+ },
+ {
+ "pc": [
+ 191
+ ],
+ "errorMessage": "User with that id does not exist"
+ },
+ {
+ "pc": [
+ 115
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 53,
+ 68,
+ 89
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGRhODUzNGJkIDB4NGViNGU5ZjEgMHgxNjU0NTg4MCAvLyBtZXRob2QgImFkZF91c2VyKChzdHJpbmcsdWludDY0LHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAiYXR0YWNoX2Fzc2V0X3RvX3VzZXIodWludDY0LGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF91c2VyKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX3VzZXJfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF91c2VyX3JvdXRlQDI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZF91c2VyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGF0dGFjaF9hc3NldF90b191c2VyCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfdXNlcl9yb3V0ZUA0OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfdXNlcgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTAKICAgIC8vIGNsYXNzIEV4YW1wbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuYWRkX3VzZXIodXNlcjogYnl0ZXMpIC0+IHZvaWQ6CmFkZF91c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozMS0zMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhZGRfdXNlcihzZWxmLCB1c2VyOiBVc2VyU3RydWN0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYm94X2V4aXN0cyh1c2VyLmlkKSwgIlVzZXIgd2l0aCBpZCBtdXN0IG5vdCBleGlzdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjYWxsc3ViIGJveF9leGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBVc2VyIHdpdGggaWQgbXVzdCBub3QgZXhpc3QKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzQKICAgIC8vIHNlbGYud3JpdGVfdG9fYm94KHVzZXIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgd3JpdGVfdG9fYm94CiAgICBmcmFtZV9idXJ5IC0xCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5ib3hfZXhpc3RzKHVzZXJfaWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmJveF9leGlzdHM6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI2LTI3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGJveF9leGlzdHMoc2VsZiwgdXNlcl9pZDogYXJjNC5VSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjgKICAgIC8vIF9kYXRhLCBleGlzdHMgPSBvcC5Cb3guZ2V0KHVzZXJfaWQuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIGJ1cnkgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3Qud3JpdGVfdG9fYm94KHVzZXI6IGJ5dGVzKSAtPiBieXRlczoKd3JpdGVfdG9fYm94OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxOC0xOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB3cml0ZV90b19ib3goc2VsZiwgdXNlcjogVXNlclN0cnVjdCkgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyMAogICAgLy8gYm94X2tleSA9IHVzZXIuaWQuYnl0ZXMKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjIxLTIyCiAgICAvLyAjIERlbGV0ZSBleGlzdGluZyBkYXRhLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHJlc2l6aW5nIHRoZSBib3gKICAgIC8vIG9wLkJveC5kZWxldGUoYm94X2tleSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI0CiAgICAvLyBvcC5Cb3gucHV0KGJveF9rZXksIHVzZXIuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuYXR0YWNoX2Fzc2V0X3RvX3VzZXIodXNlcl9pZDogYnl0ZXMsIGFzc2V0OiB1aW50NjQpIC0+IHZvaWQ6CmF0dGFjaF9hc3NldF90b191c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNi0zNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBhdHRhY2hfYXNzZXRfdG9fdXNlcihzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM4CiAgICAvLyB1c2VyID0gc2VsZi5yZWFkX2Zyb21fYm94KHVzZXJfaWQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgcmVhZF9mcm9tX2JveAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozOQogICAgLy8gdXNlci5hc3NldCA9IGFyYzQuVUludDY0KGFzc2V0LmlkKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0MAogICAgLy8gc2VsZi53cml0ZV90b19ib3godXNlcikKICAgIGNhbGxzdWIgd3JpdGVfdG9fYm94CiAgICBwb3AKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LnJlYWRfZnJvbV9ib3godXNlcl9pZDogYnl0ZXMpIC0+IGJ5dGVzOgpyZWFkX2Zyb21fYm94OgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMi0xMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiByZWFkX2Zyb21fYm94KHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0KSAtPiBVc2VyU3RydWN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE0CiAgICAvLyBib3hfZGF0YSwgZXhpc3RzID0gb3AuQm94LmdldCh1c2VyX2lkLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhc3NlcnQgZXhpc3RzLCAiVXNlciB3aXRoIHRoYXQgaWQgZG9lcyBub3QgZXhpc3QiCiAgICBhc3NlcnQgLy8gVXNlciB3aXRoIHRoYXQgaWQgZG9lcyBub3QgZXhpc3QKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTYKICAgIC8vIHJldHVybiBVc2VyU3RydWN0LmZyb21fYnl0ZXMoYm94X2RhdGEpCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5nZXRfdXNlcih1c2VyX2lkOiBieXRlcykgLT4gYnl0ZXM6CmdldF91c2VyOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0Mi00MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfdXNlcihzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCkgLT4gVXNlclN0cnVjdDoKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTo0NAogICAgLy8gcmV0dXJuIHNlbGYucmVhZF9mcm9tX2JveCh1c2VyX2lkKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlYWRfZnJvbV9ib3gKICAgIHJldHN1Ygo=",
+ "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": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/examples/struct_in_box/out/ExampleContract.destructured.ir b/examples/struct_in_box/out/ExampleContract.destructured.ir
index 9a9d7c9ab6..6dfbb2f9ad 100644
--- a/examples/struct_in_box/out/ExampleContract.destructured.ir
+++ b/examples/struct_in_box/out/ExampleContract.destructured.ir
@@ -15,18 +15,18 @@ contract examples.struct_in_box.contract.ExampleContract:
block@2: // add_user_route_L31
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0)
return 1u
block@3: // attach_asset_to_user_route_L36
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let tmp%14#0: uint64 = (btoi tmp%13#0)
@@ -36,9 +36,9 @@ contract examples.struct_in_box.contract.ExampleContract:
block@4: // get_user_route_L42
let tmp%16#0: uint64 = (txn OnCompletion)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // OnCompletion is NoOp
+ (assert tmp%17#0) // OnCompletion is not NoOp
let tmp%18#0: uint64 = (txn ApplicationID)
- (assert tmp%18#0) // is not creating
+ (assert tmp%18#0) // can only call when not creating
let tmp%20#0: bytes = (txna ApplicationArgs 1)
let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0)
let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0)
@@ -50,7 +50,7 @@ contract examples.struct_in_box.contract.ExampleContract:
block@8: // __algopy_default_create_L1
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // is creating
+ (assert tmp%25#0) // can only call when creating
return 1u
block@11: // after_if_else_L10
return 0u
diff --git a/examples/struct_in_box/out/ExampleContract.ssa.ir b/examples/struct_in_box/out/ExampleContract.ssa.ir
index 9f54dac2b5..8e67e11546 100644
--- a/examples/struct_in_box/out/ExampleContract.ssa.ir
+++ b/examples/struct_in_box/out/ExampleContract.ssa.ir
@@ -16,20 +16,20 @@ contract examples.struct_in_box.contract.ExampleContract:
block@2: // add_user_route_L31
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0)
return 1u
block@3: // attach_asset_to_user_route_L36
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 NoOp)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let tmp%14#0: uint64 = (btoi tmp%13#0)
@@ -39,10 +39,10 @@ contract examples.struct_in_box.contract.ExampleContract:
block@4: // get_user_route_L42
let tmp%16#0: uint64 = (txn OnCompletion)
let tmp%17#0: bool = (== tmp%16#0 NoOp)
- (assert tmp%17#0) // OnCompletion is NoOp
+ (assert tmp%17#0) // OnCompletion is not NoOp
let tmp%18#0: uint64 = (txn ApplicationID)
let tmp%19#0: bool = (!= tmp%18#0 0u)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
let tmp%20#0: bytes = (txna ApplicationArgs 1)
let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0)
let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0)
@@ -58,7 +58,7 @@ contract examples.struct_in_box.contract.ExampleContract:
block@8: // __algopy_default_create_L1
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (== tmp%24#0 0u)
- (assert tmp%25#0) // is creating
+ (assert tmp%25#0) // can only call when creating
examples.struct_in_box.contract.ExampleContract.__algopy_default_create()
return 1u
block@9: // switch_case_default_L10
diff --git a/examples/struct_in_box/out/ExampleContract.ssa.opt_pass_1.ir b/examples/struct_in_box/out/ExampleContract.ssa.opt_pass_1.ir
index d8c91094b8..9d5f64c604 100644
--- a/examples/struct_in_box/out/ExampleContract.ssa.opt_pass_1.ir
+++ b/examples/struct_in_box/out/ExampleContract.ssa.opt_pass_1.ir
@@ -15,18 +15,18 @@ contract examples.struct_in_box.contract.ExampleContract:
block@2: // add_user_route_L31
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0)
return 1u
block@3: // attach_asset_to_user_route_L36
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let tmp%14#0: uint64 = (btoi tmp%13#0)
@@ -36,9 +36,9 @@ contract examples.struct_in_box.contract.ExampleContract:
block@4: // get_user_route_L42
let tmp%16#0: uint64 = (txn OnCompletion)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // OnCompletion is NoOp
+ (assert tmp%17#0) // OnCompletion is not NoOp
let tmp%18#0: uint64 = (txn ApplicationID)
- (assert tmp%18#0) // is not creating
+ (assert tmp%18#0) // can only call when not creating
let tmp%20#0: bytes = (txna ApplicationArgs 1)
let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0)
let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0)
@@ -50,7 +50,7 @@ contract examples.struct_in_box.contract.ExampleContract:
block@8: // __algopy_default_create_L1
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // is creating
+ (assert tmp%25#0) // can only call when creating
return 1u
block@11: // after_if_else_L10
return 0u
diff --git a/examples/struct_in_box/out_O2/ExampleContract.approval.teal b/examples/struct_in_box/out_O2/ExampleContract.approval.teal
index 5e3bec670d..3bab8fa517 100644
--- a/examples/struct_in_box/out_O2/ExampleContract.approval.teal
+++ b/examples/struct_in_box/out_O2/ExampleContract.approval.teal
@@ -20,9 +20,9 @@ __puya_arc4_router__:
__puya_arc4_router___add_user_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
callsub add_user
intc_0 // 1
@@ -31,9 +31,9 @@ __puya_arc4_router___add_user_route@2:
__puya_arc4_router___attach_asset_to_user_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
txna ApplicationArgs 2
btoi
@@ -45,9 +45,9 @@ __puya_arc4_router___attach_asset_to_user_route@3:
__puya_arc4_router___get_user_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
callsub get_user
pushbytes 0x151f7c75
@@ -62,7 +62,7 @@ __puya_arc4_router___bare_routing@7:
bnz __puya_arc4_router___after_if_else@11
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/examples/struct_in_box/out_O2/ExampleContract.destructured.ir b/examples/struct_in_box/out_O2/ExampleContract.destructured.ir
index 9a9d7c9ab6..6dfbb2f9ad 100644
--- a/examples/struct_in_box/out_O2/ExampleContract.destructured.ir
+++ b/examples/struct_in_box/out_O2/ExampleContract.destructured.ir
@@ -15,18 +15,18 @@ contract examples.struct_in_box.contract.ExampleContract:
block@2: // add_user_route_L31
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0)
return 1u
block@3: // attach_asset_to_user_route_L36
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let tmp%14#0: uint64 = (btoi tmp%13#0)
@@ -36,9 +36,9 @@ contract examples.struct_in_box.contract.ExampleContract:
block@4: // get_user_route_L42
let tmp%16#0: uint64 = (txn OnCompletion)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // OnCompletion is NoOp
+ (assert tmp%17#0) // OnCompletion is not NoOp
let tmp%18#0: uint64 = (txn ApplicationID)
- (assert tmp%18#0) // is not creating
+ (assert tmp%18#0) // can only call when not creating
let tmp%20#0: bytes = (txna ApplicationArgs 1)
let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0)
let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0)
@@ -50,7 +50,7 @@ contract examples.struct_in_box.contract.ExampleContract:
block@8: // __algopy_default_create_L1
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (! tmp%24#0)
- (assert tmp%25#0) // is creating
+ (assert tmp%25#0) // can only call when creating
return 1u
block@11: // after_if_else_L10
return 0u
diff --git a/examples/struct_in_box/out_unoptimized/ExampleContract.approval.teal b/examples/struct_in_box/out_unoptimized/ExampleContract.approval.teal
index 8d6cf0a54f..97951268eb 100644
--- a/examples/struct_in_box/out_unoptimized/ExampleContract.approval.teal
+++ b/examples/struct_in_box/out_unoptimized/ExampleContract.approval.teal
@@ -29,11 +29,11 @@ __puya_arc4_router___add_user_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1
@@ -49,11 +49,11 @@ __puya_arc4_router___attach_asset_to_user_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1
@@ -72,11 +72,11 @@ __puya_arc4_router___get_user_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// struct_in_box/contract.py:10
// class ExampleContract(ARC4Contract):
txna ApplicationArgs 1
@@ -106,7 +106,7 @@ __puya_arc4_router_____algopy_default_create@8:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/examples/struct_in_box/out_unoptimized/ExampleContract.destructured.ir b/examples/struct_in_box/out_unoptimized/ExampleContract.destructured.ir
index c688ca022e..af460e84f3 100644
--- a/examples/struct_in_box/out_unoptimized/ExampleContract.destructured.ir
+++ b/examples/struct_in_box/out_unoptimized/ExampleContract.destructured.ir
@@ -16,20 +16,20 @@ contract examples.struct_in_box.contract.ExampleContract:
block@2: // add_user_route_L31
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
examples.struct_in_box.contract.ExampleContract.add_user(tmp%7#0)
return 1u
block@3: // attach_asset_to_user_route_L36
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 NoOp)
- (assert tmp%9#0) // OnCompletion is NoOp
+ (assert tmp%9#0) // OnCompletion is not NoOp
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
let tmp%13#0: bytes = (txna ApplicationArgs 2)
let tmp%14#0: uint64 = (btoi tmp%13#0)
@@ -39,10 +39,10 @@ contract examples.struct_in_box.contract.ExampleContract:
block@4: // get_user_route_L42
let tmp%16#0: uint64 = (txn OnCompletion)
let tmp%17#0: bool = (== tmp%16#0 NoOp)
- (assert tmp%17#0) // OnCompletion is NoOp
+ (assert tmp%17#0) // OnCompletion is not NoOp
let tmp%18#0: uint64 = (txn ApplicationID)
let tmp%19#0: bool = (!= tmp%18#0 0u)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
let tmp%20#0: bytes = (txna ApplicationArgs 1)
let tmp%21#0: bytes = examples.struct_in_box.contract.ExampleContract.get_user(tmp%20#0)
let tmp%22#0: bytes = (concat 0x151f7c75 tmp%21#0)
@@ -58,7 +58,7 @@ contract examples.struct_in_box.contract.ExampleContract:
block@8: // __algopy_default_create_L1
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (== tmp%24#0 0u)
- (assert tmp%25#0) // is creating
+ (assert tmp%25#0) // can only call when creating
examples.struct_in_box.contract.ExampleContract.__algopy_default_create()
return 1u
block@9: // switch_case_default_L10
diff --git a/examples/struct_in_box/puya.log b/examples/struct_in_box/puya.log
index d0943c6207..eaa0ad30da 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
@@ -820,6 +820,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.approval.mir b/examples/tictactoe/out/TicTacToeContract.approval.mir
index 029d248ca2..0d681a7f73 100644
--- a/examples/tictactoe/out/TicTacToeContract.approval.mir
+++ b/examples/tictactoe/out/TicTacToeContract.approval.mir
@@ -36,7 +36,7 @@ __puya_arc4_router___new_game_route@2:
// @arc4.abimethod(create="allow")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%5#0
@@ -59,9 +59,9 @@ __puya_arc4_router___join_game_route@3:
// @arc4.abimethod
txn OnCompletion tmp%6#0
! tmp%7#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%8#0
- assert // is not creating
+ assert // can only call when not creating
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%10#0
@@ -84,9 +84,9 @@ __puya_arc4_router___whose_turn_route@4:
// @arc4.abimethod
txn OnCompletion tmp%11#0
! tmp%12#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%13#0
- assert // is not creating
+ assert // can only call when not creating
callsub whose_turn tmp%15#0
byte 0x151f7c75 tmp%15#0,0x151f7c75
l-load tmp%15#0 1 0x151f7c75,tmp%15#0
@@ -100,9 +100,9 @@ __puya_arc4_router___play_route@5:
// @arc4.abimethod
txn OnCompletion tmp%17#0
! tmp%18#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%19#0
- assert // is not creating
+ assert // can only call when not creating
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%21#0
diff --git a/examples/tictactoe/out/TicTacToeContract.approval.teal b/examples/tictactoe/out/TicTacToeContract.approval.teal
index 4314fba860..2adeb568ab 100644
--- a/examples/tictactoe/out/TicTacToeContract.approval.teal
+++ b/examples/tictactoe/out/TicTacToeContract.approval.teal
@@ -25,7 +25,7 @@ __puya_arc4_router___new_game_route@2:
// @arc4.abimethod(create="allow")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -46,9 +46,9 @@ __puya_arc4_router___join_game_route@3:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -69,9 +69,9 @@ __puya_arc4_router___whose_turn_route@4:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub whose_turn
pushbytes 0x151f7c75
swap
@@ -85,9 +85,9 @@ __puya_arc4_router___play_route@5:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1
diff --git a/examples/tictactoe/out/TicTacToeContract.arc32.json b/examples/tictactoe/out/TicTacToeContract.arc32.json
index 5ec783ea7e..4ada161df8 100644
--- a/examples/tictactoe/out/TicTacToeContract.arc32.json
+++ b/examples/tictactoe/out/TicTacToeContract.arc32.json
@@ -22,7 +22,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgOQogICAgYnl0ZWNibG9jayAiZ2FtZSIgInR1cm5zIiAiY2hhbGxlbmdlciIgIndpbm5lciIgMHgwMSAweDAyICJob3N0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHB1c2hieXRlc3MgMHg5NmE5NzE4MSAweDE3YTA3OWIzIDB4YmI5ZjExNDcgMHg5ZWViZjU4ZSAvLyBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIiwgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IiwgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbmV3X2dhbWVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aG9zZV90dXJuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXdfZ2FtZV9yb3V0ZUAyOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJhbGxvdyIpCiAgICBjYWxsc3ViIG5ld19nYW1lCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGpvaW5fZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2hvc2VfdHVybl9yb3V0ZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHdob3NlX3R1cm4KICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGxheQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QubmV3X2dhbWUobW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgpuZXdfZ2FtZToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjAtMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IikKICAgIC8vIGRlZiBuZXdfZ2FtZShzZWxmLCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjIKICAgIC8vIGlmIFR4bi5hcHBsaWNhdGlvbl9pZDoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBuZXdfZ2FtZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjMtMjUKICAgIC8vICMgaWYgYSBjaGFsbGVuZ2VyIGhhcyBqb2luZWQsIGRvbid0IGFsbG93IHN0YXJ0aW5nIGEgbmV3IGdhbWUKICAgIC8vICMgdW50aWwgdGhpcyBvbmUgaXMgY29tcGxldGUKICAgIC8vIGlmIHNlbGYuY2hhbGxlbmdlcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjI2CiAgICAvLyBhc3NlcnQgc2VsZi53aW5uZXIsICJHYW1lIGlzbid0IG92ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEdhbWUgaXNuJ3Qgb3ZlcgoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNy0yOAogICAgLy8gIyByZXNldCBjaGFsbGVuZ2VyIGFuZCB3aW5uZXIKICAgIC8vIGRlbCBzZWxmLmNoYWxsZW5nZXIudmFsdWUKICAgIGJ5dGVjXzIgLy8gImNoYWxsZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyOQogICAgLy8gZGVsIHNlbGYud2lubmVyLnZhbHVlCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMAogICAgLy8gc2VsZi5ob3N0ID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNiAvLyAiaG9zdCIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMxCiAgICAvLyBzZWxmLmdhbWUgPSBHYW1lLmZyb21fYnl0ZXMob3AuYnplcm8oOSkpCiAgICBpbnRjXzMgLy8gOQogICAgYnplcm8KICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBieiBuZXdfZ2FtZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCiAgICBiIG5ld19nYW1lX2Jvb2xfbWVyZ2VAOAoKbmV3X2dhbWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKCm5ld19nYW1lX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgYXNzZXJ0IC8vIE1vdmUgbXVzdCBiZSBpbiByYW5nZQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNAogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IGFyYzQuVUludDgoSE9TVCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICAqCiAgICBzd2FwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDAKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBieXRlYyA0IC8vIDB4MDEKICAgIHJlcGxhY2UzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjb3ZlciAyCiAgICByZXBsYWNlMwogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM1CiAgICAvLyBzZWxmLnR1cm5zID0gVUludDY0KDApCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5qb2luX2dhbWUobW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgpqb2luX2dhbWU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3LTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBqb2luX2dhbWUoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmNoYWxsZW5nZXIsICJIb3N0IGFscmVhZHkgaGFzIGEgY2hhbGxlbmdlciIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEhvc3QgYWxyZWFkeSBoYXMgYSBjaGFsbGVuZ2VyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQwCiAgICAvLyBzZWxmLmNoYWxsZW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDEKICAgIC8vIHNlbGYubWFrZV9tb3ZlKGFyYzQuVUludDgoQ0hBTExFTkdFUiksIG1vdmUpCiAgICBieXRlYyA1IC8vIDB4MDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG1ha2VfbW92ZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5tYWtlX21vdmUocGxheWVyOiBieXRlcywgbW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgptYWtlX21vdmU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYwLTYxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG1ha2VfbW92ZShzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgZHVwCiAgICBieiBtYWtlX21vdmVfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBieiBtYWtlX21vdmVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWtlX21vdmVfYm9vbF9tZXJnZUA0CgptYWtlX21vdmVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKCm1ha2VfbW92ZV9ib29sX21lcmdlQDQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGFzc2VydCAvLyBNb3ZlIG11c3QgYmUgaW4gcmFuZ2UKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjQKICAgIC8vIGFzc2VydCBzZWxmLmdhbWVbcm93XVtjb2x1bW5dID09IEVNUFRZLCAiU3F1YXJlIGlzIGFscmVhZHkgdGFrZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGI9PQogICAgYXNzZXJ0IC8vIFNxdWFyZSBpcyBhbHJlYWR5IHRha2VuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY1CiAgICAvLyBzZWxmLmdhbWVbcm93XVtjb2x1bW5dID0gcGxheWVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAwCiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICByZXBsYWNlMwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NgogICAgLy8gc2VsZi50dXJucyArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NwogICAgLy8gaWYgc2VsZi5kaWRfd2luKHBsYXllciwgY29sdW1uPWNvbHVtbiwgcm93PXJvdyk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRpZF93aW4KICAgIGJ6IG1ha2VfbW92ZV9lbHNlX2JvZHlANgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2OAogICAgLy8gc2VsZi53aW5uZXIudmFsdWUgPSBwbGF5ZXIKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOQoKbWFrZV9tb3ZlX2Vsc2VfYm9keUA2OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2OQogICAgLy8gZWxpZiBzZWxmLnR1cm5zID09IDk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gOQogICAgPT0KICAgIGJ6IG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzAKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gYXJjNC5VSW50OChEUkFXKQogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgcHVzaGJ5dGVzIDB4MDMKICAgIGFwcF9nbG9iYWxfcHV0CgptYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5kaWRfd2luKHBsYXllcjogYnl0ZXMsIGNvbHVtbjogdWludDY0LCByb3c6IHVpbnQ2NCkgLT4gdWludDY0OgpkaWRfd2luOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3Mi03MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkaWRfd2luKHNlbGYsIHBsYXllcjogYXJjNC5VSW50OCwgY29sdW1uOiBVSW50NjQsIHJvdzogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NAogICAgLy8gZyA9IHNlbGYuZ2FtZS5jb3B5KCkKICAgIGR1cG4gMwogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzYKICAgIC8vIGlmIGdbcm93XVswXSA9PSBnW3Jvd11bMV0gPT0gZ1tyb3ddWzJdOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgaW50Y18yIC8vIDMKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwbiAyCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgNAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgNQogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NwogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc5CiAgICAvLyBpZiBnWzBdW2NvbHVtbl0gPT0gZ1sxXVtjb2x1bW5dID09IGdbMl1bY29sdW1uXToKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZXh0cmFjdCAzIDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VANgogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMAogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo4MAogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjgyLTgzCiAgICAvLyAjIGlmIHBsYXllciBvd25zIGNlbnRlciwgY2hlY2sgZGlhZ29uYWxzCiAgICAvLyBpZiBwbGF5ZXIgPT0gZ1sxXVsxXToKICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODQKICAgIC8vIGlmIGdbMF1bMF0gPT0gcGxheWVyID09IGdbMl1bMl06CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODUKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODYKICAgIC8vIGlmIGdbMF1bMl0gPT0gcGxheWVyID09IGdbMl1bMF06CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODcKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODgKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC53aG9zZV90dXJuKCkgLT4gYnl0ZXM6Cndob3NlX3R1cm46CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQzLTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB3aG9zZV90dXJuKHNlbGYpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAwIDEKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KEhPU1QpIGlmIHNlbGYudHVybnMgJSAyIGVsc2UgYXJjNC5VSW50OChDSEFMTEVOR0VSKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgcHVzaGludCAyIC8vIDIKICAgICUKICAgIGJ5dGVjIDUgLy8gMHgwMgogICAgYnl0ZWMgNCAvLyAweDAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5wbGF5KG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKcGxheToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDctNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBsYXkoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0OQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLndpbm5lciwgIkdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gR2FtZSBpcyBhbHJlYWR5IGZpbmlzaGVkCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUwCiAgICAvLyBpZiBzZWxmLnR1cm5zICUgMjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50dXJucyBleGlzdHMKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICBieiBwbGF5X2Vsc2VfYm9keUAyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUxCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmhvc3QsICJJdCBpcyB0aGUgaG9zdCdzIHR1cm4iCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaG9zdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ob3N0IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgaG9zdCdzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTIKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoSE9TVCkKICAgIGJ5dGVjIDQgLy8gMHgwMQogICAgYiBwbGF5X2FmdGVyX2lmX2Vsc2VAMwoKcGxheV9lbHNlX2JvZHlAMjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY2hhbGxlbmdlci5nZXQoCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU1CiAgICAvLyBkZWZhdWx0PUFjY291bnQoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNoYWxsZW5nZXIiCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0LTU2CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgLy8gICAgIGRlZmF1bHQ9QWNjb3VudCgpCiAgICAvLyApLCAiSXQgaXMgdGhlIGNoYWxsZW5nZXIncyB0dXJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHNlbGVjdAogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgY2hhbGxlbmdlcidzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTcKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGJ5dGVjIDUgLy8gMHgwMgoKcGxheV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU4CiAgICAvLyBzZWxmLm1ha2VfbW92ZShwbGF5ZXIsIG1vdmUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBtYWtlX21vdmUKICAgIHJldHN1Ygo=",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgOQogICAgYnl0ZWNibG9jayAiZ2FtZSIgInR1cm5zIiAiY2hhbGxlbmdlciIgIndpbm5lciIgMHgwMSAweDAyICJob3N0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHB1c2hieXRlc3MgMHg5NmE5NzE4MSAweDE3YTA3OWIzIDB4YmI5ZjExNDcgMHg5ZWViZjU4ZSAvLyBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIiwgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IiwgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbmV3X2dhbWVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aG9zZV90dXJuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXdfZ2FtZV9yb3V0ZUAyOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgY2FsbHN1YiBuZXdfZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fam9pbl9nYW1lX3JvdXRlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGpvaW5fZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2hvc2VfdHVybl9yb3V0ZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgd2hvc2VfdHVybgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19wbGF5X3JvdXRlQDU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBsYXkKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MTUKICAgIC8vIGNsYXNzIFRpY1RhY1RvZUNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0Lm5ld19nYW1lKG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKbmV3X2dhbWU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIwLTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJhbGxvdyIpCiAgICAvLyBkZWYgbmV3X2dhbWUoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIyCiAgICAvLyBpZiBUeG4uYXBwbGljYXRpb25faWQ6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIzLTI1CiAgICAvLyAjIGlmIGEgY2hhbGxlbmdlciBoYXMgam9pbmVkLCBkb24ndCBhbGxvdyBzdGFydGluZyBhIG5ldyBnYW1lCiAgICAvLyAjIHVudGlsIHRoaXMgb25lIGlzIGNvbXBsZXRlCiAgICAvLyBpZiBzZWxmLmNoYWxsZW5nZXI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJ6IG5ld19nYW1lX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNgogICAgLy8gYXNzZXJ0IHNlbGYud2lubmVyLCAiR2FtZSBpc24ndCBvdmVyIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBHYW1lIGlzbid0IG92ZXIKCm5ld19nYW1lX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjctMjgKICAgIC8vICMgcmVzZXQgY2hhbGxlbmdlciBhbmQgd2lubmVyCiAgICAvLyBkZWwgc2VsZi5jaGFsbGVuZ2VyLnZhbHVlCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9kZWwKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjkKICAgIC8vIGRlbCBzZWxmLndpbm5lci52YWx1ZQogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9kZWwKCm5ld19nYW1lX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzAKICAgIC8vIHNlbGYuaG9zdCA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDYgLy8gImhvc3QiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMQogICAgLy8gc2VsZi5nYW1lID0gR2FtZS5mcm9tX2J5dGVzKG9wLmJ6ZXJvKDkpKQogICAgaW50Y18zIC8vIDkKICAgIGJ6ZXJvCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IG5ld19nYW1lX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQogICAgYiBuZXdfZ2FtZV9ib29sX21lcmdlQDgKCm5ld19nYW1lX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCgpuZXdfZ2FtZV9ib29sX21lcmdlQDg6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGFzc2VydCAvLyBNb3ZlIG11c3QgYmUgaW4gcmFuZ2UKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzQKICAgIC8vIHNlbGYuZ2FtZVtyb3ddW2NvbHVtbl0gPSBhcmM0LlVJbnQ4KEhPU1QpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAwCiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgNCAvLyAweDAxCiAgICByZXBsYWNlMwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNQogICAgLy8gc2VsZi50dXJucyA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Quam9pbl9nYW1lKG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKam9pbl9nYW1lOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNy0zOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgam9pbl9nYW1lKHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jaGFsbGVuZ2VyLCAiSG9zdCBhbHJlYWR5IGhhcyBhIGNoYWxsZW5nZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBIb3N0IGFscmVhZHkgaGFzIGEgY2hhbGxlbmdlcgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MAogICAgLy8gc2VsZi5jaGFsbGVuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQxCiAgICAvLyBzZWxmLm1ha2VfbW92ZShhcmM0LlVJbnQ4KENIQUxMRU5HRVIpLCBtb3ZlKQogICAgYnl0ZWMgNSAvLyAweDAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBtYWtlX21vdmUKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QubWFrZV9tb3ZlKHBsYXllcjogYnl0ZXMsIG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKbWFrZV9tb3ZlOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MC02MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBtYWtlX21vdmUoc2VsZiwgcGxheWVyOiBhcmM0LlVJbnQ4LCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGR1cAogICAgYnogbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYnogbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFrZV9tb3ZlX2Jvb2xfbWVyZ2VANAoKbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCgptYWtlX21vdmVfYm9vbF9tZXJnZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBhc3NlcnQgLy8gTW92ZSBtdXN0IGJlIGluIHJhbmdlCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY0CiAgICAvLyBhc3NlcnQgc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9PSBFTVBUWSwgIlNxdWFyZSBpcyBhbHJlYWR5IHRha2VuIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBiPT0KICAgIGFzc2VydCAvLyBTcXVhcmUgaXMgYWxyZWFkeSB0YWtlbgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NQogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IHBsYXllcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMwogICAgcmVwbGFjZTMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjYKICAgIC8vIHNlbGYudHVybnMgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjcKICAgIC8vIGlmIHNlbGYuZGlkX3dpbihwbGF5ZXIsIGNvbHVtbj1jb2x1bW4sIHJvdz1yb3cpOgogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBkaWRfd2luCiAgICBieiBtYWtlX21vdmVfZWxzZV9ib2R5QDYKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjgKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gcGxheWVyCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKCm1ha2VfbW92ZV9lbHNlX2JvZHlANjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjkKICAgIC8vIGVsaWYgc2VsZi50dXJucyA9PSA5OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgaW50Y18zIC8vIDkKICAgID09CiAgICBieiBtYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjcwCiAgICAvLyBzZWxmLndpbm5lci52YWx1ZSA9IGFyYzQuVUludDgoRFJBVykKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIHB1c2hieXRlcyAweDAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOToKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QuZGlkX3dpbihwbGF5ZXI6IGJ5dGVzLCBjb2x1bW46IHVpbnQ2NCwgcm93OiB1aW50NjQpIC0+IHVpbnQ2NDoKZGlkX3dpbjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzItNzMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGlkX3dpbihzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIGNvbHVtbjogVUludDY0LCByb3c6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzQKICAgIC8vIGcgPSBzZWxmLmdhbWUuY29weSgpCiAgICBkdXBuIDMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc2CiAgICAvLyBpZiBnW3Jvd11bMF0gPT0gZ1tyb3ddWzFdID09IGdbcm93XVsyXToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cG4gMgogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgY292ZXIgMgogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDQKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDUKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzcKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3OQogICAgLy8gaWYgZ1swXVtjb2x1bW5dID09IGdbMV1bY29sdW1uXSA9PSBnWzJdW2NvbHVtbl06CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBleHRyYWN0IDAgMyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMyAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAzCiAgICBleHRyYWN0IDYgMyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODAKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo4Mi04MwogICAgLy8gIyBpZiBwbGF5ZXIgb3ducyBjZW50ZXIsIGNoZWNrIGRpYWdvbmFscwogICAgLy8gaWYgcGxheWVyID09IGdbMV1bMV06CiAgICBmcmFtZV9kaWcgMgogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg0CiAgICAvLyBpZiBnWzBdWzBdID09IHBsYXllciA9PSBnWzJdWzJdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxMAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg2CiAgICAvLyBpZiBnWzBdWzJdID09IHBsYXllciA9PSBnWzJdWzBdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxNAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg3CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg4CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Qud2hvc2VfdHVybigpIC0+IGJ5dGVzOgp3aG9zZV90dXJuOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgd2hvc2VfdHVybihzZWxmKSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMCAxCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50dXJucyBleGlzdHMKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICBieXRlYyA1IC8vIDB4MDIKICAgIGJ5dGVjIDQgLy8gMHgwMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QucGxheShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6CnBsYXk6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwbGF5KHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi53aW5uZXIsICJHYW1lIGlzIGFscmVhZHkgZmluaXNoZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MAogICAgLy8gaWYgc2VsZi50dXJucyAlIDI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBwdXNoaW50IDIgLy8gMgogICAgJQogICAgYnogcGxheV9lbHNlX2JvZHlAMgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5ob3N0LCAiSXQgaXMgdGhlIGhvc3QncyB0dXJuIgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImhvc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaG9zdCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSXQgaXMgdGhlIGhvc3QncyB0dXJuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUyCiAgICAvLyBwbGF5ZXIgPSBhcmM0LlVJbnQ4KEhPU1QpCiAgICBieXRlYyA0IC8vIDB4MDEKICAgIGIgcGxheV9hZnRlcl9pZl9lbHNlQDMKCnBsYXlfZWxzZV9ib2R5QDI6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgdHhuIFNlbmRlcgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NQogICAgLy8gZGVmYXVsdD1BY2NvdW50KCkKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jaGFsbGVuZ2VyLmdldCgKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NC01NgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jaGFsbGVuZ2VyLmdldCgKICAgIC8vICAgICBkZWZhdWx0PUFjY291bnQoKQogICAgLy8gKSwgIkl0IGlzIHRoZSBjaGFsbGVuZ2VyJ3MgdHVybiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzZWxlY3QKICAgID09CiAgICBhc3NlcnQgLy8gSXQgaXMgdGhlIGNoYWxsZW5nZXIncyB0dXJuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU3CiAgICAvLyBwbGF5ZXIgPSBhcmM0LlVJbnQ4KENIQUxMRU5HRVIpCiAgICBieXRlYyA1IC8vIDB4MDIKCnBsYXlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1OAogICAgLy8gc2VsZi5tYWtlX21vdmUocGxheWVyLCBtb3ZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbWFrZV9tb3ZlCiAgICByZXRzdWIK",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
diff --git a/examples/tictactoe/out/TicTacToeContract.arc56.json b/examples/tictactoe/out/TicTacToeContract.arc56.json
new file mode 100644
index 0000000000..671d7b38dd
--- /dev/null
+++ b/examples/tictactoe/out/TicTacToeContract.arc56.json
@@ -0,0 +1,268 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 1,
+ "bytes": 4
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {
+ "challenger": {
+ "keyType": "AVMString",
+ "valueType": "AVMBytes",
+ "key": "Y2hhbGxlbmdlcg=="
+ },
+ "winner": {
+ "keyType": "AVMString",
+ "valueType": "uint8",
+ "key": "d2lubmVy"
+ },
+ "host": {
+ "keyType": "AVMString",
+ "valueType": "AVMBytes",
+ "key": "aG9zdA=="
+ },
+ "game": {
+ "keyType": "AVMString",
+ "valueType": "uint8[3][3]",
+ "key": "Z2FtZQ=="
+ },
+ "turns": {
+ "keyType": "AVMString",
+ "valueType": "AVMUint64",
+ "key": "dHVybnM="
+ }
+ },
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [],
+ "call": []
+ },
+ "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 not NoOp"
+ },
+ {
+ "pc": [
+ 361
+ ],
+ "errorMessage": "Square is already taken"
+ },
+ {
+ "pc": [
+ 124,
+ 149,
+ 170
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "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"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgOQogICAgYnl0ZWNibG9jayAiZ2FtZSIgInR1cm5zIiAiY2hhbGxlbmdlciIgIndpbm5lciIgMHgwMSAweDAyICJob3N0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHB1c2hieXRlc3MgMHg5NmE5NzE4MSAweDE3YTA3OWIzIDB4YmI5ZjExNDcgMHg5ZWViZjU4ZSAvLyBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIiwgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IiwgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbmV3X2dhbWVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aG9zZV90dXJuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXdfZ2FtZV9yb3V0ZUAyOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgY2FsbHN1YiBuZXdfZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fam9pbl9nYW1lX3JvdXRlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGpvaW5fZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2hvc2VfdHVybl9yb3V0ZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgd2hvc2VfdHVybgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19wbGF5X3JvdXRlQDU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBsYXkKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MTUKICAgIC8vIGNsYXNzIFRpY1RhY1RvZUNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0Lm5ld19nYW1lKG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKbmV3X2dhbWU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIwLTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJhbGxvdyIpCiAgICAvLyBkZWYgbmV3X2dhbWUoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIyCiAgICAvLyBpZiBUeG4uYXBwbGljYXRpb25faWQ6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIzLTI1CiAgICAvLyAjIGlmIGEgY2hhbGxlbmdlciBoYXMgam9pbmVkLCBkb24ndCBhbGxvdyBzdGFydGluZyBhIG5ldyBnYW1lCiAgICAvLyAjIHVudGlsIHRoaXMgb25lIGlzIGNvbXBsZXRlCiAgICAvLyBpZiBzZWxmLmNoYWxsZW5nZXI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJ6IG5ld19nYW1lX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNgogICAgLy8gYXNzZXJ0IHNlbGYud2lubmVyLCAiR2FtZSBpc24ndCBvdmVyIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBHYW1lIGlzbid0IG92ZXIKCm5ld19nYW1lX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjctMjgKICAgIC8vICMgcmVzZXQgY2hhbGxlbmdlciBhbmQgd2lubmVyCiAgICAvLyBkZWwgc2VsZi5jaGFsbGVuZ2VyLnZhbHVlCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9kZWwKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjkKICAgIC8vIGRlbCBzZWxmLndpbm5lci52YWx1ZQogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9kZWwKCm5ld19nYW1lX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzAKICAgIC8vIHNlbGYuaG9zdCA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjIDYgLy8gImhvc3QiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMQogICAgLy8gc2VsZi5nYW1lID0gR2FtZS5mcm9tX2J5dGVzKG9wLmJ6ZXJvKDkpKQogICAgaW50Y18zIC8vIDkKICAgIGJ6ZXJvCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IG5ld19nYW1lX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQogICAgYiBuZXdfZ2FtZV9ib29sX21lcmdlQDgKCm5ld19nYW1lX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCgpuZXdfZ2FtZV9ib29sX21lcmdlQDg6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGFzc2VydCAvLyBNb3ZlIG11c3QgYmUgaW4gcmFuZ2UKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzQKICAgIC8vIHNlbGYuZ2FtZVtyb3ddW2NvbHVtbl0gPSBhcmM0LlVJbnQ4KEhPU1QpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAwCiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgNCAvLyAweDAxCiAgICByZXBsYWNlMwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNQogICAgLy8gc2VsZi50dXJucyA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Quam9pbl9nYW1lKG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKam9pbl9nYW1lOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNy0zOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgam9pbl9nYW1lKHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jaGFsbGVuZ2VyLCAiSG9zdCBhbHJlYWR5IGhhcyBhIGNoYWxsZW5nZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBIb3N0IGFscmVhZHkgaGFzIGEgY2hhbGxlbmdlcgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MAogICAgLy8gc2VsZi5jaGFsbGVuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMiAvLyAiY2hhbGxlbmdlciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQxCiAgICAvLyBzZWxmLm1ha2VfbW92ZShhcmM0LlVJbnQ4KENIQUxMRU5HRVIpLCBtb3ZlKQogICAgYnl0ZWMgNSAvLyAweDAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBtYWtlX21vdmUKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QubWFrZV9tb3ZlKHBsYXllcjogYnl0ZXMsIG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKbWFrZV9tb3ZlOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MC02MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBtYWtlX21vdmUoc2VsZiwgcGxheWVyOiBhcmM0LlVJbnQ4LCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGR1cAogICAgYnogbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYnogbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFrZV9tb3ZlX2Jvb2xfbWVyZ2VANAoKbWFrZV9tb3ZlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCgptYWtlX21vdmVfYm9vbF9tZXJnZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBhc3NlcnQgLy8gTW92ZSBtdXN0IGJlIGluIHJhbmdlCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY0CiAgICAvLyBhc3NlcnQgc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9PSBFTVBUWSwgIlNxdWFyZSBpcyBhbHJlYWR5IHRha2VuIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBiPT0KICAgIGFzc2VydCAvLyBTcXVhcmUgaXMgYWxyZWFkeSB0YWtlbgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NQogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IHBsYXllcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMwogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMwogICAgcmVwbGFjZTMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjYKICAgIC8vIHNlbGYudHVybnMgKz0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjcKICAgIC8vIGlmIHNlbGYuZGlkX3dpbihwbGF5ZXIsIGNvbHVtbj1jb2x1bW4sIHJvdz1yb3cpOgogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBkaWRfd2luCiAgICBieiBtYWtlX21vdmVfZWxzZV9ib2R5QDYKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjgKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gcGxheWVyCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKCm1ha2VfbW92ZV9lbHNlX2JvZHlANjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjkKICAgIC8vIGVsaWYgc2VsZi50dXJucyA9PSA5OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgaW50Y18zIC8vIDkKICAgID09CiAgICBieiBtYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjcwCiAgICAvLyBzZWxmLndpbm5lci52YWx1ZSA9IGFyYzQuVUludDgoRFJBVykKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIHB1c2hieXRlcyAweDAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOToKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QuZGlkX3dpbihwbGF5ZXI6IGJ5dGVzLCBjb2x1bW46IHVpbnQ2NCwgcm93OiB1aW50NjQpIC0+IHVpbnQ2NDoKZGlkX3dpbjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzItNzMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGlkX3dpbihzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIGNvbHVtbjogVUludDY0LCByb3c6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzQKICAgIC8vIGcgPSBzZWxmLmdhbWUuY29weSgpCiAgICBkdXBuIDMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc2CiAgICAvLyBpZiBnW3Jvd11bMF0gPT0gZ1tyb3ddWzFdID09IGdbcm93XVsyXToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgICoKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cG4gMgogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgY292ZXIgMgogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDQKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDUKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzcKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3OQogICAgLy8gaWYgZ1swXVtjb2x1bW5dID09IGdbMV1bY29sdW1uXSA9PSBnWzJdW2NvbHVtbl06CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBleHRyYWN0IDAgMyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMyAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAzCiAgICBleHRyYWN0IDYgMyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODAKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo4Mi04MwogICAgLy8gIyBpZiBwbGF5ZXIgb3ducyBjZW50ZXIsIGNoZWNrIGRpYWdvbmFscwogICAgLy8gaWYgcGxheWVyID09IGdbMV1bMV06CiAgICBmcmFtZV9kaWcgMgogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg0CiAgICAvLyBpZiBnWzBdWzBdID09IHBsYXllciA9PSBnWzJdWzJdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxMAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg2CiAgICAvLyBpZiBnWzBdWzJdID09IHBsYXllciA9PSBnWzJdWzBdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0zCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxNAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg3CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg4CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Qud2hvc2VfdHVybigpIC0+IGJ5dGVzOgp3aG9zZV90dXJuOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgd2hvc2VfdHVybihzZWxmKSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMCAxCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50dXJucyBleGlzdHMKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICBieXRlYyA1IC8vIDB4MDIKICAgIGJ5dGVjIDQgLy8gMHgwMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QucGxheShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6CnBsYXk6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwbGF5KHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi53aW5uZXIsICJHYW1lIGlzIGFscmVhZHkgZmluaXNoZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MAogICAgLy8gaWYgc2VsZi50dXJucyAlIDI6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBwdXNoaW50IDIgLy8gMgogICAgJQogICAgYnogcGxheV9lbHNlX2JvZHlAMgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5ob3N0LCAiSXQgaXMgdGhlIGhvc3QncyB0dXJuIgogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImhvc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaG9zdCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSXQgaXMgdGhlIGhvc3QncyB0dXJuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUyCiAgICAvLyBwbGF5ZXIgPSBhcmM0LlVJbnQ4KEhPU1QpCiAgICBieXRlYyA0IC8vIDB4MDEKICAgIGIgcGxheV9hZnRlcl9pZl9lbHNlQDMKCnBsYXlfZWxzZV9ib2R5QDI6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgdHhuIFNlbmRlcgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NQogICAgLy8gZGVmYXVsdD1BY2NvdW50KCkKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jaGFsbGVuZ2VyLmdldCgKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NC01NgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jaGFsbGVuZ2VyLmdldCgKICAgIC8vICAgICBkZWZhdWx0PUFjY291bnQoKQogICAgLy8gKSwgIkl0IGlzIHRoZSBjaGFsbGVuZ2VyJ3MgdHVybiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzZWxlY3QKICAgID09CiAgICBhc3NlcnQgLy8gSXQgaXMgdGhlIGNoYWxsZW5nZXIncyB0dXJuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU3CiAgICAvLyBwbGF5ZXIgPSBhcmM0LlVJbnQ4KENIQUxMRU5HRVIpCiAgICBieXRlYyA1IC8vIDB4MDIKCnBsYXlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1OAogICAgLy8gc2VsZi5tYWtlX21vdmUocGxheWVyLCBtb3ZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbWFrZV9tb3ZlCiAgICByZXRzdWIK",
+ "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": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/examples/tictactoe/out/TicTacToeContract.destructured.ir b/examples/tictactoe/out/TicTacToeContract.destructured.ir
index c03fedb479..4ebe058e5d 100644
--- a/examples/tictactoe/out/TicTacToeContract.destructured.ir
+++ b/examples/tictactoe/out/TicTacToeContract.destructured.ir
@@ -15,7 +15,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@2: // new_game_route_L20
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: bytes = (txna ApplicationArgs 1)
let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds
let item0%0%0#0: uint64 = (btoi item0%0#0)
@@ -26,9 +26,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@3: // join_game_route_L37
let tmp%6#0: uint64 = (txn OnCompletion)
let tmp%7#0: bool = (! tmp%6#0)
- (assert tmp%7#0) // OnCompletion is NoOp
+ (assert tmp%7#0) // OnCompletion is not NoOp
let tmp%8#0: uint64 = (txn ApplicationID)
- (assert tmp%8#0) // is not creating
+ (assert tmp%8#0) // can only call when not creating
let tmp%10#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds
let item0%1%0#0: uint64 = (btoi item0%1#0)
@@ -39,9 +39,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@4: // whose_turn_route_L43
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn()
let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0)
(log tmp%16#0)
@@ -49,9 +49,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@5: // play_route_L47
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
let tmp%21#0: bytes = (txna ApplicationArgs 1)
let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds
let item0%2%0#0: uint64 = (btoi item0%2#0)
diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.ir b/examples/tictactoe/out/TicTacToeContract.ssa.ir
index 6c24a9b87f..46f3fc325d 100644
--- a/examples/tictactoe/out/TicTacToeContract.ssa.ir
+++ b/examples/tictactoe/out/TicTacToeContract.ssa.ir
@@ -26,7 +26,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@2: // new_game_route_L20
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: bytes = (txna ApplicationArgs 1)
let item0%0#0: bytes = (extract3 tmp%5#0 0u 8u) // on error: Index access is out of bounds
let item0%0%0#0: uint64 = (btoi item0%0#0)
@@ -37,10 +37,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@3: // join_game_route_L37
let tmp%6#0: uint64 = (txn OnCompletion)
let tmp%7#0: bool = (== tmp%6#0 NoOp)
- (assert tmp%7#0) // OnCompletion is NoOp
+ (assert tmp%7#0) // OnCompletion is not NoOp
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (!= tmp%8#0 0u)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
let tmp%10#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = (extract3 tmp%10#0 0u 8u) // on error: Index access is out of bounds
let item0%1%0#0: uint64 = (btoi item0%1#0)
@@ -51,10 +51,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@4: // whose_turn_route_L43
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn()
let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0)
(log tmp%16#0)
@@ -62,10 +62,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@5: // play_route_L47
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (== tmp%17#0 NoOp)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
let tmp%20#0: bool = (!= tmp%19#0 0u)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
let tmp%21#0: bytes = (txna ApplicationArgs 1)
let item0%2#0: bytes = (extract3 tmp%21#0 0u 8u) // on error: Index access is out of bounds
let item0%2%0#0: uint64 = (btoi item0%2#0)
diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir
index 2a8548f0f5..2122c95c0b 100644
--- a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir
+++ b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir
@@ -20,7 +20,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@2: // new_game_route_L20
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: bytes = (txna ApplicationArgs 1)
let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds
let item0%0%0#0: uint64 = (btoi item0%0#0)
@@ -31,9 +31,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@3: // join_game_route_L37
let tmp%6#0: uint64 = (txn OnCompletion)
let tmp%7#0: bool = (! tmp%6#0)
- (assert tmp%7#0) // OnCompletion is NoOp
+ (assert tmp%7#0) // OnCompletion is not NoOp
let tmp%8#0: uint64 = (txn ApplicationID)
- (assert tmp%8#0) // is not creating
+ (assert tmp%8#0) // can only call when not creating
let tmp%10#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds
let item0%1%0#0: uint64 = (btoi item0%1#0)
@@ -44,9 +44,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@4: // whose_turn_route_L43
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn()
let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0)
(log tmp%16#0)
@@ -54,9 +54,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@5: // play_route_L47
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
let tmp%21#0: bytes = (txna ApplicationArgs 1)
let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds
let item0%2%0#0: uint64 = (btoi item0%2#0)
diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir
index 6357ffc4ce..ecd20f1716 100644
--- a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir
+++ b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir
@@ -18,7 +18,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@2: // new_game_route_L20
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: bytes = (txna ApplicationArgs 1)
let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds
let item0%0%0#0: uint64 = (btoi item0%0#0)
@@ -29,9 +29,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@3: // join_game_route_L37
let tmp%6#0: uint64 = (txn OnCompletion)
let tmp%7#0: bool = (! tmp%6#0)
- (assert tmp%7#0) // OnCompletion is NoOp
+ (assert tmp%7#0) // OnCompletion is not NoOp
let tmp%8#0: uint64 = (txn ApplicationID)
- (assert tmp%8#0) // is not creating
+ (assert tmp%8#0) // can only call when not creating
let tmp%10#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds
let item0%1%0#0: uint64 = (btoi item0%1#0)
@@ -42,9 +42,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@4: // whose_turn_route_L43
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn()
let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0)
(log tmp%16#0)
@@ -52,9 +52,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@5: // play_route_L47
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
let tmp%21#0: bytes = (txna ApplicationArgs 1)
let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds
let item0%2%0#0: uint64 = (btoi item0%2#0)
diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_3.ir b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_3.ir
index e9e5754b9c..fbe8823b0a 100644
--- a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_3.ir
+++ b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_3.ir
@@ -15,7 +15,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@2: // new_game_route_L20
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: bytes = (txna ApplicationArgs 1)
let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds
let item0%0%0#0: uint64 = (btoi item0%0#0)
@@ -26,9 +26,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@3: // join_game_route_L37
let tmp%6#0: uint64 = (txn OnCompletion)
let tmp%7#0: bool = (! tmp%6#0)
- (assert tmp%7#0) // OnCompletion is NoOp
+ (assert tmp%7#0) // OnCompletion is not NoOp
let tmp%8#0: uint64 = (txn ApplicationID)
- (assert tmp%8#0) // is not creating
+ (assert tmp%8#0) // can only call when not creating
let tmp%10#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds
let item0%1%0#0: uint64 = (btoi item0%1#0)
@@ -39,9 +39,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@4: // whose_turn_route_L43
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn()
let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0)
(log tmp%16#0)
@@ -49,9 +49,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@5: // play_route_L47
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
let tmp%21#0: bytes = (txna ApplicationArgs 1)
let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds
let item0%2%0#0: uint64 = (btoi item0%2#0)
diff --git a/examples/tictactoe/out_O2/TicTacToeContract.approval.teal b/examples/tictactoe/out_O2/TicTacToeContract.approval.teal
index 1bc59d705c..a6a1b576f5 100644
--- a/examples/tictactoe/out_O2/TicTacToeContract.approval.teal
+++ b/examples/tictactoe/out_O2/TicTacToeContract.approval.teal
@@ -21,7 +21,7 @@ __puya_arc4_router__:
__puya_arc4_router___new_game_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txna ApplicationArgs 1
dup
extract 0 8 // on error: Index access is out of bounds
@@ -36,9 +36,9 @@ __puya_arc4_router___new_game_route@2:
__puya_arc4_router___join_game_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
dup
extract 0 8 // on error: Index access is out of bounds
@@ -53,9 +53,9 @@ __puya_arc4_router___join_game_route@3:
__puya_arc4_router___whose_turn_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub whose_turn
pushbytes 0x151f7c75
swap
@@ -67,9 +67,9 @@ __puya_arc4_router___whose_turn_route@4:
__puya_arc4_router___play_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
dup
extract 0 8 // on error: Index access is out of bounds
diff --git a/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir b/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir
index 83e72b7bac..bb8b7d8f91 100644
--- a/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir
+++ b/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir
@@ -15,7 +15,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@2: // new_game_route_L20
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: bytes = (txna ApplicationArgs 1)
let item0%0#0: bytes = ((extract 0 8) tmp%5#0) // on error: Index access is out of bounds
let item0%0%0#0: uint64 = (btoi item0%0#0)
@@ -26,9 +26,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@3: // join_game_route_L37
let tmp%6#0: uint64 = (txn OnCompletion)
let tmp%7#0: bool = (! tmp%6#0)
- (assert tmp%7#0) // OnCompletion is NoOp
+ (assert tmp%7#0) // OnCompletion is not NoOp
let tmp%8#0: uint64 = (txn ApplicationID)
- (assert tmp%8#0) // is not creating
+ (assert tmp%8#0) // can only call when not creating
let tmp%10#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 8) tmp%10#0) // on error: Index access is out of bounds
let item0%1%0#0: uint64 = (btoi item0%1#0)
@@ -39,9 +39,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@4: // whose_turn_route_L43
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn()
let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0)
(log tmp%16#0)
@@ -49,9 +49,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@5: // play_route_L47
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
let tmp%21#0: bytes = (txna ApplicationArgs 1)
let item0%2#0: bytes = ((extract 0 8) tmp%21#0) // on error: Index access is out of bounds
let item0%2%0#0: uint64 = (btoi item0%2#0)
diff --git a/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal b/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal
index 7f8a10fe29..0069f8781a 100644
--- a/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal
+++ b/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal
@@ -44,7 +44,7 @@ __puya_arc4_router___new_game_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -70,11 +70,11 @@ __puya_arc4_router___join_game_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -100,11 +100,11 @@ __puya_arc4_router___whose_turn_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub whose_turn
pushbytes 0x151f7c75
swap
@@ -119,11 +119,11 @@ __puya_arc4_router___play_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// tictactoe/tictactoe.py:15
// class TicTacToeContract(arc4.ARC4Contract):
txna ApplicationArgs 1
diff --git a/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir b/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir
index 70c2037d75..7acade54e2 100644
--- a/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir
+++ b/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir
@@ -26,7 +26,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@2: // new_game_route_L20
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: bytes = (txna ApplicationArgs 1)
let item0%0#0: bytes = (extract3 tmp%5#0 0u 8u) // on error: Index access is out of bounds
let item0%0%0#0: uint64 = (btoi item0%0#0)
@@ -37,10 +37,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@3: // join_game_route_L37
let tmp%6#0: uint64 = (txn OnCompletion)
let tmp%7#0: bool = (== tmp%6#0 NoOp)
- (assert tmp%7#0) // OnCompletion is NoOp
+ (assert tmp%7#0) // OnCompletion is not NoOp
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (!= tmp%8#0 0u)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
let tmp%10#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = (extract3 tmp%10#0 0u 8u) // on error: Index access is out of bounds
let item0%1%0#0: uint64 = (btoi item0%1#0)
@@ -51,10 +51,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@4: // whose_turn_route_L43
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%15#0: bytes = examples.tictactoe.tictactoe.TicTacToeContract.whose_turn()
let tmp%16#0: bytes = (concat 0x151f7c75 tmp%15#0)
(log tmp%16#0)
@@ -62,10 +62,10 @@ contract examples.tictactoe.tictactoe.TicTacToeContract:
block@5: // play_route_L47
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (== tmp%17#0 NoOp)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
let tmp%20#0: bool = (!= tmp%19#0 0u)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
let tmp%21#0: bytes = (txna ApplicationArgs 1)
let item0%2#0: bytes = (extract3 tmp%21#0 0u 8u) // on error: Index access is out of bounds
let item0%2%0#0: uint64 = (btoi item0%2#0)
diff --git a/examples/tictactoe/puya.log b/examples/tictactoe/puya.log
index 8d57e535e2..dad6a4250c 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.approval.mir b/examples/voting/out/VotingRoundApp.approval.mir
index c20475fbb8..eb594c7e0c 100644
--- a/examples/voting/out/VotingRoundApp.approval.mir
+++ b/examples/voting/out/VotingRoundApp.approval.mir
@@ -66,10 +66,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -106,9 +106,9 @@ __puya_arc4_router___bootstrap_route@3:
// @arc4.abimethod
txn OnCompletion tmp%22#0
! tmp%23#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%24#0
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txn GroupIndex tmp%26#0
@@ -131,9 +131,9 @@ __puya_arc4_router___close_route@4:
// @arc4.abimethod
txn OnCompletion tmp%27#0
! tmp%28#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%29#0
- assert // is not creating
+ assert // can only call when not creating
callsub close
int 1 1
retsub 1
@@ -143,9 +143,9 @@ __puya_arc4_router___get_preconditions_route@5:
// @arc4.abimethod(readonly=True)
txn OnCompletion tmp%31#0
! tmp%32#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%33#0
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txna ApplicationArgs 1 tmp%35#0
@@ -165,9 +165,9 @@ __puya_arc4_router___vote_route@6:
// @arc4.abimethod
txn OnCompletion tmp%39#0
! tmp%40#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%41#0
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txn GroupIndex tmp%43#0
diff --git a/examples/voting/out/VotingRoundApp.approval.teal b/examples/voting/out/VotingRoundApp.approval.teal
index a79b0f336b..66b0cf93f0 100644
--- a/examples/voting/out/VotingRoundApp.approval.teal
+++ b/examples/voting/out/VotingRoundApp.approval.teal
@@ -49,10 +49,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txna ApplicationArgs 1
@@ -81,9 +81,9 @@ __puya_arc4_router___bootstrap_route@3:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txn GroupIndex
@@ -105,9 +105,9 @@ __puya_arc4_router___close_route@4:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub close
intc_1 // 1
retsub
@@ -117,9 +117,9 @@ __puya_arc4_router___get_preconditions_route@5:
// @arc4.abimethod(readonly=True)
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txna ApplicationArgs 1
@@ -139,9 +139,9 @@ __puya_arc4_router___vote_route@6:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txn GroupIndex
diff --git a/examples/voting/out/VotingRoundApp.arc32.json b/examples/voting/out/VotingRoundApp.arc32.json
index d647abb975..fb3ef3afc4 100644
--- a/examples/voting/out/VotingRoundApp.arc32.json
+++ b/examples/voting/out/VotingRoundApp.arc32.json
@@ -51,7 +51,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwIDgKICAgIGJ5dGVjYmxvY2sgImlzX2Jvb3RzdHJhcHBlZCIgInZvdGVyX2NvdW50IiAidm90ZV9pZCIgIm9wdGlvbl9jb3VudHMiICJWIiAiY2xvc2VfdGltZSIgInNuYXBzaG90X3B1YmxpY19rZXkiICJtZXRhZGF0YV9pcGZzX2NpZCIgInN0YXJ0X3RpbWUiICJlbmRfdGltZSIgInF1b3J1bSIgIm5mdF9pbWFnZV91cmwiICJ0b3RhbF9vcHRpb25zIiAweDMwMzEzMjMzMzQzNTM2MzczODM5IDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTAKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjUxCiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZCA9IEZhbHNlCiAgICBieXRlY18wIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTItNTMKICAgIC8vICMgVGhlIG1pbmltdW0gbnVtYmVyIG9mIHZvdGVycyB3aG8gaGF2ZSB2b3RlZAogICAgLy8gc2VsZi52b3Rlcl9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHhhZTg5N2Y2YiAweGE0ZThkMTY0IDB4OTY1NjA0N2EgMHhiY2IxNTg5NiAweDg0YTUzYzZlIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDhbXSx1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcChwYXkpdm9pZCIsIG1ldGhvZCAiY2xvc2UoKXZvaWQiLCBtZXRob2QgImdldF9wcmVjb25kaXRpb25zKGJ5dGVbXSkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidm90ZShwYXksYnl0ZVtdLHVpbnQ4W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192b3RlX3JvdXRlQDYKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBleHRyYWN0IDIgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm9vdHN0cmFwX3JvdXRlQDM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wcmVjb25kaXRpb25zCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZvdGVfcm91dGVANjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHZvdGUKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY3JlYXRlKHZvdGVfaWQ6IGJ5dGVzLCBzbmFwc2hvdF9wdWJsaWNfa2V5OiBieXRlcywgbWV0YWRhdGFfaXBmc19jaWQ6IGJ5dGVzLCBzdGFydF90aW1lOiB1aW50NjQsIGVuZF90aW1lOiB1aW50NjQsIG9wdGlvbl9jb3VudHM6IGJ5dGVzLCBxdW9ydW06IHVpbnQ2NCwgbmZ0X2ltYWdlX3VybDogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTgtNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZSgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHZvdGVfaWQ6IFN0cmluZywKICAgIC8vICAgICBzbmFwc2hvdF9wdWJsaWNfa2V5OiBCeXRlcywKICAgIC8vICAgICBtZXRhZGF0YV9pcGZzX2NpZDogU3RyaW5nLAogICAgLy8gICAgIHN0YXJ0X3RpbWU6IFVJbnQ2NCwKICAgIC8vICAgICBlbmRfdGltZTogVUludDY0LAogICAgLy8gICAgIG9wdGlvbl9jb3VudHM6IFZvdGVJbmRleEFycmF5LAogICAgLy8gICAgIHF1b3J1bTogVUludDY0LAogICAgLy8gICAgIG5mdF9pbWFnZV91cmw6IFN0cmluZywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDggMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3MAogICAgLy8gYXNzZXJ0IHN0YXJ0X3RpbWUgPCBlbmRfdGltZSwgIkVuZCB0aW1lIHNob3VsZCBiZSBhZnRlciBzdGFydCB0aW1lIgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIDwKICAgIGFzc2VydCAvLyBFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3MQogICAgLy8gYXNzZXJ0IGVuZF90aW1lID49IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCAiRW5kIHRpbWUgc2hvdWxkIGJlIGluIHRoZSBmdXR1cmUiCiAgICBmcmFtZV9kaWcgLTQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID49CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGluIHRoZSBmdXR1cmUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzMKICAgIC8vIHNlbGYudm90ZV9pZCA9IHZvdGVfaWQKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBmcmFtZV9kaWcgLTgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc0CiAgICAvLyBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXkgPSBzbmFwc2hvdF9wdWJsaWNfa2V5CiAgICBieXRlYyA2IC8vICJzbmFwc2hvdF9wdWJsaWNfa2V5IgogICAgZnJhbWVfZGlnIC03CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NQogICAgLy8gc2VsZi5tZXRhZGF0YV9pcGZzX2NpZCA9IG1ldGFkYXRhX2lwZnNfY2lkCiAgICBieXRlYyA3IC8vICJtZXRhZGF0YV9pcGZzX2NpZCIKICAgIGZyYW1lX2RpZyAtNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzYKICAgIC8vIHNlbGYuc3RhcnRfdGltZSA9IHN0YXJ0X3RpbWUKICAgIGJ5dGVjIDggLy8gInN0YXJ0X3RpbWUiCiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc3CiAgICAvLyBzZWxmLmVuZF90aW1lID0gZW5kX3RpbWUKICAgIGJ5dGVjIDkgLy8gImVuZF90aW1lIgogICAgZnJhbWVfZGlnIC00CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OAogICAgLy8gc2VsZi5xdW9ydW0gPSBxdW9ydW0KICAgIGJ5dGVjIDEwIC8vICJxdW9ydW0iCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc5CiAgICAvLyBzZWxmLm5mdF9pbWFnZV91cmwgPSBuZnRfaW1hZ2VfdXJsCiAgICBieXRlYyAxMSAvLyAibmZ0X2ltYWdlX3VybCIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODAKICAgIC8vIHNlbGYuc3RvcmVfb3B0aW9uX2NvdW50cyhvcHRpb25fY291bnRzLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAtMwogICAgY2FsbHN1YiBzdG9yZV9vcHRpb25fY291bnRzCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuc3RvcmVfb3B0aW9uX2NvdW50cyhvcHRpb25fY291bnRzOiBieXRlcykgLT4gYnl0ZXM6CnN0b3JlX29wdGlvbl9jb3VudHM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxNy0yMTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc3RvcmVfb3B0aW9uX2NvdW50cyhzZWxmLCBvcHRpb25fY291bnRzOiBWb3RlSW5kZXhBcnJheSkgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTkKICAgIC8vIGFzc2VydCBvcHRpb25fY291bnRzLmxlbmd0aCwgIm9wdGlvbl9jb3VudHMgc2hvdWxkIGJlIG5vbi1lbXB0eSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGFzc2VydCAvLyBvcHRpb25fY291bnRzIHNob3VsZCBiZSBub24tZW1wdHkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjIwCiAgICAvLyBhc3NlcnQgb3B0aW9uX2NvdW50cy5sZW5ndGggPD0gMTEyLCAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTEyIHF1ZXN0aW9ucyIKICAgIHB1c2hpbnQgMTEyIC8vIDExMgogICAgPD0KICAgIGFzc2VydCAvLyBDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMTIgcXVlc3Rpb25zCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMgogICAgLy8gdG90YWxfb3B0aW9ucyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKc3RvcmVfb3B0aW9uX2NvdW50c19mb3JfaGVhZGVyQDE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMwogICAgLy8gZm9yIGl0ZW0gaW4gb3B0aW9uX2NvdW50czoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogc3RvcmVfb3B0aW9uX2NvdW50c19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjQKICAgIC8vIHRvdGFsX29wdGlvbnMgKz0gaXRlbS5uYXRpdmUKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgc3RvcmVfb3B0aW9uX2NvdW50c19mb3JfaGVhZGVyQDEKCnN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyNQogICAgLy8gYXNzZXJ0IHRvdGFsX29wdGlvbnMgPD0gMTI4LCAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucyIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTI4IC8vIDEyOAogICAgPD0KICAgIGFzc2VydCAvLyBDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMjggdm90ZSBvcHRpb25zCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyNwogICAgLy8gc2VsZi5vcHRpb25fY291bnRzID0gb3B0aW9uX2NvdW50cy5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gIm9wdGlvbl9jb3VudHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9vcHRpb25zID0gdG90YWxfb3B0aW9ucwogICAgYnl0ZWMgMTIgLy8gInRvdGFsX29wdGlvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuYm9vdHN0cmFwKGZ1bmRfbWluX2JhbF9yZXE6IHVpbnQ2NCkgLT4gdm9pZDoKYm9vdHN0cmFwOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4Mi04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm9vdHN0cmFwKHNlbGYsIGZ1bmRfbWluX2JhbF9yZXE6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuaXNfYm9vdHN0cmFwcGVkLCAiTXVzdCBub3QgYmUgYWxyZWFkeSBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzX2Jvb3RzdHJhcHBlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBNdXN0IG5vdCBiZSBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4NQogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQgPSBUcnVlCiAgICBieXRlY18wIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODgKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg3LTg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgIlBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MKICAgIC8vIHZvdGluZy92b3RpbmcucHk6OTEKICAgIC8vIHRhbGx5X2JveF9zaXplID0gc2VsZi50b3RhbF9vcHRpb25zICogVk9URV9DT1VOVF9CWVRFUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF9vcHRpb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX29wdGlvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDEtMTAyCiAgICAvLyAjIHRhbGx5IGJveCB2YWx1ZQogICAgLy8gKyAodGFsbHlfYm94X3NpemUgKiBCT1hfQllURV9NSU5fQkFMQU5DRSkKICAgIGR1cAogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkzLTEwMAogICAgLy8gIyBtaW5pbXVtIGJhbGFuY2UgcmVxIGZvcjogQUxHT3MgKyBWb3RlIHJlc3VsdCBORlQgYXNzZXQKICAgIC8vIEFTU0VUX01JTl9CQUxBTkNFICogMgogICAgLy8gIyBjcmVhdGUgTkZUIGZlZQogICAgLy8gKyAxMDAwCiAgICAvLyAjIHRhbGx5IGJveAogICAgLy8gKyBCT1hfRkxBVF9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3gga2V5ICJWIgogICAgLy8gKyBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgcHVzaGludCAyMDM5MDAgLy8gMjAzOTAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkzLTEwMgogICAgLy8gIyBtaW5pbXVtIGJhbGFuY2UgcmVxIGZvcjogQUxHT3MgKyBWb3RlIHJlc3VsdCBORlQgYXNzZXQKICAgIC8vIEFTU0VUX01JTl9CQUxBTkNFICogMgogICAgLy8gIyBjcmVhdGUgTkZUIGZlZQogICAgLy8gKyAxMDAwCiAgICAvLyAjIHRhbGx5IGJveAogICAgLy8gKyBCT1hfRkxBVF9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3gga2V5ICJWIgogICAgLy8gKyBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNAogICAgLy8gbG9nKG1pbl9iYWxhbmNlX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNgogICAgLy8gZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgPT0KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA1LTEwNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLmFtb3VudCA9PSBtaW5fYmFsYW5jZV9yZXEKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgZm9yIHRoZSBleGFjdCBtaW4gYmFsYW5jZSByZXF1aXJlbWVudCIKICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgZm9yIHRoZSBleGFjdCBtaW4gYmFsYW5jZSByZXF1aXJlbWVudAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDgKICAgIC8vIGFzc2VydCBzZWxmLnRhbGx5X2JveC5jcmVhdGUoc2l6ZT10YWxseV9ib3hfc2l6ZSkKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY2xvc2UoKSAtPiB2b2lkOgpjbG9zZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTEwLTExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTEyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDIwMDAwLCBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBwdXNoaW50IDIwMDAwIC8vIDIwMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmNsb3NlX3RpbWUsICJBbHJlYWR5IGNsb3NlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjbG9zZV90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgY2xvc2VkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNAogICAgLy8gc2VsZi5jbG9zZV90aW1lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGJ5dGVjIDUgLy8gImNsb3NlX3RpbWUiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTkKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3RlX2lkIGV4aXN0cwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTE4CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICBwdXNoYnl0ZXMgIntcInN0YW5kYXJkXCI6XCJhcmM2OVwiLFwiZGVzY3JpcHRpb25cIjpcIlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTE5CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgcHVzaGJ5dGVzICIuXCIsXCJwcm9wZXJ0aWVzXCI6e1wibWV0YWRhdGFcIjpcImlwZnM6Ly8iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjAKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTIxCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJtZXRhZGF0YV9pcGZzX2NpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMgogICAgLy8gKyAnIiwiaWQiOiInCiAgICBwdXNoYnl0ZXMgIlwiLFwiaWRcIjpcIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMgogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTIzCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMwogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyNAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICBwdXNoYnl0ZXMgIlwiLFwicXVvcnVtXCI6IgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI0CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjUKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicXVvcnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnF1b3J1bSBleGlzdHMKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI1CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjYKICAgIC8vICsgJywidm90ZXJDb3VudCI6JwogICAgcHVzaGJ5dGVzICIsXCJ2b3RlckNvdW50XCI6IgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI2CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIC8vICsgJywidm90ZXJDb3VudCI6JwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyNwogICAgLy8gKyBpdG9hKHNlbGYudm90ZXJfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZXJfY291bnQgZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNwogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyOAogICAgLy8gKyAnLCJ0YWxsaWVzIjpbJwogICAgcHVzaGJ5dGVzICIsXCJ0YWxsaWVzXCI6WyIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyOAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgLy8gKyAnLCJ0YWxsaWVzIjpbJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMQogICAgLy8gY3VycmVudF9pbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnMgaW4gdWVudW1lcmF0ZShzZWxmLm9wdGlvbl9jb3VudHMpOgogICAgZHVwCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcHRpb25fY291bnRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAoKY2xvc2VfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzIKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCwgcXVlc3Rpb25fb3B0aW9ucyBpbiB1ZW51bWVyYXRlKHNlbGYub3B0aW9uX2NvdW50cyk6CiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfZGlnIDgKICAgIDwKICAgIGJ6IGNsb3NlX2FmdGVyX2ZvckAxNAogICAgZnJhbWVfZGlnIDcKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMzCiAgICAvLyBpZiBxdWVzdGlvbl9pbmRleCA+IDA6CiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM0CiAgICAvLyBub3RlICs9ICIsIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM1CiAgICAvLyBpZiBxdWVzdGlvbl9vcHRpb25zID4gMDoKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYj4KICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDIKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzYKICAgIC8vIG5vdGUgKz0gIlsiCiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGJ5dGVzICJbIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM3CiAgICAvLyBmb3Igb3B0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbl9vcHRpb25zLm5hdGl2ZSk6CiAgICBmcmFtZV9kaWcgMQogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgpjbG9zZV9mb3JfaGVhZGVyQDY6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiBjbG9zZV9hZnRlcl9mb3JAMTEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM4CiAgICAvLyBpZiBvcHRpb25faW5kZXggPiAwOgogICAgZnJhbWVfZGlnIDMKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzkKICAgIC8vIG5vdGUgKz0gIiwiCiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGJ5dGVzICIsIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKCmNsb3NlX2FmdGVyX2lmX2Vsc2VAOToKICAgIGZyYW1lX2RpZyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MAogICAgLy8gdm90ZXNfZm9yX29wdGlvbiA9IHNlbGYuZ2V0X3ZvdGVfZnJvbV9ib3goY3VycmVudF9pbmRleCkKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgZ2V0X3ZvdGVfZnJvbV9ib3gKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQxCiAgICAvLyBub3RlICs9IGl0b2Eodm90ZXNfZm9yX29wdGlvbikKICAgIGNhbGxzdWIgaXRvYQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQyCiAgICAvLyBjdXJyZW50X2luZGV4ICs9IDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM3CiAgICAvLyBmb3Igb3B0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbl9vcHRpb25zLm5hdGl2ZSk6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBjbG9zZV9mb3JfaGVhZGVyQDYKCmNsb3NlX2FmdGVyX2ZvckAxMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQzCiAgICAvLyBub3RlICs9ICJdIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiXSIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDEyOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgNgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgNQogICAgZnJhbWVfZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDkKICAgIGIgY2xvc2VfZm9yX2hlYWRlckAxCgpjbG9zZV9hZnRlcl9mb3JAMTQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NAogICAgLy8gbm90ZSArPSAiXX19IgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiXX19IgogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1NAogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTUwCiAgICAvLyBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3RlX2lkIGV4aXN0cwogICAgcHVzaGJ5dGVzICJbVk9URSBSRVNVTFRdICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTIKICAgIC8vIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gIm5mdF9pbWFnZV91cmwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmZ0X2ltYWdlX3VybCBleGlzdHMKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1MQogICAgLy8gdW5pdF9uYW1lPSJWT1RFUlNMVCIsCiAgICBwdXNoYnl0ZXMgIlZPVEVSU0xUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDkKICAgIC8vIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0OAogICAgLy8gZGVjaW1hbHM9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ3CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2LTE1NgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICAvLyAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NQogICAgLy8gc2VsZi5uZnRfYXNzZXRfaWQgPSAoCiAgICBwdXNoYnl0ZXMgIm5mdF9hc3NldF9pZCIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2LTE1NwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICAvLyAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2Fzc2V0LmlkCiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NS0xNTgKICAgIC8vIHNlbGYubmZ0X2Fzc2V0X2lkID0gKAogICAgLy8gICAgIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgICAgIHRvdGFsPTEsCiAgICAvLyAgICAgICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgICAgICBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgICAgICBub3RlPW5vdGUsCiAgICAvLyAgICAgICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2Fzc2V0LmlkCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5pdG9hKGk6IHVpbnQ2NCkgLT4gYnl0ZXM6Cml0b2E6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0OS0yNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXRvYShpOiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTMKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTIKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU0CiAgICAvLyByZXR1cm4gU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2ldKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTEKICAgIC8vIGRpZ2l0cyA9IEJ5dGVzKGIiMDEyMzQ1Njc4OSIpCiAgICBieXRlYyAxMyAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NAogICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpXSkKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICAvCiAgICBjYWxsc3ViIGl0b2EKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTIKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBTdHJpbmcuZnJvbV9ieXRlcyhkaWdpdHNbaSAlIHJhZGl4XSkKICAgICUKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUxCiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWMgMTMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuZ2V0X3ZvdGVfZnJvbV9ib3goaW5kZXg6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRfdm90ZV9mcm9tX2JveDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjM5LTI0MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdm90ZV9mcm9tX2JveChzZWxmLCBpbmRleDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQxCiAgICAvLyByZXR1cm4gb3AuYnRvaShzZWxmLnRhbGx5X2JveC5leHRyYWN0KGluZGV4LCBWT1RFX0NPVU5UX0JZVEVTKSkKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5nZXRfcHJlY29uZGl0aW9ucyhzaWduYXR1cmU6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3ByZWNvbmRpdGlvbnM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MC0xNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wcmVjb25kaXRpb25zKHNlbGYsIHNpZ25hdHVyZTogQnl0ZXMpIC0+IFZvdGluZ1ByZWNvbmRpdGlvbnM6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYzCiAgICAvLyBpc192b3Rpbmdfb3Blbj1hcmM0LlVJbnQ2NChzZWxmLnZvdGluZ19vcGVuKCkpLAogICAgY2FsbHN1YiB2b3Rpbmdfb3BlbgogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjQKICAgIC8vIGlzX2FsbG93ZWRfdG9fdm90ZT1hcmM0LlVJbnQ2NChzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhbGxvd2VkX3RvX3ZvdGUKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY1CiAgICAvLyBoYXNfYWxyZWFkeV92b3RlZD1hcmM0LlVJbnQ2NChzZWxmLmFscmVhZHlfdm90ZWQoKSksCiAgICBjYWxsc3ViIGFscmVhZHlfdm90ZWQKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY2CiAgICAvLyBjdXJyZW50X3RpbWU9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjItMTY3CiAgICAvLyByZXR1cm4gVm90aW5nUHJlY29uZGl0aW9ucygKICAgIC8vICAgICBpc192b3Rpbmdfb3Blbj1hcmM0LlVJbnQ2NChzZWxmLnZvdGluZ19vcGVuKCkpLAogICAgLy8gICAgIGlzX2FsbG93ZWRfdG9fdm90ZT1hcmM0LlVJbnQ2NChzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpKSwKICAgIC8vICAgICBoYXNfYWxyZWFkeV92b3RlZD1hcmM0LlVJbnQ2NChzZWxmLmFscmVhZHlfdm90ZWQoKSksCiAgICAvLyAgICAgY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAudm90aW5nX29wZW4oKSAtPiB1aW50NjQ6CnZvdGluZ19vcGVuOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDUtMjA2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHZvdGluZ19vcGVuKHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDgKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzX2Jvb3RzdHJhcHBlZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA4LTIxMAogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQKICAgIC8vIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICAvLyBhbmQgc2VsZi5zdGFydF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuZW5kX3RpbWUKICAgIGJ6IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDkKICAgIC8vIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2xvc2VfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJueiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjEwCiAgICAvLyBhbmQgc2VsZi5zdGFydF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuZW5kX3RpbWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJzdGFydF90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXJ0X3RpbWUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgPD0KICAgIGJ6IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImVuZF90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVuZF90aW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCiAgICBiIHZvdGluZ19vcGVuX2Jvb2xfbWVyZ2VANgoKdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKCnZvdGluZ19vcGVuX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA3LTIxMQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgLy8gICAgIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICAvLyAgICAgYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICAvLyApCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmU6IGJ5dGVzKSAtPiB1aW50NjQ6CmFsbG93ZWRfdG9fdm90ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMwLTIzMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbGxvd2VkX3RvX3ZvdGUoc2VsZiwgc2lnbmF0dXJlOiBCeXRlcykgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzIKICAgIC8vIGVuc3VyZV9idWRnZXQoMjAwMCkKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzNAogICAgLy8gVHhuLnNlbmRlci5ieXRlcywKICAgIHR4biBTZW5kZXIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjM2CiAgICAvLyBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic25hcHNob3RfcHVibGljX2tleSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5IGV4aXN0cwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzMtMjM3CiAgICAvLyByZXR1cm4gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKAogICAgLy8gICAgIFR4bi5zZW5kZXIuYnl0ZXMsCiAgICAvLyAgICAgc2lnbmF0dXJlLAogICAgLy8gICAgIHNlbGYuc25hcHNob3RfcHVibGljX2tleSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgZWQyNTUxOXZlcmlmeV9iYXJlCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFscmVhZHlfdm90ZWQoKSAtPiB1aW50NjQ6CmFscmVhZHlfdm90ZWQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxMy0yMTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxyZWFkeV92b3RlZChzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxNQogICAgLy8gcmV0dXJuIFR4bi5zZW5kZXIgaW4gc2VsZi52b3Rlc19ieV9hY2NvdW50CiAgICB0eG4gU2VuZGVyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAudm90ZShmdW5kX21pbl9iYWxfcmVxOiB1aW50NjQsIHNpZ25hdHVyZTogYnl0ZXMsIGFuc3dlcl9pZHM6IGJ5dGVzKSAtPiB2b2lkOgp2b3RlOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjktMTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB2b3RlKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sCiAgICAvLyAgICAgc2lnbmF0dXJlOiBCeXRlcywKICAgIC8vICAgICBhbnN3ZXJfaWRzOiBWb3RlSW5kZXhBcnJheSwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNzYKICAgIC8vIGVuc3VyZV9idWRnZXQoNzcwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCA3NzAwIC8vIDc3MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc3LTE3OAogICAgLy8gIyBDaGVjayB2b3RpbmcgcHJlY29uZGl0aW9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsb3dlZF90b192b3RlKHNpZ25hdHVyZSksICJOb3QgYWxsb3dlZCB0byB2b3RlIgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFsbG93ZWRfdG9fdm90ZQogICAgYXNzZXJ0IC8vIE5vdCBhbGxvd2VkIHRvIHZvdGUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc5CiAgICAvLyBhc3NlcnQgc2VsZi52b3Rpbmdfb3BlbigpLCAiVm90aW5nIG5vdCBvcGVuIgogICAgY2FsbHN1YiB2b3Rpbmdfb3BlbgogICAgYXNzZXJ0IC8vIFZvdGluZyBub3Qgb3BlbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hbHJlYWR5X3ZvdGVkKCksICJBbHJlYWR5IHZvdGVkIgogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICAhCiAgICBhc3NlcnQgLy8gQWxyZWFkeSB2b3RlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODEKICAgIC8vIHF1ZXN0aW9uc19jb3VudCA9IHNlbGYub3B0aW9uX2NvdW50cy5sZW5ndGgKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wdGlvbl9jb3VudHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODIKICAgIC8vIGFzc2VydCBhbnN3ZXJfaWRzLmxlbmd0aCA9PSBxdWVzdGlvbnNfY291bnQsICJOdW1iZXIgb2YgYW5zd2VycyBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTnVtYmVyIG9mIGFuc3dlcnMgaW5jb3JyZWN0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4NQogICAgLy8gKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgcHVzaGludCAzNCAvLyAzNAogICAgKwogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4My0xODQKICAgIC8vICMgQ2hlY2sgdm90ZXIgYm94IGlzIGZ1bmRlZAogICAgLy8gbWluX2JhbF9yZXEgPSBCT1hfRkxBVF9NSU5fQkFMQU5DRSArICgKICAgIHB1c2hpbnQgMjUwMCAvLyAyNTAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4My0xODYKICAgIC8vICMgQ2hlY2sgdm90ZXIgYm94IGlzIGZ1bmRlZAogICAgLy8gbWluX2JhbF9yZXEgPSBCT1hfRkxBVF9NSU5fQkFMQU5DRSArICgKICAgIC8vICAgICAoMzIgKyAyICsgVk9URV9JTkRFWF9CWVRFUyAqIGFuc3dlcl9pZHMubGVuZ3RoKSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFCiAgICAvLyApCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4OAogICAgLy8gZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTg3LTE4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5MQogICAgLy8gbG9nKG1pbl9iYWxfcmVxKQogICAgZHVwCiAgICBpdG9iCiAgICBsb2cKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkyCiAgICAvLyBhc3NlcnQgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbF9yZXEsICJQYXltZW50IG11c3QgYmUgdGhlIGV4YWN0IG1pbiBiYWxhbmNlIgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTMtMTk0CiAgICAvLyAjIFJlY29yZCB0aGUgdm90ZSBmb3IgZWFjaCBxdWVzdGlvbgogICAgLy8gY3VtdWxhdGl2ZV9vZmZzZXQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgZHVwCgp2b3RlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk1CiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uc19jb3VudCk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHZvdGVfYWZ0ZXJfZm9yQDQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk2LTE5NwogICAgLy8gIyBMb2FkIHRoZSB1c2VyJ3Mgdm90ZSBmb3IgdGhpcyBxdWVzdGlvbgogICAgLy8gYW5zd2VyX29wdGlvbl9pbmRleCA9IGFuc3dlcl9pZHNbcXVlc3Rpb25faW5kZXhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTgKICAgIC8vIG9wdGlvbnNfY291bnQgPSBzZWxmLm9wdGlvbl9jb3VudHNbcXVlc3Rpb25faW5kZXhdLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm9wdGlvbl9jb3VudHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3B0aW9uX2NvdW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTkKICAgIC8vIGFzc2VydCBhbnN3ZXJfb3B0aW9uX2luZGV4IDwgb3B0aW9uc19jb3VudCwgIkFuc3dlciBvcHRpb24gaW5kZXggaW52YWxpZCIKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBBbnN3ZXIgb3B0aW9uIGluZGV4IGludmFsaWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjAwCiAgICAvLyBzZWxmLmluY3JlbWVudF92b3RlX2luX2JveChjdW11bGF0aXZlX29mZnNldCArIGFuc3dlcl9vcHRpb25faW5kZXgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGNhbGxzdWIgaW5jcmVtZW50X3ZvdGVfaW5fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMQogICAgLy8gY3VtdWxhdGl2ZV9vZmZzZXQgKz0gb3B0aW9uc19jb3VudAogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMgogICAgLy8gc2VsZi52b3Rlc19ieV9hY2NvdW50W1R4bi5zZW5kZXJdID0gYW5zd2VyX2lkcy5jb3B5KCkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjAzCiAgICAvLyBzZWxmLnZvdGVyX2NvdW50ICs9IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2b3Rlcl9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3Rlcl9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18xIC8vICJ2b3Rlcl9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB2b3RlX2Zvcl9oZWFkZXJAMQoKdm90ZV9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuaW5jcmVtZW50X3ZvdGVfaW5fYm94KGluZGV4OiB1aW50NjQpIC0+IHZvaWQ6CmluY3JlbWVudF92b3RlX2luX2JveDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQzLTI0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpbmNyZW1lbnRfdm90ZV9pbl9ib3goc2VsZiwgaW5kZXg6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDUKICAgIC8vIGN1cnJlbnRfdm90ZSA9IHNlbGYuZ2V0X3ZvdGVfZnJvbV9ib3goaW5kZXgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X3ZvdGVfZnJvbV9ib3gKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ2CiAgICAvLyBzZWxmLnRhbGx5X2JveC5yZXBsYWNlKGluZGV4LCBvcC5pdG9iKGN1cnJlbnRfdm90ZSArIDEpKQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMTQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAxNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1Ygo=",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwIDgKICAgIGJ5dGVjYmxvY2sgImlzX2Jvb3RzdHJhcHBlZCIgInZvdGVyX2NvdW50IiAidm90ZV9pZCIgIm9wdGlvbl9jb3VudHMiICJWIiAiY2xvc2VfdGltZSIgInNuYXBzaG90X3B1YmxpY19rZXkiICJtZXRhZGF0YV9pcGZzX2NpZCIgInN0YXJ0X3RpbWUiICJlbmRfdGltZSIgInF1b3J1bSIgIm5mdF9pbWFnZV91cmwiICJ0b3RhbF9vcHRpb25zIiAweDMwMzEzMjMzMzQzNTM2MzczODM5IDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTAKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjUxCiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZCA9IEZhbHNlCiAgICBieXRlY18wIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTItNTMKICAgIC8vICMgVGhlIG1pbmltdW0gbnVtYmVyIG9mIHZvdGVycyB3aG8gaGF2ZSB2b3RlZAogICAgLy8gc2VsZi52b3Rlcl9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHhhZTg5N2Y2YiAweGE0ZThkMTY0IDB4OTY1NjA0N2EgMHhiY2IxNTg5NiAweDg0YTUzYzZlIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDhbXSx1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcChwYXkpdm9pZCIsIG1ldGhvZCAiY2xvc2UoKXZvaWQiLCBtZXRob2QgImdldF9wcmVjb25kaXRpb25zKGJ5dGVbXSkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidm90ZShwYXksYnl0ZVtdLHVpbnQ4W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192b3RlX3JvdXRlQDYKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm9vdHN0cmFwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9yb3V0ZUA0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3ByZWNvbmRpdGlvbnMKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdm90ZV9yb3V0ZUA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB2b3RlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNyZWF0ZSh2b3RlX2lkOiBieXRlcywgc25hcHNob3RfcHVibGljX2tleTogYnl0ZXMsIG1ldGFkYXRhX2lwZnNfY2lkOiBieXRlcywgc3RhcnRfdGltZTogdWludDY0LCBlbmRfdGltZTogdWludDY0LCBvcHRpb25fY291bnRzOiBieXRlcywgcXVvcnVtOiB1aW50NjQsIG5mdF9pbWFnZV91cmw6IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU4LTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB2b3RlX2lkOiBTdHJpbmcsCiAgICAvLyAgICAgc25hcHNob3RfcHVibGljX2tleTogQnl0ZXMsCiAgICAvLyAgICAgbWV0YWRhdGFfaXBmc19jaWQ6IFN0cmluZywKICAgIC8vICAgICBzdGFydF90aW1lOiBVSW50NjQsCiAgICAvLyAgICAgZW5kX3RpbWU6IFVJbnQ2NCwKICAgIC8vICAgICBvcHRpb25fY291bnRzOiBWb3RlSW5kZXhBcnJheSwKICAgIC8vICAgICBxdW9ydW06IFVJbnQ2NCwKICAgIC8vICAgICBuZnRfaW1hZ2VfdXJsOiBTdHJpbmcsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA4IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzAKICAgIC8vIGFzc2VydCBzdGFydF90aW1lIDwgZW5kX3RpbWUsICJFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZSIKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICA8CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGFmdGVyIHN0YXJ0IHRpbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzEKICAgIC8vIGFzc2VydCBlbmRfdGltZSA+PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgIkVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlIgogICAgZnJhbWVfZGlnIC00CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+PQogICAgYXNzZXJ0IC8vIEVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjczCiAgICAvLyBzZWxmLnZvdGVfaWQgPSB2b3RlX2lkCiAgICBieXRlY18yIC8vICJ2b3RlX2lkIgogICAgZnJhbWVfZGlnIC04CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NAogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5ID0gc25hcHNob3RfcHVibGljX2tleQogICAgYnl0ZWMgNiAvLyAic25hcHNob3RfcHVibGljX2tleSIKICAgIGZyYW1lX2RpZyAtNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzUKICAgIC8vIHNlbGYubWV0YWRhdGFfaXBmc19jaWQgPSBtZXRhZGF0YV9pcGZzX2NpZAogICAgYnl0ZWMgNyAvLyAibWV0YWRhdGFfaXBmc19jaWQiCiAgICBmcmFtZV9kaWcgLTYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc2CiAgICAvLyBzZWxmLnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lCiAgICBieXRlYyA4IC8vICJzdGFydF90aW1lIgogICAgZnJhbWVfZGlnIC01CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NwogICAgLy8gc2VsZi5lbmRfdGltZSA9IGVuZF90aW1lCiAgICBieXRlYyA5IC8vICJlbmRfdGltZSIKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzgKICAgIC8vIHNlbGYucXVvcnVtID0gcXVvcnVtCiAgICBieXRlYyAxMCAvLyAicXVvcnVtIgogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OQogICAgLy8gc2VsZi5uZnRfaW1hZ2VfdXJsID0gbmZ0X2ltYWdlX3VybAogICAgYnl0ZWMgMTEgLy8gIm5mdF9pbWFnZV91cmwiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgwCiAgICAvLyBzZWxmLnN0b3JlX29wdGlvbl9jb3VudHMob3B0aW9uX2NvdW50cy5jb3B5KCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGNhbGxzdWIgc3RvcmVfb3B0aW9uX2NvdW50cwogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnN0b3JlX29wdGlvbl9jb3VudHMob3B0aW9uX2NvdW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzdG9yZV9vcHRpb25fY291bnRzOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTctMjE4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN0b3JlX29wdGlvbl9jb3VudHMoc2VsZiwgb3B0aW9uX2NvdW50czogVm90ZUluZGV4QXJyYXkpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjE5CiAgICAvLyBhc3NlcnQgb3B0aW9uX2NvdW50cy5sZW5ndGgsICJvcHRpb25fY291bnRzIHNob3VsZCBiZSBub24tZW1wdHkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBhc3NlcnQgLy8gb3B0aW9uX2NvdW50cyBzaG91bGQgYmUgbm9uLWVtcHR5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMAogICAgLy8gYXNzZXJ0IG9wdGlvbl9jb3VudHMubGVuZ3RoIDw9IDExMiwgIkNhbid0IGhhdmUgbW9yZSB0aGFuIDExMiBxdWVzdGlvbnMiCiAgICBwdXNoaW50IDExMiAvLyAxMTIKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTEyIHF1ZXN0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjIKICAgIC8vIHRvdGFsX29wdGlvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjMKICAgIC8vIGZvciBpdGVtIGluIG9wdGlvbl9jb3VudHM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjI0CiAgICAvLyB0b3RhbF9vcHRpb25zICs9IGl0ZW0ubmF0aXZlCiAgICBidG9pCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxCgpzdG9yZV9vcHRpb25fY291bnRzX2FmdGVyX2ZvckA0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjUKICAgIC8vIGFzc2VydCB0b3RhbF9vcHRpb25zIDw9IDEyOCwgIkNhbid0IGhhdmUgbW9yZSB0aGFuIDEyOCB2b3RlIG9wdGlvbnMiCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBwdXNoaW50IDEyOCAvLyAxMjgKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjcKICAgIC8vIHNlbGYub3B0aW9uX2NvdW50cyA9IG9wdGlvbl9jb3VudHMuY29weSgpCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjgKICAgIC8vIHNlbGYudG90YWxfb3B0aW9ucyA9IHRvdGFsX29wdGlvbnMKICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF9vcHRpb25zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmJvb3RzdHJhcChmdW5kX21pbl9iYWxfcmVxOiB1aW50NjQpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODItODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJvb3RzdHJhcChzZWxmLCBmdW5kX21pbl9iYWxfcmVxOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4NAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmlzX2Jvb3RzdHJhcHBlZCwgIk11c3Qgbm90IGJlIGFscmVhZHkgYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc19ib290c3RyYXBwZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gTXVzdCBub3QgYmUgYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODUKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkID0gVHJ1ZQogICAgYnl0ZWNfMCAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg4CiAgICAvLyBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4Ny04OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkxCiAgICAvLyB0YWxseV9ib3hfc2l6ZSA9IHNlbGYudG90YWxfb3B0aW9ucyAqIFZPVEVfQ09VTlRfQllURVMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfb3B0aW9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9vcHRpb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTAxLTEwMgogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICBkdXAKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5My0xMDAKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIHB1c2hpbnQgMjAzOTAwIC8vIDIwMzkwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5My0xMDIKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IHZhbHVlCiAgICAvLyArICh0YWxseV9ib3hfc2l6ZSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDQKICAgIC8vIGxvZyhtaW5fYmFsYW5jZV9yZXEpCiAgICBkdXAKICAgIGl0b2IKICAgIGxvZwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDYKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxhbmNlX3JlcQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNS0xMDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA4CiAgICAvLyBhc3NlcnQgc2VsZi50YWxseV9ib3guY3JlYXRlKHNpemU9dGFsbHlfYm94X3NpemUpCiAgICBieXRlYyA0IC8vICJWIgogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsb3NlKCkgLT4gdm9pZDoKY2xvc2U6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMC0xMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMgogICAgLy8gZW5zdXJlX2J1ZGdldCgyMDAwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCAyMDAwMCAvLyAyMDAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jbG9zZV90aW1lLCAiQWxyZWFkeSBjbG9zZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2xvc2VfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBBbHJlYWR5IGNsb3NlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQKICAgIC8vIHNlbGYuY2xvc2VfdGltZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBieXRlYyA1IC8vICJjbG9zZV90aW1lIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE5CiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTExOAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgcHVzaGJ5dGVzICJ7XCJzdGFuZGFyZFwiOlwiYXJjNjlcIixcImRlc2NyaXB0aW9uXCI6XCJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTExOQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjAKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIHB1c2hieXRlcyAiLlwiLFwicHJvcGVydGllc1wiOntcIm1ldGFkYXRhXCI6XCJpcGZzOi8vIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTIwCiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMQogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWV0YWRhdGFfaXBmc19jaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGFfaXBmc19jaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjEKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjIKICAgIC8vICsgJyIsImlkIjoiJwogICAgcHVzaGJ5dGVzICJcIixcImlkXCI6XCIiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjIKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJ2b3RlX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZvdGVfaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjMKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgcHVzaGJ5dGVzICJcIixcInF1b3J1bVwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI1CiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInF1b3J1bSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5xdW9ydW0gZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI2CiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIHB1c2hieXRlcyAiLFwidm90ZXJDb3VudFwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNgogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjcKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZvdGVyX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZvdGVyX2NvdW50IGV4aXN0cwogICAgY2FsbHN1YiBpdG9hCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjcKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyAnLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjgKICAgIC8vICsgJywidGFsbGllcyI6WycKICAgIHB1c2hieXRlcyAiLFwidGFsbGllc1wiOlsiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjgKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyAnLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIC8vICsgJywidGFsbGllcyI6WycKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzEKICAgIC8vIGN1cnJlbnRfaW5kZXggPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMgogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4LCBxdWVzdGlvbl9vcHRpb25zIGluIHVlbnVtZXJhdGUoc2VsZi5vcHRpb25fY291bnRzKToKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3B0aW9uX2NvdW50cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCmNsb3NlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnMgaW4gdWVudW1lcmF0ZShzZWxmLm9wdGlvbl9jb3VudHMpOgogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2RpZyA4CiAgICA8CiAgICBieiBjbG9zZV9hZnRlcl9mb3JAMTQKICAgIGZyYW1lX2RpZyA3CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDkKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMwogICAgLy8gaWYgcXVlc3Rpb25faW5kZXggPiAwOgogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNAogICAgLy8gbm90ZSArPSAiLCIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIiwiCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNQogICAgLy8gaWYgcXVlc3Rpb25fb3B0aW9ucyA+IDA6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGI+CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfYnVyeSAyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM2CiAgICAvLyBub3RlICs9ICJbIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiWyIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDEKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwoKY2xvc2VfZm9yX2hlYWRlckA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzcKICAgIC8vIGZvciBvcHRpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uX29wdGlvbnMubmF0aXZlKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogY2xvc2VfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzOAogICAgLy8gaWYgb3B0aW9uX2luZGV4ID4gMDoKICAgIGZyYW1lX2RpZyAzCiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM5CiAgICAvLyBub3RlICs9ICIsIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDk6CiAgICBmcmFtZV9kaWcgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDAKICAgIC8vIHZvdGVzX2Zvcl9vcHRpb24gPSBzZWxmLmdldF92b3RlX2Zyb21fYm94KGN1cnJlbnRfaW5kZXgpCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MQogICAgLy8gbm90ZSArPSBpdG9hKHZvdGVzX2Zvcl9vcHRpb24pCiAgICBjYWxsc3ViIGl0b2EKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MgogICAgLy8gY3VycmVudF9pbmRleCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgY2xvc2VfZm9yX2hlYWRlckA2CgpjbG9zZV9hZnRlcl9mb3JAMTE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MwogICAgLy8gbm90ZSArPSAiXSIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIl0iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGZyYW1lX2RpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA5CiAgICBiIGNsb3NlX2Zvcl9oZWFkZXJAMQoKY2xvc2VfYWZ0ZXJfZm9yQDE0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDQKICAgIC8vIG5vdGUgKz0gIl19fSIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIl19fSIKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDYtMTU2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgdW5pdF9uYW1lPSJWT1RFUlNMVCIsCiAgICAvLyAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICBub3RlPW5vdGUsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1MAogICAgLy8gYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIHB1c2hieXRlcyAiW1ZPVEUgUkVTVUxUXSAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTUyCiAgICAvLyB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJuZnRfaW1hZ2VfdXJsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5mdF9pbWFnZV91cmwgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVSTAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTEKICAgIC8vIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgcHVzaGJ5dGVzICJWT1RFUlNMVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ5CiAgICAvLyBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDgKICAgIC8vIGRlY2ltYWxzPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NwogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUKICAgIC8vIHNlbGYubmZ0X2Fzc2V0X2lkID0gKAogICAgcHVzaGJ5dGVzICJuZnRfYXNzZXRfaWQiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTcKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldC5pZAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUtMTU4CiAgICAvLyBzZWxmLm5mdF9hc3NldF9pZCA9ICgKICAgIC8vICAgICBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgICAgICB0b3RhbD0xLAogICAgLy8gICAgICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gICAgICkKICAgIC8vICAgICAuc3VibWl0KCkKICAgIC8vICAgICAuY3JlYXRlZF9hc3NldC5pZAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuaXRvYShpOiB1aW50NjQpIC0+IGJ5dGVzOgppdG9hOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDktMjUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUzCiAgICAvLyBpZiBpIDwgcmFkaXg6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTMKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIDwKICAgIGJ6IGl0b2FfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NAogICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpXSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUxCiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWMgMTMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTQKICAgIC8vIHJldHVybiBTdHJpbmcuZnJvbV9ieXRlcyhkaWdpdHNbaV0pCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgcmV0c3ViCgppdG9hX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MgogICAgLy8gcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBpbnRjXzIgLy8gMTAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICAlCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjIDEzIC8vIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmdldF92b3RlX2Zyb21fYm94KGluZGV4OiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0X3ZvdGVfZnJvbV9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzOS0yNDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3ZvdGVfZnJvbV9ib3goc2VsZiwgaW5kZXg6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0MQogICAgLy8gcmV0dXJuIG9wLmJ0b2koc2VsZi50YWxseV9ib3guZXh0cmFjdChpbmRleCwgVk9URV9DT1VOVF9CWVRFUykpCiAgICBieXRlYyA0IC8vICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuZ2V0X3ByZWNvbmRpdGlvbnMoc2lnbmF0dXJlOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wcmVjb25kaXRpb25zOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAtMTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfcHJlY29uZGl0aW9ucyhzZWxmLCBzaWduYXR1cmU6IEJ5dGVzKSAtPiBWb3RpbmdQcmVjb25kaXRpb25zOgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MwogICAgLy8gaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY0CiAgICAvLyBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlKSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWxsb3dlZF90b192b3RlCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2NQogICAgLy8gaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2NgogICAgLy8gY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYyLTE2NwogICAgLy8gcmV0dXJuIFZvdGluZ1ByZWNvbmRpdGlvbnMoCiAgICAvLyAgICAgaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIC8vICAgICBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlKSksCiAgICAvLyAgICAgaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgLy8gICAgIGN1cnJlbnRfdGltZT1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGluZ19vcGVuKCkgLT4gdWludDY0Ogp2b3Rpbmdfb3BlbjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA1LTIwNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB2b3Rpbmdfb3BlbihzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA4CiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc19ib290c3RyYXBwZWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwOC0yMTAKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkCiAgICAvLyBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA5CiAgICAvLyBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNsb3NlX3RpbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxMAogICAgLy8gYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAic3RhcnRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGFydF90aW1lIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIDw9CiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJlbmRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lbmRfdGltZSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgYnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQogICAgYiB2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDYKCnZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCgp2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDY6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwNy0yMTEKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc19ib290c3RyYXBwZWQKICAgIC8vICAgICBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gICAgIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlOiBieXRlcykgLT4gdWludDY0OgphbGxvd2VkX3RvX3ZvdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzMC0yMzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsb3dlZF90b192b3RlKHNlbGYsIHNpZ25hdHVyZTogQnl0ZXMpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDIwMDApCiAgICBwdXNoaW50IDIwMDAgLy8gMjAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzQKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzNgogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNuYXBzaG90X3B1YmxpY19rZXkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc25hcHNob3RfcHVibGljX2tleSBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMzLTIzNwogICAgLy8gcmV0dXJuIG9wLmVkMjU1MTl2ZXJpZnlfYmFyZSgKICAgIC8vICAgICBUeG4uc2VuZGVyLmJ5dGVzLAogICAgLy8gICAgIHNpZ25hdHVyZSwKICAgIC8vICAgICBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGVkMjU1MTl2ZXJpZnlfYmFyZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbHJlYWR5X3ZvdGVkKCkgLT4gdWludDY0OgphbHJlYWR5X3ZvdGVkOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTMtMjE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFscmVhZHlfdm90ZWQoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTUKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyIGluIHNlbGYudm90ZXNfYnlfYWNjb3VudAogICAgdHhuIFNlbmRlcgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGUoZnVuZF9taW5fYmFsX3JlcTogdWludDY0LCBzaWduYXR1cmU6IGJ5dGVzLCBhbnN3ZXJfaWRzOiBieXRlcykgLT4gdm9pZDoKdm90ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY5LTE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdm90ZSgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXE6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHNpZ25hdHVyZTogQnl0ZXMsCiAgICAvLyAgICAgYW5zd2VyX2lkczogVm90ZUluZGV4QXJyYXksCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDc3MDAsIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzcwMCAvLyA3NzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3Ny0xNzgKICAgIC8vICMgQ2hlY2sgdm90aW5nIHByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpLCAiTm90IGFsbG93ZWQgdG8gdm90ZSIKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhbGxvd2VkX3RvX3ZvdGUKICAgIGFzc2VydCAvLyBOb3QgYWxsb3dlZCB0byB2b3RlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3OQogICAgLy8gYXNzZXJ0IHNlbGYudm90aW5nX29wZW4oKSwgIlZvdGluZyBub3Qgb3BlbiIKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGFzc2VydCAvLyBWb3Rpbmcgbm90IG9wZW4KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWxyZWFkeV92b3RlZCgpLCAiQWxyZWFkeSB2b3RlZCIKICAgIGNhbGxzdWIgYWxyZWFkeV92b3RlZAogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgdm90ZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgxCiAgICAvLyBxdWVzdGlvbnNfY291bnQgPSBzZWxmLm9wdGlvbl9jb3VudHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcHRpb25fY291bnRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgyCiAgICAvLyBhc3NlcnQgYW5zd2VyX2lkcy5sZW5ndGggPT0gcXVlc3Rpb25zX2NvdW50LCAiTnVtYmVyIG9mIGFuc3dlcnMgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE51bWJlciBvZiBhbnN3ZXJzIGluY29ycmVjdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODUKICAgIC8vICgzMiArIDIgKyBWT1RFX0lOREVYX0JZVEVTICogYW5zd2VyX2lkcy5sZW5ndGgpICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgICsKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODMtMTg0CiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICBwdXNoaW50IDI1MDAgLy8gMjUwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODMtMTg2CiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICAvLyAgICAgKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODgKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4Ny0xODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTEKICAgIC8vIGxvZyhtaW5fYmFsX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5MgogICAgLy8gYXNzZXJ0IGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxfcmVxLCAiUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0aGUgZXhhY3QgbWluIGJhbGFuY2UKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkzLTE5NAogICAgLy8gIyBSZWNvcmQgdGhlIHZvdGUgZm9yIGVhY2ggcXVlc3Rpb24KICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTUKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGR1cAoKdm90ZV9mb3JfaGVhZGVyQDE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiB2b3RlX2FmdGVyX2ZvckA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5Ni0xOTcKICAgIC8vICMgTG9hZCB0aGUgdXNlcidzIHZvdGUgZm9yIHRoaXMgcXVlc3Rpb24KICAgIC8vIGFuc3dlcl9vcHRpb25faW5kZXggPSBhbnN3ZXJfaWRzW3F1ZXN0aW9uX2luZGV4XS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk4CiAgICAvLyBvcHRpb25zX2NvdW50ID0gc2VsZi5vcHRpb25fY291bnRzW3F1ZXN0aW9uX2luZGV4XS5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wdGlvbl9jb3VudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk5CiAgICAvLyBhc3NlcnQgYW5zd2VyX29wdGlvbl9pbmRleCA8IG9wdGlvbnNfY291bnQsICJBbnN3ZXIgb3B0aW9uIGluZGV4IGludmFsaWQiCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gQW5zd2VyIG9wdGlvbiBpbmRleCBpbnZhbGlkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMAogICAgLy8gc2VsZi5pbmNyZW1lbnRfdm90ZV9pbl9ib3goY3VtdWxhdGl2ZV9vZmZzZXQgKyBhbnN3ZXJfb3B0aW9uX2luZGV4KQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgdW5jb3ZlciAzCiAgICArCiAgICBjYWxsc3ViIGluY3JlbWVudF92b3RlX2luX2JveAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDEKICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ICs9IG9wdGlvbnNfY291bnQKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDIKICAgIC8vIHNlbGYudm90ZXNfYnlfYWNjb3VudFtUeG4uc2VuZGVyXSA9IGFuc3dlcl9pZHMuY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMwogICAgLy8gc2VsZi52b3Rlcl9jb3VudCArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZXJfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTUKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdm90ZV9mb3JfaGVhZGVyQDEKCnZvdGVfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmluY3JlbWVudF92b3RlX2luX2JveChpbmRleDogdWludDY0KSAtPiB2b2lkOgppbmNyZW1lbnRfdm90ZV9pbl9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaW5jcmVtZW50X3ZvdGVfaW5fYm94KHNlbGYsIGluZGV4OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ1CiAgICAvLyBjdXJyZW50X3ZvdGUgPSBzZWxmLmdldF92b3RlX2Zyb21fYm94KGluZGV4KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0NgogICAgLy8gc2VsZi50YWxseV9ib3gucmVwbGFjZShpbmRleCwgb3AuaXRvYihjdXJyZW50X3ZvdGUgKyAxKSkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA0IC8vICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIK",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
diff --git a/examples/voting/out/VotingRoundApp.arc56.json b/examples/voting/out/VotingRoundApp.arc56.json
new file mode 100644
index 0000000000..62932282bc
--- /dev/null
+++ b/examples/voting/out/VotingRoundApp.arc56.json
@@ -0,0 +1,495 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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="
+ },
+ "close_time": {
+ "keyType": "AVMString",
+ "valueType": "AVMUint64",
+ "key": "Y2xvc2VfdGltZQ=="
+ },
+ "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=="
+ }
+ },
+ "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": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 602
+ ],
+ "errorMessage": "Already closed"
+ },
+ {
+ "pc": [
+ 1282
+ ],
+ "errorMessage": "Already voted"
+ },
+ {
+ "pc": [
+ 1364
+ ],
+ "errorMessage": "Answer option index invalid"
+ },
+ {
+ "pc": [
+ 469
+ ],
+ "errorMessage": "Can't have more than 112 questions"
+ },
+ {
+ "pc": [
+ 512
+ ],
+ "errorMessage": "Can't have more than 128 vote options"
+ },
+ {
+ "pc": [
+ 408
+ ],
+ "errorMessage": "End time should be after start time"
+ },
+ {
+ "pc": [
+ 414
+ ],
+ "errorMessage": "End time should be in the future"
+ },
+ {
+ "pc": [
+ 534
+ ],
+ "errorMessage": "Must not be already bootstrapped"
+ },
+ {
+ "pc": [
+ 1273
+ ],
+ "errorMessage": "Not allowed to vote"
+ },
+ {
+ "pc": [
+ 1298
+ ],
+ "errorMessage": "Number of answers incorrect"
+ },
+ {
+ "pc": [
+ 257,
+ 309,
+ 331,
+ 343,
+ 370
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 571
+ ],
+ "errorMessage": "Payment must be for the exact min balance requirement"
+ },
+ {
+ "pc": [
+ 1326
+ ],
+ "errorMessage": "Payment must be the exact min balance"
+ },
+ {
+ "pc": [
+ 545,
+ 1317
+ ],
+ "errorMessage": "Payment must be to app address"
+ },
+ {
+ "pc": [
+ 1277
+ ],
+ "errorMessage": "Voting not open"
+ },
+ {
+ "pc": [
+ 261
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 312,
+ 334,
+ 346,
+ 373
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 1213
+ ],
+ "errorMessage": "check self.end_time exists"
+ },
+ {
+ "pc": [
+ 532,
+ 1182
+ ],
+ "errorMessage": "check self.is_bootstrapped exists"
+ },
+ {
+ "pc": [
+ 747
+ ],
+ "errorMessage": "check self.metadata_ipfs_cid exists"
+ },
+ {
+ "pc": [
+ 1034
+ ],
+ "errorMessage": "check self.nft_image_url exists"
+ },
+ {
+ "pc": [
+ 836,
+ 1286,
+ 1353
+ ],
+ "errorMessage": "check self.option_counts exists"
+ },
+ {
+ "pc": [
+ 783
+ ],
+ "errorMessage": "check self.quorum exists"
+ },
+ {
+ "pc": [
+ 1243
+ ],
+ "errorMessage": "check self.snapshot_public_key exists"
+ },
+ {
+ "pc": [
+ 1199
+ ],
+ "errorMessage": "check self.start_time exists"
+ },
+ {
+ "pc": [
+ 550
+ ],
+ "errorMessage": "check self.total_options exists"
+ },
+ {
+ "pc": [
+ 611,
+ 763,
+ 1011
+ ],
+ "errorMessage": "check self.vote_id exists"
+ },
+ {
+ "pc": [
+ 808,
+ 1388
+ ],
+ "errorMessage": "check self.voter_count exists"
+ },
+ {
+ "pc": [
+ 465
+ ],
+ "errorMessage": "option_counts should be non-empty"
+ },
+ {
+ "pc": [
+ 322,
+ 383
+ ],
+ "errorMessage": "transaction type is pay"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwIDgKICAgIGJ5dGVjYmxvY2sgImlzX2Jvb3RzdHJhcHBlZCIgInZvdGVyX2NvdW50IiAidm90ZV9pZCIgIm9wdGlvbl9jb3VudHMiICJWIiAiY2xvc2VfdGltZSIgInNuYXBzaG90X3B1YmxpY19rZXkiICJtZXRhZGF0YV9pcGZzX2NpZCIgInN0YXJ0X3RpbWUiICJlbmRfdGltZSIgInF1b3J1bSIgIm5mdF9pbWFnZV91cmwiICJ0b3RhbF9vcHRpb25zIiAweDMwMzEzMjMzMzQzNTM2MzczODM5IDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTAKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjUxCiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZCA9IEZhbHNlCiAgICBieXRlY18wIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTItNTMKICAgIC8vICMgVGhlIG1pbmltdW0gbnVtYmVyIG9mIHZvdGVycyB3aG8gaGF2ZSB2b3RlZAogICAgLy8gc2VsZi52b3Rlcl9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHhhZTg5N2Y2YiAweGE0ZThkMTY0IDB4OTY1NjA0N2EgMHhiY2IxNTg5NiAweDg0YTUzYzZlIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDhbXSx1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcChwYXkpdm9pZCIsIG1ldGhvZCAiY2xvc2UoKXZvaWQiLCBtZXRob2QgImdldF9wcmVjb25kaXRpb25zKGJ5dGVbXSkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidm90ZShwYXksYnl0ZVtdLHVpbnQ4W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192b3RlX3JvdXRlQDYKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm9vdHN0cmFwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9yb3V0ZUA0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3ByZWNvbmRpdGlvbnMKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdm90ZV9yb3V0ZUA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB2b3RlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNyZWF0ZSh2b3RlX2lkOiBieXRlcywgc25hcHNob3RfcHVibGljX2tleTogYnl0ZXMsIG1ldGFkYXRhX2lwZnNfY2lkOiBieXRlcywgc3RhcnRfdGltZTogdWludDY0LCBlbmRfdGltZTogdWludDY0LCBvcHRpb25fY291bnRzOiBieXRlcywgcXVvcnVtOiB1aW50NjQsIG5mdF9pbWFnZV91cmw6IGJ5dGVzKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjU4LTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICB2b3RlX2lkOiBTdHJpbmcsCiAgICAvLyAgICAgc25hcHNob3RfcHVibGljX2tleTogQnl0ZXMsCiAgICAvLyAgICAgbWV0YWRhdGFfaXBmc19jaWQ6IFN0cmluZywKICAgIC8vICAgICBzdGFydF90aW1lOiBVSW50NjQsCiAgICAvLyAgICAgZW5kX3RpbWU6IFVJbnQ2NCwKICAgIC8vICAgICBvcHRpb25fY291bnRzOiBWb3RlSW5kZXhBcnJheSwKICAgIC8vICAgICBxdW9ydW06IFVJbnQ2NCwKICAgIC8vICAgICBuZnRfaW1hZ2VfdXJsOiBTdHJpbmcsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA4IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzAKICAgIC8vIGFzc2VydCBzdGFydF90aW1lIDwgZW5kX3RpbWUsICJFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZSIKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICA8CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGFmdGVyIHN0YXJ0IHRpbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzEKICAgIC8vIGFzc2VydCBlbmRfdGltZSA+PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgIkVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlIgogICAgZnJhbWVfZGlnIC00CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+PQogICAgYXNzZXJ0IC8vIEVuZCB0aW1lIHNob3VsZCBiZSBpbiB0aGUgZnV0dXJlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjczCiAgICAvLyBzZWxmLnZvdGVfaWQgPSB2b3RlX2lkCiAgICBieXRlY18yIC8vICJ2b3RlX2lkIgogICAgZnJhbWVfZGlnIC04CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NAogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5ID0gc25hcHNob3RfcHVibGljX2tleQogICAgYnl0ZWMgNiAvLyAic25hcHNob3RfcHVibGljX2tleSIKICAgIGZyYW1lX2RpZyAtNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzUKICAgIC8vIHNlbGYubWV0YWRhdGFfaXBmc19jaWQgPSBtZXRhZGF0YV9pcGZzX2NpZAogICAgYnl0ZWMgNyAvLyAibWV0YWRhdGFfaXBmc19jaWQiCiAgICBmcmFtZV9kaWcgLTYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc2CiAgICAvLyBzZWxmLnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lCiAgICBieXRlYyA4IC8vICJzdGFydF90aW1lIgogICAgZnJhbWVfZGlnIC01CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NwogICAgLy8gc2VsZi5lbmRfdGltZSA9IGVuZF90aW1lCiAgICBieXRlYyA5IC8vICJlbmRfdGltZSIKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzgKICAgIC8vIHNlbGYucXVvcnVtID0gcXVvcnVtCiAgICBieXRlYyAxMCAvLyAicXVvcnVtIgogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OQogICAgLy8gc2VsZi5uZnRfaW1hZ2VfdXJsID0gbmZ0X2ltYWdlX3VybAogICAgYnl0ZWMgMTEgLy8gIm5mdF9pbWFnZV91cmwiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgwCiAgICAvLyBzZWxmLnN0b3JlX29wdGlvbl9jb3VudHMob3B0aW9uX2NvdW50cy5jb3B5KCkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGNhbGxzdWIgc3RvcmVfb3B0aW9uX2NvdW50cwogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnN0b3JlX29wdGlvbl9jb3VudHMob3B0aW9uX2NvdW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzdG9yZV9vcHRpb25fY291bnRzOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTctMjE4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHN0b3JlX29wdGlvbl9jb3VudHMoc2VsZiwgb3B0aW9uX2NvdW50czogVm90ZUluZGV4QXJyYXkpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjE5CiAgICAvLyBhc3NlcnQgb3B0aW9uX2NvdW50cy5sZW5ndGgsICJvcHRpb25fY291bnRzIHNob3VsZCBiZSBub24tZW1wdHkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwbiAyCiAgICBhc3NlcnQgLy8gb3B0aW9uX2NvdW50cyBzaG91bGQgYmUgbm9uLWVtcHR5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMAogICAgLy8gYXNzZXJ0IG9wdGlvbl9jb3VudHMubGVuZ3RoIDw9IDExMiwgIkNhbid0IGhhdmUgbW9yZSB0aGFuIDExMiBxdWVzdGlvbnMiCiAgICBwdXNoaW50IDExMiAvLyAxMTIKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTEyIHF1ZXN0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjIKICAgIC8vIHRvdGFsX29wdGlvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjMKICAgIC8vIGZvciBpdGVtIGluIG9wdGlvbl9jb3VudHM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjI0CiAgICAvLyB0b3RhbF9vcHRpb25zICs9IGl0ZW0ubmF0aXZlCiAgICBidG9pCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHN0b3JlX29wdGlvbl9jb3VudHNfZm9yX2hlYWRlckAxCgpzdG9yZV9vcHRpb25fY291bnRzX2FmdGVyX2ZvckA0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjUKICAgIC8vIGFzc2VydCB0b3RhbF9vcHRpb25zIDw9IDEyOCwgIkNhbid0IGhhdmUgbW9yZSB0aGFuIDEyOCB2b3RlIG9wdGlvbnMiCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBwdXNoaW50IDEyOCAvLyAxMjgKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjcKICAgIC8vIHNlbGYub3B0aW9uX2NvdW50cyA9IG9wdGlvbl9jb3VudHMuY29weSgpCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjgKICAgIC8vIHNlbGYudG90YWxfb3B0aW9ucyA9IHRvdGFsX29wdGlvbnMKICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF9vcHRpb25zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmJvb3RzdHJhcChmdW5kX21pbl9iYWxfcmVxOiB1aW50NjQpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODItODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJvb3RzdHJhcChzZWxmLCBmdW5kX21pbl9iYWxfcmVxOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4NAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmlzX2Jvb3RzdHJhcHBlZCwgIk11c3Qgbm90IGJlIGFscmVhZHkgYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc19ib290c3RyYXBwZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gTXVzdCBub3QgYmUgYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODUKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkID0gVHJ1ZQogICAgYnl0ZWNfMCAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg4CiAgICAvLyBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4Ny04OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkxCiAgICAvLyB0YWxseV9ib3hfc2l6ZSA9IHNlbGYudG90YWxfb3B0aW9ucyAqIFZPVEVfQ09VTlRfQllURVMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfb3B0aW9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9vcHRpb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgICoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTAxLTEwMgogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICBkdXAKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5My0xMDAKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIHB1c2hpbnQgMjAzOTAwIC8vIDIwMzkwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo5My0xMDIKICAgIC8vICMgbWluaW11bSBiYWxhbmNlIHJlcSBmb3I6IEFMR09zICsgVm90ZSByZXN1bHQgTkZUIGFzc2V0CiAgICAvLyBBU1NFVF9NSU5fQkFMQU5DRSAqIDIKICAgIC8vICMgY3JlYXRlIE5GVCBmZWUKICAgIC8vICsgMTAwMAogICAgLy8gIyB0YWxseSBib3gKICAgIC8vICsgQk9YX0ZMQVRfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IGtleSAiViIKICAgIC8vICsgQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIC8vICMgdGFsbHkgYm94IHZhbHVlCiAgICAvLyArICh0YWxseV9ib3hfc2l6ZSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDQKICAgIC8vIGxvZyhtaW5fYmFsYW5jZV9yZXEpCiAgICBkdXAKICAgIGl0b2IKICAgIGxvZwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDYKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxhbmNlX3JlcQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNS0xMDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIGZvciB0aGUgZXhhY3QgbWluIGJhbGFuY2UgcmVxdWlyZW1lbnQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA4CiAgICAvLyBhc3NlcnQgc2VsZi50YWxseV9ib3guY3JlYXRlKHNpemU9dGFsbHlfYm94X3NpemUpCiAgICBieXRlYyA0IC8vICJWIgogICAgc3dhcAogICAgYm94X2NyZWF0ZQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsb3NlKCkgLT4gdm9pZDoKY2xvc2U6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMC0xMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMgogICAgLy8gZW5zdXJlX2J1ZGdldCgyMDAwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCAyMDAwMCAvLyAyMDAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jbG9zZV90aW1lLCAiQWxyZWFkeSBjbG9zZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2xvc2VfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBBbHJlYWR5IGNsb3NlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTQKICAgIC8vIHNlbGYuY2xvc2VfdGltZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBieXRlYyA1IC8vICJjbG9zZV90aW1lIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE5CiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTExOAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgcHVzaGJ5dGVzICJ7XCJzdGFuZGFyZFwiOlwiYXJjNjlcIixcImRlc2NyaXB0aW9uXCI6XCJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTExOQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjAKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIHB1c2hieXRlcyAiLlwiLFwicHJvcGVydGllc1wiOntcIm1ldGFkYXRhXCI6XCJpcGZzOi8vIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTIwCiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMQogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWV0YWRhdGFfaXBmc19jaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGFfaXBmc19jaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjEKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjIKICAgIC8vICsgJyIsImlkIjoiJwogICAgcHVzaGJ5dGVzICJcIixcImlkXCI6XCIiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjIKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJ2b3RlX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZvdGVfaWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjMKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgcHVzaGJ5dGVzICJcIixcInF1b3J1bVwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI1CiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInF1b3J1bSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5xdW9ydW0gZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTI2CiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIHB1c2hieXRlcyAiLFwidm90ZXJDb3VudFwiOiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNgogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjcKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZvdGVyX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZvdGVyX2NvdW50IGV4aXN0cwogICAgY2FsbHN1YiBpdG9hCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjcKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyAnLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjgKICAgIC8vICsgJywidGFsbGllcyI6WycKICAgIHB1c2hieXRlcyAiLFwidGFsbGllc1wiOlsiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjgKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIC8vICsgJyIsImlkIjoiJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJyIsInF1b3J1bSI6JwogICAgLy8gKyBpdG9hKHNlbGYucXVvcnVtKQogICAgLy8gKyAnLCJ2b3RlckNvdW50IjonCiAgICAvLyArIGl0b2Eoc2VsZi52b3Rlcl9jb3VudCkKICAgIC8vICsgJywidGFsbGllcyI6WycKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzEKICAgIC8vIGN1cnJlbnRfaW5kZXggPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMgogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4LCBxdWVzdGlvbl9vcHRpb25zIGluIHVlbnVtZXJhdGUoc2VsZi5vcHRpb25fY291bnRzKToKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3B0aW9uX2NvdW50cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCmNsb3NlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnMgaW4gdWVudW1lcmF0ZShzZWxmLm9wdGlvbl9jb3VudHMpOgogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2RpZyA4CiAgICA8CiAgICBieiBjbG9zZV9hZnRlcl9mb3JAMTQKICAgIGZyYW1lX2RpZyA3CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDkKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMwogICAgLy8gaWYgcXVlc3Rpb25faW5kZXggPiAwOgogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNAogICAgLy8gbm90ZSArPSAiLCIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIiwiCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNQogICAgLy8gaWYgcXVlc3Rpb25fb3B0aW9ucyA+IDA6CiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGI+CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfYnVyeSAyCiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM2CiAgICAvLyBub3RlICs9ICJbIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiWyIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDEKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwoKY2xvc2VfZm9yX2hlYWRlckA2OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzcKICAgIC8vIGZvciBvcHRpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uX29wdGlvbnMubmF0aXZlKToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogY2xvc2VfYWZ0ZXJfZm9yQDExCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzOAogICAgLy8gaWYgb3B0aW9uX2luZGV4ID4gMDoKICAgIGZyYW1lX2RpZyAzCiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM5CiAgICAvLyBub3RlICs9ICIsIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDk6CiAgICBmcmFtZV9kaWcgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDAKICAgIC8vIHZvdGVzX2Zvcl9vcHRpb24gPSBzZWxmLmdldF92b3RlX2Zyb21fYm94KGN1cnJlbnRfaW5kZXgpCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MQogICAgLy8gbm90ZSArPSBpdG9hKHZvdGVzX2Zvcl9vcHRpb24pCiAgICBjYWxsc3ViIGl0b2EKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MgogICAgLy8gY3VycmVudF9pbmRleCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgY2xvc2VfZm9yX2hlYWRlckA2CgpjbG9zZV9hZnRlcl9mb3JAMTE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MwogICAgLy8gbm90ZSArPSAiXSIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIl0iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2J1cnkgMAoKY2xvc2VfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIGZyYW1lX2RpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA5CiAgICBiIGNsb3NlX2Zvcl9oZWFkZXJAMQoKY2xvc2VfYWZ0ZXJfZm9yQDE0OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDQKICAgIC8vIG5vdGUgKz0gIl19fSIKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgIl19fSIKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDYtMTU2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgdW5pdF9uYW1lPSJWT1RFUlNMVCIsCiAgICAvLyAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICBub3RlPW5vdGUsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTQKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1MAogICAgLy8gYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIHB1c2hieXRlcyAiW1ZPVEUgUkVTVUxUXSAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTUyCiAgICAvLyB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJuZnRfaW1hZ2VfdXJsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5mdF9pbWFnZV91cmwgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgTm90ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVSTAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTEKICAgIC8vIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgcHVzaGJ5dGVzICJWT1RFUlNMVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ5CiAgICAvLyBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDgKICAgIC8vIGRlY2ltYWxzPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NwogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2CiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUKICAgIC8vIHNlbGYubmZ0X2Fzc2V0X2lkID0gKAogICAgcHVzaGJ5dGVzICJuZnRfYXNzZXRfaWQiCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTcKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldC5pZAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDUtMTU4CiAgICAvLyBzZWxmLm5mdF9hc3NldF9pZCA9ICgKICAgIC8vICAgICBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgICAgICB0b3RhbD0xLAogICAgLy8gICAgICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgICAgICBkZWZhdWx0X2Zyb3plbj1GYWxzZSwKICAgIC8vICAgICAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICAgICAgdXJsPXNlbGYubmZ0X2ltYWdlX3VybCwKICAgIC8vICAgICAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gICAgICkKICAgIC8vICAgICAuc3VibWl0KCkKICAgIC8vICAgICAuY3JlYXRlZF9hc3NldC5pZAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuaXRvYShpOiB1aW50NjQpIC0+IGJ5dGVzOgppdG9hOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDktMjUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUzCiAgICAvLyBpZiBpIDwgcmFkaXg6CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTMKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIDwKICAgIGJ6IGl0b2FfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NAogICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpXSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUxCiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWMgMTMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTQKICAgIC8vIHJldHVybiBTdHJpbmcuZnJvbV9ieXRlcyhkaWdpdHNbaV0pCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgcmV0c3ViCgppdG9hX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MgogICAgLy8gcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBpbnRjXzIgLy8gMTAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICAlCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjIDEzIC8vIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU1CiAgICAvLyByZXR1cm4gaXRvYShpIC8vIHJhZGl4KSArIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpICUgcmFkaXhdKQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmdldF92b3RlX2Zyb21fYm94KGluZGV4OiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0X3ZvdGVfZnJvbV9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzOS0yNDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3ZvdGVfZnJvbV9ib3goc2VsZiwgaW5kZXg6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0MQogICAgLy8gcmV0dXJuIG9wLmJ0b2koc2VsZi50YWxseV9ib3guZXh0cmFjdChpbmRleCwgVk9URV9DT1VOVF9CWVRFUykpCiAgICBieXRlYyA0IC8vICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzMgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuZ2V0X3ByZWNvbmRpdGlvbnMoc2lnbmF0dXJlOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wcmVjb25kaXRpb25zOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAtMTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfcHJlY29uZGl0aW9ucyhzZWxmLCBzaWduYXR1cmU6IEJ5dGVzKSAtPiBWb3RpbmdQcmVjb25kaXRpb25zOgogICAgcHJvdG8gMSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MwogICAgLy8gaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY0CiAgICAvLyBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlKSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWxsb3dlZF90b192b3RlCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2NQogICAgLy8gaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICBpdG9iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2NgogICAgLy8gY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYyLTE2NwogICAgLy8gcmV0dXJuIFZvdGluZ1ByZWNvbmRpdGlvbnMoCiAgICAvLyAgICAgaXNfdm90aW5nX29wZW49YXJjNC5VSW50NjQoc2VsZi52b3Rpbmdfb3BlbigpKSwKICAgIC8vICAgICBpc19hbGxvd2VkX3RvX3ZvdGU9YXJjNC5VSW50NjQoc2VsZi5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlKSksCiAgICAvLyAgICAgaGFzX2FscmVhZHlfdm90ZWQ9YXJjNC5VSW50NjQoc2VsZi5hbHJlYWR5X3ZvdGVkKCkpLAogICAgLy8gICAgIGN1cnJlbnRfdGltZT1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGluZ19vcGVuKCkgLT4gdWludDY0Ogp2b3Rpbmdfb3BlbjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA1LTIwNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB2b3Rpbmdfb3BlbihzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA4CiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImlzX2Jvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc19ib290c3RyYXBwZWQgZXhpc3RzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwOC0yMTAKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkCiAgICAvLyBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA5CiAgICAvLyBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNsb3NlX3RpbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxMAogICAgLy8gYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAic3RhcnRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGFydF90aW1lIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIDw9CiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJlbmRfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lbmRfdGltZSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgYnogdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQogICAgYiB2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDYKCnZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCgp2b3Rpbmdfb3Blbl9ib29sX21lcmdlQDY6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwNy0yMTEKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc19ib290c3RyYXBwZWQKICAgIC8vICAgICBhbmQgbm90IHNlbGYuY2xvc2VfdGltZQogICAgLy8gICAgIGFuZCBzZWxmLnN0YXJ0X3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5lbmRfdGltZQogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbGxvd2VkX3RvX3ZvdGUoc2lnbmF0dXJlOiBieXRlcykgLT4gdWludDY0OgphbGxvd2VkX3RvX3ZvdGU6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzMC0yMzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsb3dlZF90b192b3RlKHNlbGYsIHNpZ25hdHVyZTogQnl0ZXMpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDIwMDApCiAgICBwdXNoaW50IDIwMDAgLy8gMjAwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzQKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMsCiAgICB0eG4gU2VuZGVyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzNgogICAgLy8gc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNuYXBzaG90X3B1YmxpY19rZXkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc25hcHNob3RfcHVibGljX2tleSBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMzLTIzNwogICAgLy8gcmV0dXJuIG9wLmVkMjU1MTl2ZXJpZnlfYmFyZSgKICAgIC8vICAgICBUeG4uc2VuZGVyLmJ5dGVzLAogICAgLy8gICAgIHNpZ25hdHVyZSwKICAgIC8vICAgICBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGVkMjU1MTl2ZXJpZnlfYmFyZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5hbHJlYWR5X3ZvdGVkKCkgLT4gdWludDY0OgphbHJlYWR5X3ZvdGVkOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTMtMjE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFscmVhZHlfdm90ZWQoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTUKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyIGluIHNlbGYudm90ZXNfYnlfYWNjb3VudAogICAgdHhuIFNlbmRlcgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLnZvdGUoZnVuZF9taW5fYmFsX3JlcTogdWludDY0LCBzaWduYXR1cmU6IGJ5dGVzLCBhbnN3ZXJfaWRzOiBieXRlcykgLT4gdm9pZDoKdm90ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY5LTE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdm90ZSgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXE6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHNpZ25hdHVyZTogQnl0ZXMsCiAgICAvLyAgICAgYW5zd2VyX2lkczogVm90ZUluZGV4QXJyYXksCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KDc3MDAsIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCkKICAgIHB1c2hpbnQgNzcwMCAvLyA3NzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3Ny0xNzgKICAgIC8vICMgQ2hlY2sgdm90aW5nIHByZWNvbmRpdGlvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpLCAiTm90IGFsbG93ZWQgdG8gdm90ZSIKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhbGxvd2VkX3RvX3ZvdGUKICAgIGFzc2VydCAvLyBOb3QgYWxsb3dlZCB0byB2b3RlCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE3OQogICAgLy8gYXNzZXJ0IHNlbGYudm90aW5nX29wZW4oKSwgIlZvdGluZyBub3Qgb3BlbiIKICAgIGNhbGxzdWIgdm90aW5nX29wZW4KICAgIGFzc2VydCAvLyBWb3Rpbmcgbm90IG9wZW4KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWxyZWFkeV92b3RlZCgpLCAiQWxyZWFkeSB2b3RlZCIKICAgIGNhbGxzdWIgYWxyZWFkeV92b3RlZAogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgdm90ZWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgxCiAgICAvLyBxdWVzdGlvbnNfY291bnQgPSBzZWxmLm9wdGlvbl9jb3VudHMubGVuZ3RoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3B0aW9uX2NvdW50cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcHRpb25fY291bnRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTgyCiAgICAvLyBhc3NlcnQgYW5zd2VyX2lkcy5sZW5ndGggPT0gcXVlc3Rpb25zX2NvdW50LCAiTnVtYmVyIG9mIGFuc3dlcnMgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE51bWJlciBvZiBhbnN3ZXJzIGluY29ycmVjdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODUKICAgIC8vICgzMiArIDIgKyBWT1RFX0lOREVYX0JZVEVTICogYW5zd2VyX2lkcy5sZW5ndGgpICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgICsKICAgIHB1c2hpbnQgNDAwIC8vIDQwMAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODMtMTg0CiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICBwdXNoaW50IDI1MDAgLy8gMjUwMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODMtMTg2CiAgICAvLyAjIENoZWNrIHZvdGVyIGJveCBpcyBmdW5kZWQKICAgIC8vIG1pbl9iYWxfcmVxID0gQk9YX0ZMQVRfTUlOX0JBTEFOQ0UgKyAoCiAgICAvLyAgICAgKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gKQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODgKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4Ny0xODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTEKICAgIC8vIGxvZyhtaW5fYmFsX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5MgogICAgLy8gYXNzZXJ0IGZ1bmRfbWluX2JhbF9yZXEuYW1vdW50ID09IG1pbl9iYWxfcmVxLCAiUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0aGUgZXhhY3QgbWluIGJhbGFuY2UKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkzLTE5NAogICAgLy8gIyBSZWNvcmQgdGhlIHZvdGUgZm9yIGVhY2ggcXVlc3Rpb24KICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTUKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGR1cAoKdm90ZV9mb3JfaGVhZGVyQDE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAwCiAgICA8CiAgICBieiB2b3RlX2FmdGVyX2ZvckA0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5Ni0xOTcKICAgIC8vICMgTG9hZCB0aGUgdXNlcidzIHZvdGUgZm9yIHRoaXMgcXVlc3Rpb24KICAgIC8vIGFuc3dlcl9vcHRpb25faW5kZXggPSBhbnN3ZXJfaWRzW3F1ZXN0aW9uX2luZGV4XS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk4CiAgICAvLyBvcHRpb25zX2NvdW50ID0gc2VsZi5vcHRpb25fY291bnRzW3F1ZXN0aW9uX2luZGV4XS5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wdGlvbl9jb3VudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk5CiAgICAvLyBhc3NlcnQgYW5zd2VyX29wdGlvbl9pbmRleCA8IG9wdGlvbnNfY291bnQsICJBbnN3ZXIgb3B0aW9uIGluZGV4IGludmFsaWQiCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gQW5zd2VyIG9wdGlvbiBpbmRleCBpbnZhbGlkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMAogICAgLy8gc2VsZi5pbmNyZW1lbnRfdm90ZV9pbl9ib3goY3VtdWxhdGl2ZV9vZmZzZXQgKyBhbnN3ZXJfb3B0aW9uX2luZGV4KQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgdW5jb3ZlciAzCiAgICArCiAgICBjYWxsc3ViIGluY3JlbWVudF92b3RlX2luX2JveAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDEKICAgIC8vIGN1bXVsYXRpdmVfb2Zmc2V0ICs9IG9wdGlvbnNfY291bnQKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDIKICAgIC8vIHNlbGYudm90ZXNfYnlfYWNjb3VudFtUeG4uc2VuZGVyXSA9IGFuc3dlcl9pZHMuY29weSgpCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMwogICAgLy8gc2VsZi52b3Rlcl9jb3VudCArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZXJfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAidm90ZXJfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTUKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25zX2NvdW50KToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdm90ZV9mb3JfaGVhZGVyQDEKCnZvdGVfYWZ0ZXJfZm9yQDQ6CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmluY3JlbWVudF92b3RlX2luX2JveChpbmRleDogdWludDY0KSAtPiB2b2lkOgppbmNyZW1lbnRfdm90ZV9pbl9ib3g6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaW5jcmVtZW50X3ZvdGVfaW5fYm94KHNlbGYsIGluZGV4OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ1CiAgICAvLyBjdXJyZW50X3ZvdGUgPSBzZWxmLmdldF92b3RlX2Zyb21fYm94KGluZGV4KQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldF92b3RlX2Zyb21fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0NgogICAgLy8gc2VsZi50YWxseV9ib3gucmVwbGFjZShpbmRleCwgb3AuaXRvYihjdXJyZW50X3ZvdGUgKyAxKSkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA0IC8vICJWIgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIK",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiAEAAEKCCYPD2lzX2Jvb3RzdHJhcHBlZAt2b3Rlcl9jb3VudAd2b3RlX2lkDW9wdGlvbl9jb3VudHMBVgpjbG9zZV90aW1lE3NuYXBzaG90X3B1YmxpY19rZXkRbWV0YWRhdGFfaXBmc19jaWQKc3RhcnRfdGltZQhlbmRfdGltZQZxdW9ydW0NbmZ0X2ltYWdlX3VybA10b3RhbF9vcHRpb25zCjAxMjM0NTY3ODkDBoEBMRhAAAOIAASIAAtDigAAKCJnKSJniYoAATEbQQC8ggUErol/awSk6NFkBJZWBHoEvLFYlgSEpTxuNhoAjgUAAgA2AEwAWABzIokxGRREMRgURDYaAVcCADYaAlcCADYaA1cCADYaBBc2GgUXNhoGNhoHFzYaCFcCAIgAYCOJMRkURDEYRDEWIwlJOBAjEkSIAMgjiTEZFEQxGESIAPAjiTEZFEQxGEQ2GgFXAgCIAxOABBUffHVMULAjiTEZFEQxGEQxFiMJSTgQIxJENhoBVwIANhoCiANeI4kiiYoIAIv7i/wMRIv8MgcPRCqL+GcnBov5ZycHi/pnJwiL+2cnCYv8ZycKi/5nJwuL/2eL/YgAAkiJigEBi/8iWUcCRIFwDkQiSYsCiwAMQQAZi/9XAgCLAklOAiNYF4sBCIwBIwiMAkL/34sBSYGAAQ5EK4v/ZycMTGeL/4wAiYoBACIoZUQURCgjZ4v/OAcyChJEIicMZUQlC0mBkAMLgfy4DAhJFrCL/zgIEkQnBEy5RImKAAAiSYAARwKBoJwBIogDOiInBWVFARREJwUyB2ciKmVEgFh7InN0YW5kYXJkIjoiYXJjNjkiLCJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgTFCAJC4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovL1AiJwdlRFCACCIsImlkIjoiUCIqZURQgAsiLCJxdW9ydW0iOlAiJwplRIgBLlCADiwidm90ZXJDb3VudCI6UCIpZUSIARVQgAwsInRhbGxpZXMiOltQIkkrZUxJTwJEIlkiiwmLCAxBAJWLB1cCAIsJSU4CI1iMAYsFjABBAAiLBYABLFCMAIsASYwFiwGAAQCliwaMAkyMAEEAUosFgAFbUIwFiwEXjAQijAOLA4sEDEEALosFjACLA0EACIsFgAEsUIwAiwCLBklOAogAt4gAiVCMBSMIjAaLAyMIjANC/8qLBYABXVCLBowCjACLAowGiwCMBYsJIwiMCUL/Y4sFgANdfX1QsTIAIiplRIAOW1ZPVEUgUkVTVUxUXSBMUCInC2VETwOyBbIngAhWT1RFUlNMVLIlsiYisiQisiMjsiKBA7IQsgGzgAxuZnRfYXNzZXRfaWS0PGeJigEBi/8kDEEADIv/IwgnDYv/TwJSiYv/JAqI/+OL/yQYSSMIJw1OAlJQiYoBAScEi/8luheJigEBiAAZFov/iABIFogAWhYyBxZPA08DUE8CUExQiYoAAYAAIihlREEAJiInBWVFAUAAHSInCGVEMgdJjAAOQQAPIicJZUSLAA9BAAQjQgABIkyJigEBgdAPIogAuDEAIicGZUSL/0yEiYoAATEAvUUBiYoDAIGUPCKIAJmL/oj/0kSI/5lEiP/gFEQiK2VEIllJi/8iWUlPAhJEgSIIgZADC4HEEwiL/TgHMgoSREkWsIv9OAgSRCJJiwKLAAxBAECL/1cCAIsCSU4CI1gXIitlRFcCAEsCI1gXSgxEiwFJTwMIiAAcCIwBMQBJvEiL/78iKWVEIwgpTGcjCIwCQv+4iYoBAIv/iP7qIwgWJwSL/08Cu4mKAgCL/iQIiwAyDA1BACqxgQayEIEFshknDrIeJw6yH4v/jQIAAwAJQgAKIrIBQgAEMgCyAbNC/86J",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/examples/voting/out/VotingRoundApp.destructured.ir b/examples/voting/out/VotingRoundApp.destructured.ir
index 9738284368..8d939f84e9 100644
--- a/examples/voting/out/VotingRoundApp.destructured.ir
+++ b/examples/voting/out/VotingRoundApp.destructured.ir
@@ -27,10 +27,10 @@ contract examples.voting.voting.VotingRoundApp:
block@2: // create_route_L58
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -51,9 +51,9 @@ contract examples.voting.voting.VotingRoundApp:
block@3: // bootstrap_route_L82
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (! tmp%22#0)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -64,17 +64,17 @@ contract examples.voting.voting.VotingRoundApp:
block@4: // close_route_L110
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (! tmp%27#0)
- (assert tmp%28#0) // OnCompletion is NoOp
+ (assert tmp%28#0) // OnCompletion is not NoOp
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
examples.voting.voting.VotingRoundApp.close()
return 1u
block@5: // get_preconditions_route_L160
let tmp%31#0: uint64 = (txn OnCompletion)
let tmp%32#0: bool = (! tmp%31#0)
- (assert tmp%32#0) // OnCompletion is NoOp
+ (assert tmp%32#0) // OnCompletion is not NoOp
let tmp%33#0: uint64 = (txn ApplicationID)
- (assert tmp%33#0) // is not creating
+ (assert tmp%33#0) // can only call when not creating
let tmp%35#0: bytes = (txna ApplicationArgs 1)
let tmp%36#0: bytes = ((extract 2 0) tmp%35#0)
let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0)
@@ -84,9 +84,9 @@ contract examples.voting.voting.VotingRoundApp:
block@6: // vote_route_L169
let tmp%39#0: uint64 = (txn OnCompletion)
let tmp%40#0: bool = (! tmp%39#0)
- (assert tmp%40#0) // OnCompletion is NoOp
+ (assert tmp%40#0) // OnCompletion is not NoOp
let tmp%41#0: uint64 = (txn ApplicationID)
- (assert tmp%41#0) // is not creating
+ (assert tmp%41#0) // can only call when not creating
let tmp%43#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
diff --git a/examples/voting/out/VotingRoundApp.ssa.ir b/examples/voting/out/VotingRoundApp.ssa.ir
index bfef64a81a..f2cce53732 100644
--- a/examples/voting/out/VotingRoundApp.ssa.ir
+++ b/examples/voting/out/VotingRoundApp.ssa.ir
@@ -28,10 +28,10 @@ contract examples.voting.voting.VotingRoundApp:
block@2: // create_route_L58
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -52,10 +52,10 @@ contract examples.voting.voting.VotingRoundApp:
block@3: // bootstrap_route_L82
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (== tmp%22#0 NoOp)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (!= tmp%24#0 0u)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -66,19 +66,19 @@ contract examples.voting.voting.VotingRoundApp:
block@4: // close_route_L110
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 NoOp)
- (assert tmp%28#0) // OnCompletion is NoOp
+ (assert tmp%28#0) // OnCompletion is not NoOp
let tmp%29#0: uint64 = (txn ApplicationID)
let tmp%30#0: bool = (!= tmp%29#0 0u)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
examples.voting.voting.VotingRoundApp.close()
return 1u
block@5: // get_preconditions_route_L160
let tmp%31#0: uint64 = (txn OnCompletion)
let tmp%32#0: bool = (== tmp%31#0 NoOp)
- (assert tmp%32#0) // OnCompletion is NoOp
+ (assert tmp%32#0) // OnCompletion is not NoOp
let tmp%33#0: uint64 = (txn ApplicationID)
let tmp%34#0: bool = (!= tmp%33#0 0u)
- (assert tmp%34#0) // is not creating
+ (assert tmp%34#0) // can only call when not creating
let tmp%35#0: bytes = (txna ApplicationArgs 1)
let tmp%36#0: bytes = ((extract 2 0) tmp%35#0)
let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0)
@@ -88,10 +88,10 @@ contract examples.voting.voting.VotingRoundApp:
block@6: // vote_route_L169
let tmp%39#0: uint64 = (txn OnCompletion)
let tmp%40#0: bool = (== tmp%39#0 NoOp)
- (assert tmp%40#0) // OnCompletion is NoOp
+ (assert tmp%40#0) // OnCompletion is not NoOp
let tmp%41#0: uint64 = (txn ApplicationID)
let tmp%42#0: bool = (!= tmp%41#0 0u)
- (assert tmp%42#0) // is not creating
+ (assert tmp%42#0) // can only call when not creating
let tmp%43#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir
index eaff42d5cd..02efa8d6b8 100644
--- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir
+++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_1.ir
@@ -27,10 +27,10 @@ contract examples.voting.voting.VotingRoundApp:
block@2: // create_route_L58
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -51,9 +51,9 @@ contract examples.voting.voting.VotingRoundApp:
block@3: // bootstrap_route_L82
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (! tmp%22#0)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -64,17 +64,17 @@ contract examples.voting.voting.VotingRoundApp:
block@4: // close_route_L110
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (! tmp%27#0)
- (assert tmp%28#0) // OnCompletion is NoOp
+ (assert tmp%28#0) // OnCompletion is not NoOp
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
examples.voting.voting.VotingRoundApp.close()
return 1u
block@5: // get_preconditions_route_L160
let tmp%31#0: uint64 = (txn OnCompletion)
let tmp%32#0: bool = (! tmp%31#0)
- (assert tmp%32#0) // OnCompletion is NoOp
+ (assert tmp%32#0) // OnCompletion is not NoOp
let tmp%33#0: uint64 = (txn ApplicationID)
- (assert tmp%33#0) // is not creating
+ (assert tmp%33#0) // can only call when not creating
let tmp%35#0: bytes = (txna ApplicationArgs 1)
let tmp%36#0: bytes = ((extract 2 0) tmp%35#0)
let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0)
@@ -84,9 +84,9 @@ contract examples.voting.voting.VotingRoundApp:
block@6: // vote_route_L169
let tmp%39#0: uint64 = (txn OnCompletion)
let tmp%40#0: bool = (! tmp%39#0)
- (assert tmp%40#0) // OnCompletion is NoOp
+ (assert tmp%40#0) // OnCompletion is not NoOp
let tmp%41#0: uint64 = (txn ApplicationID)
- (assert tmp%41#0) // is not creating
+ (assert tmp%41#0) // can only call when not creating
let tmp%43#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
diff --git a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir
index 47afb93cd6..d1f91a0494 100644
--- a/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir
+++ b/examples/voting/out/VotingRoundApp.ssa.opt_pass_2.ir
@@ -27,10 +27,10 @@ contract examples.voting.voting.VotingRoundApp:
block@2: // create_route_L58
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -51,9 +51,9 @@ contract examples.voting.voting.VotingRoundApp:
block@3: // bootstrap_route_L82
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (! tmp%22#0)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -64,17 +64,17 @@ contract examples.voting.voting.VotingRoundApp:
block@4: // close_route_L110
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (! tmp%27#0)
- (assert tmp%28#0) // OnCompletion is NoOp
+ (assert tmp%28#0) // OnCompletion is not NoOp
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
examples.voting.voting.VotingRoundApp.close()
return 1u
block@5: // get_preconditions_route_L160
let tmp%31#0: uint64 = (txn OnCompletion)
let tmp%32#0: bool = (! tmp%31#0)
- (assert tmp%32#0) // OnCompletion is NoOp
+ (assert tmp%32#0) // OnCompletion is not NoOp
let tmp%33#0: uint64 = (txn ApplicationID)
- (assert tmp%33#0) // is not creating
+ (assert tmp%33#0) // can only call when not creating
let tmp%35#0: bytes = (txna ApplicationArgs 1)
let tmp%36#0: bytes = ((extract 2 0) tmp%35#0)
let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0)
@@ -84,9 +84,9 @@ contract examples.voting.voting.VotingRoundApp:
block@6: // vote_route_L169
let tmp%39#0: uint64 = (txn OnCompletion)
let tmp%40#0: bool = (! tmp%39#0)
- (assert tmp%40#0) // OnCompletion is NoOp
+ (assert tmp%40#0) // OnCompletion is not NoOp
let tmp%41#0: uint64 = (txn ApplicationID)
- (assert tmp%41#0) // is not creating
+ (assert tmp%41#0) // can only call when not creating
let tmp%43#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
diff --git a/examples/voting/out_O2/VotingRoundApp.approval.teal b/examples/voting/out_O2/VotingRoundApp.approval.teal
index 5481ece2a3..5240d8a732 100644
--- a/examples/voting/out_O2/VotingRoundApp.approval.teal
+++ b/examples/voting/out_O2/VotingRoundApp.approval.teal
@@ -38,10 +38,10 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
txna ApplicationArgs 1
extract 2 0
txna ApplicationArgs 2
@@ -64,9 +64,9 @@ __puya_arc4_router___create_route@2:
__puya_arc4_router___bootstrap_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txn GroupIndex
intc_1 // 1
-
@@ -82,9 +82,9 @@ __puya_arc4_router___bootstrap_route@3:
__puya_arc4_router___close_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub close
intc_1 // 1
retsub
@@ -92,9 +92,9 @@ __puya_arc4_router___close_route@4:
__puya_arc4_router___get_preconditions_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
extract 2 0
callsub get_preconditions
@@ -108,9 +108,9 @@ __puya_arc4_router___get_preconditions_route@5:
__puya_arc4_router___vote_route@6:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txn GroupIndex
intc_1 // 1
-
diff --git a/examples/voting/out_O2/VotingRoundApp.destructured.ir b/examples/voting/out_O2/VotingRoundApp.destructured.ir
index 9738284368..8d939f84e9 100644
--- a/examples/voting/out_O2/VotingRoundApp.destructured.ir
+++ b/examples/voting/out_O2/VotingRoundApp.destructured.ir
@@ -27,10 +27,10 @@ contract examples.voting.voting.VotingRoundApp:
block@2: // create_route_L58
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -51,9 +51,9 @@ contract examples.voting.voting.VotingRoundApp:
block@3: // bootstrap_route_L82
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (! tmp%22#0)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -64,17 +64,17 @@ contract examples.voting.voting.VotingRoundApp:
block@4: // close_route_L110
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (! tmp%27#0)
- (assert tmp%28#0) // OnCompletion is NoOp
+ (assert tmp%28#0) // OnCompletion is not NoOp
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
examples.voting.voting.VotingRoundApp.close()
return 1u
block@5: // get_preconditions_route_L160
let tmp%31#0: uint64 = (txn OnCompletion)
let tmp%32#0: bool = (! tmp%31#0)
- (assert tmp%32#0) // OnCompletion is NoOp
+ (assert tmp%32#0) // OnCompletion is not NoOp
let tmp%33#0: uint64 = (txn ApplicationID)
- (assert tmp%33#0) // is not creating
+ (assert tmp%33#0) // can only call when not creating
let tmp%35#0: bytes = (txna ApplicationArgs 1)
let tmp%36#0: bytes = ((extract 2 0) tmp%35#0)
let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0)
@@ -84,9 +84,9 @@ contract examples.voting.voting.VotingRoundApp:
block@6: // vote_route_L169
let tmp%39#0: uint64 = (txn OnCompletion)
let tmp%40#0: bool = (! tmp%39#0)
- (assert tmp%40#0) // OnCompletion is NoOp
+ (assert tmp%40#0) // OnCompletion is not NoOp
let tmp%41#0: uint64 = (txn ApplicationID)
- (assert tmp%41#0) // is not creating
+ (assert tmp%41#0) // can only call when not creating
let tmp%43#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
diff --git a/examples/voting/out_unoptimized/VotingRoundApp.approval.teal b/examples/voting/out_unoptimized/VotingRoundApp.approval.teal
index af54f8d3ad..28dd8b2c04 100644
--- a/examples/voting/out_unoptimized/VotingRoundApp.approval.teal
+++ b/examples/voting/out_unoptimized/VotingRoundApp.approval.teal
@@ -56,11 +56,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txna ApplicationArgs 1
@@ -98,11 +98,11 @@ __puya_arc4_router___bootstrap_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txn GroupIndex
@@ -125,11 +125,11 @@ __puya_arc4_router___close_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub close
intc_1 // 1
retsub
@@ -140,11 +140,11 @@ __puya_arc4_router___get_preconditions_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txna ApplicationArgs 1
@@ -165,11 +165,11 @@ __puya_arc4_router___vote_route@6:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// voting/voting.py:49
// class VotingRoundApp(ARC4Contract):
txn GroupIndex
diff --git a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir
index 3a67bea71c..0668fdb348 100644
--- a/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir
+++ b/examples/voting/out_unoptimized/VotingRoundApp.destructured.ir
@@ -28,10 +28,10 @@ contract examples.voting.voting.VotingRoundApp:
block@2: // create_route_L58
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -52,10 +52,10 @@ contract examples.voting.voting.VotingRoundApp:
block@3: // bootstrap_route_L82
let tmp%22#0: uint64 = (txn OnCompletion)
let tmp%23#0: bool = (== tmp%22#0 NoOp)
- (assert tmp%23#0) // OnCompletion is NoOp
+ (assert tmp%23#0) // OnCompletion is not NoOp
let tmp%24#0: uint64 = (txn ApplicationID)
let tmp%25#0: bool = (!= tmp%24#0 0u)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
let tmp%26#0: uint64 = (txn GroupIndex)
let gtxn_idx%0#0: uint64 = (- tmp%26#0 1u)
let gtxn_type%0#0: uint64 = ((gtxns TypeEnum) gtxn_idx%0#0)
@@ -66,19 +66,19 @@ contract examples.voting.voting.VotingRoundApp:
block@4: // close_route_L110
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 NoOp)
- (assert tmp%28#0) // OnCompletion is NoOp
+ (assert tmp%28#0) // OnCompletion is not NoOp
let tmp%29#0: uint64 = (txn ApplicationID)
let tmp%30#0: bool = (!= tmp%29#0 0u)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
examples.voting.voting.VotingRoundApp.close()
return 1u
block@5: // get_preconditions_route_L160
let tmp%31#0: uint64 = (txn OnCompletion)
let tmp%32#0: bool = (== tmp%31#0 NoOp)
- (assert tmp%32#0) // OnCompletion is NoOp
+ (assert tmp%32#0) // OnCompletion is not NoOp
let tmp%33#0: uint64 = (txn ApplicationID)
let tmp%34#0: bool = (!= tmp%33#0 0u)
- (assert tmp%34#0) // is not creating
+ (assert tmp%34#0) // can only call when not creating
let tmp%35#0: bytes = (txna ApplicationArgs 1)
let tmp%36#0: bytes = ((extract 2 0) tmp%35#0)
let tmp%37#0: bytes = examples.voting.voting.VotingRoundApp.get_preconditions(tmp%36#0)
@@ -88,10 +88,10 @@ contract examples.voting.voting.VotingRoundApp:
block@6: // vote_route_L169
let tmp%39#0: uint64 = (txn OnCompletion)
let tmp%40#0: bool = (== tmp%39#0 NoOp)
- (assert tmp%40#0) // OnCompletion is NoOp
+ (assert tmp%40#0) // OnCompletion is not NoOp
let tmp%41#0: uint64 = (txn ApplicationID)
let tmp%42#0: bool = (!= tmp%41#0 0u)
- (assert tmp%42#0) // is not creating
+ (assert tmp%42#0) // can only call when not creating
let tmp%43#0: uint64 = (txn GroupIndex)
let gtxn_idx%1#0: uint64 = (- tmp%43#0 1u)
let gtxn_type%1#0: uint64 = ((gtxns TypeEnum) gtxn_idx%1#0)
diff --git a/examples/voting/puya.log b/examples/voting/puya.log
index 59e69d29f2..aee850c902 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
@@ -2049,6 +2049,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/scripts/compile_all_examples.py b/scripts/compile_all_examples.py
index 4cc607dcd1..2a8adce0ab 100755
--- a/scripts/compile_all_examples.py
+++ b/scripts/compile_all_examples.py
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
import argparse
+import json
import operator
import os
import re
@@ -235,6 +236,11 @@ def checked_compile(
)
bin_files_written = re.findall(r"info: Writing (.+\.bin)", result.stdout)
+ # normalize ARC-56 output
+ arc56_files_written = re.findall(r"info: Writing (.+\.arc56\.json)", result.stdout)
+ for arc56_file in arc56_files_written:
+ _normalize_arc56(root / arc56_file)
+
if write_logs:
if p.is_dir():
log_path = p / "puya.log"
@@ -252,6 +258,15 @@ def checked_compile(
)
+def _normalize_arc56(path: Path) -> None:
+ arc56 = json.loads(path.read_text())
+ compiler_version = arc56.get("compilerInfo", {}).get("compilerVersion", {})
+ compiler_version["major"] = 99
+ compiler_version["minor"] = 99
+ compiler_version["patch"] = 99
+ path.write_text(json.dumps(arc56, indent=4), encoding="utf8")
+
+
def _load_template_vars(path: Path) -> Iterable[str]:
if path.exists():
for line in path.read_text("utf8").splitlines():
@@ -294,6 +309,7 @@ def _compile_for_level(arg: tuple[Path, int]) -> tuple[CompilationResult, int]:
"--output-memory-ir",
"--output-client",
"--output-source-map",
+ "--output-arc56",
]
out_suffix = SUFFIX_O1
write_logs = True
diff --git a/src/puya/arc32.py b/src/puya/arc32.py
index 5d8f44503a..73f9aa2d2e 100644
--- a/src/puya/arc32.py
+++ b/src/puya/arc32.py
@@ -10,6 +10,7 @@
ARC4BareMethod,
ARC4CreateOption,
ARC4MethodConfig,
+ ARC4Struct,
ContractMetaData,
ContractState,
OnCompletionAction,
@@ -39,7 +40,7 @@ def _encode_source(teal_text: str) -> str:
def _encode_schema_declaration(state: ContractState) -> JSONDict:
return {
"type": state.storage_type.name,
- "key": state.key.decode("utf-8"), # TODO: support not utf8 keys?
+ "key": state.key_or_prefix.decode("utf-8"), # TODO: support not utf8 keys?
"descr": state.description,
}
@@ -97,12 +98,12 @@ def _encode_default_arg(
return {
"source": "global-state",
# TODO: handle non utf-8 bytes
- "data": state.key.decode("utf-8"),
+ "data": state.key_or_prefix.decode("utf-8"),
}
if state := metadata.local_state.get(source):
return {
"source": "local-state",
- "data": state.key.decode("utf-8"),
+ "data": state.key_or_prefix.decode("utf-8"),
}
for method in metadata.arc4_methods:
if isinstance(method, ARC4ABIMethod) and method.name == source:
@@ -115,6 +116,9 @@ def _encode_default_arg(
def _encode_arc32_method_hint(metadata: ContractMetaData, method: ARC4ABIMethod) -> JSONDict:
+ structs = {a.name: metadata.structs[a.struct] for a in method.args if a.struct}
+ if method.returns.struct:
+ structs["output"] = metadata.structs[method.returns.struct]
return {
# deprecated by ARC-22
"read_only": True if method.config.readonly else None,
@@ -127,18 +131,18 @@ def _encode_arc32_method_hint(metadata: ContractMetaData, method: ARC4ABIMethod)
else None
),
"call_config": _encode_call_config(method.config),
- "structs": _encode_arc32_method_structs(method),
+ "structs": _encode_arc32_method_structs(structs),
}
-def _encode_arc32_method_structs(method: ARC4ABIMethod) -> JSONDict | None:
- if len(method.config.structs):
+def _encode_arc32_method_structs(structs: Mapping[str, ARC4Struct]) -> JSONDict | None:
+ if len(structs):
return {
struct_purpose: {
"name": struct_def.name,
- "elements": struct_def.elements,
+ "elements": [[f.name, f.type] for f in struct_def.fields],
}
- for struct_purpose, struct_def in method.config.structs.items()
+ for struct_purpose, struct_def in structs.items()
}
return None
diff --git a/src/puya/arc56.py b/src/puya/arc56.py
new file mode 100644
index 0000000000..899779dd41
--- /dev/null
+++ b/src/puya/arc56.py
@@ -0,0 +1,328 @@
+import base64
+import itertools
+import typing
+from collections import defaultdict
+from collections.abc import Iterable, Mapping, Sequence
+from importlib.metadata import version as metadata_version
+
+from cattrs.preconf.json import make_converter
+from packaging import version
+
+from puya import (
+ arc56_models as models,
+ log,
+)
+from puya.errors import InternalError
+from puya.models import (
+ ARC4ABIMethod,
+ ARC4BareMethod,
+ ARC4CreateOption,
+ ARC4Struct,
+ CompiledProgram,
+ ContractMetaData,
+ ContractState,
+ DebugInfo,
+)
+from puya.utils import unique
+
+# TODO: use puya once the backend is shipped as separate package
+_ALGOPY_VERSION = version.parse(metadata_version("puyapy"))
+logger = log.get_logger(__name__)
+
+
+def create_arc56_json(
+ *,
+ metadata: ContractMetaData,
+ approval_program: CompiledProgram,
+ clear_program: CompiledProgram,
+ template_prefix: str,
+) -> str:
+ assert approval_program.debug_info is not None
+ assert clear_program.debug_info is not None
+
+ converter = make_converter(omit_if_default=True)
+ bare_methods = [m for m in metadata.arc4_methods if isinstance(m, ARC4BareMethod)]
+ abi_methods = [m for m in metadata.arc4_methods if isinstance(m, ARC4ABIMethod)]
+
+ # use shorter name for structs unless there is a collision
+ aliases = _StructAliases(metadata.structs.values())
+
+ schema = metadata.state_totals
+ app_spec = models.Contract(
+ arcs=(22, 28),
+ name=metadata.name,
+ desc=metadata.description,
+ networks={}, # TODO: for users to fill in?
+ structs={
+ aliases.resolve(n): [
+ models.StructField(
+ name=e.name,
+ type=aliases.resolve(e.struct) or e.type,
+ )
+ for e in s.fields
+ ]
+ for n, s in metadata.structs.items()
+ },
+ methods=[
+ models.Method(
+ name=m.config.name,
+ desc=m.desc,
+ args=[
+ models.MethodArg(
+ type=a.type_,
+ name=a.name,
+ desc=a.desc,
+ struct=aliases.resolve(a.struct),
+ defaultValue=_encode_default_arg(
+ metadata, m.config.default_args.get(a.name)
+ ),
+ )
+ for a in m.args
+ ],
+ returns=models.MethodReturns(
+ type=m.returns.type_,
+ desc=m.returns.desc,
+ struct=aliases.resolve(m.returns.struct),
+ ),
+ actions=_method_actions(m),
+ readonly=m.config.readonly,
+ events=[_struct_to_event(aliases, struct) for struct in m.events],
+ recommendations=models.MethodRecommendations(
+ innerTransactionCount=None, # TODO: collect itxn count?
+ # TODO: users will fill these other ones in?
+ boxes=None,
+ accounts=None,
+ apps=None,
+ assets=None,
+ ),
+ )
+ for m in abi_methods
+ ],
+ state=models.ContractState(
+ schema={
+ "global": {"ints": schema.global_uints, "bytes": schema.global_bytes},
+ "local": {"ints": schema.local_uints, "bytes": schema.local_bytes},
+ },
+ keys={
+ "global": _storage_keys(aliases, metadata.global_state),
+ "local": _storage_keys(aliases, metadata.local_state),
+ "box": _storage_keys(aliases, metadata.boxes),
+ },
+ maps={
+ # note: at present there is no way of defining global/local maps
+ "global": _storage_maps(aliases, metadata.global_state),
+ "local": _storage_maps(aliases, metadata.local_state),
+ "box": _storage_maps(aliases, metadata.boxes),
+ },
+ ),
+ bareActions=_combine_actions(list(map(_method_actions, bare_methods))),
+ sourceInfo={
+ "approval": models.ProgramSourceInfo(
+ sourceInfo=_get_source_info(approval_program.debug_info),
+ pcOffsetMethod="cblocks" if approval_program.debug_info.op_pc_offset else "none",
+ ),
+ "clear": models.ProgramSourceInfo(
+ sourceInfo=_get_source_info(clear_program.debug_info),
+ pcOffsetMethod="cblocks" if clear_program.debug_info.op_pc_offset else "none",
+ ),
+ },
+ source={
+ "approval": _encode_str(approval_program.teal_src),
+ "clear": _encode_str(clear_program.teal_src),
+ },
+ byteCode=(
+ {
+ "approval": _encode_bytes(approval_program.bytecode),
+ "clear": _encode_bytes(clear_program.bytecode),
+ }
+ if approval_program.bytecode and clear_program.bytecode
+ else None
+ ),
+ compilerInfo=(
+ _compiler_info() if approval_program.bytecode and clear_program.bytecode else None
+ ),
+ events=[
+ _struct_to_event(aliases, struct)
+ for struct in unique(
+ e for m in metadata.arc4_methods if isinstance(m, ARC4ABIMethod) for e in m.events
+ )
+ ],
+ templateVariables={
+ name.removeprefix(template_prefix): models.TemplateVariable(
+ type=aliases.resolve(metadata.template_variable_types[name]),
+ value=(
+ _encode_bytes(value.to_bytes(length=8) if isinstance(value, int) else value)
+ if value is not None
+ else None
+ ),
+ )
+ for program in (approval_program, clear_program)
+ for name, value in program.template_variables.items()
+ },
+ # TODO: provide a way for contracts to declare "public" scratch vars
+ scratchVariables=None,
+ )
+ return converter.dumps(app_spec, indent=4)
+
+
+def _get_source_info(debug_info: DebugInfo) -> Sequence[models.SourceInfo]:
+ errors = defaultdict[str, list[int]](list)
+ for pc, event in debug_info.pc_events.items():
+ if error := event.get("error"):
+ errors[error].append(pc)
+ return [
+ models.SourceInfo(
+ pc=errors[error],
+ errorMessage=error,
+ )
+ for error in sorted(errors)
+ ]
+
+
+class _StructAliases:
+ def __init__(self, structs: Iterable[ARC4Struct]) -> None:
+ self.aliases = dict[str, str]()
+ for struct in structs:
+ self.aliases[struct.fullname] = (
+ struct.fullname
+ if struct.name in self.aliases or struct.name in models.AVMType
+ else struct.name
+ )
+
+ def resolve[T: str | None](self, struct: T) -> T:
+ return self.aliases.get(struct, struct) # type: ignore[arg-type, return-value]
+
+
+def _struct_to_event(structs: _StructAliases, struct: ARC4Struct) -> models.Event:
+ return models.Event(
+ name=struct.name,
+ desc=struct.desc,
+ args=[
+ models.EventArg(
+ name=f.name,
+ type=f.type,
+ struct=structs.resolve(f.struct),
+ )
+ for f in struct.fields
+ ],
+ )
+
+
+def _storage_keys(
+ structs: _StructAliases, state: Mapping[str, ContractState]
+) -> models.StorageKeys:
+ return {
+ n: models.StorageKey(
+ desc=m.description,
+ keyType=structs.resolve(m.arc56_key_type),
+ valueType=structs.resolve(m.arc56_value_type),
+ key=_encode_bytes(m.key_or_prefix),
+ )
+ for n, m in state.items()
+ if not m.is_map
+ }
+
+
+def _storage_maps(
+ structs: _StructAliases, state: Mapping[str, ContractState]
+) -> models.StorageMaps:
+ return {
+ n: models.StorageMap(
+ desc=m.description,
+ keyType=structs.resolve(m.arc56_key_type),
+ valueType=structs.resolve(m.arc56_value_type),
+ prefix=_encode_bytes(m.key_or_prefix),
+ )
+ for n, m in state.items()
+ if m.is_map
+ }
+
+
+def _method_actions(method: ARC4BareMethod | ARC4ABIMethod) -> models.MethodActions:
+ config = method.config
+ return models.MethodActions(
+ create=[
+ oca.name
+ for oca in config.allowed_completion_types
+ if config.create != ARC4CreateOption.disallow and allowed_create_oca(oca.name)
+ ],
+ call=[
+ oca.name
+ for oca in config.allowed_completion_types
+ if config.create != ARC4CreateOption.require and allowed_call_oca(oca.name)
+ ],
+ )
+
+
+def _encode_default_arg(
+ metadata: ContractMetaData, source: str | None
+) -> models.MethodArgDefaultValue | None:
+ if source is None:
+ return None
+ if (state := metadata.global_state.get(source)) and not state.is_map:
+ return models.MethodArgDefaultValue(
+ data=_encode_bytes(state.key_or_prefix),
+ type=state.arc56_key_type,
+ source=models.DefaultValueSource.global_,
+ )
+ if (state := metadata.local_state.get(source)) and not state.is_map:
+ return models.MethodArgDefaultValue(
+ data=_encode_bytes(state.key_or_prefix),
+ type=state.arc56_key_type,
+ source=models.DefaultValueSource.local_,
+ )
+ if (state := metadata.boxes.get(source)) and not state.is_map:
+ return models.MethodArgDefaultValue(
+ data=_encode_bytes(state.key_or_prefix),
+ type=state.arc56_key_type,
+ source=models.DefaultValueSource.box,
+ )
+ for method in metadata.arc4_methods:
+ if isinstance(method, ARC4ABIMethod) and method.name == source:
+ return models.MethodArgDefaultValue(
+ data=method.signature,
+ source=models.DefaultValueSource.method,
+ )
+ # TODO: constants
+ raise InternalError(f"Cannot find {source=!r} on {metadata.ref}")
+
+
+def _combine_actions(actions: Sequence[models.MethodActions]) -> models.MethodActions:
+ return models.MethodActions(
+ create=sorted(set(itertools.chain.from_iterable(a.create for a in actions))),
+ call=sorted(set(itertools.chain.from_iterable(a.call for a in actions))),
+ )
+
+
+def allowed_create_oca(
+ oca: str,
+) -> typing.TypeGuard[typing.Literal["NoOp", "OptIn", "DeleteApplication"]]:
+ return oca in ("NoOp", "OptIn", "DeleteApplication")
+
+
+def allowed_call_oca(
+ oca: str,
+) -> typing.TypeGuard[
+ typing.Literal["NoOp", "OptIn", "CloseOut", "UpdateApplication", "DeleteApplication"]
+]:
+ return oca in ("NoOp", "OptIn", "CloseOut", "UpdateApplication", "DeleteApplication")
+
+
+def _encode_str(value: str) -> str:
+ return _encode_bytes(value.encode("utf8"))
+
+
+def _encode_bytes(value: bytes) -> str:
+ return base64.b64encode(value).decode("utf-8")
+
+
+def _compiler_info() -> models.CompilerInfo:
+ return models.CompilerInfo(
+ compiler="puya",
+ compilerVersion=models.CompilerVersion(
+ major=_ALGOPY_VERSION.major,
+ minor=_ALGOPY_VERSION.minor,
+ patch=_ALGOPY_VERSION.micro,
+ commitHash=None,
+ ),
+ )
diff --git a/src/puya/arc56_models.py b/src/puya/arc56_models.py
new file mode 100644
index 0000000000..c5eb67231d
--- /dev/null
+++ b/src/puya/arc56_models.py
@@ -0,0 +1,364 @@
+# ruff: noqa: N815
+import enum
+import typing
+from collections.abc import Mapping, Sequence
+
+import attrs
+
+ABIType = str
+"""An ABI-encoded type"""
+StructName = str
+"""The name of a defined struct"""
+ProgramType = typing.Literal["approval", "clear"]
+
+
+class AVMType(enum.StrEnum):
+ """A native AVM type"""
+
+ bytes = "AVMBytes"
+ """Raw byteslice without the length prefixed that is specified in ARC-4"""
+ string = "AVMString"
+ """A utf-8 string without the length prefix that is specified in ARC-4"""
+ uint64 = "AVMUint64"
+ """A 64-bit unsigned integer"""
+
+
+@attrs.frozen
+class SourceInfo:
+ pc: Sequence[int]
+ """The program counter value(s). Could be offset if pcOffsetMethod is not 'none'"""
+ errorMessage: str
+ """A human-readable string that describes the error when the program fails at the given PC"""
+
+
+@attrs.frozen
+class ProgramSourceInfo:
+ sourceInfo: Sequence[SourceInfo]
+ """The source information for the program"""
+ pcOffsetMethod: typing.Literal["none", "cblocks"]
+ """
+ How the program counter offset is calculated
+ none: The pc values in sourceInfo are not offset
+ cblocks: The pc values in sourceInfo are offset by the PC of the first op after the
+ last cblock at the top of the program
+ """
+
+
+@attrs.frozen(kw_only=True)
+class StorageKey:
+ """Describes a single key in app storage"""
+
+ desc: str | None = None
+ """Description of what this storage key holds"""
+ keyType: ABIType | AVMType | StructName
+ """The type of the key"""
+ valueType: ABIType | AVMType | StructName
+ """The type of the value"""
+ key: str
+ """The base64-encoded key"""
+
+
+@attrs.frozen(kw_only=True)
+class StorageMap:
+ """Describes a mapping of key-value pairs in storage"""
+
+ desc: str | None = None
+ """Description of what the key-value pairs in this mapping hold"""
+ keyType: ABIType | AVMType | StructName
+ """The type of the keys in the map"""
+ valueType: ABIType | AVMType | StructName
+ """The type of the values in the map"""
+ prefix: str | None = None
+ """The base64-encoded prefix of the map keys"""
+
+
+@attrs.frozen
+class StructField:
+ """Information about a single field in a struct"""
+
+ name: str
+ """The name of the struct field"""
+ type: ABIType | StructName | Sequence["StructField"]
+ """The type of the struct field's value"""
+
+
+@attrs.frozen
+class EventArg:
+ type: ABIType
+ """
+ The type of the argument.
+ The `struct` field should also be checked to determine if this arg is a struct.
+ """
+ name: str | None = None
+ """Optional, user-friendly name for the argument"""
+ desc: str | None = None
+ """Optional, user-friendly description for the argument"""
+ struct: StructName | None = None
+ """
+ If the type is a struct, the name of the struct
+ Note: this is a separate field to maintain backwards compatability with ARC-23
+ """
+
+
+@attrs.frozen(kw_only=True)
+class Event:
+ name: str
+ """The name of the event"""
+ desc: str | None = None
+ """Optional, user-friendly description for the event"""
+ args: Sequence[EventArg]
+ """The arguments of the event, in order"""
+
+
+class DefaultValueSource(enum.Enum):
+ box = "box"
+ """The data key signifies the box key to read the value from"""
+ global_ = "global"
+ """The data key signifies the global state key to read the value from"""
+ local_ = "local"
+ """The data key signifies the local state key to read the value from (for the sender)"""
+ literal = "literal"
+ """the value is a literal and should be passed directly as the argument"""
+ method = "method"
+ """
+ The utf8 signature of the method in this contract to call to get the default value.
+ If the method has arguments, they all must have default values.
+ The method **MUST** be readonly so simulate can be used to get the default value.
+ """
+
+
+@attrs.frozen(kw_only=True)
+class MethodArgDefaultValue:
+ source: DefaultValueSource
+ """Where the default value is coming from"""
+ type: ABIType | AVMType | None = None
+ """
+ How the data is encoded.
+ This is the encoding for the data provided here, not the arg type.
+ Not relevant if source is method
+ """
+ data: str
+ """Base64 encoded bytes or uint64"""
+
+
+@attrs.frozen(kw_only=True)
+class MethodArg:
+ type: ABIType
+ """
+ The type of the argument.
+ The `struct` field should also be checked to determine if this arg is a struct.
+ """
+ struct: StructName | None = None
+ """
+ If the type is a struct, the name of the struct.
+ Note: this is a separate field to maintain backwards compatability with ARC-4
+ """
+ name: str | None = None
+ """Optional, user-friendly name for the argument"""
+ desc: str | None = None
+ """Optional, user-friendly description for the argument"""
+ defaultValue: MethodArgDefaultValue | None = None
+
+
+@attrs.frozen(kw_only=True)
+class MethodReturns:
+ type: ABIType
+ """
+ The type of the return value, or "void" to indicate no return value.
+ The `struct` field should also be checked to determine if this return value is a struct.
+ """
+ struct: StructName | None = None
+ """
+ If the type is a struct, the name of the struct
+ """
+ desc: str | None = None
+ """Optional, user-friendly description for the return value"""
+
+
+@attrs.frozen
+class MethodActions:
+ """An action is a combination of call/create and an OnComplete"""
+
+ create: Sequence[typing.Literal["NoOp", "OptIn", "DeleteApplication"]]
+ """OnCompletes this method allows when appID === 0"""
+ call: Sequence[
+ typing.Literal["NoOp", "OptIn", "CloseOut", "UpdateApplication", "DeleteApplication"]
+ ]
+ """OnCompletes this method allows when appID !== 0"""
+
+
+@attrs.frozen(kw_only=True)
+class MethodBoxRecommendation:
+ app: int | None = None
+ """The app ID for the box"""
+ key: str
+ """The base64 encoded box key"""
+ readBytes: int
+ """The number of bytes being read from the box"""
+ writeBytes: int
+ """The number of bytes being written to the box"""
+
+
+@attrs.frozen(kw_only=True)
+class MethodRecommendations:
+ innerTransactionCount: int | None = None
+ """The number of inner transactions the caller should cover the fees for"""
+ boxes: MethodBoxRecommendation | None = None
+ """Recommended box references to include"""
+ accounts: Sequence[str] | None = None
+ """Recommended foreign accounts"""
+ apps: Sequence[int] | None = None
+ """Recommended foreign apps"""
+ assets: Sequence[int] | None = None
+ """Recommended foreign assets"""
+
+
+@attrs.frozen(kw_only=True)
+class Method:
+ """
+ Describes a method in the contract.
+ This interface is an extension of the interface described in ARC-4
+ """
+
+ name: str
+ """The name of the method"""
+ desc: str | None = None
+ """Optional, user-friendly description for the method"""
+ args: Sequence[MethodArg]
+ """The arguments of the method, in order"""
+ returns: MethodReturns
+ """Information about the method's return value"""
+ actions: MethodActions
+ """Allowed actions for this method"""
+ readonly: bool
+ """If this method does not write anything to the ledger (ARC-22)"""
+ events: Sequence[Event] = ()
+ """ARC-28 events that MAY be emitted by this method"""
+ recommendations: MethodRecommendations | None = None
+ """Information that clients can use when calling the method"""
+
+
+@attrs.frozen
+class Network:
+ appID: int
+ """The app ID of the deployed contract in this network"""
+
+
+class SchemaSizes(typing.TypedDict):
+ ints: int
+ bytes: int
+
+
+ContractSchema = typing.TypedDict("ContractSchema", {"global": SchemaSizes, "local": SchemaSizes})
+StorageMaps = Mapping[str, StorageMap]
+StorageKeys = Mapping[str, StorageKey]
+ContractStorage = typing.TypedDict(
+ "ContractStorage", {"global": StorageMaps, "local": StorageMaps, "box": StorageMaps}
+)
+ContractKeys = typing.TypedDict(
+ "ContractKeys", {"global": StorageKeys, "local": StorageKeys, "box": StorageKeys}
+)
+
+
+@attrs.frozen
+class ContractState:
+ schema: ContractSchema
+ """
+ Defines the values that should be used for GlobalNumUint, GlobalNumByteSlice, LocalNumUint,
+ and LocalNumByteSlice when creating the application
+ """
+ keys: ContractKeys
+ """Mapping of human-readable names to StorageKey objects"""
+ maps: ContractStorage
+ """Mapping of human-readable names to StorageMap objects"""
+
+
+@attrs.frozen(kw_only=True)
+class CompilerVersion:
+ major: int
+ minor: int
+ patch: int
+ commitHash: str | None = None
+
+
+@attrs.frozen
+class CompilerInfo:
+ compiler: str
+ """The name of the compiler"""
+ compilerVersion: CompilerVersion
+
+
+@attrs.frozen(kw_only=True)
+class TemplateVariable:
+ type: ABIType | AVMType | StructName
+ """The type of the template variable"""
+ value: str | None = None
+ """If given, the the base64 encoded value used for the given app/program"""
+
+
+@attrs.frozen
+class ScratchVariable:
+ slot: int
+ type: ABIType | AVMType | StructName
+
+
+@attrs.frozen(kw_only=True)
+class Contract:
+ """
+ Describes the entire contract.
+ This interface is an extension of the interface described in ARC-4
+ """
+
+ arcs: Sequence[int] = ()
+ """
+ The ARCs used and/or supported by this contract.
+ All contracts implicitly support ARC-4 and ARC-56
+ """
+ name: str
+ """A user-friendly name for the contract"""
+ desc: str | None = None
+ """Optional, user-friendly description for the interface"""
+ networks: Mapping[str, Network] | None = None
+ """
+ Optional object listing the contract instances across different networks.
+ The key is the base64 genesis hash of the network, and the value contains
+ information about the deployed contract in the network indicated by the
+ key. A key containing the human-readable name of the network MAY be
+ included, but the corresponding genesis hash key MUST also be define
+ """
+ structs: Mapping[str, Sequence[StructField]]
+ """
+ Named structs use by the application.
+ Each struct field appears in the same order as ABI encoding
+ """
+ methods: Sequence[Method]
+ """All of the methods that the contract implements"""
+ state: ContractState | None = None
+ bareActions: MethodActions | None = None
+ """Supported bare actions for the contract"""
+ sourceInfo: Mapping[ProgramType, ProgramSourceInfo] | None = None
+ """Information about the TEAL programs"""
+ source: Mapping[ProgramType, str] | None = None
+ """
+ The pre-compiled TEAL that may contain template variables.
+ MUST be omitted if included as part of ARC23
+ """
+ byteCode: Mapping[ProgramType, str] | None = None
+ """
+ The compiled bytecode for the application.
+ MUST be omitted if included as part of ARC23
+ """
+ compilerInfo: CompilerInfo | None = None
+ """
+ Information used to get the given byteCode and/or PC values in sourceInfo.
+ MUST be given if byteCode or PC values are present
+ """
+ events: Sequence[Event] | None = None
+ """ARC-28 events that MAY be emitted by this contract"""
+ templateVariables: Mapping[str, TemplateVariable] | None = None
+ """
+ A mapping of template variable names as they appear in the teal (not including TMPL_ prefix)
+ to their respective types and values (if applicable)
+ """
+ scratchVariables: Mapping[str, ScratchVariable] | None = None
+ """The scratch variables used during runtime"""
diff --git a/src/puya/awst/function_traverser.py b/src/puya/awst/function_traverser.py
index 95014c8d12..527c8b2883 100644
--- a/src/puya/awst/function_traverser.py
+++ b/src/puya/awst/function_traverser.py
@@ -381,3 +381,7 @@ def visit_range(self, node: awst_nodes.Range) -> None:
node.start.accept(self)
node.stop.accept(self)
node.step.accept(self)
+
+ @typing.override
+ def visit_emit(self, expr: awst_nodes.Emit) -> None:
+ expr.value.accept(self)
diff --git a/src/puya/awst/nodes.py b/src/puya/awst/nodes.py
index 1877682560..c409f15ee0 100644
--- a/src/puya/awst/nodes.py
+++ b/src/puya/awst/nodes.py
@@ -490,6 +490,7 @@ class ARC4Decode(Expression):
wtypes.arc4_bool_wtype,
wtypes.ARC4UIntN,
wtypes.ARC4Tuple,
+ wtypes.ARC4Struct,
wtypes.ARC4DynamicArray, # only if element type is bytes for now
)
)
@@ -1362,6 +1363,16 @@ def accept(self, visitor: StatementVisitor[T]) -> T:
return visitor.visit_bytes_augmented_assignment(self)
+@attrs.frozen
+class Emit(Expression):
+ signature: str
+ value: Expression = attrs.field(validator=expression_has_wtype(wtypes.ARC4Struct))
+ wtype: WType = attrs.field(default=wtypes.void_wtype, init=False)
+
+ def accept(self, visitor: ExpressionVisitor[T]) -> T:
+ return visitor.visit_emit(self)
+
+
@attrs.frozen
class Range(Expression):
wtype: WType = attrs.field(default=wtypes.uint64_range_wtype, init=False)
diff --git a/src/puya/awst/to_code_visitor.py b/src/puya/awst/to_code_visitor.py
index 74b9f035c9..b6697f7e95 100644
--- a/src/puya/awst/to_code_visitor.py
+++ b/src/puya/awst/to_code_visitor.py
@@ -641,6 +641,10 @@ def visit_uint64_postfix_unary_operation(self, expr: nodes.UInt64PostfixUnaryOpe
def visit_arc4_router(self, expr: nodes.ARC4Router) -> str:
return "arc4_router()"
+ @typing.override
+ def visit_emit(self, expr: nodes.Emit) -> str:
+ return f"emit({expr.signature!r}, {expr.value.accept(self)})"
+
def _indent(lines: Iterable[str], indent_size: str = " ") -> Iterator[str]:
yield from (f"{indent_size}{line}" for line in lines)
diff --git a/src/puya/awst/validation/arc4_copy.py b/src/puya/awst/validation/arc4_copy.py
index a6ab9a9a63..1cc6b9bec6 100644
--- a/src/puya/awst/validation/arc4_copy.py
+++ b/src/puya/awst/validation/arc4_copy.py
@@ -33,6 +33,10 @@ def visit_intrinsic_call(self, call: awst_nodes.IntrinsicCall) -> None:
if _HasAssignmentVisitor.check(call):
super().visit_intrinsic_call(call)
+ def visit_emit(self, emit: awst_nodes.Emit) -> None:
+ if _HasAssignmentVisitor.check(emit):
+ super().visit_emit(emit)
+
def visit_assignment_statement(self, statement: awst_nodes.AssignmentStatement) -> None:
_check_assignment(statement.target, statement.value)
statement.value.accept(self)
diff --git a/src/puya/awst/visitors.py b/src/puya/awst/visitors.py
index 710a1e38c4..9f7a688bb4 100644
--- a/src/puya/awst/visitors.py
+++ b/src/puya/awst/visitors.py
@@ -289,3 +289,6 @@ def visit_arc4_router(self, expr: puya.awst.nodes.ARC4Router) -> T: ...
@abstractmethod
def visit_range(self, node: puya.awst.nodes.Range) -> T: ...
+
+ @abstractmethod
+ def visit_emit(self, emit: puya.awst.nodes.Emit) -> T: ...
diff --git a/src/puya/awst/wtypes.py b/src/puya/awst/wtypes.py
index cdb30caad5..393d5db9d8 100644
--- a/src/puya/awst/wtypes.py
+++ b/src/puya/awst/wtypes.py
@@ -166,6 +166,7 @@ class WStructType(WType):
immutable: bool = attrs.field(init=False)
scalar_type: None = attrs.field(default=None, init=False)
source_location: SourceLocation | None = attrs.field(eq=False)
+ desc: str | None = None
@immutable.default
def _immutable(self) -> bool:
@@ -208,6 +209,7 @@ class WTuple(WType):
immutable: bool = attrs.field(default=True, init=False)
name: str = attrs.field(kw_only=True)
names: tuple[str, ...] | None = attrs.field(default=None)
+ desc: str | None = None
def __eq__(self, other: object) -> bool:
# this custom equality check ensures that
@@ -460,6 +462,7 @@ class ARC4Struct(ARC4Type):
source_location: SourceLocation | None = attrs.field(default=None, eq=False)
arc4_name: str = attrs.field(init=False, eq=False)
native_type: None = attrs.field(default=None, init=False)
+ desc: str | None = None
@immutable.default
def _immutable(self) -> bool:
diff --git a/src/puya/compile.py b/src/puya/compile.py
index 9a68972016..53da795177 100644
--- a/src/puya/compile.py
+++ b/src/puya/compile.py
@@ -9,6 +9,7 @@
from puya import log
from puya.arc32 import create_arc32_json
+from puya.arc56 import create_arc56_json
from puya.artifact_sorter import ArtifactCompilationSorter
from puya.awst.nodes import AWST
from puya.awst.validation.main import validate_awst
@@ -169,6 +170,7 @@ def get_program_bytecode(
class _CompiledProgram(CompiledProgram):
teal: TealProgram
teal_src: str
+ template_variables: Mapping[str, int | bytes | None]
debug_info: DebugInfo | None = None
bytecode: bytes | None = None
@@ -207,6 +209,7 @@ def _dummy_program() -> _CompiledProgram:
subroutines=[],
),
teal_src="",
+ template_variables={},
)
@@ -265,6 +268,7 @@ def _compile_program(context: CompileContext, program: TealProgram) -> _Compiled
teal_src=emit_teal(context, program),
bytecode=assembled.bytecode if context.options.output_bytecode else None,
debug_info=assembled.debug_info,
+ template_variables=assembled.template_variables,
)
@@ -279,7 +283,6 @@ def _write_artifacts(
if out_dir is None:
continue
teal_file_stem = artifact.metadata.name
- arc32_file_stem = f"{teal_file_stem}.arc32.json"
artifact_base_path = out_dir / teal_file_stem
match artifact:
case CompiledLogicSig(program=program):
@@ -290,15 +293,27 @@ def _write_artifacts(
".clear": clear,
}
if contract.metadata.is_arc4:
- app_spec_json = create_arc32_json(
- approval.teal_src,
- clear.teal_src,
- contract.metadata,
- )
if context.options.output_arc32:
- arc32_path = out_dir / arc32_file_stem
- logger.info(f"Writing {make_path_relative_to_cwd(arc32_path)}")
- arc32_path.write_text(app_spec_json)
+ app_spec_json = create_arc32_json(
+ approval.teal_src,
+ clear.teal_src,
+ contract.metadata,
+ )
+ _write_output(
+ artifact_base_path,
+ {".arc32.json": app_spec_json.encode("utf8")},
+ )
+ if context.options.output_arc56:
+ app_spec_json = create_arc56_json(
+ metadata=contract.metadata,
+ approval_program=approval,
+ clear_program=clear,
+ template_prefix=context.options.template_vars_prefix,
+ )
+ _write_output(
+ artifact_base_path,
+ {".arc56.json": app_spec_json.encode("utf8")},
+ )
case _:
typing.assert_never(artifact)
if context.options.output_teal:
diff --git a/src/puya/ir/_puya_lib.awst.json b/src/puya/ir/_puya_lib.awst.json
index c8dfc103f8..3f82220aca 100644
--- a/src/puya/ir/_puya_lib.awst.json
+++ b/src/puya/ir/_puya_lib.awst.json
@@ -1308,6 +1308,7 @@
"source_location": null,
"name": "tuple",
"names": null,
+ "desc": null,
"_type": "WTuple"
},
"body": {
@@ -2274,6 +2275,7 @@
},
"name": "tuple",
"names": null,
+ "desc": null,
"_type": "WTuple"
},
"_type": "TupleExpression"
@@ -2362,6 +2364,7 @@
"source_location": null,
"name": "tuple",
"names": null,
+ "desc": null,
"_type": "WTuple"
},
"body": {
@@ -3099,6 +3102,7 @@
},
"name": "tuple",
"names": null,
+ "desc": null,
"_type": "WTuple"
},
"_type": "TupleExpression"
@@ -3169,6 +3173,7 @@
"source_location": null,
"name": "tuple",
"names": null,
+ "desc": null,
"_type": "WTuple"
},
"body": {
@@ -4256,6 +4261,7 @@
},
"name": "tuple",
"names": null,
+ "desc": null,
"_type": "WTuple"
},
"_type": "TupleExpression"
@@ -4326,6 +4332,7 @@
"source_location": null,
"name": "tuple",
"names": null,
+ "desc": null,
"_type": "WTuple"
},
"body": {
@@ -5668,6 +5675,7 @@
},
"name": "tuple",
"names": null,
+ "desc": null,
"_type": "WTuple"
},
"_type": "TupleExpression"
diff --git a/src/puya/ir/arc4_router.py b/src/puya/ir/arc4_router.py
index 9b235a57d4..02b59b672b 100644
--- a/src/puya/ir/arc4_router.py
+++ b/src/puya/ir/arc4_router.py
@@ -1,6 +1,8 @@
import typing
from collections.abc import Iterable, Mapping, Sequence
+from immutabledict import immutabledict
+
from puya import log
from puya.avm_type import AVMType
from puya.awst import (
@@ -222,10 +224,10 @@ def assert_create_state(
return ()
case ARC4CreateOption.disallow:
condition = _non_zero(app_id)
- comment = "is not creating"
+ comment = "can only call when not creating"
case ARC4CreateOption.require:
condition = _is_zero(app_id)
- comment = "is creating"
+ comment = "can only call when creating"
case invalid:
typing.assert_never(invalid)
return [
@@ -327,7 +329,7 @@ def check_allowed_oca(
awst_nodes.ExpressionStatement(
expr=_assert(
condition=condition,
- comment=f"OnCompletion is {oca_desc}",
+ comment=f"OnCompletion is not {oca_desc}",
source_location=location,
)
),
@@ -346,7 +348,7 @@ def _map_abi_args(
if isinstance(a, wtypes.ARC4Type):
arc4_type = a
else:
- converted = _maybe_avm_to_arc4_equivalent_type(a)
+ converted = maybe_avm_to_arc4_equivalent_type(a)
if converted is not None:
arc4_type = converted
elif _reference_type_array(a) is not None:
@@ -421,7 +423,7 @@ def route_abi_methods(
case wtypes.ARC4Type():
call_and_maybe_log = log_arc4_result(abi_loc, method_result)
case _:
- converted_return_type = _maybe_avm_to_arc4_equivalent_type(method.return_type)
+ converted_return_type = maybe_avm_to_arc4_equivalent_type(method.return_type)
if converted_return_type is None:
raise CodeError(
f"{method.return_type} is not a valid ABI return type",
@@ -568,7 +570,7 @@ def extract_arc4_methods(
*,
global_state: Mapping[str, ContractState],
local_state: Mapping[str, ContractState],
-) -> list[ARC4Method]:
+) -> dict[awst_nodes.ContractMethod, ARC4Method]:
abi_methods = {}
bare_methods = {}
known_sources: dict[str, ContractState | awst_nodes.ContractMethod] = {
@@ -587,68 +589,61 @@ def extract_arc4_methods(
_validate_default_args(abi_methods.keys(), known_sources)
- arc4_method_metadata = list[ARC4Method]()
+ arc4_method_metadata = dict[awst_nodes.ContractMethod, ARC4Method]()
for m, bare_method_config in bare_methods.items():
- arc4_method_metadata.append(
- ARC4BareMethod(
- desc=m.documentation.description,
- config=bare_method_config,
- )
+ arc4_method_metadata[m] = ARC4BareMethod(
+ desc=m.documentation.description,
+ config=bare_method_config,
)
for m, abi_method_config in abi_methods.items():
- arc4_method_metadata.append(
- ARC4ABIMethod(
- name=m.member_name,
- desc=m.documentation.description,
- args=[
- ARC4MethodArg(
- name=a.name,
- type_=_wtype_to_arc4(a.wtype),
- desc=m.documentation.args.get(a.name),
- )
- for a in m.args
- ],
- returns=ARC4Returns(
- desc=m.documentation.returns,
- type_=_wtype_to_arc4(m.return_type),
- ),
- config=abi_method_config,
- )
+ arc4_method_metadata[m] = ARC4ABIMethod(
+ name=m.member_name,
+ desc=m.documentation.description,
+ args=[
+ ARC4MethodArg(
+ name=a.name,
+ type_=_wtype_to_arc4(a.wtype),
+ struct=_get_arc4_struct_name(a.wtype),
+ desc=m.documentation.args.get(a.name),
+ )
+ for a in m.args
+ ],
+ returns=ARC4Returns(
+ desc=m.documentation.returns,
+ type_=_wtype_to_arc4(m.return_type),
+ struct=_get_arc4_struct_name(m.return_type),
+ ),
+ events=[],
+ config=abi_method_config,
)
+
return arc4_method_metadata
+def _get_arc4_struct_name(wtype: wtypes.WType) -> str | None:
+ return (
+ wtype.name
+ if isinstance(wtype, wtypes.ARC4Struct | wtypes.WTuple) and wtype.fields
+ else None
+ )
+
+
def create_abi_router(
contract: awst_nodes.Contract,
- arc4_methods_with_configs: dict[awst_nodes.ContractMethod, ARC4MethodConfig],
+ arc4_methods_with_configs: dict[awst_nodes.ContractMethod, ARC4Method],
) -> awst_nodes.ContractMethod:
router_location = contract.source_location
abi_methods = {}
bare_methods = {}
- arc4_method_metadata = list[ARC4Method]()
- for m, arc4_config in arc4_methods_with_configs.items():
- doc = m.documentation
+ for m, arc4_method in arc4_methods_with_configs.items():
+ arc4_config = arc4_method.config
assert arc4_config is m.arc4_method_config
if isinstance(arc4_config, ARC4BareMethodConfig):
bare_methods[m] = arc4_config
- metadata: ARC4Method = ARC4BareMethod(desc=doc.description, config=arc4_config)
elif isinstance(arc4_config, ARC4ABIMethodConfig):
abi_methods[m] = arc4_config
- metadata = ARC4ABIMethod(
- name=m.member_name,
- desc=doc.description,
- args=[
- ARC4MethodArg(
- name=a.name, type_=_wtype_to_arc4(a.wtype), desc=doc.args.get(a.name)
- )
- for a in m.args
- ],
- returns=ARC4Returns(desc=doc.returns, type_=_wtype_to_arc4(m.return_type)),
- config=arc4_config,
- )
else:
typing.assert_never(arc4_config)
- arc4_method_metadata.append(metadata)
abi_routing = route_abi_methods(router_location, abi_methods)
bare_routing = route_bare_methods(router_location, bare_methods)
@@ -694,7 +689,7 @@ def _wtype_to_arc4(wtype: wtypes.WType, loc: SourceLocation | None = None) -> st
return wtype.name
case wtypes.WGroupTransaction(transaction_type=transaction_type):
return transaction_type.name if transaction_type else "txn"
- converted = _maybe_avm_to_arc4_equivalent_type(wtype)
+ converted = maybe_avm_to_arc4_equivalent_type(wtype)
if converted is None:
raise CodeError(f"not an ARC4 type or native equivalent: {wtype}", loc)
return _wtype_to_arc4(converted, loc)
@@ -711,7 +706,7 @@ def _reference_type_array(wtype: wtypes.WType) -> str | None:
return None
-def _maybe_avm_to_arc4_equivalent_type(wtype: wtypes.WType) -> wtypes.ARC4Type | None:
+def maybe_avm_to_arc4_equivalent_type(wtype: wtypes.WType) -> wtypes.ARC4Type | None:
match wtype:
case wtypes.bool_wtype:
return wtypes.arc4_bool_wtype
@@ -725,16 +720,24 @@ def _maybe_avm_to_arc4_equivalent_type(wtype: wtypes.WType) -> wtypes.ARC4Type |
)
case wtypes.string_wtype:
return wtypes.arc4_string_alias
- case wtypes.WTuple(types=tuple_item_types):
+ case wtypes.WTuple(types=tuple_item_types) as wtuple:
arc4_item_types = []
for t in tuple_item_types:
if isinstance(t, wtypes.ARC4Type):
arc4_item_types.append(t)
else:
- converted = _maybe_avm_to_arc4_equivalent_type(t)
+ converted = maybe_avm_to_arc4_equivalent_type(t)
if converted is None:
return None
arc4_item_types.append(converted)
- return wtypes.ARC4Tuple(types=arc4_item_types, source_location=None)
+ if wtuple.fields:
+ return wtypes.ARC4Struct(
+ name=wtuple.name,
+ desc=wtuple.desc,
+ frozen=True,
+ fields=immutabledict(zip(wtuple.fields, arc4_item_types, strict=True)),
+ )
+ else:
+ return wtypes.ARC4Tuple(types=arc4_item_types, source_location=None)
case _:
return None
diff --git a/src/puya/ir/builder/_utils.py b/src/puya/ir/builder/_utils.py
index 80ba789063..1cc62cf441 100644
--- a/src/puya/ir/builder/_utils.py
+++ b/src/puya/ir/builder/_utils.py
@@ -233,3 +233,213 @@ def extract_const_int(expr: awst_nodes.Expression | int | None) -> int | None:
f"Expected either constant or None for index, got {type(expr).__name__}",
expr.source_location,
)
+
+
+@attrs.frozen
+class OpFactory:
+ context: IRFunctionBuildContext
+ source_location: SourceLocation | None
+
+ def assign(self, value: ValueProvider, temp_desc: str) -> Register:
+ register = assign_temp(
+ self.context, value, temp_description=temp_desc, source_location=self.source_location
+ )
+ return register
+
+ def assign_multiple(self, **values: ValueProvider) -> Sequence[Register]:
+ return [self.assign(value, desc) for desc, value in values.items()]
+
+ def add(self, a: Value, b: Value | int, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.add,
+ args=[a, b],
+ source_location=self.source_location,
+ )
+ return result
+
+ def sub(self, a: Value, b: Value | int, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.sub,
+ args=[a, b],
+ source_location=self.source_location,
+ )
+ return result
+
+ def mul(self, a: Value, b: Value | int, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.mul,
+ args=[a, b],
+ source_location=self.source_location,
+ )
+ return result
+
+ def len(self, value: Value, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.len_,
+ args=[value],
+ source_location=self.source_location,
+ )
+ return result
+
+ def eq(self, a: Value, b: Value, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.eq,
+ args=[a, b],
+ source_location=self.source_location,
+ )
+ return result
+
+ def select(self, false: Value, true: Value, condition: Value, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.select,
+ args=[false, true, condition],
+ return_type=true.ir_type,
+ source_location=self.source_location,
+ )
+ return result
+
+ def extract_uint16(self, a: Value, b: Value | int, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.extract_uint16,
+ args=[a, b],
+ source_location=self.source_location,
+ )
+ return result
+
+ def itob(self, value: Value | int, temp_desc: str) -> Register:
+ itob = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.itob,
+ args=[value],
+ source_location=self.source_location,
+ )
+ return itob
+
+ def as_u16_bytes(self, a: Value | int, temp_desc: str) -> Register:
+ as_bytes = self.itob(a, "as_bytes")
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.extract,
+ immediates=[6, 2],
+ args=[as_bytes],
+ source_location=self.source_location,
+ )
+ return result
+
+ def concat(self, a: Value | bytes, b: Value | bytes, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.concat,
+ args=[a, b],
+ source_location=self.source_location,
+ )
+ return result
+
+ def constant(self, value: int | bytes) -> Value:
+ if isinstance(value, int):
+ return UInt64Constant(value=value, source_location=self.source_location)
+ else:
+ return BytesConstant(
+ value=value, encoding=AVMBytesEncoding.base16, source_location=self.source_location
+ )
+
+ def set_bit(self, *, value: Value, index: int, bit: Value | int, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.setbit,
+ args=[value, index, bit],
+ return_type=value.ir_type,
+ source_location=self.source_location,
+ )
+ return result
+
+ def get_bit(self, value: Value, index: Value | int, temp_desc: str) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.getbit,
+ args=[value, index],
+ source_location=self.source_location,
+ )
+ return result
+
+ def extract_to_end(self, value: Value, start: int, temp_desc: str) -> Register:
+ if start > 255:
+ raise InternalError(
+ "Cannot use extract with a length of 0 if start > 255", self.source_location
+ )
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.extract,
+ immediates=[start, 0],
+ args=[value],
+ source_location=self.source_location,
+ )
+ return result
+
+ def substring3(
+ self,
+ value: Value | bytes,
+ start: Value | int,
+ end_ex: Value | int,
+ temp_desc: str,
+ ) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.substring3,
+ args=[value, start, end_ex],
+ source_location=self.source_location,
+ )
+ return result
+
+ def replace(
+ self,
+ value: Value | bytes,
+ index: Value | int,
+ replacement: Value | bytes,
+ temp_desc: str,
+ ) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ source_location=self.source_location,
+ op=AVMOp.replace3,
+ args=[value, index, replacement],
+ )
+ return result
+
+ def extract3(
+ self,
+ value: Value | bytes,
+ index: Value | int,
+ length: Value | int,
+ temp_desc: str,
+ ) -> Register:
+ result = assign_intrinsic_op(
+ self.context,
+ target=temp_desc,
+ op=AVMOp.extract3,
+ args=[value, index, length],
+ source_location=self.source_location,
+ )
+ return result
diff --git a/src/puya/ir/builder/arc4.py b/src/puya/ir/builder/arc4.py
index bbdf216d13..f446e436d4 100644
--- a/src/puya/ir/builder/arc4.py
+++ b/src/puya/ir/builder/arc4.py
@@ -12,6 +12,7 @@
from puya.errors import CodeError, InternalError
from puya.ir.avm_ops import AVMOp
from puya.ir.builder._utils import (
+ OpFactory,
assert_value,
assign_intrinsic_op,
assign_targets,
@@ -22,7 +23,6 @@
from puya.ir.builder.assignment import handle_assignment
from puya.ir.context import IRFunctionBuildContext
from puya.ir.models import (
- BytesConstant,
Intrinsic,
Register,
UInt64Constant,
@@ -30,7 +30,7 @@
ValueProvider,
ValueTuple,
)
-from puya.ir.types_ import AVMBytesEncoding, IRType, get_wtype_arity
+from puya.ir.types_ import IRType, get_wtype_arity
from puya.parse import SourceLocation, sequential_source_locations_merge
from puya.utils import bits_to_bytes, round_bits_to_nearest_bytes
@@ -93,9 +93,10 @@ def _decode_arc4_value(
args=[value],
source_location=loc,
)
- case wtypes.ARC4Tuple() as arc4_tuple, wtypes.WTuple() as native_tuple if (
- len(arc4_tuple.types) == len(native_tuple.types)
- ):
+ case (
+ wtypes.ARC4Tuple() | wtypes.ARC4Struct() as arc4_tuple,
+ wtypes.WTuple() as native_tuple,
+ ) if (len(arc4_tuple.types) == len(native_tuple.types)):
return _visit_arc4_tuple_decode(
context, arc4_tuple, value, target_wtype=native_tuple, source_location=loc
)
@@ -150,11 +151,22 @@ def _encode_expr(
context, elements, value_wtype.types, arc4_item_types, loc
)
return _visit_arc4_tuple_encode(context, arc4_items, arc4_item_types, loc)
+ case wtypes.ARC4Struct(types=arc4_item_types):
+ assert isinstance(
+ value_wtype, wtypes.WTuple
+ ), f"expected WTuple argument, got {value_wtype.name}"
+ elements = context.visitor.materialise_value_provider(
+ value_provider, description="elements_to_encode"
+ )
+ arc4_items = _encode_arc4_tuple_items(
+ context, elements, value_wtype.types, arc4_item_types, loc
+ )
+ return _visit_arc4_tuple_encode(context, arc4_items, arc4_item_types, loc)
case wtypes.ARC4DynamicArray(element_type=wtypes.ARC4UIntN(n=8)):
(value,) = context.visitor.materialise_value_provider(
value_provider, description="to_encode"
)
- factory = _OpFactory(context, loc)
+ factory = OpFactory(context, loc)
length = factory.len(value, "length")
length_uint16 = factory.as_u16_bytes(length, "length_uint16")
return factory.concat(length_uint16, value, "encoded_value")
@@ -217,7 +229,7 @@ def encode_arc4_array(context: IRFunctionBuildContext, expr: awst_nodes.NewArray
else b""
)
- factory = _OpFactory(context, expr.source_location)
+ factory = OpFactory(context, expr.source_location)
elements = [context.visitor.visit_and_materialise_single(value) for value in expr.values]
element_type = expr.wtype.element_type
@@ -254,7 +266,7 @@ def arc4_array_index(
source_location: SourceLocation,
assert_bounds: bool = True,
) -> ValueProvider:
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
array_length_vp = _get_arc4_array_length(array_wtype, array, source_location)
array_head_and_tail_vp = _get_arc4_array_head_and_tail(array_wtype, array, source_location)
array_head_and_tail = factory.assign(array_head_and_tail_vp, "array_head_and_tail")
@@ -446,7 +458,7 @@ def concat_values(
right_expr: awst_nodes.Expression,
source_location: SourceLocation,
) -> Value:
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
# check left is a valid ARC4 array to concat with
left_wtype = left_expr.wtype
if not isinstance(left_wtype, wtypes.ARC4DynamicArray):
@@ -596,14 +608,14 @@ def pop_arc4_array(
def _encode_arc4_bool(
context: IRFunctionBuildContext, bit: Value, source_location: SourceLocation
) -> Value:
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
value = factory.constant(0x00.to_bytes(1, "big"))
return factory.set_bit(value=value, index=0, bit=bit, temp_desc="encoded_bool")
def _visit_arc4_tuple_decode(
context: IRFunctionBuildContext,
- wtype: wtypes.ARC4Tuple,
+ wtype: wtypes.ARC4Tuple | wtypes.ARC4Struct,
value: Value,
target_wtype: wtypes.WTuple,
source_location: SourceLocation,
@@ -662,7 +674,7 @@ def _read_dynamic_item_using_length_from_arc4_container(
index: Value,
source_location: SourceLocation,
) -> ValueProvider:
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
item_offset_offset = factory.mul(index, 2, "item_offset_offset")
item_start_offset = factory.extract_uint16(
array_head_and_tail, item_offset_offset, "item_offset"
@@ -685,7 +697,7 @@ def _read_dynamic_item_using_end_offset_from_arc4_container(
index: Value,
source_location: SourceLocation,
) -> ValueProvider:
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
item_offset_offset = factory.mul(index, 2, "item_offset_offset")
item_start_offset = factory.extract_uint16(
array_head_and_tail, item_offset_offset, "item_offset"
@@ -735,7 +747,7 @@ def _visit_arc4_tuple_encode(
expr_loc: SourceLocation,
) -> ValueProvider:
header_size = _determine_arc4_tuple_head_size(tuple_items, round_end_result=True)
- factory = _OpFactory(context, expr_loc)
+ factory = OpFactory(context, expr_loc)
current_tail_offset = factory.assign(factory.constant(header_size // 8), "current_tail_offset")
encoded_tuple_buffer = factory.assign(factory.constant(b""), "encoded_tuple_buffer")
@@ -807,7 +819,7 @@ def _arc4_replace_tuple_item(
value: ValueProvider,
source_location: SourceLocation,
) -> Value:
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
base = context.visitor.visit_and_materialise_single(base_expr)
value = factory.assign(value, "assigned_value")
element_type = wtype.types[index_int]
@@ -1006,7 +1018,7 @@ def _get_arc4_array_tail_data_and_item_count(
For native tuples will return the tuple items packed into the equivalent static array
of tail data and item count
"""
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
match expr:
case awst_nodes.Expression(
wtype=wtypes.ARC4DynamicArray() | wtypes.ARC4StaticArray() as arr_wtype
@@ -1232,7 +1244,7 @@ def _concat_dynamic_array_fixed_size(
source_location: SourceLocation,
byte_size: int,
) -> Value:
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
def array_data(expr: awst_nodes.Expression) -> Value:
match expr.wtype:
@@ -1277,7 +1289,7 @@ def _arc4_items_as_arc4_tuple(
items: Sequence[Value],
source_location: SourceLocation,
) -> Value:
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
result = factory.constant(b"")
if is_arc4_dynamic_size(item_wtype):
tail_offset: Value = UInt64Constant(value=len(items) * 2, source_location=source_location)
@@ -1382,7 +1394,7 @@ def _get_arc4_array_tail(
# no header for static sized elements
return array_head_and_tail
- factory = _OpFactory(context, source_location)
+ factory = OpFactory(context, source_location)
# special case to use extract with immediate length of 0 where possible
# TODO: have an IR pseudo op, extract_to_end that handles this for non constant values?
if isinstance(array_length, UInt64Constant) and array_length.value <= 127:
@@ -1392,216 +1404,6 @@ def _get_arc4_array_tail(
return factory.substring3(array_head_and_tail, start_of_tail, total_length, "data")
-@attrs.frozen
-class _OpFactory:
- context: IRFunctionBuildContext
- source_location: SourceLocation | None
-
- def assign(self, value: ValueProvider, temp_desc: str) -> Register:
- register = assign_temp(
- self.context, value, temp_description=temp_desc, source_location=self.source_location
- )
- return register
-
- def assign_multiple(self, **values: ValueProvider) -> Sequence[Register]:
- return [self.assign(value, desc) for desc, value in values.items()]
-
- def add(self, a: Value, b: Value | int, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.add,
- args=[a, b],
- source_location=self.source_location,
- )
- return result
-
- def sub(self, a: Value, b: Value | int, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.sub,
- args=[a, b],
- source_location=self.source_location,
- )
- return result
-
- def mul(self, a: Value, b: Value | int, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.mul,
- args=[a, b],
- source_location=self.source_location,
- )
- return result
-
- def len(self, value: Value, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.len_,
- args=[value],
- source_location=self.source_location,
- )
- return result
-
- def eq(self, a: Value, b: Value, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.eq,
- args=[a, b],
- source_location=self.source_location,
- )
- return result
-
- def select(self, false: Value, true: Value, condition: Value, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.select,
- args=[false, true, condition],
- return_type=true.ir_type,
- source_location=self.source_location,
- )
- return result
-
- def extract_uint16(self, a: Value, b: Value | int, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.extract_uint16,
- args=[a, b],
- source_location=self.source_location,
- )
- return result
-
- def itob(self, value: Value | int, temp_desc: str) -> Register:
- itob = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.itob,
- args=[value],
- source_location=self.source_location,
- )
- return itob
-
- def as_u16_bytes(self, a: Value | int, temp_desc: str) -> Register:
- as_bytes = self.itob(a, "as_bytes")
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.extract,
- immediates=[6, 2],
- args=[as_bytes],
- source_location=self.source_location,
- )
- return result
-
- def concat(self, a: Value | bytes, b: Value | bytes, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.concat,
- args=[a, b],
- source_location=self.source_location,
- )
- return result
-
- def constant(self, value: int | bytes) -> Value:
- if isinstance(value, int):
- return UInt64Constant(value=value, source_location=self.source_location)
- else:
- return BytesConstant(
- value=value, encoding=AVMBytesEncoding.base16, source_location=self.source_location
- )
-
- def set_bit(self, *, value: Value, index: int, bit: Value | int, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.setbit,
- args=[value, index, bit],
- return_type=value.ir_type,
- source_location=self.source_location,
- )
- return result
-
- def get_bit(self, value: Value, index: Value | int, temp_desc: str) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.getbit,
- args=[value, index],
- source_location=self.source_location,
- )
- return result
-
- def extract_to_end(self, value: Value, start: int, temp_desc: str) -> Register:
- if start > 255:
- raise InternalError(
- "Cannot use extract with a length of 0 if start > 255", self.source_location
- )
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.extract,
- immediates=[start, 0],
- args=[value],
- source_location=self.source_location,
- )
- return result
-
- def substring3(
- self,
- value: Value | bytes,
- start: Value | int,
- end_ex: Value | int,
- temp_desc: str,
- ) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.substring3,
- args=[value, start, end_ex],
- source_location=self.source_location,
- )
- return result
-
- def replace(
- self,
- value: Value | bytes,
- index: Value | int,
- replacement: Value | bytes,
- temp_desc: str,
- ) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- source_location=self.source_location,
- op=AVMOp.replace3,
- args=[value, index, replacement],
- )
- return result
-
- def extract3(
- self,
- value: Value | bytes,
- index: Value | int,
- length: Value | int,
- temp_desc: str,
- ) -> Register:
- result = assign_intrinsic_op(
- self.context,
- target=temp_desc,
- op=AVMOp.extract3,
- args=[value, index, length],
- source_location=self.source_location,
- )
- return result
-
-
def is_arc4_dynamic_size(wtype: wtypes.ARC4Type) -> bool:
match wtype:
case wtypes.ARC4DynamicArray():
diff --git a/src/puya/ir/builder/main.py b/src/puya/ir/builder/main.py
index e774089c66..7f5a07faf2 100644
--- a/src/puya/ir/builder/main.py
+++ b/src/puya/ir/builder/main.py
@@ -19,6 +19,7 @@
from puya.ir.builder import arc4, flow_control, storage
from puya.ir.builder._tuple_util import get_tuple_item_values
from puya.ir.builder._utils import (
+ OpFactory,
assert_value,
assign,
assign_intrinsic_op,
@@ -1136,6 +1137,21 @@ def visit_arc4_router(self, expr: awst_nodes.ARC4Router) -> TExpression:
source_location=expr.source_location,
)
+ def visit_emit(self, expr: awst_nodes.Emit) -> TExpression:
+ factory = OpFactory(self.context, expr.source_location)
+ value = self.context.visitor.visit_and_materialise_single(expr.value)
+ prefix = MethodConstant(value=expr.signature, source_location=expr.source_location)
+ event = factory.concat(prefix, value, "event")
+
+ self.context.block_builder.add(
+ Intrinsic(
+ op=AVMOp("log"),
+ args=[event],
+ source_location=expr.source_location,
+ )
+ )
+ return None
+
def visit_range(self, node: awst_nodes.Range) -> TExpression:
raise CodeError("unexpected range location", node.source_location)
diff --git a/src/puya/ir/main.py b/src/puya/ir/main.py
index 76f28455b6..11c03902a3 100644
--- a/src/puya/ir/main.py
+++ b/src/puya/ir/main.py
@@ -2,7 +2,7 @@
import itertools
import typing
from collections import Counter, defaultdict
-from collections.abc import Collection, Iterable, Iterator, Mapping
+from collections.abc import Collection, Iterable, Iterator, Mapping, Sequence
from pathlib import Path
import attrs
@@ -20,7 +20,7 @@
from puya.context import CompileContext
from puya.errors import InternalError
from puya.ir import arc4_router
-from puya.ir.arc4_router import extract_arc4_methods
+from puya.ir.arc4_router import extract_arc4_methods, maybe_avm_to_arc4_equivalent_type
from puya.ir.builder.main import FunctionIRBuilder
from puya.ir.context import IRBuildContext
from puya.ir.destructure.main import destructure_ssa
@@ -33,15 +33,18 @@
from puya.ir.utils import format_tuple_index
from puya.ir.validation.main import validate_module_artifact
from puya.models import (
+ ARC4ABIMethod,
ARC4Method,
ARC4MethodConfig,
+ ARC4Struct,
+ ARC4StructField,
ContractMetaData,
ContractState,
LogicSignatureMetaData,
StateTotals,
)
from puya.parse import SourceLocation
-from puya.utils import StableSet, attrs_extend, coalesce, set_remove
+from puya.utils import StableSet, attrs_extend, coalesce, set_remove, unique
logger = log.get_logger(__name__)
@@ -230,6 +233,25 @@ def _build_ir(ctx: IRBuildContext, contract: awst_nodes.Contract) -> Contract:
clear_subs_srefs = SubroutineCollector.collect(
ctx, start=contract.clear_program, callees=callees, arc4_router_func=arc4_router_func
)
+ function_emits = EventCollector.collect(ctx, unique((*approval_subs_srefs, *clear_subs_srefs)))
+
+ # collect emitted events by method, and include any referenced structs
+ structs = list(folded.structs)
+ arc4_methods = []
+ for method, arc4_method in arc4_method_data.items():
+ if isinstance(arc4_method, ARC4ABIMethod):
+ method_structs = function_emits[method]
+ # extend structs with any arc4 struct types that are part of an event
+ structs.extend(
+ t
+ for method_struct in method_structs
+ for t in method_struct.fields.values()
+ if isinstance(t, wtypes.ARC4Struct)
+ )
+ arc4_method = attrs.evolve(
+ arc4_method, events=list(map(_wtype_to_struct, method_structs))
+ )
+ arc4_methods.append(arc4_method)
# construct unique Subroutine objects for each function
# that was referenced through either entry point
for func in itertools.chain(approval_subs_srefs, clear_subs_srefs):
@@ -273,10 +295,15 @@ def _build_ir(ctx: IRBuildContext, contract: awst_nodes.Contract) -> Contract:
description=contract.description,
name=contract.name,
ref=contract.id,
- arc4_methods=folded.arc4_methods,
+ arc4_methods=arc4_methods,
global_state=immutabledict(folded.global_state),
local_state=immutabledict(folded.local_state),
+ boxes=immutabledict(folded.boxes),
state_totals=folded.build_state_totals(location=contract.source_location),
+ structs=immutabledict(_wtypes_to_structs(structs)),
+ template_variable_types=immutabledict(
+ TemplateVariableTypeCollector.collect(ctx.subroutines)
+ ),
),
)
return result
@@ -423,7 +450,9 @@ def _make_program(
class FoldedContract:
global_state: dict[str, ContractState] = attrs.field(factory=dict)
local_state: dict[str, ContractState] = attrs.field(factory=dict)
+ boxes: dict[str, ContractState] = attrs.field(factory=dict)
arc4_methods: list[ARC4Method] = attrs.field(factory=list)
+ structs: list[wtypes.ARC4Struct | wtypes.WTuple] = attrs.field(factory=list)
declared_totals: awst_nodes.StateTotals | None
def build_state_totals(self, *, location: SourceLocation) -> StateTotals:
@@ -483,22 +512,20 @@ def _gather_arc4_methods(
def _fold_state_and_special_methods(
contract: awst_nodes.Contract,
-) -> tuple[FoldedContract, dict[awst_nodes.ContractMethod, ARC4MethodConfig]]:
+) -> tuple[FoldedContract, dict[awst_nodes.ContractMethod, ARC4Method]]:
result = FoldedContract(
declared_totals=contract.state_totals,
)
+ struct_types = list[wtypes.ARC4Struct | wtypes.WTuple]()
for state in contract.app_state:
- storage_type = wtypes.persistable_stack_type(state.storage_wtype, state.source_location)
key_type = None
if state.key_wtype is not None:
key_type = wtypes.persistable_stack_type(state.key_wtype, state.source_location)
- translated = ContractState(
- name=state.member_name,
- source_location=state.source_location,
- key=state.key.value, # TODO: pass encoding?
- storage_type=storage_type,
- description=state.description,
- )
+ if _is_arc4_struct(state.key_wtype):
+ struct_types.append(state.key_wtype)
+ if _is_arc4_struct(state.storage_wtype):
+ struct_types.append(state.storage_wtype)
+ translated = _get_contract_state(state)
match state.kind:
case awst_nodes.AppStorageKind.app_global:
if key_type is not None:
@@ -513,17 +540,113 @@ def _fold_state_and_special_methods(
)
result.local_state[state.member_name] = translated
case awst_nodes.AppStorageKind.box:
- pass # TODO: forward these on
+ result.boxes[state.member_name] = translated
case _:
typing.assert_never(state.kind)
arc4_method_refs = _gather_arc4_methods(contract)
+ for arc4_method in arc4_method_refs:
+ for wtype in (arc4_method.return_type, *(arg.wtype for arg in arc4_method.args)):
+ if _is_arc4_struct(wtype):
+ struct_types.append(wtype)
if arc4_method_refs:
- result.arc4_methods = extract_arc4_methods(
+ methods = extract_arc4_methods(
arc4_method_refs,
local_state=result.local_state,
global_state=result.global_state,
)
- return result, arc4_method_refs
+ result.arc4_methods = list(methods.values())
+ else:
+ methods = {}
+ result.structs = struct_types
+ return result, methods
+
+
+def _is_arc4_struct(wtype: wtypes.WType) -> typing.TypeGuard[wtypes.ARC4Struct | wtypes.WTuple]:
+ return isinstance(wtype, wtypes.ARC4Struct | wtypes.WTuple) and bool(wtype.fields)
+
+
+def _wtypes_to_structs(
+ structs: Sequence[wtypes.ARC4Struct | wtypes.WTuple],
+) -> dict[str, ARC4Struct]:
+ """
+ Produce a unique mapping of struct names to ARC4Struct definitions.
+ Will recursively include any structs referenced in fields
+ """
+ structs = list(structs)
+ struct_results = dict[wtypes.ARC4Struct | wtypes.WTuple, ARC4Struct]()
+ while structs:
+ struct = structs.pop()
+ if struct in struct_results:
+ continue
+ structs.extend(
+ wtype
+ for wtype in struct.fields.values()
+ if isinstance(wtype, wtypes.ARC4Struct) and wtype not in struct_results
+ )
+ struct_results[struct] = _wtype_to_struct(struct)
+ return {
+ wtype.name: struct_results[wtype] for wtype in sorted(struct_results, key=lambda s: s.name)
+ }
+
+
+def _wtype_to_struct(struct: wtypes.ARC4Struct | wtypes.WTuple) -> ARC4Struct:
+ fields = []
+ for field_name, field_wtype in struct.fields.items():
+ if not isinstance(field_wtype, wtypes.ARC4Type):
+ maybe_arc4_field_wtype = maybe_avm_to_arc4_equivalent_type(field_wtype)
+ if maybe_arc4_field_wtype is None:
+ raise InternalError("expected ARC4 type")
+ field_wtype = maybe_arc4_field_wtype
+ fields.append(
+ ARC4StructField(
+ name=field_name,
+ type=field_wtype.arc4_name,
+ struct=field_wtype.name if _is_arc4_struct(field_wtype) else None,
+ )
+ )
+ return ARC4Struct(
+ fullname=struct.name,
+ desc=struct.desc,
+ fields=fields,
+ )
+
+
+def _get_contract_state(state: awst_nodes.AppStorageDefinition) -> ContractState:
+ storage_type = wtypes.persistable_stack_type(state.storage_wtype, state.source_location)
+ if state.key_wtype is not None:
+ arc56_key_type = _get_arc56_type(state.key_wtype, state.source_location)
+ is_map = True
+ else:
+ arc56_key_type = (
+ "AVMString" if state.key.encoding == awst_nodes.BytesEncoding.utf8 else "AVMBytes"
+ )
+ is_map = False
+ arc56_value_type = _get_arc56_type(state.storage_wtype, state.source_location)
+ return ContractState(
+ name=state.member_name,
+ source_location=state.source_location,
+ key_or_prefix=state.key.value,
+ arc56_key_type=arc56_key_type,
+ arc56_value_type=arc56_value_type,
+ storage_type=storage_type,
+ description=state.description,
+ is_map=is_map,
+ )
+
+
+def _get_arc56_type(wtype: wtypes.WType, loc: SourceLocation) -> str:
+ if isinstance(wtype, wtypes.ARC4Struct):
+ return wtype.name
+ if isinstance(wtype, wtypes.ARC4Type):
+ return wtype.arc4_name
+ if wtype == wtypes.string_wtype:
+ return "AVMString"
+ storage_type = wtypes.persistable_stack_type(wtype, loc)
+ match storage_type:
+ case AVMType.uint64:
+ return "AVMUint64"
+ case AVMType.bytes:
+ return "AVMBytes"
class SubroutineCollector(FunctionTraverser):
@@ -582,3 +705,79 @@ def _enter_func(self, func: awst_nodes.Function) -> Iterator[None]:
yield
finally:
self._func_stack.pop()
+
+
+@attrs.frozen
+class EventCollector(FunctionTraverser):
+ context: IRBuildContext
+ emits: dict[awst_nodes.Function, StableSet[wtypes.ARC4Struct]] = attrs.field(factory=dict)
+ _func_stack: list[awst_nodes.Function] = attrs.field(factory=list)
+
+ @classmethod
+ def collect(
+ cls, context: IRBuildContext, all_funcs: Iterable[awst_nodes.Function]
+ ) -> Mapping[awst_nodes.Function, StableSet[wtypes.ARC4Struct]]:
+ collector = cls(context)
+ for func in all_funcs:
+ collector.process_func(func)
+ return collector.emits
+
+ def process_func(self, func: awst_nodes.Function) -> None:
+ if func in self.emits:
+ return
+ self.emits[func] = StableSet[wtypes.ARC4Struct]()
+ with self._enter_func(func):
+ func.body.accept(self)
+
+ @contextlib.contextmanager
+ def _enter_func(self, func: awst_nodes.Function) -> Iterator[None]:
+ self._func_stack.append(func)
+ try:
+ yield
+ finally:
+ self._func_stack.pop()
+
+ @property
+ def current_func(self) -> awst_nodes.Function:
+ return self._func_stack[-1]
+
+ def visit_emit(self, emit: awst_nodes.Emit) -> None:
+ assert isinstance(emit.value.wtype, wtypes.ARC4Struct)
+ self.emits[self.current_func].add(emit.value.wtype)
+
+ def visit_subroutine_call_expression(self, expr: awst_nodes.SubroutineCallExpression) -> None:
+ target = self.context.resolve_function_reference(
+ expr.target,
+ expr.source_location,
+ caller=self.current_func,
+ )
+ self.process_func(target)
+ self.emits[self.current_func] |= self.emits[target]
+
+
+class TemplateVariableTypeCollector(FunctionTraverser):
+ def __init__(self) -> None:
+ self.vars = dict[str, awst_nodes.TemplateVar]()
+
+ @classmethod
+ def collect(cls, functions: Iterable[awst_nodes.Function]) -> dict[str, str]:
+ collector = cls()
+ for function in functions:
+ function.body.accept(collector)
+ return {
+ name: _get_arc56_type(var.wtype, var.source_location)
+ for name, var in collector.vars.items()
+ }
+
+ def visit_template_var(self, var: awst_nodes.TemplateVar) -> None:
+ try:
+ existing = self.vars[var.name]
+ except KeyError:
+ self.vars[var.name] = var
+ else:
+ if existing.wtype != var.wtype:
+ logger.error(
+ "inconsistent types specified for template var",
+ location=var.source_location,
+ )
+ logger.info("other template var", location=existing.source_location)
diff --git a/src/puya/models.py b/src/puya/models.py
index f469b9b591..0555f1e195 100644
--- a/src/puya/models.py
+++ b/src/puya/models.py
@@ -45,14 +45,24 @@ class ARC4CreateOption(enum.Enum):
disallow = enum.auto()
-def _freeze_list_of_lists(elements: Sequence[Sequence[str]]) -> Sequence[tuple[str, str]]:
- return tuple((e1, e2) for (e1, e2) in elements)
-
-
@attrs.frozen
-class ARC32StructDef:
+class ARC4StructField:
name: str
- elements: Sequence[tuple[str, str]] = attrs.field(default=(), converter=_freeze_list_of_lists)
+ type: str
+ struct: str | None
+
+
+@attrs.frozen(kw_only=True)
+class ARC4Struct:
+ fullname: str
+ desc: str | None = None
+ fields: Sequence[ARC4StructField] = attrs.field(
+ default=(), converter=tuple[ARC4StructField, ...]
+ )
+
+ @property
+ def name(self) -> str:
+ return self.fullname.rsplit(".", maxsplit=1)[-1]
@attrs.frozen(kw_only=True)
@@ -60,7 +70,7 @@ class ARC4BareMethodConfig:
source_location: SourceLocation
allowed_completion_types: Sequence[OnCompletionAction] = attrs.field(
default=(OnCompletionAction.NoOp,),
- converter=tuple[OnCompletionAction],
+ converter=tuple[OnCompletionAction, ...],
validator=attrs.validators.min_len(1),
)
create: ARC4CreateOption = ARC4CreateOption.disallow
@@ -79,19 +89,20 @@ class ARC4ABIMethodConfig:
readonly: bool = False
default_args: immutabledict[str, str] = immutabledict()
"""Mapping is from parameter -> source"""
- structs: immutabledict[str, ARC32StructDef] = immutabledict()
@attrs.frozen
class ARC4MethodArg:
name: str
type_: str
+ struct: str | None
desc: str | None = attrs.field(hash=False)
@attrs.frozen
class ARC4Returns:
type_: str
+ struct: str | None
desc: str | None = attrs.field(hash=False)
@@ -101,8 +112,13 @@ class ARC4ABIMethod:
desc: str | None = attrs.field(hash=False)
args: Sequence[ARC4MethodArg] = attrs.field(converter=tuple[ARC4MethodArg, ...])
returns: ARC4Returns
+ events: Sequence[ARC4Struct]
config: ARC4ABIMethodConfig
+ @property
+ def signature(self) -> str:
+ return f"{self.name}({','.join(a.type_ for a in self.args)}){self.returns.type_}"
+
@attrs.frozen
class ARC4BareMethod:
@@ -114,9 +130,14 @@ class ARC4BareMethod:
class ContractState:
name: str
source_location: SourceLocation
- key: bytes
+ key_or_prefix: bytes
+ """Key value as bytes, or prefix if it is a map"""
+ arc56_key_type: str
+ arc56_value_type: str
storage_type: typing.Literal[AVMType.uint64, AVMType.bytes]
description: str | None
+ is_map: bool
+ """State describes a map"""
@attrs.frozen(kw_only=True)
@@ -145,8 +166,12 @@ class ContractMetaData:
description: str | None
global_state: immutabledict[str, ContractState]
local_state: immutabledict[str, ContractState]
+ boxes: immutabledict[str, ContractState]
state_totals: StateTotals
arc4_methods: Sequence[ARC4Method]
+ structs: immutabledict[str, ARC4Struct]
+ template_variable_types: immutabledict[str, str]
+ """Mapping of template variable names to their ARC-56 type"""
@property
def is_arc4(self) -> bool:
@@ -174,6 +199,8 @@ class DebugEvent(typing.TypedDict, total=False):
"""Variable names on the stack AFTER the next op executes"""
defined_out: Sequence[str]
"""Variable names that are defined AFTER the next op executes"""
+ error: str
+ """Error message if failure occurs at this op"""
@attrs.frozen
@@ -202,6 +229,10 @@ def bytecode(self) -> bytes | None:
@abc.abstractmethod
def debug_info(self) -> DebugInfo | None: ...
+ @property
+ @abc.abstractmethod
+ def template_variables(self) -> Mapping[str, int | bytes | None]: ...
+
class CompiledContract(abc.ABC):
@property
diff --git a/src/puya/options.py b/src/puya/options.py
index 0a6ac6334e..0dcc6d5c35 100644
--- a/src/puya/options.py
+++ b/src/puya/options.py
@@ -18,6 +18,7 @@ class PuyaOptions:
output_teal: bool = False
output_source_map: bool = False
output_arc32: bool = False
+ output_arc56: bool = False
output_ssa_ir: bool = False
output_optimization_ir: bool = False
output_destructured_ir: bool = False
diff --git a/src/puya/ussemble/assemble.py b/src/puya/ussemble/assemble.py
index a2a7eac6c9..adcd3883ab 100644
--- a/src/puya/ussemble/assemble.py
+++ b/src/puya/ussemble/assemble.py
@@ -90,6 +90,10 @@ def get_label_offset(label: models.Label) -> int:
pc_ops,
pc_events,
),
+ template_variables={
+ var: value[0] if var in ctx.provided_template_variables else None
+ for var, value in ctx.template_variables.items()
+ },
)
@@ -108,6 +112,8 @@ def _add_op_debug_events(
event["callsub"] = subroutine_ids[func_block]
elif op.op_code == "retsub":
event["retsub"] = True
+ elif op.op_code in ("assert", "err") and op.comment:
+ event["error"] = op.comment
event["op"] = op.teal()
for sm in op.stack_manipulations:
diff --git a/src/puya/ussemble/context.py b/src/puya/ussemble/context.py
index a25b89b626..48081046d5 100644
--- a/src/puya/ussemble/context.py
+++ b/src/puya/ussemble/context.py
@@ -1,3 +1,5 @@
+from collections.abc import Mapping
+
import attrs
from puya.context import CompileContext
@@ -6,5 +8,19 @@
@attrs.frozen(kw_only=True)
class AssembleContext(CompileContext):
- template_variables: dict[str, TemplateValue] = attrs.field(factory=dict)
- offset_pc_from_constant_blocks: bool
+ mocked_template_variables: dict[str, TemplateValue] = attrs.field(factory=dict)
+ """Mocked template variables, used for generating debug info only"""
+ provided_template_variables: dict[str, TemplateValue] = attrs.field(factory=dict)
+ """Template variables provided via command line, or compilation"""
+
+ @property
+ def template_variables(self) -> Mapping[str, TemplateValue]:
+ return {
+ **self.mocked_template_variables,
+ **self.provided_template_variables,
+ }
+
+ @property
+ def offset_pc_from_constant_blocks(self) -> bool:
+ # only need to offset PC if there are any unspecified template variables
+ return bool(self.mocked_template_variables)
diff --git a/src/puya/ussemble/main.py b/src/puya/ussemble/main.py
index dc1f7e9f04..a24e48f83d 100644
--- a/src/puya/ussemble/main.py
+++ b/src/puya/ussemble/main.py
@@ -16,25 +16,25 @@ def assemble_program(
*,
debug_only: bool = False,
) -> models.AssembledProgram:
+ int_template_vars = _gather_template_variables(program, teal.IntBlock)
+ bytes_template_vars = _gather_template_variables(program, teal.BytesBlock)
+ program_template_vars = {*int_template_vars, *bytes_template_vars}
if debug_only:
# use dummy template values to produce a debug map
- program_variables: Mapping[str, TemplateValue] = {
- **{t: (0, None) for t in _gather_template_variables(program, teal.IntBlock)},
- **{t: (b"", None) for t in _gather_template_variables(program, teal.BytesBlock)},
- }
- offset_pc = any(program_variables.keys() - template_variables.keys())
- template_variables = {
- **program_variables,
- **template_variables,
+ mocked_template_variables: Mapping[str, TemplateValue] = {
+ **{t: (0, None) for t in int_template_vars if t not in template_variables},
+ **{t: (b"", None) for t in bytes_template_vars if t not in template_variables},
}
else:
- offset_pc = False
+ mocked_template_variables = {}
assemble_ctx = attrs_extend(
AssembleContext,
ctx,
- template_variables=template_variables,
- offset_pc_from_constant_blocks=offset_pc,
+ provided_template_variables={
+ t: v for t, v in template_variables.items() if t in program_template_vars
+ },
+ mocked_template_variables=mocked_template_variables,
)
return assemble_bytecode_and_debug_info(assemble_ctx, program)
diff --git a/src/puya/ussemble/models.py b/src/puya/ussemble/models.py
index 2566b6effe..cf8a25857f 100644
--- a/src/puya/ussemble/models.py
+++ b/src/puya/ussemble/models.py
@@ -1,4 +1,4 @@
-from collections.abc import Sequence
+from collections.abc import Mapping, Sequence
import attrs
@@ -33,3 +33,5 @@ def op_spec(self) -> OpSpec:
class AssembledProgram:
bytecode: bytes
debug_info: DebugInfo
+ template_variables: Mapping[str, int | bytes | None]
+ """Indicates template variable values used in compilation"""
diff --git a/src/puyapy/__main__.py b/src/puyapy/__main__.py
index 2ed2988716..94c3bdb002 100644
--- a/src/puyapy/__main__.py
+++ b/src/puyapy/__main__.py
@@ -45,6 +45,12 @@ def main() -> None:
default=True,
help="Output {contract}.arc32.json ARC-32 app spec file",
)
+ parser.add_argument(
+ "--output-arc56",
+ action=argparse.BooleanOptionalAction,
+ default=False,
+ help="Output {contract}.arc56.json ARC-56 app spec file",
+ )
parser.add_argument(
"--output-client",
action=argparse.BooleanOptionalAction,
diff --git a/src/puyapy/awst_build/arc32_client_gen.py b/src/puyapy/awst_build/arc32_client_gen.py
deleted file mode 100644
index 3b1d6dcf41..0000000000
--- a/src/puyapy/awst_build/arc32_client_gen.py
+++ /dev/null
@@ -1,142 +0,0 @@
-import itertools
-import textwrap
-import typing
-from collections.abc import Iterable, Sequence
-from pathlib import Path
-
-from puya import log
-from puya.models import (
- ARC4ABIMethod,
- ARC4CreateOption,
- ARC4Method,
- ARC4MethodArg,
- ARC32StructDef,
- OnCompletionAction,
-)
-from puya.utils import make_path_relative_to_cwd, unique
-
-from puyapy.awst_build import constants
-from puyapy.awst_build.arc4_utils import arc4_to_pytype
-
-logger = log.get_logger(__name__)
-
-_AUTO_GENERATED_COMMENT = "# This file is auto-generated, do not modify"
-_INDENT = " " * 4
-
-
-def write_arc32_client(name: str, methods: Sequence[ARC4Method], out_dir: Path) -> None:
- stub_path = out_dir / f"client_{name}.py"
- if _can_overwrite_auto_generated_file(stub_path):
- logger.info(f"writing {make_path_relative_to_cwd(stub_path)}")
- stub_text = _create_arc32_stub(name, methods)
- stub_path.write_text(stub_text)
- else:
- logger.error(
- f"Not outputting {make_path_relative_to_cwd(stub_path)} "
- "since content does not appear to be auto-generated"
- )
-
-
-def _can_overwrite_auto_generated_file(path: Path) -> bool:
- return not path.exists() or path.read_text().startswith(_AUTO_GENERATED_COMMENT)
-
-
-def _create_arc32_stub(name: str, methods: Sequence[ARC4Method]) -> str:
- abi_methods = [m for m in methods if isinstance(m, ARC4ABIMethod)]
- return "\n".join(
- (
- _AUTO_GENERATED_COMMENT,
- "# flake8: noqa", # this works for flake8 and ruff
- "# fmt: off", # disable formatting"
- "import typing",
- "",
- "import algopy",
- "",
- *itertools.chain(
- *(
- _abi_struct_to_class(s)
- for s in unique(s for m in abi_methods for s in m.config.structs.values())
- )
- ),
- "",
- f"class {name}(algopy.arc4.ARC4Client, typing.Protocol):",
- *([_indent(["pass"]), ""] if not abi_methods else []),
- *(_abi_method_to_signature(m) for m in abi_methods),
- )
- )
-
-
-def _abi_struct_to_class(s: ARC32StructDef) -> Iterable[str]:
- return (
- f"class {s.name}(algopy.arc4.Struct):",
- _indent(
- f"{name}: {_arc4_type_to_algopy_cls(elem_type)}" for name, elem_type in s.elements
- ),
- )
-
-
-def _abi_method_to_signature(m: ARC4ABIMethod) -> str:
- structs = dict(m.config.structs)
- try:
- output_struct = structs["output"]
- except KeyError:
- return_type = _arc4_type_to_algopy_cls(m.returns.type_)
- else:
- return_type = output_struct.name
-
- return _indent(
- (
- _arc4_method_to_decorator(m),
- f"def {m.name}(",
- _indent(
- (
- "self,",
- *(_abi_arg(arg, structs.get(arg.name)) for arg in m.args),
- )
- ),
- f") -> {return_type}: ...",
- "",
- )
- )
-
-
-def _abi_arg(arg: ARC4MethodArg, struct: ARC32StructDef | None) -> str:
- python_type = struct.name if struct else _arc4_type_to_algopy_cls(arg.type_)
- return f"{arg.name}: {python_type},"
-
-
-def _arc4_type_to_algopy_cls(typ: str) -> str:
- return str(arc4_to_pytype(typ))
-
-
-def _arc4_method_to_decorator(method: ARC4ABIMethod) -> str:
- config = method.config
- abimethod_args = dict[str, object]()
- if config.name and config.name != method.name:
- abimethod_args["name"] = config.name
- if config.readonly:
- abimethod_args["readonly"] = True
- if config.default_args:
- abimethod_args["default_args"] = dict(config.default_args)
- if config.allowed_completion_types != (OnCompletionAction.NoOp,):
- abimethod_args["allow_actions"] = [oca.name for oca in config.allowed_completion_types]
- match config.create:
- case ARC4CreateOption.allow:
- abimethod_args["create"] = "allow"
- case ARC4CreateOption.require:
- abimethod_args["create"] = "require"
- case ARC4CreateOption.disallow:
- pass
- case invalid:
- typing.assert_never(invalid)
- kwargs = ", ".join(f"{name}={value!r}" for name, value in abimethod_args.items())
- decorator = f"@{constants.ABIMETHOD_DECORATOR_ALIAS}"
- if kwargs:
- decorator += f"({kwargs})"
- return decorator
-
-
-def _indent(lines: Iterable[str] | str) -> str:
- if not isinstance(lines, str):
- lines = "\n".join(lines)
- return textwrap.indent(lines, _INDENT)
diff --git a/src/puyapy/awst_build/arc4_client_gen.py b/src/puyapy/awst_build/arc4_client_gen.py
new file mode 100644
index 0000000000..b50857a715
--- /dev/null
+++ b/src/puyapy/awst_build/arc4_client_gen.py
@@ -0,0 +1,212 @@
+import textwrap
+from collections.abc import Iterable, Sequence
+from pathlib import Path
+
+from puya import (
+ arc56_models as arc56,
+ log,
+)
+from puya.errors import CodeError
+from puya.models import (
+ OnCompletionAction,
+)
+from puya.utils import make_path_relative_to_cwd
+
+from puyapy.awst_build import constants
+from puyapy.awst_build.arc4_utils import arc4_to_pytype
+
+logger = log.get_logger(__name__)
+
+_AUTO_GENERATED_COMMENT = "# This file is auto-generated, do not modify"
+_INDENT = " " * 4
+
+
+def write_arc4_client(contract: arc56.Contract, out_dir: Path) -> None:
+ stub_path = out_dir / f"client_{contract.name}.py"
+ if _can_overwrite_auto_generated_file(stub_path):
+ logger.info(f"writing {make_path_relative_to_cwd(stub_path)}")
+ stub_text = _ClientGenerator.generate(contract)
+ stub_path.write_text(stub_text)
+ else:
+ logger.error(
+ f"Not outputting {make_path_relative_to_cwd(stub_path)} "
+ "since content does not appear to be auto-generated"
+ )
+
+
+def _can_overwrite_auto_generated_file(path: Path) -> bool:
+ return not path.exists() or path.read_text().startswith(_AUTO_GENERATED_COMMENT)
+
+
+class _ClientGenerator:
+
+ def __init__(self, contract: arc56.Contract):
+ self.contract = contract
+ self.python_methods = set[str]()
+ self.struct_to_class = dict[str, str]()
+ self.reserved_class_names = {contract.name}
+ self.reserved_method_names = set[str]()
+ self.class_decls = list[str]()
+
+ @classmethod
+ def generate(cls, contract: arc56.Contract) -> str:
+ return cls(contract)._gen() # noqa: SLF001
+
+ def _gen(self) -> str:
+ # generate class definitions for any referenced structs in methods
+ # don't generate from self.contract.structs as it may contain other struct definitions
+ for method in self.contract.methods:
+ for struct in filter(None, (method.returns.struct, *(a.struct for a in method.args))):
+ if struct not in self.struct_to_class and (
+ struct_def := self.contract.structs.get(struct)
+ ):
+ self._prepare_struct_class(struct, struct_def)
+ return "\n".join(
+ (
+ _AUTO_GENERATED_COMMENT,
+ "# flake8: noqa", # this works for flake8 and ruff
+ "# fmt: off", # disable formatting"
+ "import typing",
+ "",
+ "import algopy",
+ "",
+ *self.class_decls,
+ "",
+ f"class {self.contract.name}(algopy.arc4.ARC4Client, typing.Protocol):",
+ # TODO: include docstring
+ *self._gen_methods(),
+ )
+ )
+
+ def _prepare_struct_class(self, name: str, fields: Sequence[arc56.StructField]) -> str:
+ python_name = self._unique_class(name)
+ self.struct_to_class[name] = python_name
+ lines = [f"class {python_name}(algopy.arc4.Struct):"]
+ # TODO: include docstring
+ for field in fields:
+ if isinstance(field.type, str):
+ typ = self._get_client_type(field.type)
+ else:
+ # generate anonymous struct type
+ anon_struct = f"{name}_{field.name}"
+ typ = self._prepare_struct_class(anon_struct, field.type)
+ lines.append(_indent(f"{field.name}: {typ}"))
+ # TODO: include docstring
+ if self.class_decls:
+ self.class_decls.append("")
+ self.class_decls.extend(lines)
+ return python_name
+
+ def _get_client_type(self, typ: str) -> str:
+ # map ABI / AVM type to algopy type
+ if typ == arc56.AVMType.uint64:
+ return "algopy.UInt64"
+ elif typ == arc56.AVMType.bytes:
+ return "algopy.Bytes"
+ elif struct := self.contract.structs.get(typ):
+ try:
+ # use existing definition
+ return self.struct_to_class[typ]
+ except KeyError:
+ # generate and return class name
+ return self._prepare_struct_class(typ, struct)
+ else:
+ return str(arc4_to_pytype(typ, None))
+
+ def _unique_class(self, name: str) -> str:
+ base_name = name
+ seq = 1
+ while name in self.reserved_class_names:
+ seq += 1
+ name = f"{base_name}{seq}"
+
+ self.reserved_class_names.add(name)
+ return name
+
+ def _unique_method(self, name: str) -> str:
+ base_name = name
+ seq = 1
+ while name in self.reserved_method_names:
+ seq += 1
+ name = f"{base_name}{seq}"
+
+ self.reserved_method_names.add(name)
+ return name
+
+ def _gen_methods(self) -> Iterable[str]:
+ if not self.contract.methods:
+ yield _indent("pass")
+ yield ""
+ else:
+ for method in self.contract.methods:
+ yield self._gen_method(method)
+
+ def _gen_method(self, method: arc56.Method) -> str:
+ return_type = self._get_client_type(method.returns.struct or method.returns.type)
+ python_method = self._unique_method(method.name)
+ return _indent(
+ (
+ _arc4_method_to_decorator(python_method, method),
+ f"def {python_method}(",
+ # TODO: include docstring
+ _indent(
+ (
+ "self,",
+ *(self._gen_arg(arg) for arg in method.args),
+ )
+ ),
+ f") -> {return_type}: ...",
+ "",
+ )
+ )
+
+ def _gen_arg(self, arg: arc56.MethodArg) -> str:
+ python_type = self._get_client_type(arg.struct or arg.type)
+ return f"{arg.name}: {python_type},"
+
+
+def _arc4_method_to_decorator(python_method: str, method: arc56.Method) -> str:
+ abimethod_args = dict[str, object]()
+ if method.name != python_method:
+ abimethod_args["name"] = method.name
+ if method.readonly:
+ abimethod_args["readonly"] = True
+ if not _compatible_actions(method.actions.create, method.actions.call):
+ # TODO: support this, once decorators support it
+ raise CodeError(
+ f"unsupported on completion combination for generating an ARC4 client"
+ f" for method: {method.name}"
+ )
+ actions = sorted(
+ {*method.actions.create, *method.actions.call}, key=lambda a: OnCompletionAction[a]
+ )
+ if set(actions) != {OnCompletionAction.NoOp.name}:
+ abimethod_args["allow_actions"] = actions
+ if method.actions.create and method.actions.call:
+ abimethod_args["create"] = "allow"
+ elif method.actions.create:
+ abimethod_args["create"] = "require"
+ else:
+ # disallow is default
+ pass
+ kwargs = ", ".join(f"{name}={value!r}" for name, value in abimethod_args.items())
+ decorator = f"@{constants.ABIMETHOD_DECORATOR_ALIAS}"
+ if kwargs:
+ decorator += f"({kwargs})"
+ return decorator
+
+
+def _compatible_actions(create: Sequence[str], call: Sequence[str]) -> bool:
+ if not create:
+ return True
+ if not call:
+ return True
+ # if both collections are present, then they are compatible if everything in
+ # create is also in call
+ return all(a in call for a in create)
+
+
+def _indent(lines: Iterable[str] | str) -> str:
+ if not isinstance(lines, str):
+ lines = "\n".join(lines)
+ return textwrap.indent(lines, _INDENT)
diff --git a/src/puyapy/awst_build/arc4_utils.py b/src/puyapy/awst_build/arc4_utils.py
index 5cffa47e76..58d0306469 100644
--- a/src/puyapy/awst_build/arc4_utils.py
+++ b/src/puyapy/awst_build/arc4_utils.py
@@ -14,7 +14,8 @@
ARC4ABIMethodConfig,
ARC4BareMethodConfig,
ARC4CreateOption,
- ARC32StructDef,
+ ARC4Struct,
+ ARC4StructField,
OnCompletionAction,
TransactionType,
)
@@ -201,13 +202,6 @@ def get_arc4_abimethod_data(
case invalid_default_args_option:
context.error(f"invalid default_args option: {invalid_default_args_option}", dec_loc)
- # extract "structs" from signature
- structs = dict[str, ARC32StructDef]()
- for n, pt in func_types.items():
- mapped_type = pytype_to_arc4_pytype(pt, on_error=lambda t: t)
- if _is_arc4_struct(mapped_type):
- structs[n] = _pytype_to_struct_def(mapped_type)
-
config = ARC4ABIMethodConfig(
source_location=dec_loc,
allowed_completion_types=allowed_completion_types,
@@ -215,7 +209,6 @@ def get_arc4_abimethod_data(
name=name,
readonly=readonly,
default_args=immutabledict(default_args),
- structs=immutabledict(structs),
)
return ARC4ABIMethodData(
member_name=func_def.name,
@@ -310,10 +303,17 @@ def visit_dict_expr(self, o: mypy.nodes.DictExpr) -> dict[object, object]:
return {key.accept(self) if key else None: value.accept(self) for key, value in o.items}
-def _pytype_to_struct_def(typ: pytypes.StructType) -> ARC32StructDef:
- return ARC32StructDef(
- name=typ.name.rsplit(".", maxsplit=1)[-1],
- elements=[(n, pytype_to_arc4(t)) for n, t in typ.fields.items()],
+def _pytype_to_struct_def(typ: pytypes.StructType) -> ARC4Struct:
+ return ARC4Struct(
+ fullname=typ.name,
+ fields=[
+ ARC4StructField(
+ name=n,
+ type=pytype_to_arc4(t),
+ struct=t.name if pytypes.ARC4StructBaseType in t.mro else None,
+ )
+ for n, t in typ.fields.items()
+ ],
)
@@ -359,6 +359,7 @@ def pytype_to_arc4_pytype(
case pytypes.NamedTupleType():
return pytypes.StructType(
base=pytypes.ARC4StructBaseType,
+ desc=pytype.desc,
name=pytype.name,
fields={
name: pytype_to_arc4_pytype(t, on_error) for name, t in pytype.fields.items()
diff --git a/src/puyapy/awst_build/eb/arc4/emit.py b/src/puyapy/awst_build/eb/arc4/emit.py
index 47c725a94a..bed2d1a745 100644
--- a/src/puyapy/awst_build/eb/arc4/emit.py
+++ b/src/puyapy/awst_build/eb/arc4/emit.py
@@ -3,18 +3,17 @@
import mypy.nodes
from puya import log
-from puya.awst.nodes import MethodConstant
+from puya.awst.nodes import Emit
from puya.parse import SourceLocation
-from puyapy.awst_build import intrinsic_factory, pytypes
+from puyapy.awst_build import pytypes
from puyapy.awst_build.arc4_utils import pytype_to_arc4
from puyapy.awst_build.eb import _expect as expect
from puyapy.awst_build.eb._base import FunctionBuilder
from puyapy.awst_build.eb.arc4._utils import get_arc4_signature
-from puyapy.awst_build.eb.arc4.tuple import ARC4TupleGenericTypeBuilder
+from puyapy.awst_build.eb.arc4.struct import ARC4StructTypeBuilder
from puyapy.awst_build.eb.interface import InstanceBuilder, NodeBuilder
from puyapy.awst_build.eb.none import NoneExpressionBuilder
-from puyapy.awst_build.eb.tuple import TupleLiteralBuilder
logger = log.get_logger(__name__)
@@ -33,7 +32,6 @@ def call(
case InstanceBuilder(
pytype=pytypes.StructType() as struct_type
) as event_arg_eb if pytypes.ARC4StructBaseType < struct_type:
- event_name = struct_type.name.split(".")[-1]
if rest:
logger.error(
"unexpected additional arguments", location=rest[0].source_location
@@ -46,18 +44,28 @@ def call(
location=first.source_location,
)
arc4_args = signature.convert_args(rest)
- event_name = signature.method_name
- event_arg_eb = ARC4TupleGenericTypeBuilder(location).call(
- args=[TupleLiteralBuilder(items=arc4_args, location=location)],
- arg_names=[None],
- arg_kinds=[mypy.nodes.ARG_POS],
+ # emit requires a struct type, so generate one based on args
+ struct_type = pytypes.StructType(
+ base=pytypes.ARC4StructBaseType,
+ name=signature.method_name,
+ desc=None,
+ fields={
+ f"field{idx}": arg.pytype for idx, arg in enumerate(arc4_args, start=1)
+ },
+ frozen=True,
+ source_location=location,
+ )
+ event_arg_eb = ARC4StructTypeBuilder(struct_type, location).call(
+ args=arc4_args,
+ arg_names=[None] * len(arc4_args),
+ arg_kinds=[mypy.nodes.ARG_POS] * len(arc4_args),
location=location,
)
+ event_name = struct_type.name.split(".")[-1]
event_sig = f"{event_name}{pytype_to_arc4(event_arg_eb.pytype, location)}"
- log_value = intrinsic_factory.concat(
- MethodConstant(value=event_sig, source_location=location),
- event_arg_eb.resolve(),
- location,
+ emit = Emit(
+ signature=event_sig,
+ value=event_arg_eb.resolve(),
+ source_location=location,
)
- log_expr = intrinsic_factory.log(log_value, location)
- return NoneExpressionBuilder(log_expr)
+ return NoneExpressionBuilder(emit)
diff --git a/src/puyapy/awst_build/module.py b/src/puyapy/awst_build/module.py
index c162f56887..6ee13f8971 100644
--- a/src/puyapy/awst_build/module.py
+++ b/src/puyapy/awst_build/module.py
@@ -706,6 +706,7 @@ def _process_struct(
struct_typ = pytypes.StructType(
base=base,
name=cdef.fullname,
+ desc=cdef.docstring,
fields=fields,
frozen=frozen,
source_location=cls_loc,
@@ -723,6 +724,7 @@ def _process_named_tuple(
cls_loc = context.node_location(cdef)
named_tuple_type = pytypes.NamedTupleType(
name=cdef.fullname,
+ desc=cdef.docstring,
fields=fields,
source_location=cls_loc,
)
diff --git a/src/puyapy/awst_build/pytypes.py b/src/puyapy/awst_build/pytypes.py
index d7ca6f9544..4b8a9b8f0e 100644
--- a/src/puyapy/awst_build/pytypes.py
+++ b/src/puyapy/awst_build/pytypes.py
@@ -354,6 +354,7 @@ class NamedTupleType(TupleType, RuntimeType):
generic: None = attrs.field(default=None, init=False)
bases: tuple[PyType, ...] = attrs.field(default=(NamedTupleBaseType,), init=False)
mro: tuple[PyType, ...] = attrs.field(default=(NamedTupleBaseType,), init=False)
+ desc: str | None = None
wtype: wtypes.WTuple = attrs.field(init=False)
@items.default
@@ -369,6 +370,8 @@ def _wtype(self) -> wtypes.WTuple:
unnamed_type,
name=self.name,
names=tuple(self.fields),
+ source_location=self.source_location,
+ desc=self.desc,
)
@@ -472,6 +475,7 @@ class StructType(RuntimeType):
wtype: wtypes.WType
source_location: SourceLocation | None
generic: None = None
+ desc: str | None = None
@cached_property
def names(self) -> tuple[str, ...]:
@@ -486,6 +490,7 @@ def __init__(
*,
base: PyType,
name: str,
+ desc: str | None,
fields: Mapping[str, PyType],
frozen: bool,
source_location: SourceLocation | None,
@@ -501,12 +506,17 @@ def __init__(
else:
raise InternalError(f"Unknown struct base type: {base}", source_location)
wtype = wtype_cls(
- fields=field_wtypes, name=name, frozen=frozen, source_location=source_location
+ fields=field_wtypes,
+ name=name,
+ desc=desc,
+ frozen=frozen,
+ source_location=source_location,
)
self.__attrs_init__(
bases=[base],
mro=[base],
name=name,
+ desc=desc,
wtype=wtype,
fields=fields,
frozen=frozen,
diff --git a/src/puyapy/client_gen.py b/src/puyapy/client_gen.py
index b724c633f0..74503b4086 100644
--- a/src/puyapy/client_gen.py
+++ b/src/puyapy/client_gen.py
@@ -1,27 +1,24 @@
import argparse
import json
import typing
-from collections.abc import Iterable, Mapping, Sequence
+from collections.abc import Iterable, Sequence
from pathlib import Path
import attrs
-from immutabledict import immutabledict
-from puya import log
+from cattrs.preconf.json import make_converter
+from puya import (
+ arc56_models as arc56,
+ log,
+)
from puya.arc32 import OCA_ARC32_MAPPING
+from puya.arc56 import allowed_call_oca, allowed_create_oca
from puya.errors import PuyaError
from puya.models import (
- ARC4ABIMethod,
- ARC4ABIMethodConfig,
- ARC4CreateOption,
- ARC4Method,
ARC4MethodArg,
ARC4Returns,
- ARC32StructDef,
- OnCompletionAction,
)
-from puya.parse import SourceLocation
-from puyapy.awst_build.arc32_client_gen import write_arc32_client
+from puyapy.awst_build.arc4_client_gen import write_arc4_client
logger = log.get_logger(__name__)
ARC32_OCA_MAPPING = {v: k for k, v in OCA_ARC32_MAPPING.items()}
@@ -31,6 +28,7 @@
class PuyaGenOptions:
paths: Sequence[Path] = attrs.field(default=(), repr=lambda p: str(list(map(str, p))))
log_level: log.LogLevel = log.LogLevel.info
+ out_dir: Path | None = None
def main() -> None:
@@ -38,25 +36,45 @@ def main() -> None:
prog="puyapy-clientgen",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
description="Output algopy contract client for typed ARC4 ABI calls from an "
- "ARC32 application.json spec",
+ "ARC-32 or ARC-56 application spec",
+ )
+ parser.add_argument(
+ "--out-dir",
+ type=Path,
+ help="Path for outputting client, defaults to app spec folder",
+ default=False,
)
parser.add_argument("paths", type=Path, nargs="+", metavar="PATH")
options = PuyaGenOptions()
parser.parse_args(namespace=options)
log.configure_logging(min_log_level=options.log_level)
- output_stubs(options.paths)
+ output_stubs(options.paths, options.out_dir)
-def output_stubs(paths: Sequence[Path]) -> None:
+def output_stubs(paths: Sequence[Path], out_dir: Path | None) -> None:
try:
app_spec_paths = resolve_app_specs(paths)
for app_spec_path in app_spec_paths:
- name, methods = parse_app_spec_methods(app_spec_path.read_text("utf8"))
- write_arc32_client(name, methods, app_spec_path.parent)
+ app_spec_json = app_spec_path.read_text("utf8")
+ if app_spec_path.name.endswith(".arc56.json"):
+ app_spec = parse_arc56(app_spec_json)
+ else:
+ # TODO: use algokit_utils to do this conversion when it is available?
+ app_spec = _convert_arc32_to_arc56(app_spec_json)
+ write_arc4_client(app_spec, out_dir or app_spec_path.parent)
except PuyaError as ex:
logger.error(str(ex)) # noqa: TRY400
+def _convert_arc32_to_arc56(app_spec_json: str) -> arc56.Contract:
+ name, structs, methods = _parse_arc32_app_spec_methods(app_spec_json)
+ return arc56.Contract(
+ name=name,
+ structs=structs,
+ methods=methods,
+ )
+
+
def resolve_app_specs(paths: Sequence[Path]) -> Sequence[Path]:
app_specs = list[Path]()
for path in paths:
@@ -75,36 +93,58 @@ def resolve_app_specs(paths: Sequence[Path]) -> Sequence[Path]:
return app_specs
-def parse_app_spec_methods(app_spec_json: str) -> tuple[str, Sequence[ARC4Method]]:
+def parse_arc56(app_spec_json: str) -> arc56.Contract:
+ converter = make_converter(omit_if_default=True)
+ return converter.loads(app_spec_json, arc56.Contract)
+
+
+def _parse_arc32_app_spec_methods(
+ app_spec_json: str,
+) -> tuple[str, dict[str, Sequence[arc56.StructField]], Sequence[arc56.Method]]:
+ # only need to parse a limited subset of ARC32 for client generation
+ # i.e. ABI methods, their OCA parameters, and any struct info
+ # default args are ignored as they aren't supported for on chain calls currently
+
app_spec = json.loads(app_spec_json)
contract = app_spec["contract"]
hints = app_spec["hints"]
contract_name = contract["name"]
- methods = list[ARC4Method]()
+ methods = list[arc56.Method]()
arc4_methods = {m.signature: m for m in _parse_methods(contract["methods"])}
+ known_structs = dict[str, Sequence[arc56.StructField]]()
for arc4_method in arc4_methods.values():
method_hints = hints[str(arc4_method.signature)]
- create_option, allowed_oca = _call_config(method_hints["call_config"])
+ arg_to_struct = dict[str, str]()
+ for param, struct_name, struct in _parse_structs(method_hints.get("structs", {})):
+ for known_struct_name, known_struct in known_structs.items():
+ if known_struct == struct:
+ arg_to_struct[param] = known_struct_name
+ break
+ else:
+ known_structs[struct_name] = struct
+ arg_to_struct[param] = struct_name
methods.append(
- ARC4ABIMethod(
- name=arc4_method.python_name,
+ arc56.Method(
+ name=arc4_method.signature.name,
desc=arc4_method.desc,
- args=arc4_method.signature.args,
- returns=arc4_method.signature.returns,
- config=ARC4ABIMethodConfig(
- source_location=SourceLocation(file=None, line=1),
- name=arc4_method.signature.name,
- create=create_option,
- readonly=bool(method_hints.get("read_only") or arc4_method.readonly),
- allowed_completion_types=allowed_oca,
- default_args=immutabledict(
- _default_args(method_hints.get("default_arguments", {}), arc4_methods)
- ),
- structs=immutabledict(_structs(method_hints.get("structs", {}))),
+ args=[
+ arc56.MethodArg(
+ name=a.name,
+ type=a.type_,
+ struct=arg_to_struct.get(a.name),
+ )
+ for a in arc4_method.signature.args
+ ],
+ returns=arc56.MethodReturns(
+ type=arc4_method.signature.returns.type_,
+ desc=arc4_method.desc,
+ struct=arg_to_struct.get("output"),
),
+ readonly=bool(method_hints.get("read_only") or arc4_method.readonly),
+ actions=_parse_call_config(method_hints["call_config"]),
)
)
- return contract_name, methods
+ return contract_name, known_structs, methods
@attrs.frozen(kw_only=True)
@@ -120,22 +160,17 @@ def __str__(self) -> str:
@attrs.frozen(kw_only=True)
class _Method:
signature: _MethodSignature
- python_name: str
desc: str | None
readonly: bool | None
def _parse_methods(methods: list[dict[str, typing.Any]]) -> Iterable[_Method]:
- arc4_names = dict[str, int]()
for method in methods:
signature = _parse_signature(method)
- name_seen = arc4_names[signature.name] = arc4_names.get(signature.name, 0) + 1
yield _Method(
signature=signature,
desc=method.get("desc"),
readonly=method.get("readonly"),
- # de-duplicate potential collisions
- python_name=signature.name if name_seen == 1 else f"{signature.name}{name_seen}",
)
@@ -148,57 +183,48 @@ def _parse_signature(method: dict[str, typing.Any]) -> _MethodSignature:
name=arg["name"],
type_=arg["type"],
desc=arg.get("desc"),
+ struct=arg.get("struct"),
)
for arg in method["args"]
),
returns=ARC4Returns(
type_=returns["type"],
desc=returns.get("desc"),
+ struct=returns.get("struct"),
),
)
-def _call_config(
- method_call_config: dict[str, str]
-) -> tuple[ARC4CreateOption, Sequence[OnCompletionAction]]:
- try:
- (call_config,) = set(method_call_config.values())
- except ValueError as ex:
- raise PuyaError("Different call configs for a single method not supported") from ex
- match call_config:
- case "CREATE":
- create_option = ARC4CreateOption.require
- case "ALL":
- create_option = ARC4CreateOption.allow
- case "CALL":
- create_option = ARC4CreateOption.disallow
- case invalid:
- raise PuyaError(f"invalid call config option: {invalid}")
- allowed_oca = [ARC32_OCA_MAPPING[a] for a in method_call_config]
- return create_option, allowed_oca
-
-
-def _default_args(
- default_args: dict[str, typing.Any], arc32_python_sig: Mapping[_MethodSignature, _Method]
-) -> Iterable[tuple[str, str]]:
- for param, default_arg_config in default_args.items():
- data = default_arg_config["data"]
- source = default_arg_config["source"]
- match source:
- case "global-state":
- yield param, data
- case "local-state":
- yield param, data
- case "abi-method":
- signature = _parse_signature(data)
- yield param, arc32_python_sig[signature].python_name
- case _:
- raise PuyaError(f"Unsupported source '{source}' for default argument: {param}")
-
-
-def _structs(structs: dict[str, dict[str, typing.Any]]) -> Iterable[tuple[str, ARC32StructDef]]:
+def _parse_call_config(method_call_config: dict[str, str]) -> arc56.MethodActions:
+ create = []
+ call = []
+ for oca, call_config in method_call_config.items():
+ action = ARC32_OCA_MAPPING[oca].name
+ match call_config:
+ case "CREATE" if allowed_create_oca(action):
+ create.append(action)
+ case "CALL" if allowed_call_oca(action):
+ call.append(action)
+ # allowed creates is narrower than calls so only need to check that
+ case "ALL" if allowed_create_oca(action):
+ create.append(action)
+ call.append(action)
+ case invalid:
+ raise PuyaError(f"invalid call config option: {invalid}")
+
+ return arc56.MethodActions(
+ create=create,
+ call=call,
+ )
+
+
+def _parse_structs(
+ structs: dict[str, dict[str, typing.Any]]
+) -> Iterable[tuple[str, str, Sequence[arc56.StructField]]]:
for param, struct_config in structs.items():
- yield param, ARC32StructDef(name=struct_config["name"], elements=struct_config["elements"])
+ yield param, struct_config["name"], [
+ arc56.StructField(name=f[0], type=f[1]) for f in struct_config["elements"]
+ ]
if __name__ == "__main__":
diff --git a/src/puyapy/compile.py b/src/puyapy/compile.py
index f8520691de..e024b6a265 100644
--- a/src/puyapy/compile.py
+++ b/src/puyapy/compile.py
@@ -16,7 +16,7 @@
import mypy.util
from packaging import version
from puya import log, models
-from puya.arc32 import create_arc32_json
+from puya.arc56 import create_arc56_json
from puya.awst.nodes import AWST
from puya.awst.serialize import awst_to_json
from puya.awst.to_code_visitor import ToCodeVisitor
@@ -24,9 +24,9 @@
from puya.errors import log_exceptions
from puya.utils import make_path_relative_to_cwd
-from puyapy.awst_build.arc32_client_gen import write_arc32_client
+from puyapy.awst_build.arc4_client_gen import write_arc4_client
from puyapy.awst_build.main import transform_ast
-from puyapy.client_gen import parse_app_spec_methods
+from puyapy.client_gen import parse_arc56
from puyapy.options import PuyaPyOptions
from puyapy.parse import TYPESHED_PATH, ParseResult, parse_and_typecheck
from puyapy.utils import determine_out_dir
@@ -79,12 +79,13 @@ def compile_to_teal(puyapy_options: PuyaPyOptions) -> None:
)
log_ctx.exit_if_errors()
if puyapy_options.output_client:
- write_arc32_clients(compilation_set, teal)
+ write_arc32_clients(puyapy_options.template_vars_prefix, compilation_set, teal)
# needs to be outside the with block
log_ctx.exit_if_errors()
def write_arc32_clients(
+ template_prefix: str,
compilation_set: Mapping[models.ContractReference | models.LogicSigReference, Path],
artifacts: Sequence[models.CompilationArtifact],
) -> None:
@@ -92,16 +93,17 @@ def write_arc32_clients(
if isinstance(artifact, models.CompiledContract) and artifact.metadata.is_arc4:
contract_out_dir = compilation_set.get(artifact.id)
if contract_out_dir:
- app_spec_json = create_arc32_json(
- artifact.approval_program.teal_src,
- artifact.clear_program.teal_src,
- artifact.metadata,
+ app_spec_json = create_arc56_json(
+ approval_program=artifact.approval_program,
+ clear_program=artifact.clear_program,
+ metadata=artifact.metadata,
+ template_prefix=template_prefix,
)
- # use round trip of ARC32 -> reparse to ensure consistency
- # of client output regardless if generating from ARC32 or
+ # use round trip of ARC-56 -> reparse to ensure consistency
+ # of client output regardless if generating from ARC-56 or
# Puya ARC4Contract
- name, methods = parse_app_spec_methods(app_spec_json)
- write_arc32_client(name, methods, contract_out_dir)
+ contract = parse_arc56(app_spec_json)
+ write_arc4_client(contract, contract_out_dir)
def parse_with_mypy(paths: Sequence[Path]) -> ParseResult:
diff --git a/test_cases/abi_routing/out/CustomApproval.approval.mir b/test_cases/abi_routing/out/CustomApproval.approval.mir
index 34453fd54e..3d93cb6cb1 100644
--- a/test_cases/abi_routing/out/CustomApproval.approval.mir
+++ b/test_cases/abi_routing/out/CustomApproval.approval.mir
@@ -124,9 +124,9 @@ __puya_arc4_router___add_one_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/custom_approval.py:6
// class CustomApproval(ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -152,7 +152,7 @@ __puya_arc4_router___bare_routing@5:
__puya_arc4_router_____algopy_default_create@6:
txn ApplicationID tmp%11#0
! tmp%12#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/abi_routing/out/CustomApproval.approval.teal b/test_cases/abi_routing/out/CustomApproval.approval.teal
index 7b2787df0c..c2ee51003e 100644
--- a/test_cases/abi_routing/out/CustomApproval.approval.teal
+++ b/test_cases/abi_routing/out/CustomApproval.approval.teal
@@ -89,9 +89,9 @@ __puya_arc4_router___add_one_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/custom_approval.py:6
// class CustomApproval(ARC4Contract):
txna ApplicationArgs 1
@@ -114,7 +114,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/test_cases/abi_routing/out/CustomApproval.arc32.json b/test_cases/abi_routing/out/CustomApproval.arc32.json
index 1f78f130d9..50313fc59a 100644
--- a/test_cases/abi_routing/out/CustomApproval.arc32.json
+++ b/test_cases/abi_routing/out/CustomApproval.arc32.json
@@ -7,7 +7,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgcHVzaGJ5dGVzICIiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxMwogICAgLy8gaWYgVHhuLm51bV9hcHBfYXJncyA9PSAyIGFuZCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBvcC5pdG9iKDQyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICA9PQogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxNAogICAgLy8gbG9nKCLwn46J8J+OifCfjokiKQogICAgcHVzaGJ5dGVzICJceGYwXHg5Zlx4OGVceDg5XHhmMFx4OWZceDhlXHg4OVx4ZjBceDlmXHg4ZVx4ODkiCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE1CiAgICAvLyByZXN1bHQgPSBzdXBlcigpLmFwcHJvdmFsX3Byb2dyYW0oKQogICAgY2FsbHN1YiBhcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE2CiAgICAvLyBpZiBub3QgcmVzdWx0OgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTgtMTkKICAgIC8vICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSIKICAgIC8vICIgc28gSSBjYW4gc2F5IHdoYXRldmVyIEkgd2FudCBoZXJlIgogICAgcHVzaGJ5dGVzICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTctMjAKICAgIC8vIGxvZygKICAgIC8vICAgICAidGhpcyB3aWxsIG5ldmVyIGJlIHNlZW4gdW5sZXNzIHlvdSdyZSBydW5uaW5nIGluIHNpbXVsYXRpb24gbW9kZSBhbnl3YXkiCiAgICAvLyAgICAgIiBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyApCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICBkdXAKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY3VzdG9tX2FwcHJvdmFsLkN1c3RvbUFwcHJvdmFsLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2lkID09IDAsICJub25zZW5zZSBhc3NlcnQganVzdCB0byBnZW5lcmF0ZSBhbiBpbml0IG1ldGhvZCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gbm9uc2Vuc2UgYXNzZXJ0IGp1c3QgdG8gZ2VuZXJhdGUgYW4gaW5pdCBtZXRob2QKICAgIHJldHN1YgoKCi8vIGFsZ29weS5hcmM0LkFSQzRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtKCkgLT4gdWludDY0OgphcHByb3ZhbF9wcm9ncmFtOgogICAgcHJvdG8gMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NgogICAgLy8gY2xhc3MgQ3VzdG9tQXBwcm92YWwoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwM2I1YzBhZiAvLyBtZXRob2QgImFkZF9vbmUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF9vbmVfcm91dGVAMgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX29uZV9yb3V0ZUAyOgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo2CiAgICAvLyBjbGFzcyBDdXN0b21BcHByb3ZhbChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYWRkX29uZQogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo2CiAgICAvLyBjbGFzcyBDdXN0b21BcHByb3ZhbChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jdXN0b21fYXBwcm92YWwuQ3VzdG9tQXBwcm92YWwuYWRkX29uZSh4OiB1aW50NjQpIC0+IHVpbnQ2NDoKYWRkX29uZToKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYWRkX29uZShzZWxmLCB4OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjI1CiAgICAvLyByZXR1cm4geCArIDEKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1Ygo=",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgcHVzaGJ5dGVzICIiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxMwogICAgLy8gaWYgVHhuLm51bV9hcHBfYXJncyA9PSAyIGFuZCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBvcC5pdG9iKDQyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICA9PQogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxNAogICAgLy8gbG9nKCLwn46J8J+OifCfjokiKQogICAgcHVzaGJ5dGVzICJceGYwXHg5Zlx4OGVceDg5XHhmMFx4OWZceDhlXHg4OVx4ZjBceDlmXHg4ZVx4ODkiCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE1CiAgICAvLyByZXN1bHQgPSBzdXBlcigpLmFwcHJvdmFsX3Byb2dyYW0oKQogICAgY2FsbHN1YiBhcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE2CiAgICAvLyBpZiBub3QgcmVzdWx0OgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTgtMTkKICAgIC8vICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSIKICAgIC8vICIgc28gSSBjYW4gc2F5IHdoYXRldmVyIEkgd2FudCBoZXJlIgogICAgcHVzaGJ5dGVzICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTctMjAKICAgIC8vIGxvZygKICAgIC8vICAgICAidGhpcyB3aWxsIG5ldmVyIGJlIHNlZW4gdW5sZXNzIHlvdSdyZSBydW5uaW5nIGluIHNpbXVsYXRpb24gbW9kZSBhbnl3YXkiCiAgICAvLyAgICAgIiBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyApCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICBkdXAKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY3VzdG9tX2FwcHJvdmFsLkN1c3RvbUFwcHJvdmFsLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2lkID09IDAsICJub25zZW5zZSBhc3NlcnQganVzdCB0byBnZW5lcmF0ZSBhbiBpbml0IG1ldGhvZCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gbm9uc2Vuc2UgYXNzZXJ0IGp1c3QgdG8gZ2VuZXJhdGUgYW4gaW5pdCBtZXRob2QKICAgIHJldHN1YgoKCi8vIGFsZ29weS5hcmM0LkFSQzRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtKCkgLT4gdWludDY0OgphcHByb3ZhbF9wcm9ncmFtOgogICAgcHJvdG8gMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NgogICAgLy8gY2xhc3MgQ3VzdG9tQXBwcm92YWwoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwM2I1YzBhZiAvLyBtZXRob2QgImFkZF9vbmUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF9vbmVfcm91dGVAMgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX29uZV9yb3V0ZUAyOgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhZGRfb25lCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jdXN0b21fYXBwcm92YWwuQ3VzdG9tQXBwcm92YWwuYWRkX29uZSh4OiB1aW50NjQpIC0+IHVpbnQ2NDoKYWRkX29uZToKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYWRkX29uZShzZWxmLCB4OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjI1CiAgICAvLyByZXR1cm4geCArIDEKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
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..080b15c971
--- /dev/null
+++ b/test_cases/abi_routing/out/CustomApproval.arc56.json
@@ -0,0 +1,113 @@
+{
+ "name": "CustomApproval",
+ "structs": {},
+ "methods": [
+ {
+ "name": "add_one",
+ "args": [
+ {
+ "type": "uint64",
+ "name": "x"
+ }
+ ],
+ "returns": {
+ "type": "uint64"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [],
+ "recommendations": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 208
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 239
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 211
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 173
+ ],
+ "errorMessage": "nonsense assert just to generate an init method"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgcHVzaGJ5dGVzICIiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxMwogICAgLy8gaWYgVHhuLm51bV9hcHBfYXJncyA9PSAyIGFuZCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBvcC5pdG9iKDQyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICA9PQogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxNAogICAgLy8gbG9nKCLwn46J8J+OifCfjokiKQogICAgcHVzaGJ5dGVzICJceGYwXHg5Zlx4OGVceDg5XHhmMFx4OWZceDhlXHg4OVx4ZjBceDlmXHg4ZVx4ODkiCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE1CiAgICAvLyByZXN1bHQgPSBzdXBlcigpLmFwcHJvdmFsX3Byb2dyYW0oKQogICAgY2FsbHN1YiBhcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE2CiAgICAvLyBpZiBub3QgcmVzdWx0OgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTgtMTkKICAgIC8vICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSIKICAgIC8vICIgc28gSSBjYW4gc2F5IHdoYXRldmVyIEkgd2FudCBoZXJlIgogICAgcHVzaGJ5dGVzICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTctMjAKICAgIC8vIGxvZygKICAgIC8vICAgICAidGhpcyB3aWxsIG5ldmVyIGJlIHNlZW4gdW5sZXNzIHlvdSdyZSBydW5uaW5nIGluIHNpbXVsYXRpb24gbW9kZSBhbnl3YXkiCiAgICAvLyAgICAgIiBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyApCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICBkdXAKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY3VzdG9tX2FwcHJvdmFsLkN1c3RvbUFwcHJvdmFsLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2lkID09IDAsICJub25zZW5zZSBhc3NlcnQganVzdCB0byBnZW5lcmF0ZSBhbiBpbml0IG1ldGhvZCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gbm9uc2Vuc2UgYXNzZXJ0IGp1c3QgdG8gZ2VuZXJhdGUgYW4gaW5pdCBtZXRob2QKICAgIHJldHN1YgoKCi8vIGFsZ29weS5hcmM0LkFSQzRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtKCkgLT4gdWludDY0OgphcHByb3ZhbF9wcm9ncmFtOgogICAgcHJvdG8gMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NgogICAgLy8gY2xhc3MgQ3VzdG9tQXBwcm92YWwoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwM2I1YzBhZiAvLyBtZXRob2QgImFkZF9vbmUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF9vbmVfcm91dGVAMgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX29uZV9yb3V0ZUAyOgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhZGRfb25lCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jdXN0b21fYXBwcm92YWwuQ3VzdG9tQXBwcm92YWwuYWRkX29uZSh4OiB1aW50NjQpIC0+IHVpbnQ2NDoKYWRkX29uZToKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYWRkX29uZShzZWxmLCB4OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjI1CiAgICAvLyByZXR1cm4geCArIDEKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "byteCode": {
+ "approval": "CiACAQCAADEYQAADiACYMRuBAhJBABk2GgGBKhYSQQAPgAzwn46J8J+OifCfjomwiAB8SUUCQABsgGl0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmWwSUOKAAAxGBREiYoAAYgAAYmKAAExG0EAKYAEA7XArzYaAI4BAAIjiTEZFEQxGEQ2GgEXiAAZFoAEFR98dUxQsCKJMRlAAAYxGBREIokjiYoBAYv/IgiJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/abi_routing/out/CustomApproval.destructured.ir b/test_cases/abi_routing/out/CustomApproval.destructured.ir
index ab1e1cce1d..641b61ee03 100644
--- a/test_cases/abi_routing/out/CustomApproval.destructured.ir
+++ b/test_cases/abi_routing/out/CustomApproval.destructured.ir
@@ -50,9 +50,9 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@2: // add_one_route_L23
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0)
@@ -66,7 +66,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
return 1u
block@9: // after_if_else_L6
return 0u
diff --git a/test_cases/abi_routing/out/CustomApproval.ssa.ir b/test_cases/abi_routing/out/CustomApproval.ssa.ir
index a3b94cf3c3..56dcd9cae9 100644
--- a/test_cases/abi_routing/out/CustomApproval.ssa.ir
+++ b/test_cases/abi_routing/out/CustomApproval.ssa.ir
@@ -51,10 +51,10 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@2: // add_one_route_L23
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0)
@@ -72,7 +72,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (== tmp%11#0 0u)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
test_cases.abi_routing.custom_approval.CustomApproval.__algopy_default_create()
return 1u
block@7: // switch_case_default_L6
diff --git a/test_cases/abi_routing/out/CustomApproval.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/CustomApproval.ssa.opt_pass_1.ir
index ab1e1cce1d..641b61ee03 100644
--- a/test_cases/abi_routing/out/CustomApproval.ssa.opt_pass_1.ir
+++ b/test_cases/abi_routing/out/CustomApproval.ssa.opt_pass_1.ir
@@ -50,9 +50,9 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@2: // add_one_route_L23
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0)
@@ -66,7 +66,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
return 1u
block@9: // after_if_else_L6
return 0u
diff --git a/test_cases/abi_routing/out/MinimumARC4.approval.mir b/test_cases/abi_routing/out/MinimumARC4.approval.mir
index 5430440335..85558c2323 100644
--- a/test_cases/abi_routing/out/MinimumARC4.approval.mir
+++ b/test_cases/abi_routing/out/MinimumARC4.approval.mir
@@ -52,7 +52,7 @@ __puya_arc4_router___bare_routing@2:
__puya_arc4_router_____algopy_default_create@3:
txn ApplicationID tmp%3#0
! tmp%4#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/abi_routing/out/MinimumARC4.approval.teal b/test_cases/abi_routing/out/MinimumARC4.approval.teal
index 4b12c1950c..20ce19d73c 100644
--- a/test_cases/abi_routing/out/MinimumARC4.approval.teal
+++ b/test_cases/abi_routing/out/MinimumARC4.approval.teal
@@ -34,7 +34,7 @@ __puya_arc4_router__:
bnz __puya_arc4_router___after_if_else@6
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
pushint 1 // 1
retsub
diff --git a/test_cases/abi_routing/out/MinimumARC4.arc32.json b/test_cases/abi_routing/out/MinimumARC4.arc32.json
index c6f282172e..464773c93a 100644
--- a/test_cases/abi_routing/out/MinimumARC4.arc32.json
+++ b/test_cases/abi_routing/out/MinimumARC4.arc32.json
@@ -1,7 +1,7 @@
{
"hints": {},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjUKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjYKICAgIC8vIHNlbGYuZ3ZhbHVlID0gVUludDY0KDQpCiAgICBwdXNoYnl0ZXMgImd2YWx1ZSIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjUKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjYKICAgIC8vIHNlbGYuZ3ZhbHVlID0gVUludDY0KDQpCiAgICBwdXNoYnl0ZXMgImd2YWx1ZSIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjQKICAgIC8vIGNsYXNzIE1pbmltdW1BUkM0KEFSQzRDb250cmFjdCk6CiAgICBwdXNoaW50IDAgLy8gMAogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
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..2c9a802a15
--- /dev/null
+++ b/test_cases/abi_routing/out/MinimumARC4.arc56.json
@@ -0,0 +1,79 @@
+{
+ "name": "MinimumARC4",
+ "structs": {},
+ "methods": [],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 44
+ ],
+ "errorMessage": "can only call when creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjUKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjYKICAgIC8vIHNlbGYuZ3ZhbHVlID0gVUludDY0KDQpCiAgICBwdXNoYnl0ZXMgImd2YWx1ZSIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBhYmlfcm91dGluZy9taW5pbWFsLnB5OjQKICAgIC8vIGNsYXNzIE1pbmltdW1BUkM0KEFSQzRDb250cmFjdCk6CiAgICBwdXNoaW50IDAgLy8gMAogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
+ },
+ "byteCode": {
+ "approval": "CjEYQAADiAAEiAAQQ4oAAIAGZ3ZhbHVlgQRniYoAATEbQAAMMRlAAAcxGBREgQGJgQCJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/abi_routing/out/MinimumARC4.destructured.ir b/test_cases/abi_routing/out/MinimumARC4.destructured.ir
index ee66099ec0..9130ed8a13 100644
--- a/test_cases/abi_routing/out/MinimumARC4.destructured.ir
+++ b/test_cases/abi_routing/out/MinimumARC4.destructured.ir
@@ -26,7 +26,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4:
block@3: // __algopy_default_create_L1
let tmp%3#0: uint64 = (txn ApplicationID)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // is creating
+ (assert tmp%4#0) // can only call when creating
return 1u
block@6: // after_if_else_L4
return 0u
diff --git a/test_cases/abi_routing/out/MinimumARC4.ssa.ir b/test_cases/abi_routing/out/MinimumARC4.ssa.ir
index 03d7819430..513c08f61e 100644
--- a/test_cases/abi_routing/out/MinimumARC4.ssa.ir
+++ b/test_cases/abi_routing/out/MinimumARC4.ssa.ir
@@ -29,7 +29,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4:
block@3: // __algopy_default_create_L1
let tmp%3#0: uint64 = (txn ApplicationID)
let tmp%4#0: bool = (== tmp%3#0 0u)
- (assert tmp%4#0) // is creating
+ (assert tmp%4#0) // can only call when creating
test_cases.abi_routing.minimal.MinimumARC4.__algopy_default_create()
return 1u
block@4: // switch_case_default_L4
diff --git a/test_cases/abi_routing/out/MinimumARC4.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/MinimumARC4.ssa.opt_pass_1.ir
index ee66099ec0..9130ed8a13 100644
--- a/test_cases/abi_routing/out/MinimumARC4.ssa.opt_pass_1.ir
+++ b/test_cases/abi_routing/out/MinimumARC4.ssa.opt_pass_1.ir
@@ -26,7 +26,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4:
block@3: // __algopy_default_create_L1
let tmp%3#0: uint64 = (txn ApplicationID)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // is creating
+ (assert tmp%4#0) // can only call when creating
return 1u
block@6: // after_if_else_L4
return 0u
diff --git a/test_cases/abi_routing/out/Reference.approval.mir b/test_cases/abi_routing/out/Reference.approval.mir
index ccb0fcfe7d..9652ca9743 100644
--- a/test_cases/abi_routing/out/Reference.approval.mir
+++ b/test_cases/abi_routing/out/Reference.approval.mir
@@ -96,9 +96,9 @@ __puya_arc4_router___noop_with_uint64_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -154,9 +154,9 @@ __puya_arc4_router___mixed_oca_route@4:
shl tmp%14#0
int 37 tmp%14#0,37
& tmp%15#0
- assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ assert // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
txn ApplicationID tmp%16#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%18#0
@@ -183,9 +183,9 @@ __puya_arc4_router___opt_into_asset_route@5:
// @arc4.abimethod
txn OnCompletion tmp%21#0
! tmp%22#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%23#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%25#0
@@ -202,9 +202,9 @@ __puya_arc4_router___with_transactions_route@6:
// @arc4.abimethod
txn OnCompletion tmp%28#0
! tmp%29#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%30#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%32#0
@@ -235,9 +235,9 @@ __puya_arc4_router___compare_assets_route@7:
// @arc4.abimethod
txn OnCompletion tmp%38#0
! tmp%39#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%40#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%42#0
@@ -259,9 +259,9 @@ __puya_arc4_router___get_address_route@8:
// @arc4.abimethod(readonly=True)
txn OnCompletion tmp%48#0
! tmp%49#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%50#0
- assert // is not creating
+ assert // can only call when not creating
callsub get_address tmp%52#0
byte 0x151f7c75 tmp%52#0,0x151f7c75
l-load tmp%52#0 1 0x151f7c75,tmp%52#0
@@ -275,9 +275,9 @@ __puya_arc4_router___get_asset_route@9:
// @arc4.abimethod(readonly=True)
txn OnCompletion tmp%54#0
! tmp%55#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%56#0
- assert // is not creating
+ assert // can only call when not creating
callsub get_asset tmp%58#0
byte 0x151f7c75 tmp%58#0,0x151f7c75
l-load tmp%58#0 1 0x151f7c75,tmp%58#0
@@ -291,9 +291,9 @@ __puya_arc4_router___get_application_route@10:
// @arc4.abimethod(readonly=True, name="get_application")
txn OnCompletion tmp%60#0
! tmp%61#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%62#0
- assert // is not creating
+ assert // can only call when not creating
callsub get_app tmp%64#0
byte 0x151f7c75 tmp%64#0,0x151f7c75
l-load tmp%64#0 1 0x151f7c75,tmp%64#0
@@ -307,9 +307,9 @@ __puya_arc4_router___get_an_int_route@11:
// @arc4.abimethod(readonly=True, name="get_an_int")
txn OnCompletion tmp%66#0
! tmp%67#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%68#0
- assert // is not creating
+ assert // can only call when not creating
callsub get_a_int tmp%70#0
byte 0x151f7c75 tmp%70#0,0x151f7c75
l-load tmp%70#0 1 0x151f7c75,tmp%70#0
@@ -335,9 +335,9 @@ __puya_arc4_router___method_with_default_args_route@12:
// )
txn OnCompletion tmp%72#0
! tmp%73#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%74#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%76#0
@@ -393,9 +393,9 @@ __puya_arc4_router___method_with_15_args_route@13:
// @arc4.abimethod
txn OnCompletion tmp%97#0
! tmp%98#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%99#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%101#0
@@ -464,9 +464,9 @@ __puya_arc4_router___method_with_more_than_15_args_route@14:
// @arc4.abimethod
txn OnCompletion tmp%132#0
! tmp%133#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%134#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%136#0
@@ -585,9 +585,9 @@ __puya_arc4_router___hello_with_algopy_string_route@15:
// @arc4.abimethod
txn OnCompletion tmp%182#0
! tmp%183#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%184#0
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1 tmp%186#0
@@ -630,7 +630,7 @@ __puya_arc4_router___bare_abi_config@19:
// )
txn ApplicationID tmp%190#0
! tmp%191#0
- assert // is creating
+ assert // can only call when creating
// abi_routing/contract.py:66-76
// @arc4.baremethod(
// allow_actions=[
diff --git a/test_cases/abi_routing/out/Reference.approval.teal b/test_cases/abi_routing/out/Reference.approval.teal
index 339fb6eca4..cbc58d72ec 100644
--- a/test_cases/abi_routing/out/Reference.approval.teal
+++ b/test_cases/abi_routing/out/Reference.approval.teal
@@ -67,9 +67,9 @@ __puya_arc4_router___noop_with_uint64_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -124,9 +124,9 @@ __puya_arc4_router___mixed_oca_route@4:
shl
pushint 37 // 37
&
- assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ assert // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -153,9 +153,9 @@ __puya_arc4_router___opt_into_asset_route@5:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -172,9 +172,9 @@ __puya_arc4_router___with_transactions_route@6:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -201,9 +201,9 @@ __puya_arc4_router___compare_assets_route@7:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -223,9 +223,9 @@ __puya_arc4_router___get_address_route@8:
// @arc4.abimethod(readonly=True)
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_address
bytec_0 // 0x151f7c75
swap
@@ -239,9 +239,9 @@ __puya_arc4_router___get_asset_route@9:
// @arc4.abimethod(readonly=True)
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_asset
bytec_0 // 0x151f7c75
swap
@@ -255,9 +255,9 @@ __puya_arc4_router___get_application_route@10:
// @arc4.abimethod(readonly=True, name="get_application")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_app
bytec_0 // 0x151f7c75
swap
@@ -271,9 +271,9 @@ __puya_arc4_router___get_an_int_route@11:
// @arc4.abimethod(readonly=True, name="get_an_int")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_a_int
bytec_0 // 0x151f7c75
swap
@@ -299,9 +299,9 @@ __puya_arc4_router___method_with_default_args_route@12:
// )
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -348,9 +348,9 @@ __puya_arc4_router___method_with_15_args_route@13:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -404,9 +404,9 @@ __puya_arc4_router___method_with_more_than_15_args_route@14:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -493,9 +493,9 @@ __puya_arc4_router___hello_with_algopy_string_route@15:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -538,7 +538,7 @@ __puya_arc4_router___bare_abi_config@19:
// )
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
// abi_routing/contract.py:66-76
// @arc4.baremethod(
// allow_actions=[
diff --git a/test_cases/abi_routing/out/Reference.arc32.json b/test_cases/abi_routing/out/Reference.arc32.json
index b4f8be1534..d0aa310dc8 100644
--- a/test_cases/abi_routing/out/Reference.arc32.json
+++ b/test_cases/abi_routing/out/Reference.arc32.json
@@ -150,7 +150,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMjMgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJhc2EiIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgxMjMpCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUKICAgIC8vIHNlbGYuYW5faW50ID0gVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImFuX2ludCIKICAgIGludGNfMyAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHNlbGYuc29tZV9ieXRlcyA9IEJ5dGVzMyhhcmM0LkJ5dGUoNyksIGFyYzQuQnl0ZSg4KSwgYXJjNC5CeXRlKDkpKQogICAgcHVzaGJ5dGVzcyAic29tZV9ieXRlcyIgMHgwNzA4MDkgLy8gInNvbWVfYnl0ZXMiLCAweDA3MDgwOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBwdXNoYnl0ZXMgImNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIHNlbGYuYXBwID0gQXBwbGljYXRpb24oMTIzKQogICAgcHVzaGJ5dGVzICJhcHAiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzAKICAgIC8vIGFzc2VydCBhcmM0LmFyYzRfc2lnbmF0dXJlKCJnZXQodWludDY0LGJ5dGVbXSlieXRlW10iKSwgImhhcyBtZXRob2Qgc2VsZWN0b3IiCiAgICBwdXNoYnl0ZXMgMHgxODkzOTJjNSAvLyBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGxlbgogICAgYXNzZXJ0IC8vIGhhcyBtZXRob2Qgc2VsZWN0b3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOAogICAgcHVzaGJ5dGVzcyAweGQ3OGRiMzViIDB4M2E1MzUzZmMgMHhkMmYyZjUzYyAweDI4MjZiMjAyIDB4NmY4ZTk0Y2QgMHgxN2RjNjhmMCAweDdmYWQ5NzgwIDB4MmZkZjk1YTQgMHgxMzk5ODI2YyAweGExMzAwODIxIDB4NjVmNGNiOWIgMHg1NzMyMTk1YSAweGQxNzU1MmZiIDB4OTAyM2JiMTkgLy8gbWV0aG9kICJub29wX3dpdGhfdWludDY0KHVpbnQ2NCl1aW50OCIsIG1ldGhvZCAiYWxsX3RoZV90aGluZ3ModWludDY0KXVpbnQ4IiwgbWV0aG9kICJtaXhlZF9vY2EodWludDY0KXVpbnQ4IiwgbWV0aG9kICJvcHRfaW50b19hc3NldChhc3NldCl2b2lkIiwgbWV0aG9kICJ3aXRoX3RyYW5zYWN0aW9ucyhhc3NldCx1aW50NjQscGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjb21wYXJlX2Fzc2V0cyhhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2Fzc2V0KCl1aW50NjQiLCBtZXRob2QgImdldF9hcHBsaWNhdGlvbigpdWludDY0IiwgbWV0aG9kICJnZXRfYW5faW50KCl1aW50NjQiLCBtZXRob2QgIm1ldGhvZF93aXRoX2RlZmF1bHRfYXJncyhhc3NldCxhc3NldCxhY2NvdW50LGFjY291bnQsYXBwbGljYXRpb24sYXBwbGljYXRpb24sYnl0ZVszXSx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm1ldGhvZF93aXRoXzE1X2FyZ3ModWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxhc3NldCxwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbm9vcF93aXRoX3VpbnQ2NF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FsbF90aGVfdGhpbmdzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aXRoX3RyYW5zYWN0aW9uc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FkZHJlc3Nfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FuX2ludF9yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3Nfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb193aXRoX2FsZ29weV9zdHJpbmdfcm91dGVAMTUKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25vb3Bfd2l0aF91aW50NjRfcm91dGVAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbm9vcF93aXRoX3VpbnQ2NAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWxsX3RoZV90aGluZ3Nfcm91dGVAMzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5PcHRJbiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5VcGRhdGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIG5hbWU9ImFsbF90aGVfdGhpbmdzIiwKICAgIC8vICAgICBjcmVhdGU9ImFsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgY2FsbHN1YiBmdWxsX2FiaV9jb25maWcKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21peGVkX29jYV9yb3V0ZUA0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTMtNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJkaXNhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIGludGNfMCAvLyAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIHB1c2hpbnQgMzcgLy8gMzcKICAgICYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgb25lIG9mIE5vT3AsIENsb3NlT3V0LCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUzLTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT0iZGlzYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBjYWxsc3ViIG1peGVkX29jYQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVANToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcHRfaW50b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVANjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHdpdGhfdHJhbnNhY3Rpb25zCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jb21wYXJlX2Fzc2V0c19yb3V0ZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjb21wYXJlX2Fzc2V0cwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FkZHJlc3Nfcm91dGVAODoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FwcGxpY2F0aW9uX3JvdXRlQDEwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FwcGxpY2F0aW9uIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FwcAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FuX2ludF9yb3V0ZUAxMToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hbl9pbnQiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYV9pbnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoX2RlZmF1bHRfYXJnc19yb3V0ZUAxMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgY2FsbHN1YiBtZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3MKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoXzE1X2FyZ3Nfcm91dGVAMTM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoXzE1X2FyZ3MKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMjQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQ1IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA1MyA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2hlbGxvX3dpdGhfYWxnb3B5X3N0cmluZ19yb3V0ZUAxNToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgaGVsbG9fd2l0aF9hbGdvcHlfc3RyaW5nCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE4OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjIgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOQogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjYtNzUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIk9wdEluIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIlVwZGF0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT0icmVxdWlyZSIsCiAgICAvLyApCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIC8vIGRlZiBiYXJlX2FiaV9jb25maWcoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYmFyZV9hYmlfY29uZmlnCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm5vb3Bfd2l0aF91aW50NjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpub29wX3dpdGhfdWludDY0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzItMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vb3Bfd2l0aF91aW50NjQoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSAxICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZnVsbF9hYmlfY29uZmlnKGE6IGJ5dGVzKSAtPiBieXRlczoKZnVsbF9hYmlfY29uZmlnOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgZnVsbF9hYmlfY29uZmlnKHNlbGYsIGE6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MAogICAgLy8gcmVzdWx0ID0gVUludDY0KDEpICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWl4ZWRfb2NhKGE6IGJ5dGVzKSAtPiBieXRlczoKbWl4ZWRfb2NhOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTMtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJkaXNhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIC8vIGRlZiBtaXhlZF9vY2Eoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXN1bHQgPSBVSW50NjQoMSkgKyBhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KHJlc3VsdCkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcHRfaW50b19hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyAjIE9ubHkgYWxsb3cgYXBwIGNyZWF0b3IgdG8gb3B0IHRoZSBhcHAgYWNjb3VudCBpbnRvIGEgQVNBCiAgICAvLyBhc3NlcnQgb3AuVHhuLnNlbmRlciA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIGNhbiBvcHQgaW4gdG8gQVNBIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODMtODQKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzYSwgIkFTQSBhbHJlYWR5IG9wdGVkIGluIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2EgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQVNBIGFscmVhZHkgb3B0ZWQgaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWNfMSAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODgtODkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBvcC5JVHhuQ3JlYXRlLmJlZ2luKCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIpCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF9mZWUoVUludDY0KDApKSAgIyBjb3ZlciBmZWUgd2l0aCBvdXRlciB0eG4KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X2Fzc2V0X3JlY2VpdmVyKG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfeGZlcl9hc3NldChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uud2l0aF90cmFuc2FjdGlvbnMoYXNzZXQ6IHVpbnQ2NCwgYW5faW50OiBieXRlcywgcGF5OiB1aW50NjQsIGFub3RoZXJfaW50OiBieXRlcykgLT4gdm9pZDoKd2l0aF90cmFuc2FjdGlvbnM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5Ni0xMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHdpdGhfdHJhbnNhY3Rpb25zKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFuX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhbm90aGVyX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IHNlbGYuYXNhID09IGFzc2V0LCAiaXMgY29ycmVjdCBhc3NldCIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgYXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFuX2ludC5uYXRpdmUgPT0gMSwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgcGF5LnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJpcyBwYXltZW50IHRvIGFwcCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIHBheW1lbnQgdG8gYXBwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCBhbm90aGVyX2ludC5uYXRpdmUgPT0gMiwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuY29tcGFyZV9hc3NldHMoYXNzZXRfYTogdWludDY0LCBhc3NldF9iOiB1aW50NjQpIC0+IHZvaWQ6CmNvbXBhcmVfYXNzZXRzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY29tcGFyZV9hc3NldHMoc2VsZiwgYXNzZXRfYTogQXNzZXQsIGFzc2V0X2I6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIGFzc2VydCBhc3NldF9hID09IGFzc2V0X2IsICJhc3NldCBhID09IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhID09IGIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hZGRyZXNzKCkgLT4gYnl0ZXM6CmdldF9hZGRyZXNzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FkZHJlc3Moc2VsZikgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3MoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYXNzZXQoKSAtPiBieXRlczoKZ2V0X2Fzc2V0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCg0NTYpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2FwcCgpIC0+IGJ5dGVzOgpnZXRfYXBwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICAvLyBkZWYgZ2V0X2FwcChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoNDU2KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAxYzgKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hX2ludCgpIC0+IGJ5dGVzOgpnZXRfYV9pbnQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FuX2ludCIpCiAgICAvLyBkZWYgZ2V0X2FfaW50KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKGFzc2V0X2Zyb21fc3RvcmFnZTogdWludDY0LCBhc3NldF9mcm9tX2Z1bmN0aW9uOiB1aW50NjQsIGFjY291bnRfZnJvbV9zdG9yYWdlOiBieXRlcywgYWNjb3VudF9mcm9tX2Z1bmN0aW9uOiBieXRlcywgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiB1aW50NjQsIGFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb246IHVpbnQ2NCwgYnl0ZXNfZnJvbV9zdG9yYWdlOiBieXRlcywgaW50X2Zyb21fc3RvcmFnZTogYnl0ZXMsIGludF9mcm9tX2Z1bmN0aW9uOiBieXRlcykgLT4gdm9pZDoKbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICAvLyBkZWYgbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfZnJvbV9zdG9yYWdlOiBBc3NldCwKICAgIC8vICAgICBhc3NldF9mcm9tX2Z1bmN0aW9uOiBBc3NldCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fc3RvcmFnZTogQWNjb3VudCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fZnVuY3Rpb246IEFjY291bnQsCiAgICAvLyAgICAgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBieXRlc19mcm9tX3N0b3JhZ2U6IEJ5dGVzMywKICAgIC8vICAgICBpbnRfZnJvbV9zdG9yYWdlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpbnRfZnJvbV9mdW5jdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYXNzZXJ0IGFzc2V0X2Zyb21fc3RvcmFnZSA9PSBBc3NldCgxMjMpLCAid3JvbmcgYXNzZXQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC05CiAgICBpbnRjXzIgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBhc3NlcnQgYXNzZXRfZnJvbV9mdW5jdGlvbiA9PSBBc3NldCg0NTYpLCAid3JvbmcgYXNzZXQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtOAogICAgcHVzaGludCA0NTYgLy8gNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNzZXJ0IGFjY291bnRfZnJvbV9zdG9yYWdlID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtNwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fZnVuY3Rpb24gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgIndyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlID09IEFwcGxpY2F0aW9uKDEyMyksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMiAvLyAxMjMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uID09IEFwcGxpY2F0aW9uKDQ1NiksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC00CiAgICBwdXNoaW50IDQ1NiAvLyA0NTYKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzBdID09IGFyYzQuQnl0ZSg3KSwgIndyb25nIDB0aCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNwogICAgYj09CiAgICBhc3NlcnQgLy8gd3JvbmcgMHRoIGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMV0gPT0gYXJjNC5CeXRlKDgpLCAid3JvbmcgMXN0IGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA4CiAgICBiPT0KICAgIGFzc2VydCAvLyB3cm9uZyAxc3QgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVsyXSA9PSBhcmM0LkJ5dGUoOSksICJ3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDkKICAgIGI9PQogICAgYXNzZXJ0IC8vIHdyb25nIDJuZCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBhc3NlcnQgaW50X2Zyb21fc3RvcmFnZS5uYXRpdmUgPT0gMiwgIndyb25nIGludCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGludF9mcm9tX2Z1bmN0aW9uLm5hdGl2ZSA9PSAzLCAid3JvbmcgaW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIGZ1bmN0aW9uCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5tZXRob2Rfd2l0aF8xNV9hcmdzKG9uZTogdWludDY0LCB0d286IHVpbnQ2NCwgdGhyZWU6IHVpbnQ2NCwgZm91cjogdWludDY0LCBmaXZlOiB1aW50NjQsIHNpeDogdWludDY0LCBzZXZlbjogdWludDY0LCBlaWdodDogdWludDY0LCBuaW5lOiB1aW50NjQsIHRlbjogdWludDY0LCBlbGV2ZW46IHVpbnQ2NCwgdHdlbHZlOiB1aW50NjQsIHRoaXJ0ZWVuOiB1aW50NjQsIGZvdXJ0ZWVuOiB1aW50NjQsIGZpZnRlZW46IGJ5dGVzKSAtPiBieXRlczoKbWV0aG9kX3dpdGhfMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2Ni0xODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoXzE1X2FyZ3MoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBvbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0d286IFVJbnQ2NCwKICAgIC8vICAgICB0aHJlZTogVUludDY0LAogICAgLy8gICAgIGZvdXI6IFVJbnQ2NCwKICAgIC8vICAgICBmaXZlOiBVSW50NjQsCiAgICAvLyAgICAgc2l4OiBVSW50NjQsCiAgICAvLyAgICAgc2V2ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlaWdodDogVUludDY0LAogICAgLy8gICAgIG5pbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlbGV2ZW46IFVJbnQ2NCwKICAgIC8vICAgICB0d2VsdmU6IFVJbnQ2NCwKICAgIC8vICAgICB0aGlydGVlbjogVUludDY0LAogICAgLy8gICAgIGZvdXJ0ZWVuOiBVSW50NjQsCiAgICAvLyAgICAgZmlmdGVlbjogQnl0ZXMsCiAgICAvLyApIC0+IEJ5dGVzOgogICAgcHJvdG8gMTUgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgZnJhbWVfZGlnIC0xNQogICAgZnJhbWVfZGlnIC0xNAogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OQogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgZnJhbWVfZGlnIC0xMwogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICBmcmFtZV9kaWcgLTEyCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkxCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MgogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICBmcmFtZV9kaWcgLTEwCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkzCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5NAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICAvLyArIHNldmVuCiAgICAvLyArIGVpZ2h0CiAgICBmcmFtZV9kaWcgLTgKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTUKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICBmcmFtZV9kaWcgLTcKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTYKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgZnJhbWVfZGlnIC02CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk3CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICBmcmFtZV9kaWcgLTUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTgKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICBmcmFtZV9kaWcgLTQKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTkKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0yMDAKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICAvLyArIGZvdXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ni0yMDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb25lCiAgICAvLyAgICAgKyB0d28KICAgIC8vICAgICArIHRocmVlCiAgICAvLyAgICAgKyBmb3VyCiAgICAvLyAgICAgKyBmaXZlCiAgICAvLyAgICAgKyBzaXgKICAgIC8vICAgICArIHNldmVuCiAgICAvLyAgICAgKyBlaWdodAogICAgLy8gICAgICsgbmluZQogICAgLy8gICAgICsgdGVuCiAgICAvLyAgICAgKyBlbGV2ZW4KICAgIC8vICAgICArIHR3ZWx2ZQogICAgLy8gICAgICsgdGhpcnRlZW4KICAgIC8vICAgICArIGZvdXJ0ZWVuCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gcmV0dXJuIGZpZnRlZW4KICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MoYTogYnl0ZXMsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogdWludDY0LCBhc3NldDogdWludDY0LCBlOiBieXRlcywgZjogYnl0ZXMsIHBheTogdWludDY0LCBnOiBieXRlcywgaDogYnl0ZXMsIGk6IGJ5dGVzLCBqOiBieXRlcywgazogYnl0ZXMsIGw6IGJ5dGVzLCBtOiBieXRlcywgbjogYnl0ZXMsIG86IGJ5dGVzLCBwOiB1aW50NjQsIHE6IGJ5dGVzLCByOiBieXRlcywgczogYnl0ZXMsIHQ6IGJ5dGVzLCBhc3NldDI6IHVpbnQ2NCwgcGF5MjogdWludDY0LCB1OiBieXRlcywgdjogYnl0ZXMpIC0+IGJ5dGVzOgptZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNC0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZDogVUludDY0LAogICAgLy8gICAgIGFzc2V0OiBBc3NldCwKICAgIC8vICAgICBlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBmOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwYXk6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIGc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGg6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGk6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGo6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGs6IGFyYzQuVUludDY0LAogICAgLy8gICAgICMgcnVmZjogbm9xYTogRTc0MQogICAgLy8gICAgIGw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG06IGFyYzQuVUludDY0LAogICAgLy8gICAgIG46IGFyYzQuVUludDY0LAogICAgLy8gICAgIG86IGFyYzQuVUludDY0LAogICAgLy8gICAgIHA6IFVJbnQ2NCwKICAgIC8vICAgICBxOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICByOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzOiBCeXRlcywKICAgIC8vICAgICB0OiBCeXRlcywKICAgIC8vICAgICBhc3NldDI6IEFzc2V0LAogICAgLy8gICAgIHBheTI6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHU6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHY6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDI2IDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gYXNzZXJ0IG9wLlR4bi5udW1fYXBwX2FyZ3MgPT0gMTYKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEwMDAwMAogICAgZnJhbWVfZGlnIC0xOQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDEwMDAwMCAvLyAxMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gYXNzZXJ0IHBheTIuYW1vdW50ID09IDIwMDAwMAogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMjAwMDAwIC8vIDIwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBhc3NlcnQgYXNzZXQuaWQKICAgIGZyYW1lX2RpZyAtMjIKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgYXNzZXQyLmlkCiAgICBmcmFtZV9kaWcgLTQKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsb2cocyArIHQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjYKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gKyBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gKyBjLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTEKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIGZyYW1lX2RpZyAtMjMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gKyBlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MgogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyArIGYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjUzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTQKICAgIC8vICsgZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gKyBoLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1NQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyArIGkubmF0aXZlCiAgICBmcmFtZV9kaWcgLTE2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU2CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTcKICAgIC8vICsgai5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gKyBrLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1OAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyArIGwubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEzCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU5CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNjAKICAgIC8vICsgbS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjAKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gKyBuLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI2MQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgLy8gKyBtLm5hdGl2ZQogICAgLy8gKyBuLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyArIG8ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYyCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY0CiAgICAvLyArIHEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY1CiAgICAvLyArIHIubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjUKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY2CiAgICAvLyArIHUubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjYKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyArIHYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgLy8gKyB2Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ3LTI2OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KAogICAgLy8gICAgIGEubmF0aXZlCiAgICAvLyAgICAgKyBiLm5hdGl2ZQogICAgLy8gICAgICsgYy5uYXRpdmUKICAgIC8vICAgICArIGQKICAgIC8vICAgICArIGUubmF0aXZlCiAgICAvLyAgICAgKyBmLm5hdGl2ZQogICAgLy8gICAgICsgZy5uYXRpdmUKICAgIC8vICAgICArIGgubmF0aXZlCiAgICAvLyAgICAgKyBpLm5hdGl2ZQogICAgLy8gICAgICsgai5uYXRpdmUKICAgIC8vICAgICArIGsubmF0aXZlCiAgICAvLyAgICAgKyBsLm5hdGl2ZQogICAgLy8gICAgICsgbS5uYXRpdmUKICAgIC8vICAgICArIG4ubmF0aXZlCiAgICAvLyAgICAgKyBvLm5hdGl2ZQogICAgLy8gICAgICsgcAogICAgLy8gICAgICsgcS5uYXRpdmUKICAgIC8vICAgICArIHIubmF0aXZlCiAgICAvLyAgICAgKyB1Lm5hdGl2ZQogICAgLy8gICAgICsgdi5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyByZXR1cm4gIkhlbGxvICIgKyBuYW1lICsgIiEiCiAgICBwdXNoYnl0ZXMgIkhlbGxvICIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgIiEiCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmJhcmVfYWJpX2NvbmZpZygpIC0+IHZvaWQ6CmJhcmVfYWJpX2NvbmZpZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjY2LTc2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJPcHRJbiIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJVcGRhdGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9InJlcXVpcmUiLAogICAgLy8gKQogICAgLy8gZGVmIGJhcmVfYWJpX2NvbmZpZyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3NwogICAgLy8gbG9nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgIkhlbGxvIFdvcmxkIgogICAgbG9nCiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMjMgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJhc2EiIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgxMjMpCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUKICAgIC8vIHNlbGYuYW5faW50ID0gVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImFuX2ludCIKICAgIGludGNfMyAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHNlbGYuc29tZV9ieXRlcyA9IEJ5dGVzMyhhcmM0LkJ5dGUoNyksIGFyYzQuQnl0ZSg4KSwgYXJjNC5CeXRlKDkpKQogICAgcHVzaGJ5dGVzcyAic29tZV9ieXRlcyIgMHgwNzA4MDkgLy8gInNvbWVfYnl0ZXMiLCAweDA3MDgwOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBwdXNoYnl0ZXMgImNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIHNlbGYuYXBwID0gQXBwbGljYXRpb24oMTIzKQogICAgcHVzaGJ5dGVzICJhcHAiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzAKICAgIC8vIGFzc2VydCBhcmM0LmFyYzRfc2lnbmF0dXJlKCJnZXQodWludDY0LGJ5dGVbXSlieXRlW10iKSwgImhhcyBtZXRob2Qgc2VsZWN0b3IiCiAgICBwdXNoYnl0ZXMgMHgxODkzOTJjNSAvLyBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGxlbgogICAgYXNzZXJ0IC8vIGhhcyBtZXRob2Qgc2VsZWN0b3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOAogICAgcHVzaGJ5dGVzcyAweGQ3OGRiMzViIDB4M2E1MzUzZmMgMHhkMmYyZjUzYyAweDI4MjZiMjAyIDB4NmY4ZTk0Y2QgMHgxN2RjNjhmMCAweDdmYWQ5NzgwIDB4MmZkZjk1YTQgMHgxMzk5ODI2YyAweGExMzAwODIxIDB4NjVmNGNiOWIgMHg1NzMyMTk1YSAweGQxNzU1MmZiIDB4OTAyM2JiMTkgLy8gbWV0aG9kICJub29wX3dpdGhfdWludDY0KHVpbnQ2NCl1aW50OCIsIG1ldGhvZCAiYWxsX3RoZV90aGluZ3ModWludDY0KXVpbnQ4IiwgbWV0aG9kICJtaXhlZF9vY2EodWludDY0KXVpbnQ4IiwgbWV0aG9kICJvcHRfaW50b19hc3NldChhc3NldCl2b2lkIiwgbWV0aG9kICJ3aXRoX3RyYW5zYWN0aW9ucyhhc3NldCx1aW50NjQscGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjb21wYXJlX2Fzc2V0cyhhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2Fzc2V0KCl1aW50NjQiLCBtZXRob2QgImdldF9hcHBsaWNhdGlvbigpdWludDY0IiwgbWV0aG9kICJnZXRfYW5faW50KCl1aW50NjQiLCBtZXRob2QgIm1ldGhvZF93aXRoX2RlZmF1bHRfYXJncyhhc3NldCxhc3NldCxhY2NvdW50LGFjY291bnQsYXBwbGljYXRpb24sYXBwbGljYXRpb24sYnl0ZVszXSx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm1ldGhvZF93aXRoXzE1X2FyZ3ModWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxhc3NldCxwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbm9vcF93aXRoX3VpbnQ2NF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FsbF90aGVfdGhpbmdzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aXRoX3RyYW5zYWN0aW9uc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FkZHJlc3Nfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FuX2ludF9yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3Nfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb193aXRoX2FsZ29weV9zdHJpbmdfcm91dGVAMTUKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25vb3Bfd2l0aF91aW50NjRfcm91dGVAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBub29wX3dpdGhfdWludDY0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hbGxfdGhlX3RoaW5nc19yb3V0ZUAzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBjYWxsc3ViIGZ1bGxfYWJpX2NvbmZpZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCAzNyAvLyAzNwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3Qgb25lIG9mIE5vT3AsIENsb3NlT3V0LCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgY2FsbHN1YiBtaXhlZF9vY2EKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDU6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcHRfaW50b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVANjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgd2l0aF90cmFuc2FjdGlvbnMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY29tcGFyZV9hc3NldHMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hZGRyZXNzX3JvdXRlQDg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTA6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYXBwbGljYXRpb24iKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcHAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hbl9pbnRfcm91dGVAMTE6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYW5faW50IikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYV9pbnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoX2RlZmF1bHRfYXJnc19yb3V0ZUAxMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoX2RlZmF1bHRfYXJncwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBtZXRob2Rfd2l0aF8xNV9hcmdzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3Nfcm91dGVAMTQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMjQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQ1IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA1MyA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2hlbGxvX3dpdGhfYWxnb3B5X3N0cmluZ19yb3V0ZUAxNToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBoZWxsb193aXRoX2FsZ29weV9zdHJpbmcKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIC8vIGRlZiBiYXJlX2FiaV9jb25maWcoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYmFyZV9hYmlfY29uZmlnCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm5vb3Bfd2l0aF91aW50NjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpub29wX3dpdGhfdWludDY0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzItMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vb3Bfd2l0aF91aW50NjQoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSAxICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZnVsbF9hYmlfY29uZmlnKGE6IGJ5dGVzKSAtPiBieXRlczoKZnVsbF9hYmlfY29uZmlnOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgZnVsbF9hYmlfY29uZmlnKHNlbGYsIGE6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MAogICAgLy8gcmVzdWx0ID0gVUludDY0KDEpICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWl4ZWRfb2NhKGE6IGJ5dGVzKSAtPiBieXRlczoKbWl4ZWRfb2NhOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTMtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJkaXNhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIC8vIGRlZiBtaXhlZF9vY2Eoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXN1bHQgPSBVSW50NjQoMSkgKyBhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KHJlc3VsdCkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcHRfaW50b19hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyAjIE9ubHkgYWxsb3cgYXBwIGNyZWF0b3IgdG8gb3B0IHRoZSBhcHAgYWNjb3VudCBpbnRvIGEgQVNBCiAgICAvLyBhc3NlcnQgb3AuVHhuLnNlbmRlciA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIGNhbiBvcHQgaW4gdG8gQVNBIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODMtODQKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzYSwgIkFTQSBhbHJlYWR5IG9wdGVkIGluIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2EgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQVNBIGFscmVhZHkgb3B0ZWQgaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWNfMSAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODgtODkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBvcC5JVHhuQ3JlYXRlLmJlZ2luKCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIpCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF9mZWUoVUludDY0KDApKSAgIyBjb3ZlciBmZWUgd2l0aCBvdXRlciB0eG4KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X2Fzc2V0X3JlY2VpdmVyKG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfeGZlcl9hc3NldChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uud2l0aF90cmFuc2FjdGlvbnMoYXNzZXQ6IHVpbnQ2NCwgYW5faW50OiBieXRlcywgcGF5OiB1aW50NjQsIGFub3RoZXJfaW50OiBieXRlcykgLT4gdm9pZDoKd2l0aF90cmFuc2FjdGlvbnM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5Ni0xMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHdpdGhfdHJhbnNhY3Rpb25zKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFuX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhbm90aGVyX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IHNlbGYuYXNhID09IGFzc2V0LCAiaXMgY29ycmVjdCBhc3NldCIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgYXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFuX2ludC5uYXRpdmUgPT0gMSwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgcGF5LnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJpcyBwYXltZW50IHRvIGFwcCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIHBheW1lbnQgdG8gYXBwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCBhbm90aGVyX2ludC5uYXRpdmUgPT0gMiwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuY29tcGFyZV9hc3NldHMoYXNzZXRfYTogdWludDY0LCBhc3NldF9iOiB1aW50NjQpIC0+IHZvaWQ6CmNvbXBhcmVfYXNzZXRzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY29tcGFyZV9hc3NldHMoc2VsZiwgYXNzZXRfYTogQXNzZXQsIGFzc2V0X2I6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIGFzc2VydCBhc3NldF9hID09IGFzc2V0X2IsICJhc3NldCBhID09IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhID09IGIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hZGRyZXNzKCkgLT4gYnl0ZXM6CmdldF9hZGRyZXNzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FkZHJlc3Moc2VsZikgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3MoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYXNzZXQoKSAtPiBieXRlczoKZ2V0X2Fzc2V0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCg0NTYpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2FwcCgpIC0+IGJ5dGVzOgpnZXRfYXBwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICAvLyBkZWYgZ2V0X2FwcChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoNDU2KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAxYzgKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hX2ludCgpIC0+IGJ5dGVzOgpnZXRfYV9pbnQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FuX2ludCIpCiAgICAvLyBkZWYgZ2V0X2FfaW50KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKGFzc2V0X2Zyb21fc3RvcmFnZTogdWludDY0LCBhc3NldF9mcm9tX2Z1bmN0aW9uOiB1aW50NjQsIGFjY291bnRfZnJvbV9zdG9yYWdlOiBieXRlcywgYWNjb3VudF9mcm9tX2Z1bmN0aW9uOiBieXRlcywgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiB1aW50NjQsIGFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb246IHVpbnQ2NCwgYnl0ZXNfZnJvbV9zdG9yYWdlOiBieXRlcywgaW50X2Zyb21fc3RvcmFnZTogYnl0ZXMsIGludF9mcm9tX2Z1bmN0aW9uOiBieXRlcykgLT4gdm9pZDoKbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICAvLyBkZWYgbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfZnJvbV9zdG9yYWdlOiBBc3NldCwKICAgIC8vICAgICBhc3NldF9mcm9tX2Z1bmN0aW9uOiBBc3NldCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fc3RvcmFnZTogQWNjb3VudCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fZnVuY3Rpb246IEFjY291bnQsCiAgICAvLyAgICAgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBieXRlc19mcm9tX3N0b3JhZ2U6IEJ5dGVzMywKICAgIC8vICAgICBpbnRfZnJvbV9zdG9yYWdlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpbnRfZnJvbV9mdW5jdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYXNzZXJ0IGFzc2V0X2Zyb21fc3RvcmFnZSA9PSBBc3NldCgxMjMpLCAid3JvbmcgYXNzZXQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC05CiAgICBpbnRjXzIgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBhc3NlcnQgYXNzZXRfZnJvbV9mdW5jdGlvbiA9PSBBc3NldCg0NTYpLCAid3JvbmcgYXNzZXQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtOAogICAgcHVzaGludCA0NTYgLy8gNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNzZXJ0IGFjY291bnRfZnJvbV9zdG9yYWdlID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtNwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fZnVuY3Rpb24gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgIndyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlID09IEFwcGxpY2F0aW9uKDEyMyksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMiAvLyAxMjMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uID09IEFwcGxpY2F0aW9uKDQ1NiksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC00CiAgICBwdXNoaW50IDQ1NiAvLyA0NTYKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzBdID09IGFyYzQuQnl0ZSg3KSwgIndyb25nIDB0aCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNwogICAgYj09CiAgICBhc3NlcnQgLy8gd3JvbmcgMHRoIGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMV0gPT0gYXJjNC5CeXRlKDgpLCAid3JvbmcgMXN0IGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA4CiAgICBiPT0KICAgIGFzc2VydCAvLyB3cm9uZyAxc3QgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVsyXSA9PSBhcmM0LkJ5dGUoOSksICJ3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDkKICAgIGI9PQogICAgYXNzZXJ0IC8vIHdyb25nIDJuZCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBhc3NlcnQgaW50X2Zyb21fc3RvcmFnZS5uYXRpdmUgPT0gMiwgIndyb25nIGludCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGludF9mcm9tX2Z1bmN0aW9uLm5hdGl2ZSA9PSAzLCAid3JvbmcgaW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIGZ1bmN0aW9uCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5tZXRob2Rfd2l0aF8xNV9hcmdzKG9uZTogdWludDY0LCB0d286IHVpbnQ2NCwgdGhyZWU6IHVpbnQ2NCwgZm91cjogdWludDY0LCBmaXZlOiB1aW50NjQsIHNpeDogdWludDY0LCBzZXZlbjogdWludDY0LCBlaWdodDogdWludDY0LCBuaW5lOiB1aW50NjQsIHRlbjogdWludDY0LCBlbGV2ZW46IHVpbnQ2NCwgdHdlbHZlOiB1aW50NjQsIHRoaXJ0ZWVuOiB1aW50NjQsIGZvdXJ0ZWVuOiB1aW50NjQsIGZpZnRlZW46IGJ5dGVzKSAtPiBieXRlczoKbWV0aG9kX3dpdGhfMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2Ni0xODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoXzE1X2FyZ3MoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBvbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0d286IFVJbnQ2NCwKICAgIC8vICAgICB0aHJlZTogVUludDY0LAogICAgLy8gICAgIGZvdXI6IFVJbnQ2NCwKICAgIC8vICAgICBmaXZlOiBVSW50NjQsCiAgICAvLyAgICAgc2l4OiBVSW50NjQsCiAgICAvLyAgICAgc2V2ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlaWdodDogVUludDY0LAogICAgLy8gICAgIG5pbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlbGV2ZW46IFVJbnQ2NCwKICAgIC8vICAgICB0d2VsdmU6IFVJbnQ2NCwKICAgIC8vICAgICB0aGlydGVlbjogVUludDY0LAogICAgLy8gICAgIGZvdXJ0ZWVuOiBVSW50NjQsCiAgICAvLyAgICAgZmlmdGVlbjogQnl0ZXMsCiAgICAvLyApIC0+IEJ5dGVzOgogICAgcHJvdG8gMTUgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgZnJhbWVfZGlnIC0xNQogICAgZnJhbWVfZGlnIC0xNAogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OQogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgZnJhbWVfZGlnIC0xMwogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICBmcmFtZV9kaWcgLTEyCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkxCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MgogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICBmcmFtZV9kaWcgLTEwCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkzCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5NAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICAvLyArIHNldmVuCiAgICAvLyArIGVpZ2h0CiAgICBmcmFtZV9kaWcgLTgKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTUKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICBmcmFtZV9kaWcgLTcKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTYKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgZnJhbWVfZGlnIC02CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk3CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICBmcmFtZV9kaWcgLTUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTgKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICBmcmFtZV9kaWcgLTQKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTkKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0yMDAKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICAvLyArIGZvdXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ni0yMDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb25lCiAgICAvLyAgICAgKyB0d28KICAgIC8vICAgICArIHRocmVlCiAgICAvLyAgICAgKyBmb3VyCiAgICAvLyAgICAgKyBmaXZlCiAgICAvLyAgICAgKyBzaXgKICAgIC8vICAgICArIHNldmVuCiAgICAvLyAgICAgKyBlaWdodAogICAgLy8gICAgICsgbmluZQogICAgLy8gICAgICsgdGVuCiAgICAvLyAgICAgKyBlbGV2ZW4KICAgIC8vICAgICArIHR3ZWx2ZQogICAgLy8gICAgICsgdGhpcnRlZW4KICAgIC8vICAgICArIGZvdXJ0ZWVuCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gcmV0dXJuIGZpZnRlZW4KICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MoYTogYnl0ZXMsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogdWludDY0LCBhc3NldDogdWludDY0LCBlOiBieXRlcywgZjogYnl0ZXMsIHBheTogdWludDY0LCBnOiBieXRlcywgaDogYnl0ZXMsIGk6IGJ5dGVzLCBqOiBieXRlcywgazogYnl0ZXMsIGw6IGJ5dGVzLCBtOiBieXRlcywgbjogYnl0ZXMsIG86IGJ5dGVzLCBwOiB1aW50NjQsIHE6IGJ5dGVzLCByOiBieXRlcywgczogYnl0ZXMsIHQ6IGJ5dGVzLCBhc3NldDI6IHVpbnQ2NCwgcGF5MjogdWludDY0LCB1OiBieXRlcywgdjogYnl0ZXMpIC0+IGJ5dGVzOgptZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNC0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZDogVUludDY0LAogICAgLy8gICAgIGFzc2V0OiBBc3NldCwKICAgIC8vICAgICBlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBmOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwYXk6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIGc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGg6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGk6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGo6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGs6IGFyYzQuVUludDY0LAogICAgLy8gICAgICMgcnVmZjogbm9xYTogRTc0MQogICAgLy8gICAgIGw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG06IGFyYzQuVUludDY0LAogICAgLy8gICAgIG46IGFyYzQuVUludDY0LAogICAgLy8gICAgIG86IGFyYzQuVUludDY0LAogICAgLy8gICAgIHA6IFVJbnQ2NCwKICAgIC8vICAgICBxOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICByOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzOiBCeXRlcywKICAgIC8vICAgICB0OiBCeXRlcywKICAgIC8vICAgICBhc3NldDI6IEFzc2V0LAogICAgLy8gICAgIHBheTI6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHU6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHY6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDI2IDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gYXNzZXJ0IG9wLlR4bi5udW1fYXBwX2FyZ3MgPT0gMTYKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEwMDAwMAogICAgZnJhbWVfZGlnIC0xOQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDEwMDAwMCAvLyAxMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gYXNzZXJ0IHBheTIuYW1vdW50ID09IDIwMDAwMAogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMjAwMDAwIC8vIDIwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBhc3NlcnQgYXNzZXQuaWQKICAgIGZyYW1lX2RpZyAtMjIKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgYXNzZXQyLmlkCiAgICBmcmFtZV9kaWcgLTQKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsb2cocyArIHQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjYKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gKyBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gKyBjLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTEKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIGZyYW1lX2RpZyAtMjMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gKyBlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MgogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyArIGYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjUzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTQKICAgIC8vICsgZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gKyBoLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1NQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyArIGkubmF0aXZlCiAgICBmcmFtZV9kaWcgLTE2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU2CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTcKICAgIC8vICsgai5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gKyBrLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1OAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyArIGwubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEzCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU5CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNjAKICAgIC8vICsgbS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjAKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gKyBuLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI2MQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgLy8gKyBtLm5hdGl2ZQogICAgLy8gKyBuLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyArIG8ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYyCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY0CiAgICAvLyArIHEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY1CiAgICAvLyArIHIubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjUKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY2CiAgICAvLyArIHUubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjYKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyArIHYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgLy8gKyB2Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ3LTI2OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KAogICAgLy8gICAgIGEubmF0aXZlCiAgICAvLyAgICAgKyBiLm5hdGl2ZQogICAgLy8gICAgICsgYy5uYXRpdmUKICAgIC8vICAgICArIGQKICAgIC8vICAgICArIGUubmF0aXZlCiAgICAvLyAgICAgKyBmLm5hdGl2ZQogICAgLy8gICAgICsgZy5uYXRpdmUKICAgIC8vICAgICArIGgubmF0aXZlCiAgICAvLyAgICAgKyBpLm5hdGl2ZQogICAgLy8gICAgICsgai5uYXRpdmUKICAgIC8vICAgICArIGsubmF0aXZlCiAgICAvLyAgICAgKyBsLm5hdGl2ZQogICAgLy8gICAgICsgbS5uYXRpdmUKICAgIC8vICAgICArIG4ubmF0aXZlCiAgICAvLyAgICAgKyBvLm5hdGl2ZQogICAgLy8gICAgICsgcAogICAgLy8gICAgICsgcS5uYXRpdmUKICAgIC8vICAgICArIHIubmF0aXZlCiAgICAvLyAgICAgKyB1Lm5hdGl2ZQogICAgLy8gICAgICsgdi5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyByZXR1cm4gIkhlbGxvICIgKyBuYW1lICsgIiEiCiAgICBwdXNoYnl0ZXMgIkhlbGxvICIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgIiEiCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmJhcmVfYWJpX2NvbmZpZygpIC0+IHZvaWQ6CmJhcmVfYWJpX2NvbmZpZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjY2LTc2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJPcHRJbiIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJVcGRhdGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9InJlcXVpcmUiLAogICAgLy8gKQogICAgLy8gZGVmIGJhcmVfYWJpX2NvbmZpZyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3NwogICAgLy8gbG9nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgIkhlbGxvIFdvcmxkIgogICAgbG9nCiAgICByZXRzdWIK",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
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..5e44f70d37
--- /dev/null
+++ b/test_cases/abi_routing/out/Reference.arc56.json
@@ -0,0 +1,798 @@
+{
+ "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": "all_the_things",
+ "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_application",
+ "args": [],
+ "returns": {
+ "type": "uint64"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": true,
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "name": "get_an_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,
+ "desc": "Fifteen args should not encode the last argument as a tuple",
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "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,
+ "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.",
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "name": "hello_with_algopy_string",
+ "args": [
+ {
+ "type": "string",
+ "name": "name"
+ }
+ ],
+ "returns": {
+ "type": "string"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [],
+ "recommendations": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 829
+ ],
+ "errorMessage": "ASA already opted in"
+ },
+ {
+ "pc": [
+ 219,
+ 273,
+ 291,
+ 325,
+ 349,
+ 365,
+ 381,
+ 397,
+ 413,
+ 470,
+ 556,
+ 720
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 254
+ ],
+ "errorMessage": "OnCompletion is not one of NoOp, CloseOut, DeleteApplication"
+ },
+ {
+ "pc": [
+ 823
+ ],
+ "errorMessage": "Only creator can opt in to ASA"
+ },
+ {
+ "pc": [
+ 892
+ ],
+ "errorMessage": "asset a == b"
+ },
+ {
+ "pc": [
+ 768
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 222,
+ 257,
+ 276,
+ 294,
+ 328,
+ 352,
+ 368,
+ 384,
+ 400,
+ 416,
+ 473,
+ 559,
+ 723
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 827,
+ 858
+ ],
+ "errorMessage": "check self.asa exists"
+ },
+ {
+ "pc": [
+ 99
+ ],
+ "errorMessage": "has method selector"
+ },
+ {
+ "pc": [
+ 862
+ ],
+ "errorMessage": "is correct asset"
+ },
+ {
+ "pc": [
+ 868,
+ 882
+ ],
+ "errorMessage": "is correct int"
+ },
+ {
+ "pc": [
+ 876
+ ],
+ "errorMessage": "is payment to app"
+ },
+ {
+ "pc": [
+ 313,
+ 594,
+ 695
+ ],
+ "errorMessage": "transaction type is pay"
+ },
+ {
+ "pc": [
+ 972
+ ],
+ "errorMessage": "wrong 0th byte from storage"
+ },
+ {
+ "pc": [
+ 982
+ ],
+ "errorMessage": "wrong 1st byte from storage"
+ },
+ {
+ "pc": [
+ 992
+ ],
+ "errorMessage": "wrong 2nd byte from storage"
+ },
+ {
+ "pc": [
+ 950
+ ],
+ "errorMessage": "wrong account from function"
+ },
+ {
+ "pc": [
+ 944
+ ],
+ "errorMessage": "wrong account from storage"
+ },
+ {
+ "pc": [
+ 962
+ ],
+ "errorMessage": "wrong application from function"
+ },
+ {
+ "pc": [
+ 955
+ ],
+ "errorMessage": "wrong application from storage"
+ },
+ {
+ "pc": [
+ 938
+ ],
+ "errorMessage": "wrong asset from function"
+ },
+ {
+ "pc": [
+ 931
+ ],
+ "errorMessage": "wrong asset from storage"
+ },
+ {
+ "pc": [
+ 1005
+ ],
+ "errorMessage": "wrong int from function"
+ },
+ {
+ "pc": [
+ 998
+ ],
+ "errorMessage": "wrong int from storage"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMjMgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJhc2EiIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNAogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgxMjMpCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUKICAgIC8vIHNlbGYuYW5faW50ID0gVUludDY0KDIpCiAgICBwdXNoYnl0ZXMgImFuX2ludCIKICAgIGludGNfMyAvLyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHNlbGYuc29tZV9ieXRlcyA9IEJ5dGVzMyhhcmM0LkJ5dGUoNyksIGFyYzQuQnl0ZSg4KSwgYXJjNC5CeXRlKDkpKQogICAgcHVzaGJ5dGVzcyAic29tZV9ieXRlcyIgMHgwNzA4MDkgLy8gInNvbWVfYnl0ZXMiLCAweDA3MDgwOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmNyZWF0b3IgPSBvcC5UeG4uc2VuZGVyCiAgICBwdXNoYnl0ZXMgImNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjgKICAgIC8vIHNlbGYuYXBwID0gQXBwbGljYXRpb24oMTIzKQogICAgcHVzaGJ5dGVzICJhcHAiCiAgICBpbnRjXzIgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzAKICAgIC8vIGFzc2VydCBhcmM0LmFyYzRfc2lnbmF0dXJlKCJnZXQodWludDY0LGJ5dGVbXSlieXRlW10iKSwgImhhcyBtZXRob2Qgc2VsZWN0b3IiCiAgICBwdXNoYnl0ZXMgMHgxODkzOTJjNSAvLyBtZXRob2QgImdldCh1aW50NjQsYnl0ZVtdKWJ5dGVbXSIKICAgIGxlbgogICAgYXNzZXJ0IC8vIGhhcyBtZXRob2Qgc2VsZWN0b3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOAogICAgcHVzaGJ5dGVzcyAweGQ3OGRiMzViIDB4M2E1MzUzZmMgMHhkMmYyZjUzYyAweDI4MjZiMjAyIDB4NmY4ZTk0Y2QgMHgxN2RjNjhmMCAweDdmYWQ5NzgwIDB4MmZkZjk1YTQgMHgxMzk5ODI2YyAweGExMzAwODIxIDB4NjVmNGNiOWIgMHg1NzMyMTk1YSAweGQxNzU1MmZiIDB4OTAyM2JiMTkgLy8gbWV0aG9kICJub29wX3dpdGhfdWludDY0KHVpbnQ2NCl1aW50OCIsIG1ldGhvZCAiYWxsX3RoZV90aGluZ3ModWludDY0KXVpbnQ4IiwgbWV0aG9kICJtaXhlZF9vY2EodWludDY0KXVpbnQ4IiwgbWV0aG9kICJvcHRfaW50b19hc3NldChhc3NldCl2b2lkIiwgbWV0aG9kICJ3aXRoX3RyYW5zYWN0aW9ucyhhc3NldCx1aW50NjQscGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjb21wYXJlX2Fzc2V0cyhhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJnZXRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2Fzc2V0KCl1aW50NjQiLCBtZXRob2QgImdldF9hcHBsaWNhdGlvbigpdWludDY0IiwgbWV0aG9kICJnZXRfYW5faW50KCl1aW50NjQiLCBtZXRob2QgIm1ldGhvZF93aXRoX2RlZmF1bHRfYXJncyhhc3NldCxhc3NldCxhY2NvdW50LGFjY291bnQsYXBwbGljYXRpb24sYXBwbGljYXRpb24sYnl0ZVszXSx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgIm1ldGhvZF93aXRoXzE1X2FyZ3ModWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYXNzZXQsdWludDY0LHVpbnQ2NCxwYXksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdLGJ5dGVbXSxhc3NldCxwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbm9vcF93aXRoX3VpbnQ2NF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FsbF90aGVfdGhpbmdzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aXRoX3RyYW5zYWN0aW9uc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FkZHJlc3Nfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FuX2ludF9yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3Nfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnc19yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb193aXRoX2FsZ29weV9zdHJpbmdfcm91dGVAMTUKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX25vb3Bfd2l0aF91aW50NjRfcm91dGVAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBub29wX3dpdGhfdWludDY0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hbGxfdGhlX3RoaW5nc19yb3V0ZUAzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBjYWxsc3ViIGZ1bGxfYWJpX2NvbmZpZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWl4ZWRfb2NhX3JvdXRlQDQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCAzNyAvLyAzNwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3Qgb25lIG9mIE5vT3AsIENsb3NlT3V0LCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgY2FsbHN1YiBtaXhlZF9vY2EKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDU6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcHRfaW50b19hc3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVANjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgd2l0aF90cmFuc2FjdGlvbnMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbXBhcmVfYXNzZXRzX3JvdXRlQDc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY29tcGFyZV9hc3NldHMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hZGRyZXNzX3JvdXRlQDg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXNzZXRfcm91dGVAOToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXBwbGljYXRpb25fcm91dGVAMTA6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYXBwbGljYXRpb24iKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcHAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hbl9pbnRfcm91dGVAMTE6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYW5faW50IikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYV9pbnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoX2RlZmF1bHRfYXJnc19yb3V0ZUAxMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoX2RlZmF1bHRfYXJncwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfMTVfYXJnc19yb3V0ZUAxMzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBtZXRob2Rfd2l0aF8xNV9hcmdzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3Nfcm91dGVAMTQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMjQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZHVwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQ1IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA1MyA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2hlbGxvX3dpdGhfYWxnb3B5X3N0cmluZ19yb3V0ZUAxNToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBoZWxsb193aXRoX2FsZ29weV9zdHJpbmcKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIC8vIGRlZiBiYXJlX2FiaV9jb25maWcoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYmFyZV9hYmlfY29uZmlnCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm5vb3Bfd2l0aF91aW50NjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpub29wX3dpdGhfdWludDY0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzItMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG5vb3Bfd2l0aF91aW50NjQoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM0CiAgICAvLyByZXN1bHQgPSAxICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZnVsbF9hYmlfY29uZmlnKGE6IGJ5dGVzKSAtPiBieXRlczoKZnVsbF9hYmlfY29uZmlnOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MzctNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLk9wdEluLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLlVwZGF0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgICAgICBPbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgbmFtZT0iYWxsX3RoZV90aGluZ3MiLAogICAgLy8gICAgIGNyZWF0ZT0iYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgZnVsbF9hYmlfY29uZmlnKHNlbGYsIGE6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MAogICAgLy8gcmVzdWx0ID0gVUludDY0KDEpICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWl4ZWRfb2NhKGE6IGJ5dGVzKSAtPiBieXRlczoKbWl4ZWRfb2NhOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTMtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJkaXNhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIC8vIGRlZiBtaXhlZF9vY2Eoc2VsZiwgYTogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjYzCiAgICAvLyByZXN1bHQgPSBVSW50NjQoMSkgKyBhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KHJlc3VsdCkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcHRfaW50b19hc3NldChzZWxmLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyAjIE9ubHkgYWxsb3cgYXBwIGNyZWF0b3IgdG8gb3B0IHRoZSBhcHAgYWNjb3VudCBpbnRvIGEgQVNBCiAgICAvLyBhc3NlcnQgb3AuVHhuLnNlbmRlciA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSBjcmVhdG9yIGNhbiBvcHQgaW4gdG8gQVNBIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODMtODQKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzYSwgIkFTQSBhbHJlYWR5IG9wdGVkIGluIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2EgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQVNBIGFscmVhZHkgb3B0ZWQgaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojg1LTg2CiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWNfMSAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6ODgtODkKICAgIC8vICMgU3VibWl0IG9wdC1pbiB0cmFuc2FjdGlvbjogMCBhc3NldCB0cmFuc2ZlciB0byBzZWxmCiAgICAvLyBvcC5JVHhuQ3JlYXRlLmJlZ2luKCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF90eXBlX2VudW0oVHJhbnNhY3Rpb25UeXBlLkFzc2V0VHJhbnNmZXIpCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF9mZWUoVUludDY0KDApKSAgIyBjb3ZlciBmZWUgd2l0aCBvdXRlciB0eG4KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X2Fzc2V0X3JlY2VpdmVyKG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfeGZlcl9hc3NldChhc3NldCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uud2l0aF90cmFuc2FjdGlvbnMoYXNzZXQ6IHVpbnQ2NCwgYW5faW50OiBieXRlcywgcGF5OiB1aW50NjQsIGFub3RoZXJfaW50OiBieXRlcykgLT4gdm9pZDoKd2l0aF90cmFuc2FjdGlvbnM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5Ni0xMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHdpdGhfdHJhbnNhY3Rpb25zKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXQ6IEFzc2V0LAogICAgLy8gICAgIGFuX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhbm90aGVyX2ludDogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gYXNzZXJ0IHNlbGYuYXNhID09IGFzc2V0LCAiaXMgY29ycmVjdCBhc3NldCIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIGNvcnJlY3QgYXNzZXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFuX2ludC5uYXRpdmUgPT0gMSwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA2CiAgICAvLyBhc3NlcnQgcGF5LnJlY2VpdmVyID09IG9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJpcyBwYXltZW50IHRvIGFwcCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGlzIHBheW1lbnQgdG8gYXBwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDcKICAgIC8vIGFzc2VydCBhbm90aGVyX2ludC5uYXRpdmUgPT0gMiwgImlzIGNvcnJlY3QgaW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGludAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuY29tcGFyZV9hc3NldHMoYXNzZXRfYTogdWludDY0LCBhc3NldF9iOiB1aW50NjQpIC0+IHZvaWQ6CmNvbXBhcmVfYXNzZXRzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY29tcGFyZV9hc3NldHMoc2VsZiwgYXNzZXRfYTogQXNzZXQsIGFzc2V0X2I6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTEKICAgIC8vIGFzc2VydCBhc3NldF9hID09IGFzc2V0X2IsICJhc3NldCBhID09IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhID09IGIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hZGRyZXNzKCkgLT4gYnl0ZXM6CmdldF9hZGRyZXNzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FkZHJlc3Moc2VsZikgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTUKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3MoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYXNzZXQoKSAtPiBieXRlczoKZ2V0X2Fzc2V0OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE3LTExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCg0NTYpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2FwcCgpIC0+IGJ5dGVzOgpnZXRfYXBwOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIxLTEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICAvLyBkZWYgZ2V0X2FwcChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoNDU2KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAxYzgKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hX2ludCgpIC0+IGJ5dGVzOgpnZXRfYV9pbnQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgbmFtZT0iZ2V0X2FuX2ludCIpCiAgICAvLyBkZWYgZ2V0X2FfaW50KHNlbGYpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjcKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKGFzc2V0X2Zyb21fc3RvcmFnZTogdWludDY0LCBhc3NldF9mcm9tX2Z1bmN0aW9uOiB1aW50NjQsIGFjY291bnRfZnJvbV9zdG9yYWdlOiBieXRlcywgYWNjb3VudF9mcm9tX2Z1bmN0aW9uOiBieXRlcywgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiB1aW50NjQsIGFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb246IHVpbnQ2NCwgYnl0ZXNfZnJvbV9zdG9yYWdlOiBieXRlcywgaW50X2Zyb21fc3RvcmFnZTogYnl0ZXMsIGludF9mcm9tX2Z1bmN0aW9uOiBieXRlcykgLT4gdm9pZDoKbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI5LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX3N0b3JhZ2UiOiAiYXNhIiwKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fZnVuY3Rpb24iOiBnZXRfYXNzZXQsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fc3RvcmFnZSI6ICJjcmVhdG9yIiwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYWRkcmVzcyIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX3N0b3JhZ2UiOiAiYXBwIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fZnVuY3Rpb24iOiBnZXRfYXBwLAogICAgLy8gICAgICAgICAiYnl0ZXNfZnJvbV9zdG9yYWdlIjogInNvbWVfYnl0ZXMiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fc3RvcmFnZSI6ICJhbl9pbnQiLAogICAgLy8gICAgICAgICAiaW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FfaW50IiwKICAgIC8vICAgICB9CiAgICAvLyApCiAgICAvLyBkZWYgbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfZnJvbV9zdG9yYWdlOiBBc3NldCwKICAgIC8vICAgICBhc3NldF9mcm9tX2Z1bmN0aW9uOiBBc3NldCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fc3RvcmFnZTogQWNjb3VudCwKICAgIC8vICAgICBhY2NvdW50X2Zyb21fZnVuY3Rpb246IEFjY291bnQsCiAgICAvLyAgICAgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uOiBBcHBsaWNhdGlvbiwKICAgIC8vICAgICBieXRlc19mcm9tX3N0b3JhZ2U6IEJ5dGVzMywKICAgIC8vICAgICBpbnRfZnJvbV9zdG9yYWdlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpbnRfZnJvbV9mdW5jdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYXNzZXJ0IGFzc2V0X2Zyb21fc3RvcmFnZSA9PSBBc3NldCgxMjMpLCAid3JvbmcgYXNzZXQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC05CiAgICBpbnRjXzIgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU1CiAgICAvLyBhc3NlcnQgYXNzZXRfZnJvbV9mdW5jdGlvbiA9PSBBc3NldCg0NTYpLCAid3JvbmcgYXNzZXQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtOAogICAgcHVzaGludCA0NTYgLy8gNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFzc2V0IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gYXNzZXJ0IGFjY291bnRfZnJvbV9zdG9yYWdlID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtNwogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTcKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fZnVuY3Rpb24gPT0gb3AuR2xvYmFsLnplcm9fYWRkcmVzcywgIndyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFjY291bnQgZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU4CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlID09IEFwcGxpY2F0aW9uKDEyMyksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMiAvLyAxMjMKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uID09IEFwcGxpY2F0aW9uKDQ1NiksICJ3cm9uZyBhcHBsaWNhdGlvbiBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC00CiAgICBwdXNoaW50IDQ1NiAvLyA0NTYKICAgID09CiAgICBhc3NlcnQgLy8gd3JvbmcgYXBwbGljYXRpb24gZnJvbSBmdW5jdGlvbgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYwCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzBdID09IGFyYzQuQnl0ZSg3KSwgIndyb25nIDB0aCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwNwogICAgYj09CiAgICBhc3NlcnQgLy8gd3JvbmcgMHRoIGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjEKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMV0gPT0gYXJjNC5CeXRlKDgpLCAid3JvbmcgMXN0IGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA4CiAgICBiPT0KICAgIGFzc2VydCAvLyB3cm9uZyAxc3QgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVsyXSA9PSBhcmM0LkJ5dGUoOSksICJ3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDkKICAgIGI9PQogICAgYXNzZXJ0IC8vIHdyb25nIDJuZCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYzCiAgICAvLyBhc3NlcnQgaW50X2Zyb21fc3RvcmFnZS5uYXRpdmUgPT0gMiwgIndyb25nIGludCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGludF9mcm9tX2Z1bmN0aW9uLm5hdGl2ZSA9PSAzLCAid3JvbmcgaW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGludCBmcm9tIGZ1bmN0aW9uCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5tZXRob2Rfd2l0aF8xNV9hcmdzKG9uZTogdWludDY0LCB0d286IHVpbnQ2NCwgdGhyZWU6IHVpbnQ2NCwgZm91cjogdWludDY0LCBmaXZlOiB1aW50NjQsIHNpeDogdWludDY0LCBzZXZlbjogdWludDY0LCBlaWdodDogdWludDY0LCBuaW5lOiB1aW50NjQsIHRlbjogdWludDY0LCBlbGV2ZW46IHVpbnQ2NCwgdHdlbHZlOiB1aW50NjQsIHRoaXJ0ZWVuOiB1aW50NjQsIGZvdXJ0ZWVuOiB1aW50NjQsIGZpZnRlZW46IGJ5dGVzKSAtPiBieXRlczoKbWV0aG9kX3dpdGhfMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2Ni0xODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoXzE1X2FyZ3MoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBvbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0d286IFVJbnQ2NCwKICAgIC8vICAgICB0aHJlZTogVUludDY0LAogICAgLy8gICAgIGZvdXI6IFVJbnQ2NCwKICAgIC8vICAgICBmaXZlOiBVSW50NjQsCiAgICAvLyAgICAgc2l4OiBVSW50NjQsCiAgICAvLyAgICAgc2V2ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlaWdodDogVUludDY0LAogICAgLy8gICAgIG5pbmU6IFVJbnQ2NCwKICAgIC8vICAgICB0ZW46IFVJbnQ2NCwKICAgIC8vICAgICBlbGV2ZW46IFVJbnQ2NCwKICAgIC8vICAgICB0d2VsdmU6IFVJbnQ2NCwKICAgIC8vICAgICB0aGlydGVlbjogVUludDY0LAogICAgLy8gICAgIGZvdXJ0ZWVuOiBVSW50NjQsCiAgICAvLyAgICAgZmlmdGVlbjogQnl0ZXMsCiAgICAvLyApIC0+IEJ5dGVzOgogICAgcHJvdG8gMTUgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgZnJhbWVfZGlnIC0xNQogICAgZnJhbWVfZGlnIC0xNAogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE4OQogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgZnJhbWVfZGlnIC0xMwogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICBmcmFtZV9kaWcgLTEyCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkxCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MgogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICBmcmFtZV9kaWcgLTEwCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTkzCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5NAogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICAvLyArIHNldmVuCiAgICAvLyArIGVpZ2h0CiAgICBmcmFtZV9kaWcgLTgKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTUKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICBmcmFtZV9kaWcgLTcKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTYKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgZnJhbWVfZGlnIC02CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk3CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICBmcmFtZV9kaWcgLTUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTgKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICBmcmFtZV9kaWcgLTQKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTkKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0yMDAKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgLy8gKyBuaW5lCiAgICAvLyArIHRlbgogICAgLy8gKyBlbGV2ZW4KICAgIC8vICsgdHdlbHZlCiAgICAvLyArIHRoaXJ0ZWVuCiAgICAvLyArIGZvdXJ0ZWVuCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ni0yMDEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb25lCiAgICAvLyAgICAgKyB0d28KICAgIC8vICAgICArIHRocmVlCiAgICAvLyAgICAgKyBmb3VyCiAgICAvLyAgICAgKyBmaXZlCiAgICAvLyAgICAgKyBzaXgKICAgIC8vICAgICArIHNldmVuCiAgICAvLyAgICAgKyBlaWdodAogICAgLy8gICAgICsgbmluZQogICAgLy8gICAgICsgdGVuCiAgICAvLyAgICAgKyBlbGV2ZW4KICAgIC8vICAgICArIHR3ZWx2ZQogICAgLy8gICAgICsgdGhpcnRlZW4KICAgIC8vICAgICArIGZvdXJ0ZWVuCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gcmV0dXJuIGZpZnRlZW4KICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3MoYTogYnl0ZXMsIGI6IGJ5dGVzLCBjOiBieXRlcywgZDogdWludDY0LCBhc3NldDogdWludDY0LCBlOiBieXRlcywgZjogYnl0ZXMsIHBheTogdWludDY0LCBnOiBieXRlcywgaDogYnl0ZXMsIGk6IGJ5dGVzLCBqOiBieXRlcywgazogYnl0ZXMsIGw6IGJ5dGVzLCBtOiBieXRlcywgbjogYnl0ZXMsIG86IGJ5dGVzLCBwOiB1aW50NjQsIHE6IGJ5dGVzLCByOiBieXRlcywgczogYnl0ZXMsIHQ6IGJ5dGVzLCBhc3NldDI6IHVpbnQ2NCwgcGF5MjogdWludDY0LCB1OiBieXRlcywgdjogYnl0ZXMpIC0+IGJ5dGVzOgptZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNC0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgYzogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZDogVUludDY0LAogICAgLy8gICAgIGFzc2V0OiBBc3NldCwKICAgIC8vICAgICBlOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBmOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwYXk6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIGc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGg6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGk6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGo6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGs6IGFyYzQuVUludDY0LAogICAgLy8gICAgICMgcnVmZjogbm9xYTogRTc0MQogICAgLy8gICAgIGw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG06IGFyYzQuVUludDY0LAogICAgLy8gICAgIG46IGFyYzQuVUludDY0LAogICAgLy8gICAgIG86IGFyYzQuVUludDY0LAogICAgLy8gICAgIHA6IFVJbnQ2NCwKICAgIC8vICAgICBxOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICByOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzOiBCeXRlcywKICAgIC8vICAgICB0OiBCeXRlcywKICAgIC8vICAgICBhc3NldDI6IEFzc2V0LAogICAgLy8gICAgIHBheTI6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHU6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHY6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDI2IDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gYXNzZXJ0IG9wLlR4bi5udW1fYXBwX2FyZ3MgPT0gMTYKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDAKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID09IDEwMDAwMAogICAgZnJhbWVfZGlnIC0xOQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDEwMDAwMCAvLyAxMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gYXNzZXJ0IHBheTIuYW1vdW50ID09IDIwMDAwMAogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMjAwMDAwIC8vIDIwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQyCiAgICAvLyBhc3NlcnQgYXNzZXQuaWQKICAgIGZyYW1lX2RpZyAtMjIKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQzCiAgICAvLyBhc3NlcnQgYXNzZXQyLmlkCiAgICBmcmFtZV9kaWcgLTQKICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ1CiAgICAvLyBsb2cocyArIHQpCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjYKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gKyBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gKyBjLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTEKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIGZyYW1lX2RpZyAtMjMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gKyBlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MgogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjUzCiAgICAvLyArIGYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjUzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTQKICAgIC8vICsgZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gKyBoLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1NQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU2CiAgICAvLyArIGkubmF0aXZlCiAgICBmcmFtZV9kaWcgLTE2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU2CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTcKICAgIC8vICsgai5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gKyBrLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1OAogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU5CiAgICAvLyArIGwubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEzCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU5CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNjAKICAgIC8vICsgbS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjAKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gKyBuLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xMQogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI2MQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgLy8gKyBtLm5hdGl2ZQogICAgLy8gKyBuLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYyCiAgICAvLyArIG8ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEwCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYyCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYzCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIGZyYW1lX2RpZyAtOQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY0CiAgICAvLyArIHEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjQKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY1CiAgICAvLyArIHIubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjUKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY2CiAgICAvLyArIHUubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjYKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjY3CiAgICAvLyArIHYubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjcKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgIC8vICsgby5uYXRpdmUKICAgIC8vICsgcAogICAgLy8gKyBxLm5hdGl2ZQogICAgLy8gKyByLm5hdGl2ZQogICAgLy8gKyB1Lm5hdGl2ZQogICAgLy8gKyB2Lm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ3LTI2OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KAogICAgLy8gICAgIGEubmF0aXZlCiAgICAvLyAgICAgKyBiLm5hdGl2ZQogICAgLy8gICAgICsgYy5uYXRpdmUKICAgIC8vICAgICArIGQKICAgIC8vICAgICArIGUubmF0aXZlCiAgICAvLyAgICAgKyBmLm5hdGl2ZQogICAgLy8gICAgICsgZy5uYXRpdmUKICAgIC8vICAgICArIGgubmF0aXZlCiAgICAvLyAgICAgKyBpLm5hdGl2ZQogICAgLy8gICAgICsgai5uYXRpdmUKICAgIC8vICAgICArIGsubmF0aXZlCiAgICAvLyAgICAgKyBsLm5hdGl2ZQogICAgLy8gICAgICsgbS5uYXRpdmUKICAgIC8vICAgICArIG4ubmF0aXZlCiAgICAvLyAgICAgKyBvLm5hdGl2ZQogICAgLy8gICAgICsgcAogICAgLy8gICAgICsgcS5uYXRpdmUKICAgIC8vICAgICArIHIubmF0aXZlCiAgICAvLyAgICAgKyB1Lm5hdGl2ZQogICAgLy8gICAgICsgdi5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MC0yNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZyhzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjcyCiAgICAvLyByZXR1cm4gIkhlbGxvICIgKyBuYW1lICsgIiEiCiAgICBwdXNoYnl0ZXMgIkhlbGxvICIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgIiEiCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmJhcmVfYWJpX2NvbmZpZygpIC0+IHZvaWQ6CmJhcmVfYWJpX2NvbmZpZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjY2LTc2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJPcHRJbiIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJVcGRhdGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9InJlcXVpcmUiLAogICAgLy8gKQogICAgLy8gZGVmIGJhcmVfYWJpX2NvbmZpZyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3NwogICAgLy8gbG9nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgIkhlbGxvIFdvcmxkIgogICAgbG9nCiAgICByZXRzdWIK",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "byteCode": {
+ "approval": "CiAEAQB7AiYDBBUffHUDYXNhCAAAAAAAAAHIMRhAAAOIAASIAD9DigAAKSRngAZhbl9pbnQlZ4ICCnNvbWVfYnl0ZXMDBwgJZ4AHY3JlYXRvcjEAZ4ADYXBwJGeABBiTksUVRImKAAExG0ECfoIOBNeNs1sEOlNT/ATS8vU8BCgmsgIEb46UzQQX3GjwBH+tl4AEL9+VpAQTmYJsBKEwCCEEZfTLmwRXMhlaBNF1UvsEkCO7GTYaAI4OAAIAFQAhADgASgBsAIQAlACkALQAxAD9AVMB9yOJMRkURDEYRDYaAYgCIyhMULAiiTYaAYgCJChMULAiiSIxGZCBJRpEMRhENhoBiAIaKExQsCKJMRkURDEYRDYaARfAMIgCESKJMRkURDEYRDYaARfAMDYaAjEWIglJOBAiEkQ2GgOIAhQiiTEZFEQxGEQ2GgEXwDA2GgIXwDCIAhwiiTEZFEQxGESIAhooTFCwIokxGRREMRhEiAIQKExQsCKJMRkURDEYRIgCBShMULAiiTEZFEQxGESIAfooTFCwIokxGRREMRhENhoBF8AwNhoCF8AwNhoDF8AcNhoEF8AcNhoFF8AyNhoGF8AyNhoHNhoINhoJiAHLIokxGRREMRhENhoBFzYaAhc2GgMXNhoEFzYaBRc2GgYXNhoHFzYaCBc2GgkXNhoKFzYaCxc2GgwXNhoNFzYaDhc2Gg9XAgCIAdRJFRZXBgJMUChMULAiiTEZFEQxGEQ2GgE2GgI2GgM2GgQXNhoFF8AwNhoGNhoHMRYlCUk4ECISRDYaCDYaCTYaCjYaCzYaDDYaDTYaDjYaD1cACDYaD1cICDYaD1cQCBc2Gg9XGAg2Gg9XIAg2Gg9JgShZSwGBKllSVwIANhoPSYEqWUsBFVJXAgA2Gg9XLAEXwDAxFiIJSTgQIhJENhoPVy0INhoPVzUIiAFYKExQsCKJMRkURDEYRDYaAVcCAIgBukkVFlcGAkxQKExQsCKJMRmNBgACAAIAAgALAAIAAiOJMRgURIgBpiKJI4mKAQGL/xciCBZXBwGJigEBi/8XIggWVwcBiYoBAYv/FyIIFlcHAYmKAQAxADIJEkQjKWVEFEQpi/9nsYEEshAjsgEyCrIUi/+yEbOJigQAIyllRIv8EkSL/RciEkSL/jgHMgoSRIv/FyUSRImKAgCL/ov/EkSJigABMgOJigABKomKAAEqiYoAAYAIAAAAAAAAAAOJigkAi/ckEkSL+IHIAxJEi/kyCRJEi/oyAxJEi/skEkSL/IHIAxJEi/1XAAGAAQeoRIv9VwEBgAEIqESL/VcCAYABCahEi/4XJRJEi/8XgQMSRImKDwGL8YvyCIvzCIv0CIv1CIv2CIv3CIv4CIv5CIv6CIv7CIv8CIv9CIv+CESL/4mKGgExG4EQEkSL7TgIgaCNBhJEi/04CIHAmgwSRIvqRIv8RIv6i/tQsIvmF4vnFwiL6BcIi+kIi+sXCIvsFwiL7hcIi+8XCIvwFwiL8RcIi/IXCIvzFwiL9BcIi/UXCIv2FwiL9wiL+BcIi/kXCIv+FwiL/xcIFomKAQGABkhlbGxvIIv/UIABIVCJigAAgAtIZWxsbyBXb3JsZLCJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/abi_routing/out/Reference.destructured.ir b/test_cases/abi_routing/out/Reference.destructured.ir
index 17b854483b..3106e65a42 100644
--- a/test_cases/abi_routing/out/Reference.destructured.ir
+++ b/test_cases/abi_routing/out/Reference.destructured.ir
@@ -33,9 +33,9 @@ contract test_cases.abi_routing.contract.Reference:
block@2: // noop_with_uint64_route_L32
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0)
let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0)
@@ -51,9 +51,9 @@ contract test_cases.abi_routing.contract.Reference:
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: uint64 = (shl 1u tmp%13#0)
let tmp%15#0: uint64 = (& tmp%14#0 37u)
- (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
let tmp%16#0: uint64 = (txn ApplicationID)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%18#0: bytes = (txna ApplicationArgs 1)
let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0)
let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0)
@@ -62,9 +62,9 @@ contract test_cases.abi_routing.contract.Reference:
block@5: // opt_into_asset_route_L79
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
let tmp%25#0: bytes = (txna ApplicationArgs 1)
let tmp%26#0: uint64 = (btoi tmp%25#0)
let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0)
@@ -73,9 +73,9 @@ contract test_cases.abi_routing.contract.Reference:
block@6: // with_transactions_route_L96
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
let tmp%32#0: bytes = (txna ApplicationArgs 1)
let tmp%33#0: uint64 = (btoi tmp%32#0)
let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0)
@@ -91,9 +91,9 @@ contract test_cases.abi_routing.contract.Reference:
block@7: // compare_assets_route_L109
let tmp%38#0: uint64 = (txn OnCompletion)
let tmp%39#0: bool = (! tmp%38#0)
- (assert tmp%39#0) // OnCompletion is NoOp
+ (assert tmp%39#0) // OnCompletion is not NoOp
let tmp%40#0: uint64 = (txn ApplicationID)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
let tmp%42#0: bytes = (txna ApplicationArgs 1)
let tmp%43#0: uint64 = (btoi tmp%42#0)
let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0)
@@ -105,9 +105,9 @@ contract test_cases.abi_routing.contract.Reference:
block@8: // get_address_route_L113
let tmp%48#0: uint64 = (txn OnCompletion)
let tmp%49#0: bool = (! tmp%48#0)
- (assert tmp%49#0) // OnCompletion is NoOp
+ (assert tmp%49#0) // OnCompletion is not NoOp
let tmp%50#0: uint64 = (txn ApplicationID)
- (assert tmp%50#0) // is not creating
+ (assert tmp%50#0) // can only call when not creating
let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address()
let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0)
(log tmp%53#0)
@@ -115,9 +115,9 @@ contract test_cases.abi_routing.contract.Reference:
block@9: // get_asset_route_L117
let tmp%54#0: uint64 = (txn OnCompletion)
let tmp%55#0: bool = (! tmp%54#0)
- (assert tmp%55#0) // OnCompletion is NoOp
+ (assert tmp%55#0) // OnCompletion is not NoOp
let tmp%56#0: uint64 = (txn ApplicationID)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset()
let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0)
(log tmp%59#0)
@@ -125,9 +125,9 @@ contract test_cases.abi_routing.contract.Reference:
block@10: // get_application_route_L121
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app()
let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0)
(log tmp%65#0)
@@ -135,9 +135,9 @@ contract test_cases.abi_routing.contract.Reference:
block@11: // get_an_int_route_L125
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int()
let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0)
(log tmp%71#0)
@@ -145,9 +145,9 @@ contract test_cases.abi_routing.contract.Reference:
block@12: // method_with_default_args_route_L129
let tmp%72#0: uint64 = (txn OnCompletion)
let tmp%73#0: bool = (! tmp%72#0)
- (assert tmp%73#0) // OnCompletion is NoOp
+ (assert tmp%73#0) // OnCompletion is not NoOp
let tmp%74#0: uint64 = (txn ApplicationID)
- (assert tmp%74#0) // is not creating
+ (assert tmp%74#0) // can only call when not creating
let tmp%76#0: bytes = (txna ApplicationArgs 1)
let tmp%77#0: uint64 = (btoi tmp%76#0)
let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0)
@@ -174,9 +174,9 @@ contract test_cases.abi_routing.contract.Reference:
block@13: // method_with_15_args_route_L166
let tmp%97#0: uint64 = (txn OnCompletion)
let tmp%98#0: bool = (! tmp%97#0)
- (assert tmp%98#0) // OnCompletion is NoOp
+ (assert tmp%98#0) // OnCompletion is not NoOp
let tmp%99#0: uint64 = (txn ApplicationID)
- (assert tmp%99#0) // is not creating
+ (assert tmp%99#0) // can only call when not creating
let tmp%101#0: bytes = (txna ApplicationArgs 1)
let tmp%102#0: uint64 = (btoi tmp%101#0)
let tmp%103#0: bytes = (txna ApplicationArgs 2)
@@ -218,9 +218,9 @@ contract test_cases.abi_routing.contract.Reference:
block@14: // method_with_more_than_15_args_route_L204
let tmp%132#0: uint64 = (txn OnCompletion)
let tmp%133#0: bool = (! tmp%132#0)
- (assert tmp%133#0) // OnCompletion is NoOp
+ (assert tmp%133#0) // OnCompletion is not NoOp
let tmp%134#0: uint64 = (txn ApplicationID)
- (assert tmp%134#0) // is not creating
+ (assert tmp%134#0) // can only call when not creating
let tmp%136#0: bytes = (txna ApplicationArgs 1)
let tmp%137#0: bytes = (txna ApplicationArgs 2)
let tmp%138#0: bytes = (txna ApplicationArgs 3)
@@ -284,9 +284,9 @@ contract test_cases.abi_routing.contract.Reference:
block@15: // hello_with_algopy_string_route_L270
let tmp%182#0: uint64 = (txn OnCompletion)
let tmp%183#0: bool = (! tmp%182#0)
- (assert tmp%183#0) // OnCompletion is NoOp
+ (assert tmp%183#0) // OnCompletion is not NoOp
let tmp%184#0: uint64 = (txn ApplicationID)
- (assert tmp%184#0) // is not creating
+ (assert tmp%184#0) // can only call when not creating
let tmp%186#0: bytes = (txna ApplicationArgs 1)
let tmp%187#0: bytes = ((extract 2 0) tmp%186#0)
let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0)
@@ -303,7 +303,7 @@ contract test_cases.abi_routing.contract.Reference:
block@19: // bare_abi_config_L66
let tmp%190#0: uint64 = (txn ApplicationID)
let tmp%191#0: bool = (! tmp%190#0)
- (assert tmp%191#0) // is creating
+ (assert tmp%191#0) // can only call when creating
test_cases.abi_routing.contract.Reference.bare_abi_config()
return 1u
block@22: // after_if_else_L22
diff --git a/test_cases/abi_routing/out/Reference.ssa.ir b/test_cases/abi_routing/out/Reference.ssa.ir
index ffaaf78628..c76ea4cd05 100644
--- a/test_cases/abi_routing/out/Reference.ssa.ir
+++ b/test_cases/abi_routing/out/Reference.ssa.ir
@@ -39,10 +39,10 @@ contract test_cases.abi_routing.contract.Reference:
block@2: // noop_with_uint64_route_L32
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0)
let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0)
@@ -58,10 +58,10 @@ contract test_cases.abi_routing.contract.Reference:
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: uint64 = (shl 1u tmp%13#0)
let tmp%15#0: uint64 = (& tmp%14#0 37u)
- (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (!= tmp%16#0 0u)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
let tmp%18#0: bytes = (txna ApplicationArgs 1)
let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0)
let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0)
@@ -70,10 +70,10 @@ contract test_cases.abi_routing.contract.Reference:
block@5: // opt_into_asset_route_L79
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (== tmp%21#0 NoOp)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
let tmp%24#0: bool = (!= tmp%23#0 0u)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%25#0: bytes = (txna ApplicationArgs 1)
let tmp%26#0: uint64 = (btoi tmp%25#0)
let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0)
@@ -82,10 +82,10 @@ contract test_cases.abi_routing.contract.Reference:
block@6: // with_transactions_route_L96
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (== tmp%28#0 NoOp)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
let tmp%31#0: bool = (!= tmp%30#0 0u)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
let tmp%32#0: bytes = (txna ApplicationArgs 1)
let tmp%33#0: uint64 = (btoi tmp%32#0)
let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0)
@@ -101,10 +101,10 @@ contract test_cases.abi_routing.contract.Reference:
block@7: // compare_assets_route_L109
let tmp%38#0: uint64 = (txn OnCompletion)
let tmp%39#0: bool = (== tmp%38#0 NoOp)
- (assert tmp%39#0) // OnCompletion is NoOp
+ (assert tmp%39#0) // OnCompletion is not NoOp
let tmp%40#0: uint64 = (txn ApplicationID)
let tmp%41#0: bool = (!= tmp%40#0 0u)
- (assert tmp%41#0) // is not creating
+ (assert tmp%41#0) // can only call when not creating
let tmp%42#0: bytes = (txna ApplicationArgs 1)
let tmp%43#0: uint64 = (btoi tmp%42#0)
let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0)
@@ -116,10 +116,10 @@ contract test_cases.abi_routing.contract.Reference:
block@8: // get_address_route_L113
let tmp%48#0: uint64 = (txn OnCompletion)
let tmp%49#0: bool = (== tmp%48#0 NoOp)
- (assert tmp%49#0) // OnCompletion is NoOp
+ (assert tmp%49#0) // OnCompletion is not NoOp
let tmp%50#0: uint64 = (txn ApplicationID)
let tmp%51#0: bool = (!= tmp%50#0 0u)
- (assert tmp%51#0) // is not creating
+ (assert tmp%51#0) // can only call when not creating
let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address()
let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0)
(log tmp%53#0)
@@ -127,10 +127,10 @@ contract test_cases.abi_routing.contract.Reference:
block@9: // get_asset_route_L117
let tmp%54#0: uint64 = (txn OnCompletion)
let tmp%55#0: bool = (== tmp%54#0 NoOp)
- (assert tmp%55#0) // OnCompletion is NoOp
+ (assert tmp%55#0) // OnCompletion is not NoOp
let tmp%56#0: uint64 = (txn ApplicationID)
let tmp%57#0: bool = (!= tmp%56#0 0u)
- (assert tmp%57#0) // is not creating
+ (assert tmp%57#0) // can only call when not creating
let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset()
let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0)
(log tmp%59#0)
@@ -138,10 +138,10 @@ contract test_cases.abi_routing.contract.Reference:
block@10: // get_application_route_L121
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (== tmp%60#0 NoOp)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
let tmp%63#0: bool = (!= tmp%62#0 0u)
- (assert tmp%63#0) // is not creating
+ (assert tmp%63#0) // can only call when not creating
let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app()
let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0)
(log tmp%65#0)
@@ -149,10 +149,10 @@ contract test_cases.abi_routing.contract.Reference:
block@11: // get_an_int_route_L125
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (== tmp%66#0 NoOp)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
let tmp%69#0: bool = (!= tmp%68#0 0u)
- (assert tmp%69#0) // is not creating
+ (assert tmp%69#0) // can only call when not creating
let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int()
let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0)
(log tmp%71#0)
@@ -160,10 +160,10 @@ contract test_cases.abi_routing.contract.Reference:
block@12: // method_with_default_args_route_L129
let tmp%72#0: uint64 = (txn OnCompletion)
let tmp%73#0: bool = (== tmp%72#0 NoOp)
- (assert tmp%73#0) // OnCompletion is NoOp
+ (assert tmp%73#0) // OnCompletion is not NoOp
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (!= tmp%74#0 0u)
- (assert tmp%75#0) // is not creating
+ (assert tmp%75#0) // can only call when not creating
let tmp%76#0: bytes = (txna ApplicationArgs 1)
let tmp%77#0: uint64 = (btoi tmp%76#0)
let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0)
@@ -190,10 +190,10 @@ contract test_cases.abi_routing.contract.Reference:
block@13: // method_with_15_args_route_L166
let tmp%97#0: uint64 = (txn OnCompletion)
let tmp%98#0: bool = (== tmp%97#0 NoOp)
- (assert tmp%98#0) // OnCompletion is NoOp
+ (assert tmp%98#0) // OnCompletion is not NoOp
let tmp%99#0: uint64 = (txn ApplicationID)
let tmp%100#0: bool = (!= tmp%99#0 0u)
- (assert tmp%100#0) // is not creating
+ (assert tmp%100#0) // can only call when not creating
let tmp%101#0: bytes = (txna ApplicationArgs 1)
let tmp%102#0: uint64 = (btoi tmp%101#0)
let tmp%103#0: bytes = (txna ApplicationArgs 2)
@@ -235,10 +235,10 @@ contract test_cases.abi_routing.contract.Reference:
block@14: // method_with_more_than_15_args_route_L204
let tmp%132#0: uint64 = (txn OnCompletion)
let tmp%133#0: bool = (== tmp%132#0 NoOp)
- (assert tmp%133#0) // OnCompletion is NoOp
+ (assert tmp%133#0) // OnCompletion is not NoOp
let tmp%134#0: uint64 = (txn ApplicationID)
let tmp%135#0: bool = (!= tmp%134#0 0u)
- (assert tmp%135#0) // is not creating
+ (assert tmp%135#0) // can only call when not creating
let tmp%136#0: bytes = (txna ApplicationArgs 1)
let tmp%137#0: bytes = (txna ApplicationArgs 2)
let tmp%138#0: bytes = (txna ApplicationArgs 3)
@@ -302,10 +302,10 @@ contract test_cases.abi_routing.contract.Reference:
block@15: // hello_with_algopy_string_route_L270
let tmp%182#0: uint64 = (txn OnCompletion)
let tmp%183#0: bool = (== tmp%182#0 NoOp)
- (assert tmp%183#0) // OnCompletion is NoOp
+ (assert tmp%183#0) // OnCompletion is not NoOp
let tmp%184#0: uint64 = (txn ApplicationID)
let tmp%185#0: bool = (!= tmp%184#0 0u)
- (assert tmp%185#0) // is not creating
+ (assert tmp%185#0) // can only call when not creating
let tmp%186#0: bytes = (txna ApplicationArgs 1)
let tmp%187#0: bytes = ((extract 2 0) tmp%186#0)
let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0)
@@ -326,7 +326,7 @@ contract test_cases.abi_routing.contract.Reference:
block@19: // bare_abi_config_L66
let tmp%190#0: uint64 = (txn ApplicationID)
let tmp%191#0: bool = (== tmp%190#0 0u)
- (assert tmp%191#0) // is creating
+ (assert tmp%191#0) // can only call when creating
test_cases.abi_routing.contract.Reference.bare_abi_config()
return 1u
block@20: // switch_case_default_L22
diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir
index 2714d12041..8aa77383c7 100644
--- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir
+++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_1.ir
@@ -37,9 +37,9 @@ contract test_cases.abi_routing.contract.Reference:
block@2: // noop_with_uint64_route_L32
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0)
let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0)
@@ -55,9 +55,9 @@ contract test_cases.abi_routing.contract.Reference:
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: uint64 = (shl 1u tmp%13#0)
let tmp%15#0: uint64 = (& tmp%14#0 37u)
- (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
let tmp%16#0: uint64 = (txn ApplicationID)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%18#0: bytes = (txna ApplicationArgs 1)
let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0)
let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0)
@@ -66,9 +66,9 @@ contract test_cases.abi_routing.contract.Reference:
block@5: // opt_into_asset_route_L79
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
let tmp%25#0: bytes = (txna ApplicationArgs 1)
let tmp%26#0: uint64 = (btoi tmp%25#0)
let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0)
@@ -77,9 +77,9 @@ contract test_cases.abi_routing.contract.Reference:
block@6: // with_transactions_route_L96
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
let tmp%32#0: bytes = (txna ApplicationArgs 1)
let tmp%33#0: uint64 = (btoi tmp%32#0)
let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0)
@@ -95,9 +95,9 @@ contract test_cases.abi_routing.contract.Reference:
block@7: // compare_assets_route_L109
let tmp%38#0: uint64 = (txn OnCompletion)
let tmp%39#0: bool = (! tmp%38#0)
- (assert tmp%39#0) // OnCompletion is NoOp
+ (assert tmp%39#0) // OnCompletion is not NoOp
let tmp%40#0: uint64 = (txn ApplicationID)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
let tmp%42#0: bytes = (txna ApplicationArgs 1)
let tmp%43#0: uint64 = (btoi tmp%42#0)
let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0)
@@ -109,9 +109,9 @@ contract test_cases.abi_routing.contract.Reference:
block@8: // get_address_route_L113
let tmp%48#0: uint64 = (txn OnCompletion)
let tmp%49#0: bool = (! tmp%48#0)
- (assert tmp%49#0) // OnCompletion is NoOp
+ (assert tmp%49#0) // OnCompletion is not NoOp
let tmp%50#0: uint64 = (txn ApplicationID)
- (assert tmp%50#0) // is not creating
+ (assert tmp%50#0) // can only call when not creating
let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address()
let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0)
(log tmp%53#0)
@@ -119,9 +119,9 @@ contract test_cases.abi_routing.contract.Reference:
block@9: // get_asset_route_L117
let tmp%54#0: uint64 = (txn OnCompletion)
let tmp%55#0: bool = (! tmp%54#0)
- (assert tmp%55#0) // OnCompletion is NoOp
+ (assert tmp%55#0) // OnCompletion is not NoOp
let tmp%56#0: uint64 = (txn ApplicationID)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset()
let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0)
(log tmp%59#0)
@@ -129,9 +129,9 @@ contract test_cases.abi_routing.contract.Reference:
block@10: // get_application_route_L121
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app()
let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0)
(log tmp%65#0)
@@ -139,9 +139,9 @@ contract test_cases.abi_routing.contract.Reference:
block@11: // get_an_int_route_L125
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int()
let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0)
(log tmp%71#0)
@@ -149,9 +149,9 @@ contract test_cases.abi_routing.contract.Reference:
block@12: // method_with_default_args_route_L129
let tmp%72#0: uint64 = (txn OnCompletion)
let tmp%73#0: bool = (! tmp%72#0)
- (assert tmp%73#0) // OnCompletion is NoOp
+ (assert tmp%73#0) // OnCompletion is not NoOp
let tmp%74#0: uint64 = (txn ApplicationID)
- (assert tmp%74#0) // is not creating
+ (assert tmp%74#0) // can only call when not creating
let tmp%76#0: bytes = (txna ApplicationArgs 1)
let tmp%77#0: uint64 = (btoi tmp%76#0)
let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0)
@@ -178,9 +178,9 @@ contract test_cases.abi_routing.contract.Reference:
block@13: // method_with_15_args_route_L166
let tmp%97#0: uint64 = (txn OnCompletion)
let tmp%98#0: bool = (! tmp%97#0)
- (assert tmp%98#0) // OnCompletion is NoOp
+ (assert tmp%98#0) // OnCompletion is not NoOp
let tmp%99#0: uint64 = (txn ApplicationID)
- (assert tmp%99#0) // is not creating
+ (assert tmp%99#0) // can only call when not creating
let tmp%101#0: bytes = (txna ApplicationArgs 1)
let tmp%102#0: uint64 = (btoi tmp%101#0)
let tmp%103#0: bytes = (txna ApplicationArgs 2)
@@ -222,9 +222,9 @@ contract test_cases.abi_routing.contract.Reference:
block@14: // method_with_more_than_15_args_route_L204
let tmp%132#0: uint64 = (txn OnCompletion)
let tmp%133#0: bool = (! tmp%132#0)
- (assert tmp%133#0) // OnCompletion is NoOp
+ (assert tmp%133#0) // OnCompletion is not NoOp
let tmp%134#0: uint64 = (txn ApplicationID)
- (assert tmp%134#0) // is not creating
+ (assert tmp%134#0) // can only call when not creating
let tmp%136#0: bytes = (txna ApplicationArgs 1)
let tmp%137#0: bytes = (txna ApplicationArgs 2)
let tmp%138#0: bytes = (txna ApplicationArgs 3)
@@ -288,9 +288,9 @@ contract test_cases.abi_routing.contract.Reference:
block@15: // hello_with_algopy_string_route_L270
let tmp%182#0: uint64 = (txn OnCompletion)
let tmp%183#0: bool = (! tmp%182#0)
- (assert tmp%183#0) // OnCompletion is NoOp
+ (assert tmp%183#0) // OnCompletion is not NoOp
let tmp%184#0: uint64 = (txn ApplicationID)
- (assert tmp%184#0) // is not creating
+ (assert tmp%184#0) // can only call when not creating
let tmp%186#0: bytes = (txna ApplicationArgs 1)
let tmp%187#0: bytes = ((extract 2 0) tmp%186#0)
let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0)
@@ -307,7 +307,7 @@ contract test_cases.abi_routing.contract.Reference:
block@19: // bare_abi_config_L66
let tmp%190#0: uint64 = (txn ApplicationID)
let tmp%191#0: bool = (! tmp%190#0)
- (assert tmp%191#0) // is creating
+ (assert tmp%191#0) // can only call when creating
test_cases.abi_routing.contract.Reference.bare_abi_config()
return 1u
block@22: // after_if_else_L22
diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir
index 6f10b647c2..1128c6fe93 100644
--- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir
+++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_2.ir
@@ -35,9 +35,9 @@ contract test_cases.abi_routing.contract.Reference:
block@2: // noop_with_uint64_route_L32
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0)
let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0)
@@ -53,9 +53,9 @@ contract test_cases.abi_routing.contract.Reference:
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: uint64 = (shl 1u tmp%13#0)
let tmp%15#0: uint64 = (& tmp%14#0 37u)
- (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
let tmp%16#0: uint64 = (txn ApplicationID)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%18#0: bytes = (txna ApplicationArgs 1)
let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0)
let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0)
@@ -64,9 +64,9 @@ contract test_cases.abi_routing.contract.Reference:
block@5: // opt_into_asset_route_L79
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
let tmp%25#0: bytes = (txna ApplicationArgs 1)
let tmp%26#0: uint64 = (btoi tmp%25#0)
let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0)
@@ -75,9 +75,9 @@ contract test_cases.abi_routing.contract.Reference:
block@6: // with_transactions_route_L96
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
let tmp%32#0: bytes = (txna ApplicationArgs 1)
let tmp%33#0: uint64 = (btoi tmp%32#0)
let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0)
@@ -93,9 +93,9 @@ contract test_cases.abi_routing.contract.Reference:
block@7: // compare_assets_route_L109
let tmp%38#0: uint64 = (txn OnCompletion)
let tmp%39#0: bool = (! tmp%38#0)
- (assert tmp%39#0) // OnCompletion is NoOp
+ (assert tmp%39#0) // OnCompletion is not NoOp
let tmp%40#0: uint64 = (txn ApplicationID)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
let tmp%42#0: bytes = (txna ApplicationArgs 1)
let tmp%43#0: uint64 = (btoi tmp%42#0)
let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0)
@@ -107,9 +107,9 @@ contract test_cases.abi_routing.contract.Reference:
block@8: // get_address_route_L113
let tmp%48#0: uint64 = (txn OnCompletion)
let tmp%49#0: bool = (! tmp%48#0)
- (assert tmp%49#0) // OnCompletion is NoOp
+ (assert tmp%49#0) // OnCompletion is not NoOp
let tmp%50#0: uint64 = (txn ApplicationID)
- (assert tmp%50#0) // is not creating
+ (assert tmp%50#0) // can only call when not creating
let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address()
let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0)
(log tmp%53#0)
@@ -117,9 +117,9 @@ contract test_cases.abi_routing.contract.Reference:
block@9: // get_asset_route_L117
let tmp%54#0: uint64 = (txn OnCompletion)
let tmp%55#0: bool = (! tmp%54#0)
- (assert tmp%55#0) // OnCompletion is NoOp
+ (assert tmp%55#0) // OnCompletion is not NoOp
let tmp%56#0: uint64 = (txn ApplicationID)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset()
let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0)
(log tmp%59#0)
@@ -127,9 +127,9 @@ contract test_cases.abi_routing.contract.Reference:
block@10: // get_application_route_L121
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app()
let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0)
(log tmp%65#0)
@@ -137,9 +137,9 @@ contract test_cases.abi_routing.contract.Reference:
block@11: // get_an_int_route_L125
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int()
let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0)
(log tmp%71#0)
@@ -147,9 +147,9 @@ contract test_cases.abi_routing.contract.Reference:
block@12: // method_with_default_args_route_L129
let tmp%72#0: uint64 = (txn OnCompletion)
let tmp%73#0: bool = (! tmp%72#0)
- (assert tmp%73#0) // OnCompletion is NoOp
+ (assert tmp%73#0) // OnCompletion is not NoOp
let tmp%74#0: uint64 = (txn ApplicationID)
- (assert tmp%74#0) // is not creating
+ (assert tmp%74#0) // can only call when not creating
let tmp%76#0: bytes = (txna ApplicationArgs 1)
let tmp%77#0: uint64 = (btoi tmp%76#0)
let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0)
@@ -176,9 +176,9 @@ contract test_cases.abi_routing.contract.Reference:
block@13: // method_with_15_args_route_L166
let tmp%97#0: uint64 = (txn OnCompletion)
let tmp%98#0: bool = (! tmp%97#0)
- (assert tmp%98#0) // OnCompletion is NoOp
+ (assert tmp%98#0) // OnCompletion is not NoOp
let tmp%99#0: uint64 = (txn ApplicationID)
- (assert tmp%99#0) // is not creating
+ (assert tmp%99#0) // can only call when not creating
let tmp%101#0: bytes = (txna ApplicationArgs 1)
let tmp%102#0: uint64 = (btoi tmp%101#0)
let tmp%103#0: bytes = (txna ApplicationArgs 2)
@@ -220,9 +220,9 @@ contract test_cases.abi_routing.contract.Reference:
block@14: // method_with_more_than_15_args_route_L204
let tmp%132#0: uint64 = (txn OnCompletion)
let tmp%133#0: bool = (! tmp%132#0)
- (assert tmp%133#0) // OnCompletion is NoOp
+ (assert tmp%133#0) // OnCompletion is not NoOp
let tmp%134#0: uint64 = (txn ApplicationID)
- (assert tmp%134#0) // is not creating
+ (assert tmp%134#0) // can only call when not creating
let tmp%136#0: bytes = (txna ApplicationArgs 1)
let tmp%137#0: bytes = (txna ApplicationArgs 2)
let tmp%138#0: bytes = (txna ApplicationArgs 3)
@@ -286,9 +286,9 @@ contract test_cases.abi_routing.contract.Reference:
block@15: // hello_with_algopy_string_route_L270
let tmp%182#0: uint64 = (txn OnCompletion)
let tmp%183#0: bool = (! tmp%182#0)
- (assert tmp%183#0) // OnCompletion is NoOp
+ (assert tmp%183#0) // OnCompletion is not NoOp
let tmp%184#0: uint64 = (txn ApplicationID)
- (assert tmp%184#0) // is not creating
+ (assert tmp%184#0) // can only call when not creating
let tmp%186#0: bytes = (txna ApplicationArgs 1)
let tmp%187#0: bytes = ((extract 2 0) tmp%186#0)
let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0)
@@ -305,7 +305,7 @@ contract test_cases.abi_routing.contract.Reference:
block@19: // bare_abi_config_L66
let tmp%190#0: uint64 = (txn ApplicationID)
let tmp%191#0: bool = (! tmp%190#0)
- (assert tmp%191#0) // is creating
+ (assert tmp%191#0) // can only call when creating
test_cases.abi_routing.contract.Reference.bare_abi_config()
return 1u
block@22: // after_if_else_L22
diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir
index 3e13f06973..74906ed792 100644
--- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir
+++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_3.ir
@@ -34,9 +34,9 @@ contract test_cases.abi_routing.contract.Reference:
block@2: // noop_with_uint64_route_L32
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0)
let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0)
@@ -52,9 +52,9 @@ contract test_cases.abi_routing.contract.Reference:
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: uint64 = (shl 1u tmp%13#0)
let tmp%15#0: uint64 = (& tmp%14#0 37u)
- (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
let tmp%16#0: uint64 = (txn ApplicationID)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%18#0: bytes = (txna ApplicationArgs 1)
let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0)
let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0)
@@ -63,9 +63,9 @@ contract test_cases.abi_routing.contract.Reference:
block@5: // opt_into_asset_route_L79
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
let tmp%25#0: bytes = (txna ApplicationArgs 1)
let tmp%26#0: uint64 = (btoi tmp%25#0)
let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0)
@@ -74,9 +74,9 @@ contract test_cases.abi_routing.contract.Reference:
block@6: // with_transactions_route_L96
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
let tmp%32#0: bytes = (txna ApplicationArgs 1)
let tmp%33#0: uint64 = (btoi tmp%32#0)
let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0)
@@ -92,9 +92,9 @@ contract test_cases.abi_routing.contract.Reference:
block@7: // compare_assets_route_L109
let tmp%38#0: uint64 = (txn OnCompletion)
let tmp%39#0: bool = (! tmp%38#0)
- (assert tmp%39#0) // OnCompletion is NoOp
+ (assert tmp%39#0) // OnCompletion is not NoOp
let tmp%40#0: uint64 = (txn ApplicationID)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
let tmp%42#0: bytes = (txna ApplicationArgs 1)
let tmp%43#0: uint64 = (btoi tmp%42#0)
let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0)
@@ -106,9 +106,9 @@ contract test_cases.abi_routing.contract.Reference:
block@8: // get_address_route_L113
let tmp%48#0: uint64 = (txn OnCompletion)
let tmp%49#0: bool = (! tmp%48#0)
- (assert tmp%49#0) // OnCompletion is NoOp
+ (assert tmp%49#0) // OnCompletion is not NoOp
let tmp%50#0: uint64 = (txn ApplicationID)
- (assert tmp%50#0) // is not creating
+ (assert tmp%50#0) // can only call when not creating
let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address()
let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0)
(log tmp%53#0)
@@ -116,9 +116,9 @@ contract test_cases.abi_routing.contract.Reference:
block@9: // get_asset_route_L117
let tmp%54#0: uint64 = (txn OnCompletion)
let tmp%55#0: bool = (! tmp%54#0)
- (assert tmp%55#0) // OnCompletion is NoOp
+ (assert tmp%55#0) // OnCompletion is not NoOp
let tmp%56#0: uint64 = (txn ApplicationID)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset()
let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0)
(log tmp%59#0)
@@ -126,9 +126,9 @@ contract test_cases.abi_routing.contract.Reference:
block@10: // get_application_route_L121
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app()
let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0)
(log tmp%65#0)
@@ -136,9 +136,9 @@ contract test_cases.abi_routing.contract.Reference:
block@11: // get_an_int_route_L125
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int()
let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0)
(log tmp%71#0)
@@ -146,9 +146,9 @@ contract test_cases.abi_routing.contract.Reference:
block@12: // method_with_default_args_route_L129
let tmp%72#0: uint64 = (txn OnCompletion)
let tmp%73#0: bool = (! tmp%72#0)
- (assert tmp%73#0) // OnCompletion is NoOp
+ (assert tmp%73#0) // OnCompletion is not NoOp
let tmp%74#0: uint64 = (txn ApplicationID)
- (assert tmp%74#0) // is not creating
+ (assert tmp%74#0) // can only call when not creating
let tmp%76#0: bytes = (txna ApplicationArgs 1)
let tmp%77#0: uint64 = (btoi tmp%76#0)
let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0)
@@ -175,9 +175,9 @@ contract test_cases.abi_routing.contract.Reference:
block@13: // method_with_15_args_route_L166
let tmp%97#0: uint64 = (txn OnCompletion)
let tmp%98#0: bool = (! tmp%97#0)
- (assert tmp%98#0) // OnCompletion is NoOp
+ (assert tmp%98#0) // OnCompletion is not NoOp
let tmp%99#0: uint64 = (txn ApplicationID)
- (assert tmp%99#0) // is not creating
+ (assert tmp%99#0) // can only call when not creating
let tmp%101#0: bytes = (txna ApplicationArgs 1)
let tmp%102#0: uint64 = (btoi tmp%101#0)
let tmp%103#0: bytes = (txna ApplicationArgs 2)
@@ -219,9 +219,9 @@ contract test_cases.abi_routing.contract.Reference:
block@14: // method_with_more_than_15_args_route_L204
let tmp%132#0: uint64 = (txn OnCompletion)
let tmp%133#0: bool = (! tmp%132#0)
- (assert tmp%133#0) // OnCompletion is NoOp
+ (assert tmp%133#0) // OnCompletion is not NoOp
let tmp%134#0: uint64 = (txn ApplicationID)
- (assert tmp%134#0) // is not creating
+ (assert tmp%134#0) // can only call when not creating
let tmp%136#0: bytes = (txna ApplicationArgs 1)
let tmp%137#0: bytes = (txna ApplicationArgs 2)
let tmp%138#0: bytes = (txna ApplicationArgs 3)
@@ -285,9 +285,9 @@ contract test_cases.abi_routing.contract.Reference:
block@15: // hello_with_algopy_string_route_L270
let tmp%182#0: uint64 = (txn OnCompletion)
let tmp%183#0: bool = (! tmp%182#0)
- (assert tmp%183#0) // OnCompletion is NoOp
+ (assert tmp%183#0) // OnCompletion is not NoOp
let tmp%184#0: uint64 = (txn ApplicationID)
- (assert tmp%184#0) // is not creating
+ (assert tmp%184#0) // can only call when not creating
let tmp%186#0: bytes = (txna ApplicationArgs 1)
let tmp%187#0: bytes = ((extract 2 0) tmp%186#0)
let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0)
@@ -304,7 +304,7 @@ contract test_cases.abi_routing.contract.Reference:
block@19: // bare_abi_config_L66
let tmp%190#0: uint64 = (txn ApplicationID)
let tmp%191#0: bool = (! tmp%190#0)
- (assert tmp%191#0) // is creating
+ (assert tmp%191#0) // can only call when creating
test_cases.abi_routing.contract.Reference.bare_abi_config()
return 1u
block@22: // after_if_else_L22
diff --git a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir
index 17b854483b..3106e65a42 100644
--- a/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir
+++ b/test_cases/abi_routing/out/Reference.ssa.opt_pass_4.ir
@@ -33,9 +33,9 @@ contract test_cases.abi_routing.contract.Reference:
block@2: // noop_with_uint64_route_L32
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0)
let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0)
@@ -51,9 +51,9 @@ contract test_cases.abi_routing.contract.Reference:
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: uint64 = (shl 1u tmp%13#0)
let tmp%15#0: uint64 = (& tmp%14#0 37u)
- (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
let tmp%16#0: uint64 = (txn ApplicationID)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%18#0: bytes = (txna ApplicationArgs 1)
let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0)
let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0)
@@ -62,9 +62,9 @@ contract test_cases.abi_routing.contract.Reference:
block@5: // opt_into_asset_route_L79
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
let tmp%25#0: bytes = (txna ApplicationArgs 1)
let tmp%26#0: uint64 = (btoi tmp%25#0)
let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0)
@@ -73,9 +73,9 @@ contract test_cases.abi_routing.contract.Reference:
block@6: // with_transactions_route_L96
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
let tmp%32#0: bytes = (txna ApplicationArgs 1)
let tmp%33#0: uint64 = (btoi tmp%32#0)
let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0)
@@ -91,9 +91,9 @@ contract test_cases.abi_routing.contract.Reference:
block@7: // compare_assets_route_L109
let tmp%38#0: uint64 = (txn OnCompletion)
let tmp%39#0: bool = (! tmp%38#0)
- (assert tmp%39#0) // OnCompletion is NoOp
+ (assert tmp%39#0) // OnCompletion is not NoOp
let tmp%40#0: uint64 = (txn ApplicationID)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
let tmp%42#0: bytes = (txna ApplicationArgs 1)
let tmp%43#0: uint64 = (btoi tmp%42#0)
let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0)
@@ -105,9 +105,9 @@ contract test_cases.abi_routing.contract.Reference:
block@8: // get_address_route_L113
let tmp%48#0: uint64 = (txn OnCompletion)
let tmp%49#0: bool = (! tmp%48#0)
- (assert tmp%49#0) // OnCompletion is NoOp
+ (assert tmp%49#0) // OnCompletion is not NoOp
let tmp%50#0: uint64 = (txn ApplicationID)
- (assert tmp%50#0) // is not creating
+ (assert tmp%50#0) // can only call when not creating
let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address()
let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0)
(log tmp%53#0)
@@ -115,9 +115,9 @@ contract test_cases.abi_routing.contract.Reference:
block@9: // get_asset_route_L117
let tmp%54#0: uint64 = (txn OnCompletion)
let tmp%55#0: bool = (! tmp%54#0)
- (assert tmp%55#0) // OnCompletion is NoOp
+ (assert tmp%55#0) // OnCompletion is not NoOp
let tmp%56#0: uint64 = (txn ApplicationID)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset()
let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0)
(log tmp%59#0)
@@ -125,9 +125,9 @@ contract test_cases.abi_routing.contract.Reference:
block@10: // get_application_route_L121
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app()
let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0)
(log tmp%65#0)
@@ -135,9 +135,9 @@ contract test_cases.abi_routing.contract.Reference:
block@11: // get_an_int_route_L125
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int()
let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0)
(log tmp%71#0)
@@ -145,9 +145,9 @@ contract test_cases.abi_routing.contract.Reference:
block@12: // method_with_default_args_route_L129
let tmp%72#0: uint64 = (txn OnCompletion)
let tmp%73#0: bool = (! tmp%72#0)
- (assert tmp%73#0) // OnCompletion is NoOp
+ (assert tmp%73#0) // OnCompletion is not NoOp
let tmp%74#0: uint64 = (txn ApplicationID)
- (assert tmp%74#0) // is not creating
+ (assert tmp%74#0) // can only call when not creating
let tmp%76#0: bytes = (txna ApplicationArgs 1)
let tmp%77#0: uint64 = (btoi tmp%76#0)
let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0)
@@ -174,9 +174,9 @@ contract test_cases.abi_routing.contract.Reference:
block@13: // method_with_15_args_route_L166
let tmp%97#0: uint64 = (txn OnCompletion)
let tmp%98#0: bool = (! tmp%97#0)
- (assert tmp%98#0) // OnCompletion is NoOp
+ (assert tmp%98#0) // OnCompletion is not NoOp
let tmp%99#0: uint64 = (txn ApplicationID)
- (assert tmp%99#0) // is not creating
+ (assert tmp%99#0) // can only call when not creating
let tmp%101#0: bytes = (txna ApplicationArgs 1)
let tmp%102#0: uint64 = (btoi tmp%101#0)
let tmp%103#0: bytes = (txna ApplicationArgs 2)
@@ -218,9 +218,9 @@ contract test_cases.abi_routing.contract.Reference:
block@14: // method_with_more_than_15_args_route_L204
let tmp%132#0: uint64 = (txn OnCompletion)
let tmp%133#0: bool = (! tmp%132#0)
- (assert tmp%133#0) // OnCompletion is NoOp
+ (assert tmp%133#0) // OnCompletion is not NoOp
let tmp%134#0: uint64 = (txn ApplicationID)
- (assert tmp%134#0) // is not creating
+ (assert tmp%134#0) // can only call when not creating
let tmp%136#0: bytes = (txna ApplicationArgs 1)
let tmp%137#0: bytes = (txna ApplicationArgs 2)
let tmp%138#0: bytes = (txna ApplicationArgs 3)
@@ -284,9 +284,9 @@ contract test_cases.abi_routing.contract.Reference:
block@15: // hello_with_algopy_string_route_L270
let tmp%182#0: uint64 = (txn OnCompletion)
let tmp%183#0: bool = (! tmp%182#0)
- (assert tmp%183#0) // OnCompletion is NoOp
+ (assert tmp%183#0) // OnCompletion is not NoOp
let tmp%184#0: uint64 = (txn ApplicationID)
- (assert tmp%184#0) // is not creating
+ (assert tmp%184#0) // can only call when not creating
let tmp%186#0: bytes = (txna ApplicationArgs 1)
let tmp%187#0: bytes = ((extract 2 0) tmp%186#0)
let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0)
@@ -303,7 +303,7 @@ contract test_cases.abi_routing.contract.Reference:
block@19: // bare_abi_config_L66
let tmp%190#0: uint64 = (txn ApplicationID)
let tmp%191#0: bool = (! tmp%190#0)
- (assert tmp%191#0) // is creating
+ (assert tmp%191#0) // can only call when creating
test_cases.abi_routing.contract.Reference.bare_abi_config()
return 1u
block@22: // after_if_else_L22
diff --git a/test_cases/abi_routing/out/client_Reference.py b/test_cases/abi_routing/out/client_Reference.py
index 03b489afb7..9c1b3d4e78 100644
--- a/test_cases/abi_routing/out/client_Reference.py
+++ b/test_cases/abi_routing/out/client_Reference.py
@@ -67,7 +67,7 @@ def get_an_int(
self,
) -> algopy.arc4.UIntN[typing.Literal[64]]: ...
- @algopy.arc4.abimethod(default_args={'asset_from_storage': 'asa', 'asset_from_function': 'get_asset', 'account_from_storage': 'creator', 'account_from_function': 'get_address', 'application_from_storage': 'app', 'application_from_function': 'get_application', 'bytes_from_storage': 'some_bytes', 'int_from_storage': 'an_int', 'int_from_function': 'get_an_int'})
+ @algopy.arc4.abimethod
def method_with_default_args(
self,
asset_from_storage: algopy.Asset,
diff --git a/test_cases/abi_routing/out_O2/CustomApproval.approval.teal b/test_cases/abi_routing/out_O2/CustomApproval.approval.teal
index 149eaea18a..8bf9c69e72 100644
--- a/test_cases/abi_routing/out_O2/CustomApproval.approval.teal
+++ b/test_cases/abi_routing/out_O2/CustomApproval.approval.teal
@@ -63,9 +63,9 @@ __puya_arc4_router__:
__puya_arc4_router___add_one_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
callsub add_one
@@ -82,7 +82,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/test_cases/abi_routing/out_O2/CustomApproval.destructured.ir b/test_cases/abi_routing/out_O2/CustomApproval.destructured.ir
index ab1e1cce1d..641b61ee03 100644
--- a/test_cases/abi_routing/out_O2/CustomApproval.destructured.ir
+++ b/test_cases/abi_routing/out_O2/CustomApproval.destructured.ir
@@ -50,9 +50,9 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@2: // add_one_route_L23
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0)
@@ -66,7 +66,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
return 1u
block@9: // after_if_else_L6
return 0u
diff --git a/test_cases/abi_routing/out_O2/MinimumARC4.approval.teal b/test_cases/abi_routing/out_O2/MinimumARC4.approval.teal
index 3abc7c8bf8..14f6299c11 100644
--- a/test_cases/abi_routing/out_O2/MinimumARC4.approval.teal
+++ b/test_cases/abi_routing/out_O2/MinimumARC4.approval.teal
@@ -28,7 +28,7 @@ __puya_arc4_router__:
bnz __puya_arc4_router___after_if_else@6
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
pushint 1 // 1
retsub
diff --git a/test_cases/abi_routing/out_O2/MinimumARC4.destructured.ir b/test_cases/abi_routing/out_O2/MinimumARC4.destructured.ir
index ee66099ec0..9130ed8a13 100644
--- a/test_cases/abi_routing/out_O2/MinimumARC4.destructured.ir
+++ b/test_cases/abi_routing/out_O2/MinimumARC4.destructured.ir
@@ -26,7 +26,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4:
block@3: // __algopy_default_create_L1
let tmp%3#0: uint64 = (txn ApplicationID)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // is creating
+ (assert tmp%4#0) // can only call when creating
return 1u
block@6: // after_if_else_L4
return 0u
diff --git a/test_cases/abi_routing/out_O2/Reference.approval.teal b/test_cases/abi_routing/out_O2/Reference.approval.teal
index f7762bc27c..1eb2dfbc2c 100644
--- a/test_cases/abi_routing/out_O2/Reference.approval.teal
+++ b/test_cases/abi_routing/out_O2/Reference.approval.teal
@@ -49,9 +49,9 @@ __puya_arc4_router__:
__puya_arc4_router___noop_with_uint64_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
callsub noop_with_uint64
bytec_0 // 0x151f7c75
@@ -77,9 +77,9 @@ __puya_arc4_router___mixed_oca_route@4:
shl
pushint 37 // 37
&
- assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ assert // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
callsub mixed_oca
bytec_0 // 0x151f7c75
@@ -92,9 +92,9 @@ __puya_arc4_router___mixed_oca_route@4:
__puya_arc4_router___opt_into_asset_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txnas Assets
@@ -105,9 +105,9 @@ __puya_arc4_router___opt_into_asset_route@5:
__puya_arc4_router___with_transactions_route@6:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txnas Assets
@@ -128,9 +128,9 @@ __puya_arc4_router___with_transactions_route@6:
__puya_arc4_router___compare_assets_route@7:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txnas Assets
@@ -144,9 +144,9 @@ __puya_arc4_router___compare_assets_route@7:
__puya_arc4_router___get_address_route@8:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_address
bytec_0 // 0x151f7c75
swap
@@ -158,9 +158,9 @@ __puya_arc4_router___get_address_route@8:
__puya_arc4_router___get_asset_route@9:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_asset
bytec_0 // 0x151f7c75
swap
@@ -172,9 +172,9 @@ __puya_arc4_router___get_asset_route@9:
__puya_arc4_router___get_application_route@10:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_app
bytec_0 // 0x151f7c75
swap
@@ -186,9 +186,9 @@ __puya_arc4_router___get_application_route@10:
__puya_arc4_router___get_an_int_route@11:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_a_int
bytec_0 // 0x151f7c75
swap
@@ -200,9 +200,9 @@ __puya_arc4_router___get_an_int_route@11:
__puya_arc4_router___method_with_default_args_route@12:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txnas Assets
@@ -231,9 +231,9 @@ __puya_arc4_router___method_with_default_args_route@12:
__puya_arc4_router___method_with_15_args_route@13:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txna ApplicationArgs 2
@@ -281,9 +281,9 @@ __puya_arc4_router___method_with_15_args_route@13:
__puya_arc4_router___method_with_more_than_15_args_route@14:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
txna ApplicationArgs 2
txna ApplicationArgs 3
@@ -364,9 +364,9 @@ __puya_arc4_router___method_with_more_than_15_args_route@14:
__puya_arc4_router___hello_with_algopy_string_route@15:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
extract 2 0
callsub hello_with_algopy_string
@@ -392,7 +392,7 @@ __puya_arc4_router___bare_routing@18:
__puya_arc4_router___bare_abi_config@19:
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
callsub bare_abi_config
intc_0 // 1
retsub
diff --git a/test_cases/abi_routing/out_O2/Reference.destructured.ir b/test_cases/abi_routing/out_O2/Reference.destructured.ir
index 17b854483b..3106e65a42 100644
--- a/test_cases/abi_routing/out_O2/Reference.destructured.ir
+++ b/test_cases/abi_routing/out_O2/Reference.destructured.ir
@@ -33,9 +33,9 @@ contract test_cases.abi_routing.contract.Reference:
block@2: // noop_with_uint64_route_L32
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0)
let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0)
@@ -51,9 +51,9 @@ contract test_cases.abi_routing.contract.Reference:
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: uint64 = (shl 1u tmp%13#0)
let tmp%15#0: uint64 = (& tmp%14#0 37u)
- (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
let tmp%16#0: uint64 = (txn ApplicationID)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%18#0: bytes = (txna ApplicationArgs 1)
let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0)
let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0)
@@ -62,9 +62,9 @@ contract test_cases.abi_routing.contract.Reference:
block@5: // opt_into_asset_route_L79
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
let tmp%25#0: bytes = (txna ApplicationArgs 1)
let tmp%26#0: uint64 = (btoi tmp%25#0)
let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0)
@@ -73,9 +73,9 @@ contract test_cases.abi_routing.contract.Reference:
block@6: // with_transactions_route_L96
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
let tmp%32#0: bytes = (txna ApplicationArgs 1)
let tmp%33#0: uint64 = (btoi tmp%32#0)
let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0)
@@ -91,9 +91,9 @@ contract test_cases.abi_routing.contract.Reference:
block@7: // compare_assets_route_L109
let tmp%38#0: uint64 = (txn OnCompletion)
let tmp%39#0: bool = (! tmp%38#0)
- (assert tmp%39#0) // OnCompletion is NoOp
+ (assert tmp%39#0) // OnCompletion is not NoOp
let tmp%40#0: uint64 = (txn ApplicationID)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
let tmp%42#0: bytes = (txna ApplicationArgs 1)
let tmp%43#0: uint64 = (btoi tmp%42#0)
let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0)
@@ -105,9 +105,9 @@ contract test_cases.abi_routing.contract.Reference:
block@8: // get_address_route_L113
let tmp%48#0: uint64 = (txn OnCompletion)
let tmp%49#0: bool = (! tmp%48#0)
- (assert tmp%49#0) // OnCompletion is NoOp
+ (assert tmp%49#0) // OnCompletion is not NoOp
let tmp%50#0: uint64 = (txn ApplicationID)
- (assert tmp%50#0) // is not creating
+ (assert tmp%50#0) // can only call when not creating
let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address()
let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0)
(log tmp%53#0)
@@ -115,9 +115,9 @@ contract test_cases.abi_routing.contract.Reference:
block@9: // get_asset_route_L117
let tmp%54#0: uint64 = (txn OnCompletion)
let tmp%55#0: bool = (! tmp%54#0)
- (assert tmp%55#0) // OnCompletion is NoOp
+ (assert tmp%55#0) // OnCompletion is not NoOp
let tmp%56#0: uint64 = (txn ApplicationID)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset()
let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0)
(log tmp%59#0)
@@ -125,9 +125,9 @@ contract test_cases.abi_routing.contract.Reference:
block@10: // get_application_route_L121
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (! tmp%60#0)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
- (assert tmp%62#0) // is not creating
+ (assert tmp%62#0) // can only call when not creating
let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app()
let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0)
(log tmp%65#0)
@@ -135,9 +135,9 @@ contract test_cases.abi_routing.contract.Reference:
block@11: // get_an_int_route_L125
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (! tmp%66#0)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
- (assert tmp%68#0) // is not creating
+ (assert tmp%68#0) // can only call when not creating
let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int()
let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0)
(log tmp%71#0)
@@ -145,9 +145,9 @@ contract test_cases.abi_routing.contract.Reference:
block@12: // method_with_default_args_route_L129
let tmp%72#0: uint64 = (txn OnCompletion)
let tmp%73#0: bool = (! tmp%72#0)
- (assert tmp%73#0) // OnCompletion is NoOp
+ (assert tmp%73#0) // OnCompletion is not NoOp
let tmp%74#0: uint64 = (txn ApplicationID)
- (assert tmp%74#0) // is not creating
+ (assert tmp%74#0) // can only call when not creating
let tmp%76#0: bytes = (txna ApplicationArgs 1)
let tmp%77#0: uint64 = (btoi tmp%76#0)
let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0)
@@ -174,9 +174,9 @@ contract test_cases.abi_routing.contract.Reference:
block@13: // method_with_15_args_route_L166
let tmp%97#0: uint64 = (txn OnCompletion)
let tmp%98#0: bool = (! tmp%97#0)
- (assert tmp%98#0) // OnCompletion is NoOp
+ (assert tmp%98#0) // OnCompletion is not NoOp
let tmp%99#0: uint64 = (txn ApplicationID)
- (assert tmp%99#0) // is not creating
+ (assert tmp%99#0) // can only call when not creating
let tmp%101#0: bytes = (txna ApplicationArgs 1)
let tmp%102#0: uint64 = (btoi tmp%101#0)
let tmp%103#0: bytes = (txna ApplicationArgs 2)
@@ -218,9 +218,9 @@ contract test_cases.abi_routing.contract.Reference:
block@14: // method_with_more_than_15_args_route_L204
let tmp%132#0: uint64 = (txn OnCompletion)
let tmp%133#0: bool = (! tmp%132#0)
- (assert tmp%133#0) // OnCompletion is NoOp
+ (assert tmp%133#0) // OnCompletion is not NoOp
let tmp%134#0: uint64 = (txn ApplicationID)
- (assert tmp%134#0) // is not creating
+ (assert tmp%134#0) // can only call when not creating
let tmp%136#0: bytes = (txna ApplicationArgs 1)
let tmp%137#0: bytes = (txna ApplicationArgs 2)
let tmp%138#0: bytes = (txna ApplicationArgs 3)
@@ -284,9 +284,9 @@ contract test_cases.abi_routing.contract.Reference:
block@15: // hello_with_algopy_string_route_L270
let tmp%182#0: uint64 = (txn OnCompletion)
let tmp%183#0: bool = (! tmp%182#0)
- (assert tmp%183#0) // OnCompletion is NoOp
+ (assert tmp%183#0) // OnCompletion is not NoOp
let tmp%184#0: uint64 = (txn ApplicationID)
- (assert tmp%184#0) // is not creating
+ (assert tmp%184#0) // can only call when not creating
let tmp%186#0: bytes = (txna ApplicationArgs 1)
let tmp%187#0: bytes = ((extract 2 0) tmp%186#0)
let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0)
@@ -303,7 +303,7 @@ contract test_cases.abi_routing.contract.Reference:
block@19: // bare_abi_config_L66
let tmp%190#0: uint64 = (txn ApplicationID)
let tmp%191#0: bool = (! tmp%190#0)
- (assert tmp%191#0) // is creating
+ (assert tmp%191#0) // can only call when creating
test_cases.abi_routing.contract.Reference.bare_abi_config()
return 1u
block@22: // after_if_else_L22
diff --git a/test_cases/abi_routing/out_unoptimized/CustomApproval.approval.teal b/test_cases/abi_routing/out_unoptimized/CustomApproval.approval.teal
index b94072ea4d..9d0021af45 100644
--- a/test_cases/abi_routing/out_unoptimized/CustomApproval.approval.teal
+++ b/test_cases/abi_routing/out_unoptimized/CustomApproval.approval.teal
@@ -93,11 +93,11 @@ __puya_arc4_router___add_one_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/custom_approval.py:6
// class CustomApproval(ARC4Contract):
txna ApplicationArgs 1
@@ -129,7 +129,7 @@ __puya_arc4_router_____algopy_default_create@6:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/test_cases/abi_routing/out_unoptimized/CustomApproval.destructured.ir b/test_cases/abi_routing/out_unoptimized/CustomApproval.destructured.ir
index a3b94cf3c3..56dcd9cae9 100644
--- a/test_cases/abi_routing/out_unoptimized/CustomApproval.destructured.ir
+++ b/test_cases/abi_routing/out_unoptimized/CustomApproval.destructured.ir
@@ -51,10 +51,10 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@2: // add_one_route_L23
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let to_encode%0#0: uint64 = test_cases.abi_routing.custom_approval.CustomApproval.add_one(tmp%8#0)
@@ -72,7 +72,7 @@ contract test_cases.abi_routing.custom_approval.CustomApproval:
block@6: // __algopy_default_create_L1
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (== tmp%11#0 0u)
- (assert tmp%12#0) // is creating
+ (assert tmp%12#0) // can only call when creating
test_cases.abi_routing.custom_approval.CustomApproval.__algopy_default_create()
return 1u
block@7: // switch_case_default_L6
diff --git a/test_cases/abi_routing/out_unoptimized/MinimumARC4.approval.teal b/test_cases/abi_routing/out_unoptimized/MinimumARC4.approval.teal
index 751cf63386..0aa218809c 100644
--- a/test_cases/abi_routing/out_unoptimized/MinimumARC4.approval.teal
+++ b/test_cases/abi_routing/out_unoptimized/MinimumARC4.approval.teal
@@ -48,7 +48,7 @@ __puya_arc4_router_____algopy_default_create@3:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
pushint 1 // 1
retsub
diff --git a/test_cases/abi_routing/out_unoptimized/MinimumARC4.destructured.ir b/test_cases/abi_routing/out_unoptimized/MinimumARC4.destructured.ir
index 03d7819430..513c08f61e 100644
--- a/test_cases/abi_routing/out_unoptimized/MinimumARC4.destructured.ir
+++ b/test_cases/abi_routing/out_unoptimized/MinimumARC4.destructured.ir
@@ -29,7 +29,7 @@ contract test_cases.abi_routing.minimal.MinimumARC4:
block@3: // __algopy_default_create_L1
let tmp%3#0: uint64 = (txn ApplicationID)
let tmp%4#0: bool = (== tmp%3#0 0u)
- (assert tmp%4#0) // is creating
+ (assert tmp%4#0) // can only call when creating
test_cases.abi_routing.minimal.MinimumARC4.__algopy_default_create()
return 1u
block@4: // switch_case_default_L4
diff --git a/test_cases/abi_routing/out_unoptimized/Reference.approval.teal b/test_cases/abi_routing/out_unoptimized/Reference.approval.teal
index ded65c06e2..a8d90027bf 100644
--- a/test_cases/abi_routing/out_unoptimized/Reference.approval.teal
+++ b/test_cases/abi_routing/out_unoptimized/Reference.approval.teal
@@ -97,11 +97,11 @@ __puya_arc4_router___noop_with_uint64_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -157,11 +157,11 @@ __puya_arc4_router___mixed_oca_route@4:
shl
pushint 37 // 37
&
- assert // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ assert // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -189,11 +189,11 @@ __puya_arc4_router___opt_into_asset_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -211,11 +211,11 @@ __puya_arc4_router___with_transactions_route@6:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -247,11 +247,11 @@ __puya_arc4_router___compare_assets_route@7:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -272,11 +272,11 @@ __puya_arc4_router___get_address_route@8:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub get_address
bytec_0 // 0x151f7c75
swap
@@ -291,11 +291,11 @@ __puya_arc4_router___get_asset_route@9:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub get_asset
bytec_0 // 0x151f7c75
swap
@@ -310,11 +310,11 @@ __puya_arc4_router___get_application_route@10:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub get_app
bytec_0 // 0x151f7c75
swap
@@ -329,11 +329,11 @@ __puya_arc4_router___get_an_int_route@11:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub get_a_int
bytec_0 // 0x151f7c75
swap
@@ -360,11 +360,11 @@ __puya_arc4_router___method_with_default_args_route@12:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -421,11 +421,11 @@ __puya_arc4_router___method_with_15_args_route@13:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -495,11 +495,11 @@ __puya_arc4_router___method_with_more_than_15_args_route@14:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -637,11 +637,11 @@ __puya_arc4_router___hello_with_algopy_string_route@15:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// abi_routing/contract.py:22
// class Reference(ARC4Contract):
txna ApplicationArgs 1
@@ -693,7 +693,7 @@ __puya_arc4_router___bare_abi_config@19:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
// abi_routing/contract.py:66-76
// @arc4.baremethod(
// allow_actions=[
diff --git a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir
index 1b5c33eef9..677ee46bbb 100644
--- a/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir
+++ b/test_cases/abi_routing/out_unoptimized/Reference.destructured.ir
@@ -39,10 +39,10 @@ contract test_cases.abi_routing.contract.Reference:
block@2: // noop_with_uint64_route_L32
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = test_cases.abi_routing.contract.Reference.noop_with_uint64(tmp%7#0)
let tmp%9#0: bytes = (concat 0x151f7c75 tmp%8#0)
@@ -58,10 +58,10 @@ contract test_cases.abi_routing.contract.Reference:
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: uint64 = (shl 1u tmp%13#0)
let tmp%15#0: uint64 = (& tmp%14#0 37u)
- (assert tmp%15#0) // OnCompletion is one of NoOp, CloseOut, DeleteApplication
+ (assert tmp%15#0) // OnCompletion is not one of NoOp, CloseOut, DeleteApplication
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (!= tmp%16#0 0u)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
let tmp%18#0: bytes = (txna ApplicationArgs 1)
let tmp%19#0: bytes = test_cases.abi_routing.contract.Reference.mixed_oca(tmp%18#0)
let tmp%20#0: bytes = (concat 0x151f7c75 tmp%19#0)
@@ -70,10 +70,10 @@ contract test_cases.abi_routing.contract.Reference:
block@5: // opt_into_asset_route_L79
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (== tmp%21#0 NoOp)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
let tmp%24#0: bool = (!= tmp%23#0 0u)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
let tmp%25#0: bytes = (txna ApplicationArgs 1)
let tmp%26#0: uint64 = (btoi tmp%25#0)
let tmp%27#0: uint64 = ((txnas Assets) tmp%26#0)
@@ -82,10 +82,10 @@ contract test_cases.abi_routing.contract.Reference:
block@6: // with_transactions_route_L96
let tmp%28#0: uint64 = (txn OnCompletion)
let tmp%29#0: bool = (== tmp%28#0 NoOp)
- (assert tmp%29#0) // OnCompletion is NoOp
+ (assert tmp%29#0) // OnCompletion is not NoOp
let tmp%30#0: uint64 = (txn ApplicationID)
let tmp%31#0: bool = (!= tmp%30#0 0u)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
let tmp%32#0: bytes = (txna ApplicationArgs 1)
let tmp%33#0: uint64 = (btoi tmp%32#0)
let tmp%34#0: uint64 = ((txnas Assets) tmp%33#0)
@@ -101,10 +101,10 @@ contract test_cases.abi_routing.contract.Reference:
block@7: // compare_assets_route_L109
let tmp%38#0: uint64 = (txn OnCompletion)
let tmp%39#0: bool = (== tmp%38#0 NoOp)
- (assert tmp%39#0) // OnCompletion is NoOp
+ (assert tmp%39#0) // OnCompletion is not NoOp
let tmp%40#0: uint64 = (txn ApplicationID)
let tmp%41#0: bool = (!= tmp%40#0 0u)
- (assert tmp%41#0) // is not creating
+ (assert tmp%41#0) // can only call when not creating
let tmp%42#0: bytes = (txna ApplicationArgs 1)
let tmp%43#0: uint64 = (btoi tmp%42#0)
let tmp%44#0: uint64 = ((txnas Assets) tmp%43#0)
@@ -116,10 +116,10 @@ contract test_cases.abi_routing.contract.Reference:
block@8: // get_address_route_L113
let tmp%48#0: uint64 = (txn OnCompletion)
let tmp%49#0: bool = (== tmp%48#0 NoOp)
- (assert tmp%49#0) // OnCompletion is NoOp
+ (assert tmp%49#0) // OnCompletion is not NoOp
let tmp%50#0: uint64 = (txn ApplicationID)
let tmp%51#0: bool = (!= tmp%50#0 0u)
- (assert tmp%51#0) // is not creating
+ (assert tmp%51#0) // can only call when not creating
let tmp%52#0: bytes = test_cases.abi_routing.contract.Reference.get_address()
let tmp%53#0: bytes = (concat 0x151f7c75 tmp%52#0)
(log tmp%53#0)
@@ -127,10 +127,10 @@ contract test_cases.abi_routing.contract.Reference:
block@9: // get_asset_route_L117
let tmp%54#0: uint64 = (txn OnCompletion)
let tmp%55#0: bool = (== tmp%54#0 NoOp)
- (assert tmp%55#0) // OnCompletion is NoOp
+ (assert tmp%55#0) // OnCompletion is not NoOp
let tmp%56#0: uint64 = (txn ApplicationID)
let tmp%57#0: bool = (!= tmp%56#0 0u)
- (assert tmp%57#0) // is not creating
+ (assert tmp%57#0) // can only call when not creating
let tmp%58#0: bytes = test_cases.abi_routing.contract.Reference.get_asset()
let tmp%59#0: bytes = (concat 0x151f7c75 tmp%58#0)
(log tmp%59#0)
@@ -138,10 +138,10 @@ contract test_cases.abi_routing.contract.Reference:
block@10: // get_application_route_L121
let tmp%60#0: uint64 = (txn OnCompletion)
let tmp%61#0: bool = (== tmp%60#0 NoOp)
- (assert tmp%61#0) // OnCompletion is NoOp
+ (assert tmp%61#0) // OnCompletion is not NoOp
let tmp%62#0: uint64 = (txn ApplicationID)
let tmp%63#0: bool = (!= tmp%62#0 0u)
- (assert tmp%63#0) // is not creating
+ (assert tmp%63#0) // can only call when not creating
let tmp%64#0: bytes = test_cases.abi_routing.contract.Reference.get_app()
let tmp%65#0: bytes = (concat 0x151f7c75 tmp%64#0)
(log tmp%65#0)
@@ -149,10 +149,10 @@ contract test_cases.abi_routing.contract.Reference:
block@11: // get_an_int_route_L125
let tmp%66#0: uint64 = (txn OnCompletion)
let tmp%67#0: bool = (== tmp%66#0 NoOp)
- (assert tmp%67#0) // OnCompletion is NoOp
+ (assert tmp%67#0) // OnCompletion is not NoOp
let tmp%68#0: uint64 = (txn ApplicationID)
let tmp%69#0: bool = (!= tmp%68#0 0u)
- (assert tmp%69#0) // is not creating
+ (assert tmp%69#0) // can only call when not creating
let tmp%70#0: bytes = test_cases.abi_routing.contract.Reference.get_a_int()
let tmp%71#0: bytes = (concat 0x151f7c75 tmp%70#0)
(log tmp%71#0)
@@ -160,10 +160,10 @@ contract test_cases.abi_routing.contract.Reference:
block@12: // method_with_default_args_route_L129
let tmp%72#0: uint64 = (txn OnCompletion)
let tmp%73#0: bool = (== tmp%72#0 NoOp)
- (assert tmp%73#0) // OnCompletion is NoOp
+ (assert tmp%73#0) // OnCompletion is not NoOp
let tmp%74#0: uint64 = (txn ApplicationID)
let tmp%75#0: bool = (!= tmp%74#0 0u)
- (assert tmp%75#0) // is not creating
+ (assert tmp%75#0) // can only call when not creating
let tmp%76#0: bytes = (txna ApplicationArgs 1)
let tmp%77#0: uint64 = (btoi tmp%76#0)
let tmp%78#0: uint64 = ((txnas Assets) tmp%77#0)
@@ -190,10 +190,10 @@ contract test_cases.abi_routing.contract.Reference:
block@13: // method_with_15_args_route_L166
let tmp%97#0: uint64 = (txn OnCompletion)
let tmp%98#0: bool = (== tmp%97#0 NoOp)
- (assert tmp%98#0) // OnCompletion is NoOp
+ (assert tmp%98#0) // OnCompletion is not NoOp
let tmp%99#0: uint64 = (txn ApplicationID)
let tmp%100#0: bool = (!= tmp%99#0 0u)
- (assert tmp%100#0) // is not creating
+ (assert tmp%100#0) // can only call when not creating
let tmp%101#0: bytes = (txna ApplicationArgs 1)
let tmp%102#0: uint64 = (btoi tmp%101#0)
let tmp%103#0: bytes = (txna ApplicationArgs 2)
@@ -235,10 +235,10 @@ contract test_cases.abi_routing.contract.Reference:
block@14: // method_with_more_than_15_args_route_L204
let tmp%132#0: uint64 = (txn OnCompletion)
let tmp%133#0: bool = (== tmp%132#0 NoOp)
- (assert tmp%133#0) // OnCompletion is NoOp
+ (assert tmp%133#0) // OnCompletion is not NoOp
let tmp%134#0: uint64 = (txn ApplicationID)
let tmp%135#0: bool = (!= tmp%134#0 0u)
- (assert tmp%135#0) // is not creating
+ (assert tmp%135#0) // can only call when not creating
let tmp%136#0: bytes = (txna ApplicationArgs 1)
let tmp%137#0: bytes = (txna ApplicationArgs 2)
let tmp%138#0: bytes = (txna ApplicationArgs 3)
@@ -302,10 +302,10 @@ contract test_cases.abi_routing.contract.Reference:
block@15: // hello_with_algopy_string_route_L270
let tmp%182#0: uint64 = (txn OnCompletion)
let tmp%183#0: bool = (== tmp%182#0 NoOp)
- (assert tmp%183#0) // OnCompletion is NoOp
+ (assert tmp%183#0) // OnCompletion is not NoOp
let tmp%184#0: uint64 = (txn ApplicationID)
let tmp%185#0: bool = (!= tmp%184#0 0u)
- (assert tmp%185#0) // is not creating
+ (assert tmp%185#0) // can only call when not creating
let tmp%186#0: bytes = (txna ApplicationArgs 1)
let tmp%187#0: bytes = ((extract 2 0) tmp%186#0)
let to_encode%1#0: bytes = test_cases.abi_routing.contract.Reference.hello_with_algopy_string(tmp%187#0)
@@ -326,7 +326,7 @@ contract test_cases.abi_routing.contract.Reference:
block@19: // bare_abi_config_L66
let tmp%190#0: uint64 = (txn ApplicationID)
let tmp%191#0: bool = (== tmp%190#0 0u)
- (assert tmp%191#0) // is creating
+ (assert tmp%191#0) // can only call when creating
test_cases.abi_routing.contract.Reference.bare_abi_config()
return 1u
block@20: // switch_case_default_L22
diff --git a/test_cases/abi_routing/puya.log b/test_cases/abi_routing/puya.log
index 5c0210a16f..5f2a175161 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 hello_with_algopy_string_block@0.ops[10]: 'v-load tmp%1#0' with
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 7c6cc6bdb9..9dd020d70c 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.approval.mir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.mir
index d20439da29..8e10476874 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.mir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.mir
@@ -38,9 +38,9 @@ __puya_arc4_router___test_static_elements_route@2:
// @arc4.abimethod()
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_static_elements
int 1 1
retsub 1
@@ -50,9 +50,9 @@ __puya_arc4_router___test_dynamic_elements_route@3:
// @arc4.abimethod()
txn OnCompletion tmp%7#0
! tmp%8#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%9#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_dynamic_elements
int 1 1
retsub 1
@@ -62,9 +62,9 @@ __puya_arc4_router___test_mixed_single_dynamic_elements_route@4:
// @arc4.abimethod()
txn OnCompletion tmp%11#0
! tmp%12#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%13#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_mixed_single_dynamic_elements
int 1 1
retsub 1
@@ -74,9 +74,9 @@ __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5:
// @arc4.abimethod()
txn OnCompletion tmp%15#0
! tmp%16#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%17#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_mixed_multiple_dynamic_elements
int 1 1
retsub 1
@@ -86,9 +86,9 @@ __puya_arc4_router___test_nested_struct_replacement_route@6:
// @arc4.abimethod()
txn OnCompletion tmp%19#0
! tmp%20#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%21#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_nested_struct_replacement
int 1 1
retsub 1
@@ -98,9 +98,9 @@ __puya_arc4_router___test_nested_tuple_modification_route@7:
// @arc4.abimethod()
txn OnCompletion tmp%23#0
! tmp%24#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%25#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_nested_tuple_modification
int 1 1
retsub 1
@@ -115,7 +115,7 @@ __puya_arc4_router___bare_routing@10:
__puya_arc4_router_____algopy_default_create@11:
txn ApplicationID tmp%28#0
! tmp%29#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal
index 24d8e44e9a..a4f9ab52d8 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal
@@ -25,9 +25,9 @@ __puya_arc4_router___test_static_elements_route@2:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_static_elements
intc_1 // 1
retsub
@@ -37,9 +37,9 @@ __puya_arc4_router___test_dynamic_elements_route@3:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_dynamic_elements
intc_1 // 1
retsub
@@ -49,9 +49,9 @@ __puya_arc4_router___test_mixed_single_dynamic_elements_route@4:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_mixed_single_dynamic_elements
intc_1 // 1
retsub
@@ -61,9 +61,9 @@ __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_mixed_multiple_dynamic_elements
intc_1 // 1
retsub
@@ -73,9 +73,9 @@ __puya_arc4_router___test_nested_struct_replacement_route@6:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_nested_struct_replacement
intc_1 // 1
retsub
@@ -85,9 +85,9 @@ __puya_arc4_router___test_nested_tuple_modification_route@7:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_nested_tuple_modification
intc_1 // 1
retsub
@@ -99,7 +99,7 @@ __puya_arc4_router___bare_routing@10:
bnz __puya_arc4_router___after_if_else@14
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json
index 685073ad41..a3dc19f137 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json
@@ -32,7 +32,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgMiA0CiAgICBieXRlY2Jsb2NrIDB4MDAwNCAweDAwMDIgMHgwMDFjIDB4IDB4MDAxMiAweDAwMWEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwCiAgICBwdXNoYnl0ZXNzIDB4NTU3MTU4MjcgMHg3MTNkZDZkYiAweDM3MTU4YWFjIDB4ODU3MGJlM2IgMHg1MWFhOGM0OSAweDI4M2ExODZmIC8vIG1ldGhvZCAidGVzdF9zdGF0aWNfZWxlbWVudHMoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfc3RhdGljX2VsZW1lbnRzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbl9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3N0YXRpY19lbGVtZW50c19yb3V0ZUAyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9zdGF0aWNfZWxlbWVudHMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfZHluYW1pY19lbGVtZW50c19yb3V0ZUAzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHNfcm91dGVANToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50X3JvdXRlQDY6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb25fcm91dGVANzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3Rfc3RhdGljX2VsZW1lbnRzKCkgLT4gdm9pZDoKdGVzdF9zdGF0aWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3Rfc3RhdGljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDIKICAgIC8vIGJ5dGVfYXJyYXkxID0gYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTEoKSwgZ2V0X2J5dGUyKCkpCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MwogICAgLy8gYnl0ZV9hcnJheTIgPSBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMygpLCBnZXRfYnl0ZTQoKSkKICAgIGNhbGxzdWIgZ2V0X2J5dGUzCiAgICBjYWxsc3ViIGdldF9ieXRlNAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzdHJ1Y3QxID0gU3RhdGljU3RydWN0KGdldF91aW50MSgpLCBieXRlX2FycmF5MS5jb3B5KCkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDYKICAgIC8vIHN0cnVjdDIgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGJ5dGVfYXJyYXkyLmNvcHkoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0NwogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0OAogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICByZXBsYWNlMiAxMgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0OQogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NTAKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDEwIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICBleHRyYWN0IDEwIDEwIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgcHVzaGludCAxMCAvLyAxMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QxCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIHBvcAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9ieXRlMSgpIC0+IGJ5dGVzOgpnZXRfYnl0ZTE6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2J5dGUxKCkgLT4gYXJjNC5CeXRlOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gcmV0dXJuIGFyYzQuQnl0ZSg0KQogICAgcHVzaGJ5dGVzIDB4MDQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTIoKSAtPiBieXRlczoKZ2V0X2J5dGUyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDMtMjA0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlMigpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDUKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoNSkKICAgIHB1c2hieXRlcyAweDA1CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGUzKCkgLT4gYnl0ZXM6CmdldF9ieXRlMzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTMoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjEwCiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDQyKQogICAgcHVzaGJ5dGVzIDB4MmEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTQoKSAtPiBieXRlczoKZ2V0X2J5dGU0OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlNCgpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTUKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoMjU1KQogICAgcHVzaGJ5dGVzIDB4ZmYKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdWludDEoKSAtPiBieXRlczoKZ2V0X3VpbnQxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODgtMTg5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91aW50MSgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5MAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDMpCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3VpbnQyKCkgLT4gYnl0ZXM6CmdldF91aW50MjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTkzLTE5NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdWludDIoKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgyKio0MikKICAgIHB1c2hieXRlcyAweDAwMDAwNDAwMDAwMDAwMDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfZHluYW1pY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBzdHJ1Y3QxID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzdHJ1Y3QyID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMygpLCBnZXRfc3RyaW5nMSgpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMwogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhcnJheSA9IGFyYzQuRHluYW1pY0FycmF5KHN0cnVjdDEuY29weSgpLCBzdHJ1Y3QxLmNvcHkoKSkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MQogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDEuY29weSgpKQogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhcnJheVsxXSA9IHN0cnVjdDIuY29weSgpICAjIHJlcGxhY2UKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2NAogICAgLy8gbG9nKGFycmF5WzBdKQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICB1bmNvdmVyIDQKICAgIHNlbGVjdAogICAgZGlnIDUKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjUKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyA0CiAgICBpbnRjXzMgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBsb2coYXJyYXlbMl0pCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzEKICAgIC8vIGxvZyhhcnJheSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MwogICAgLy8gbG9nKGFycmF5KQogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3N0cmluZzEoKSAtPiBieXRlczoKZ2V0X3N0cmluZzE6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cmluZzEoKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzUKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZygiYSIpCiAgICBwdXNoYnl0ZXMgMHgwMDAxNjEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfc3RyaW5nMigpIC0+IGJ5dGVzOgpnZXRfc3RyaW5nMjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RyaW5nMigpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nKCJiZWUiKQogICAgcHVzaGJ5dGVzIDB4MDAwMzYyNjU2NQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9zdHJpbmczKCkgLT4gYnl0ZXM6CmdldF9zdHJpbmczOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODMtMTg0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9zdHJpbmczKCkgLT4gYXJjNC5TdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoIkhlbGxvIFdvcmxkIikKICAgIHB1c2hieXRlcyAweDAwMGI0ODY1NmM2YzZmMjA1NzZmNzI2YzY0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NwogICAgLy8gc3RydWN0MSA9IE1peGVkU2luZ2xlU3RydWN0KGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3OAogICAgLy8gc3RydWN0MiA9IE1peGVkU2luZ2xlU3RydWN0KGdldF91aW50MigpLCBnZXRfc3RyaW5nMigpLCBnZXRfdWludDEoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MAogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDIuY29weSgpKQogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vIDB4CiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBhcnJheS5hcHBlbmQoc3RydWN0Mi5jb3B5KCkpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhcnJheVswXSA9IHN0cnVjdDEuY29weSgpICAjIHJlcGxhY2UKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4NAogICAgLy8gbG9nKGFycmF5WzBdKQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICB1bmNvdmVyIDQKICAgIHNlbGVjdAogICAgZGlnIDUKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODcKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHBvcAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50czoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAtOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTMKICAgIC8vIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5Mi05NAogICAgLy8gc3RydWN0MSA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgYnl0ZWNfMiAvLyAweDAwMWMKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCAyOCAvLyAyOAogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5NgogICAgLy8gZ2V0X3VpbnQyKCksIGdldF9zdHJpbmcyKCksIGdldF91aW50MSgpLCBnZXRfdTE2X2FycjIoKSwgZ2V0X3VpbnQyKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfdTE2X2FycjIKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojk1LTk3CiAgICAvLyBzdHJ1Y3QyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDIoKSwgZ2V0X3N0cmluZzIoKSwgZ2V0X3VpbnQxKCksIGdldF91MTZfYXJyMigpLCBnZXRfdWludDIoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBhcnJheSA9IGFyYzQuRHluYW1pY0FycmF5KHN0cnVjdDEuY29weSgpLCBzdHJ1Y3QxLmNvcHkoKSkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5OQogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKQogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTAwCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDEKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gbG9nKGFycmF5WzFdKQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdTE2X2FycjEoKSAtPiBieXRlczoKZ2V0X3UxNl9hcnIxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91MTZfYXJyMSgpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDE2XToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjAKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlVJbnQxNigyKioxNiAtIDEpLCBhcmM0LlVJbnQxNigwKSwgYXJjNC5VSW50MTYoNDIpKQogICAgcHVzaGJ5dGVzIDB4MDAwM2ZmZmYwMDAwMDAyYQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF91MTZfYXJyMigpIC0+IGJ5dGVzOgpnZXRfdTE2X2FycjI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIyMy0yMjQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3UxNl9hcnIyKCkgLT4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50MTZdOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuVUludDE2KDEpLCBhcmM0LlVJbnQxNigyKSwgYXJjNC5VSW50MTYoMyksIGFyYzQuVUludDE2KDQpKQogICAgcHVzaGJ5dGVzIDB4MDAwNDAwMDEwMDAyMDAwMzAwMDQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA5CiAgICAvLyBvbmUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQxKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMAogICAgLy8gdHdvID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gdGhyZWUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUyKCksIGdldF9ieXRlMSgpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfdTE2X2FycjEKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMi0xMTQKICAgIC8vIGZvdXIgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTE1CiAgICAvLyBmaXZlID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExNi0xMjIKICAgIC8vIHN0cnVjdDEgPSBOZXN0ZWREeW5hbWljU3RydWN0KAogICAgLy8gICAgIG9uZT1vbmUuY29weSgpLAogICAgLy8gICAgIHR3bz10d28uY29weSgpLAogICAgLy8gICAgIHRocmVlPXRocmVlLmNvcHkoKSwKICAgIC8vICAgICBmb3VyPWZvdXIuY29weSgpLAogICAgLy8gICAgIGZpdmU9Zml2ZS5jb3B5KCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjIDUgLy8gMHgwMDFhCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGRpZyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgZGlnIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMjUKICAgIC8vIHR3bz1EeW5hbWljU3RydWN0KGdldF9zdHJpbmcyKCksIGdldF9zdHJpbmcxKCkpLCAgIyB0aGlzIGlzIHRoZSBkaWZmZXJlbmNlIHdpdGggc3RydWN0MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEyMy0xMjkKICAgIC8vIHN0cnVjdDIgPSBOZXN0ZWREeW5hbWljU3RydWN0KAogICAgLy8gICAgIG9uZT1vbmUuY29weSgpLAogICAgLy8gICAgIHR3bz1EeW5hbWljU3RydWN0KGdldF9zdHJpbmcyKCksIGdldF9zdHJpbmcxKCkpLCAgIyB0aGlzIGlzIHRoZSBkaWZmZXJlbmNlIHdpdGggc3RydWN0MQogICAgLy8gICAgIHRocmVlPXRocmVlLmNvcHkoKSwKICAgIC8vICAgICBmb3VyPWZvdXIuY29weSgpLAogICAgLy8gICAgIGZpdmU9Zml2ZS5jb3B5KCksCiAgICAvLyApCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAyNiAvLyAyNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTMxCiAgICAvLyBzdHJ1Y3QyLnR3byA9IHR3by5jb3B5KCkgICMgbm93IHN0cnVjdDIgc2hvdWxkIG1hdGNoIHN0cnVjdDEKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGRpZyAxCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgICsKICAgIGRpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICByZXBsYWNlMiAyMgogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciA0CiAgICArCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAyNAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmJ5dGVzID09IHN0cnVjdDIuYnl0ZXMsICJzdHJ1Y3QxIGRvZXMgbm90IG1hdGNoIHN0cnVjdDIiCiAgICA9PQogICAgYXNzZXJ0IC8vIHN0cnVjdDEgZG9lcyBub3QgbWF0Y2ggc3RydWN0MgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMzYKICAgIC8vIG9uZSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDEoKSwgYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTEoKSwgZ2V0X2J5dGUyKCkpKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X2J5dGUxCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY29uY2F0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM3CiAgICAvLyB0d28gPSBEeW5hbWljU3RydWN0KGdldF9zdHJpbmcxKCksIGdldF9zdHJpbmcyKCkpCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM4CiAgICAvLyB0aHJlZSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDIoKSwgYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTIoKSwgZ2V0X2J5dGUxKCkpKQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY29uY2F0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQwCiAgICAvLyBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM5LTE0MQogICAgLy8gZm91cjEgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQzCiAgICAvLyBnZXRfdWludDEoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gZ2V0X3N0cmluZzEoKSwKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ1CiAgICAvLyBnZXRfdWludDIoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZ2V0X3UxNl9hcnIxKCkgKyAoYXJjNC5VSW50MTYoMTIzKSwpLCAgIyBub3FhOiBSVUYwMDUKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDA3YgogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ3CiAgICAvLyBnZXRfdWludDEoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0Mi0xNDgKICAgIC8vIGZvdXIyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwKICAgIC8vICAgICBnZXRfc3RyaW5nMSgpLAogICAgLy8gICAgIGdldF91aW50MigpLAogICAgLy8gICAgIGdldF91MTZfYXJyMSgpICsgKGFyYzQuVUludDE2KDEyMyksKSwgICMgbm9xYTogUlVGMDA1CiAgICAvLyAgICAgZ2V0X3VpbnQxKCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBmaXZlID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE1MC0xNTgKICAgIC8vIHR1cDEgPSBhcmM0LlR1cGxlKAogICAgLy8gICAgICgKICAgIC8vICAgICAgICAgb25lLmNvcHkoKSwKICAgIC8vICAgICAgICAgdHdvLmNvcHkoKSwKICAgIC8vICAgICAgICAgdGhyZWUuY29weSgpLAogICAgLy8gICAgICAgICBmb3VyMS5jb3B5KCksCiAgICAvLyAgICAgICAgIGZpdmUuY29weSgpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgNQogICAgYnl0ZWMgNSAvLyAweDAwMWEKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGxlbgogICAgcHVzaGludCAyNiAvLyAyNgogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE1OS0xNjcKICAgIC8vIHR1cDIgPSBhcmM0LlR1cGxlKAogICAgLy8gICAgICgKICAgIC8vICAgICAgICAgb25lLmNvcHkoKSwKICAgIC8vICAgICAgICAgdHdvLmNvcHkoKSwKICAgIC8vICAgICAgICAgdGhyZWUuY29weSgpLAogICAgLy8gICAgICAgICBmb3VyMi5jb3B5KCksCiAgICAvLyAgICAgICAgIGZpdmUuY29weSgpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gdHVwMlszXS5kLnBvcCgpCiAgICBkdXAKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBidXJ5IDEKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNAogICAgZXh0cmFjdDMKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgNQogICAgZGlnIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgc3dhcAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgLQogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgIGRpZyAyCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgKwogICAgc3dhcAogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDI0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gYXNzZXJ0IHR1cDEuYnl0ZXMgPT0gdHVwMi5ieXRlcywgInR1cDEgZG9lcyBub3QgbWF0Y2ggdHVwMiIKICAgID09CiAgICBhc3NlcnQgLy8gdHVwMSBkb2VzIG5vdCBtYXRjaCB0dXAyCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplKGFycmF5OiBieXRlcywgZml4ZWRfYnl0ZV9zaXplOiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZToKICAgIHByb3RvIDIgMgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBkdXAKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QzCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudChhcnJheTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMSAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgYnl0ZWNfMyAvLyAweAogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2J1cnkgMQogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBzdGF0aWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50KGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQsIGFycmF5X2xlbmd0aDogdWludDY0KSAtPiBieXRlczoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTQKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgMwogICAgLQogICAgY292ZXIgMwogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDIKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgMiA0CiAgICBieXRlY2Jsb2NrIDB4MDAwNCAweDAwMDIgMHgwMDFjIDB4IDB4MDAxMiAweDAwMWEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwCiAgICBwdXNoYnl0ZXNzIDB4NTU3MTU4MjcgMHg3MTNkZDZkYiAweDM3MTU4YWFjIDB4ODU3MGJlM2IgMHg1MWFhOGM0OSAweDI4M2ExODZmIC8vIG1ldGhvZCAidGVzdF9zdGF0aWNfZWxlbWVudHMoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfc3RhdGljX2VsZW1lbnRzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbl9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3N0YXRpY19lbGVtZW50c19yb3V0ZUAyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X3N0YXRpY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfZHluYW1pY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHNfcm91dGVANToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnRfcm91dGVANjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfdHVwbGVfbW9kaWZpY2F0aW9uX3JvdXRlQDc6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X3N0YXRpY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3Rfc3RhdGljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3N0YXRpY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBieXRlX2FycmF5MSA9IGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKQogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDMKICAgIC8vIGJ5dGVfYXJyYXkyID0gYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTMoKSwgZ2V0X2J5dGU0KCkpCiAgICBjYWxsc3ViIGdldF9ieXRlMwogICAgY2FsbHN1YiBnZXRfYnl0ZTQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0NQogICAgLy8gc3RydWN0MSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDEoKSwgYnl0ZV9hcnJheTEuY29weSgpKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBzdHJ1Y3QyID0gU3RhdGljU3RydWN0KGdldF91aW50MigpLCBieXRlX2FycmF5Mi5jb3B5KCkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDcKICAgIC8vIGFycmF5ID0gYXJjNC5EeW5hbWljQXJyYXkoc3RydWN0MS5jb3B5KCksIHN0cnVjdDEuY29weSgpKQogICAgZGlnIDEKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDgKICAgIC8vIGFycmF5WzFdID0gc3RydWN0Mi5jb3B5KCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcmVwbGFjZTIgMTIKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDkKICAgIC8vIGxvZyhhcnJheSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBsb2coYXJyYXlbMF0pCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxMCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1MQogICAgLy8gbG9nKGFycmF5WzFdKQogICAgZXh0cmFjdCAxMCAxMCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgcHVzaGludCAxMCAvLyAxMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTEoKSAtPiBieXRlczoKZ2V0X2J5dGUxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTgtMTk5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlMSgpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDAKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoNCkKICAgIHB1c2hieXRlcyAweDA0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGUyKCkgLT4gYnl0ZXM6CmdldF9ieXRlMjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjAzLTIwNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTIoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDUpCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9ieXRlMygpIC0+IGJ5dGVzOgpnZXRfYnl0ZTM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2J5dGUzKCkgLT4gYXJjNC5CeXRlOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gcmV0dXJuIGFyYzQuQnl0ZSg0MikKICAgIHB1c2hieXRlcyAweDJhCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGU0KCkgLT4gYnl0ZXM6CmdldF9ieXRlNDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTQoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjE1CiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDI1NSkKICAgIHB1c2hieXRlcyAweGZmCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3VpbnQxKCkgLT4gYnl0ZXM6CmdldF91aW50MToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdWludDEoKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF91aW50MigpIC0+IGJ5dGVzOgpnZXRfdWludDI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5My0xOTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3VpbnQyKCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoMioqNDIpCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDQwMDAwMDAwMDAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9keW5hbWljX2VsZW1lbnRzKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2R5bmFtaWNfZWxlbWVudHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1OAogICAgLy8gc3RydWN0MSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1OQogICAgLy8gc3RydWN0MiA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzMoKSwgZ2V0X3N0cmluZzEoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzMKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MAogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjEKICAgIC8vIGFycmF5LmFwcGVuZChzdHJ1Y3QxLmNvcHkoKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MgogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKSAgIyByZXBsYWNlCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MwogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjQKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2NgogICAgLy8gbG9nKGFycmF5WzJdKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBwdXNoaW50IDYgLy8gNgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2OQogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzAKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MgogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzMKICAgIC8vIGxvZyhhcnJheSkKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9zdHJpbmcxKCkgLT4gYnl0ZXM6CmdldF9zdHJpbmcxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzMtMTc0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9zdHJpbmcxKCkgLT4gYXJjNC5TdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTc1CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoImEiKQogICAgcHVzaGJ5dGVzIDB4MDAwMTYxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3N0cmluZzIoKSAtPiBieXRlczoKZ2V0X3N0cmluZzI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3OC0xNzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cmluZzIoKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZygiYmVlIikKICAgIHB1c2hieXRlcyAweDAwMDM2MjY1NjUKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfc3RyaW5nMygpIC0+IGJ5dGVzOgpnZXRfc3RyaW5nMzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RyaW5nMygpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgMHgwMDBiNDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NS03NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzcKICAgIC8vIHN0cnVjdDEgPSBNaXhlZFNpbmdsZVN0cnVjdChnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgNCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzgKICAgIC8vIHN0cnVjdDIgPSBNaXhlZFNpbmdsZVN0cnVjdChnZXRfdWludDIoKSwgZ2V0X3N0cmluZzIoKSwgZ2V0X3VpbnQxKCkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgNCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODAKICAgIC8vIGFycmF5LmFwcGVuZChzdHJ1Y3QyLmNvcHkoKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAweAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MQogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDIuY29weSgpKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MgogICAgLy8gYXJyYXlbMF0gPSBzdHJ1Y3QxLmNvcHkoKSAgIyByZXBsYWNlCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MwogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODQKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGludGNfMyAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4OAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjkwLTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTItOTQKICAgIC8vIHN0cnVjdDEgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTYKICAgIC8vIGdldF91aW50MigpLCBnZXRfc3RyaW5nMigpLCBnZXRfdWludDEoKSwgZ2V0X3UxNl9hcnIyKCksIGdldF91aW50MigpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIyCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5NS05NwogICAgLy8gc3RydWN0MiA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQyKCksIGdldF9zdHJpbmcyKCksIGdldF91aW50MSgpLCBnZXRfdTE2X2FycjIoKSwgZ2V0X3VpbnQyKCkKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgYnl0ZWNfMiAvLyAweDAwMWMKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCAyOCAvLyAyOAogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5OAogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTkKICAgIC8vIGFycmF5WzFdID0gc3RydWN0Mi5jb3B5KCkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTAxCiAgICAvLyBsb2coYXJyYXlbMF0pCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIHVuY292ZXIgNAogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDIKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgcG9wCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3UxNl9hcnIxKCkgLT4gYnl0ZXM6CmdldF91MTZfYXJyMToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjE4LTIxOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdTE2X2FycjEoKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQxNl06CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjIwCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5VSW50MTYoMioqMTYgLSAxKSwgYXJjNC5VSW50MTYoMCksIGFyYzQuVUludDE2KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDNmZmZmMDAwMDAwMmEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdTE2X2FycjIoKSAtPiBieXRlczoKZ2V0X3UxNl9hcnIyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjMtMjI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91MTZfYXJyMigpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDE2XToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjUKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlVJbnQxNigxKSwgYXJjNC5VSW50MTYoMiksIGFyYzQuVUludDE2KDMpLCBhcmM0LlVJbnQxNig0KSkKICAgIHB1c2hieXRlcyAweDAwMDQwMDAxMDAwMjAwMDMwMDA0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50KCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gb25lID0gU3RhdGljU3RydWN0KGdldF91aW50MSgpLCBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMSgpLCBnZXRfYnl0ZTIoKSkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTAKICAgIC8vIHR3byA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTEKICAgIC8vIHRocmVlID0gU3RhdGljU3RydWN0KGdldF91aW50MigpLCBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMigpLCBnZXRfYnl0ZTEoKSkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNhbGxzdWIgZ2V0X2J5dGUxCiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTMKICAgIC8vIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTItMTE0CiAgICAvLyBmb3VyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gZml2ZSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTYtMTIyCiAgICAvLyBzdHJ1Y3QxID0gTmVzdGVkRHluYW1pY1N0cnVjdCgKICAgIC8vICAgICBvbmU9b25lLmNvcHkoKSwKICAgIC8vICAgICB0d289dHdvLmNvcHkoKSwKICAgIC8vICAgICB0aHJlZT10aHJlZS5jb3B5KCksCiAgICAvLyAgICAgZm91cj1mb3VyLmNvcHkoKSwKICAgIC8vICAgICBmaXZlPWZpdmUuY29weSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlYyA1IC8vIDB4MDAxYQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBkaWcgMQogICAgKwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTI1CiAgICAvLyB0d289RHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMigpLCBnZXRfc3RyaW5nMSgpKSwgICMgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHN0cnVjdDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMjMtMTI5CiAgICAvLyBzdHJ1Y3QyID0gTmVzdGVkRHluYW1pY1N0cnVjdCgKICAgIC8vICAgICBvbmU9b25lLmNvcHkoKSwKICAgIC8vICAgICB0d289RHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMigpLCBnZXRfc3RyaW5nMSgpKSwgICMgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHN0cnVjdDEKICAgIC8vICAgICB0aHJlZT10aHJlZS5jb3B5KCksCiAgICAvLyAgICAgZm91cj1mb3VyLmNvcHkoKSwKICAgIC8vICAgICBmaXZlPWZpdmUuY29weSgpLAogICAgLy8gKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc3RydWN0Mi50d28gPSB0d28uY29weSgpICAjIG5vdyBzdHJ1Y3QyIHNob3VsZCBtYXRjaCBzdHJ1Y3QxCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgZGlnIDIKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBkaWcgMQogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICArCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgcmVwbGFjZTIgMjIKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMjQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgc3RydWN0MS5ieXRlcyA9PSBzdHJ1Y3QyLmJ5dGVzLCAic3RydWN0MSBkb2VzIG5vdCBtYXRjaCBzdHJ1Y3QyIgogICAgPT0KICAgIGFzc2VydCAvLyBzdHJ1Y3QxIGRvZXMgbm90IG1hdGNoIHN0cnVjdDIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24oKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb246CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfdHVwbGVfbW9kaWZpY2F0aW9uKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM2CiAgICAvLyBvbmUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQxKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gdHdvID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gdGhyZWUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUyKCksIGdldF9ieXRlMSgpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfdTE2X2FycjEKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzOS0xNDEKICAgIC8vIGZvdXIxID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gZ2V0X3VpbnQxKCksCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDQKICAgIC8vIGdldF9zdHJpbmcxKCksCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZ2V0X3VpbnQyKCksCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDYKICAgIC8vIGdldF91MTZfYXJyMSgpICsgKGFyYzQuVUludDE2KDEyMyksKSwgICMgbm9xYTogUlVGMDA1CiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAwN2IKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZ2V0X3VpbnQxKCksCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDItMTQ4CiAgICAvLyBmb3VyMiA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQxKCksCiAgICAvLyAgICAgZ2V0X3N0cmluZzEoKSwKICAgIC8vICAgICBnZXRfdWludDIoKSwKICAgIC8vICAgICBnZXRfdTE2X2FycjEoKSArIChhcmM0LlVJbnQxNigxMjMpLCksICAjIG5vcWE6IFJVRjAwNQogICAgLy8gICAgIGdldF91aW50MSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZml2ZSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNTAtMTU4CiAgICAvLyB0dXAxID0gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIG9uZS5jb3B5KCksCiAgICAvLyAgICAgICAgIHR3by5jb3B5KCksCiAgICAvLyAgICAgICAgIHRocmVlLmNvcHkoKSwKICAgIC8vICAgICAgICAgZm91cjEuY29weSgpLAogICAgLy8gICAgICAgICBmaXZlLmNvcHkoKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDUKICAgIGJ5dGVjIDUgLy8gMHgwMDFhCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNTktMTY3CiAgICAvLyB0dXAyID0gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIG9uZS5jb3B5KCksCiAgICAvLyAgICAgICAgIHR3by5jb3B5KCksCiAgICAvLyAgICAgICAgIHRocmVlLmNvcHkoKSwKICAgIC8vICAgICAgICAgZm91cjIuY29weSgpLAogICAgLy8gICAgICAgICBmaXZlLmNvcHkoKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNjkKICAgIC8vIHR1cDJbM10uZC5wb3AoKQogICAgZHVwCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgZGlnIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAxCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDQKICAgIGV4dHJhY3QzCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDUKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHN3YXAKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIC0KICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkaWcgMgogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgICsKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAyNAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzAKICAgIC8vIGFzc2VydCB0dXAxLmJ5dGVzID09IHR1cDIuYnl0ZXMsICJ0dXAxIGRvZXMgbm90IG1hdGNoIHR1cDIiCiAgICA9PQogICAgYXNzZXJ0IC8vIHR1cDEgZG9lcyBub3QgbWF0Y2ggdHVwMgogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzMgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0LCBhcnJheV9sZW5ndGg6IHVpbnQ2NCkgLT4gYnl0ZXM6CnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC00CiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZGlnIDMKICAgIC0KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBjb3ZlciAzCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
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..c958f96c26
--- /dev/null
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json
@@ -0,0 +1,210 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 215
+ ],
+ "errorMessage": "Index access is out of bounds"
+ },
+ {
+ "pc": [
+ 91,
+ 103,
+ 115,
+ 127,
+ 139,
+ 151
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 168
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 94,
+ 106,
+ 118,
+ 130,
+ 142,
+ 154
+ ],
+ "errorMessage": "can only call when 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+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwCiAgICBwdXNoYnl0ZXNzIDB4NTU3MTU4MjcgMHg3MTNkZDZkYiAweDM3MTU4YWFjIDB4ODU3MGJlM2IgMHg1MWFhOGM0OSAweDI4M2ExODZmIC8vIG1ldGhvZCAidGVzdF9zdGF0aWNfZWxlbWVudHMoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfc3RhdGljX2VsZW1lbnRzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbl9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3N0YXRpY19lbGVtZW50c19yb3V0ZUAyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X3N0YXRpY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfZHluYW1pY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHNfcm91dGVANToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnRfcm91dGVANjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfdHVwbGVfbW9kaWZpY2F0aW9uX3JvdXRlQDc6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X3N0YXRpY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3Rfc3RhdGljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3N0YXRpY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBieXRlX2FycmF5MSA9IGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKQogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDMKICAgIC8vIGJ5dGVfYXJyYXkyID0gYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTMoKSwgZ2V0X2J5dGU0KCkpCiAgICBjYWxsc3ViIGdldF9ieXRlMwogICAgY2FsbHN1YiBnZXRfYnl0ZTQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0NQogICAgLy8gc3RydWN0MSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDEoKSwgYnl0ZV9hcnJheTEuY29weSgpKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBzdHJ1Y3QyID0gU3RhdGljU3RydWN0KGdldF91aW50MigpLCBieXRlX2FycmF5Mi5jb3B5KCkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDcKICAgIC8vIGFycmF5ID0gYXJjNC5EeW5hbWljQXJyYXkoc3RydWN0MS5jb3B5KCksIHN0cnVjdDEuY29weSgpKQogICAgZGlnIDEKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDgKICAgIC8vIGFycmF5WzFdID0gc3RydWN0Mi5jb3B5KCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcmVwbGFjZTIgMTIKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDkKICAgIC8vIGxvZyhhcnJheSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBsb2coYXJyYXlbMF0pCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxMCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1MQogICAgLy8gbG9nKGFycmF5WzFdKQogICAgZXh0cmFjdCAxMCAxMCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1MwogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgcHVzaGludCAxMCAvLyAxMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTEoKSAtPiBieXRlczoKZ2V0X2J5dGUxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTgtMTk5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlMSgpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDAKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoNCkKICAgIHB1c2hieXRlcyAweDA0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGUyKCkgLT4gYnl0ZXM6CmdldF9ieXRlMjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjAzLTIwNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTIoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjA1CiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDUpCiAgICBwdXNoYnl0ZXMgMHgwNQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9ieXRlMygpIC0+IGJ5dGVzOgpnZXRfYnl0ZTM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIwOC0yMDkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2J5dGUzKCkgLT4gYXJjNC5CeXRlOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gcmV0dXJuIGFyYzQuQnl0ZSg0MikKICAgIHB1c2hieXRlcyAweDJhCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGU0KCkgLT4gYnl0ZXM6CmdldF9ieXRlNDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjEzLTIxNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTQoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjE1CiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDI1NSkKICAgIHB1c2hieXRlcyAweGZmCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3VpbnQxKCkgLT4gYnl0ZXM6CmdldF91aW50MToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTg4LTE4OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdWludDEoKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgzKQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF91aW50MigpIC0+IGJ5dGVzOgpnZXRfdWludDI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5My0xOTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3VpbnQyKCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTk1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoMioqNDIpCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDQwMDAwMDAwMDAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9keW5hbWljX2VsZW1lbnRzKCkgLT4gdm9pZDoKdGVzdF9keW5hbWljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2R5bmFtaWNfZWxlbWVudHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1OAogICAgLy8gc3RydWN0MSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1OQogICAgLy8gc3RydWN0MiA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzMoKSwgZ2V0X3N0cmluZzEoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzMKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MAogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjEKICAgIC8vIGFycmF5LmFwcGVuZChzdHJ1Y3QxLmNvcHkoKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MgogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKSAgIyByZXBsYWNlCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MwogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjQKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2NgogICAgLy8gbG9nKGFycmF5WzJdKQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBwdXNoaW50IDYgLy8gNgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2OQogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzAKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MgogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzMKICAgIC8vIGxvZyhhcnJheSkKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9zdHJpbmcxKCkgLT4gYnl0ZXM6CmdldF9zdHJpbmcxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzMtMTc0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9zdHJpbmcxKCkgLT4gYXJjNC5TdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTc1CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoImEiKQogICAgcHVzaGJ5dGVzIDB4MDAwMTYxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3N0cmluZzIoKSAtPiBieXRlczoKZ2V0X3N0cmluZzI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3OC0xNzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cmluZzIoKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODAKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZygiYmVlIikKICAgIHB1c2hieXRlcyAweDAwMDM2MjY1NjUKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfc3RyaW5nMygpIC0+IGJ5dGVzOgpnZXRfc3RyaW5nMzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RyaW5nMygpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nKCJIZWxsbyBXb3JsZCIpCiAgICBwdXNoYnl0ZXMgMHgwMDBiNDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NS03NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzcKICAgIC8vIHN0cnVjdDEgPSBNaXhlZFNpbmdsZVN0cnVjdChnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgNCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzgKICAgIC8vIHN0cnVjdDIgPSBNaXhlZFNpbmdsZVN0cnVjdChnZXRfdWludDIoKSwgZ2V0X3N0cmluZzIoKSwgZ2V0X3VpbnQxKCkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgNCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODAKICAgIC8vIGFycmF5LmFwcGVuZChzdHJ1Y3QyLmNvcHkoKSkKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAweAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MQogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDIuY29weSgpKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MgogICAgLy8gYXJyYXlbMF0gPSBzdHJ1Y3QxLmNvcHkoKSAgIyByZXBsYWNlCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MwogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODQKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICB1bmNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGludGNfMyAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4OAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjkwLTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTItOTQKICAgIC8vIHN0cnVjdDEgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTYKICAgIC8vIGdldF91aW50MigpLCBnZXRfc3RyaW5nMigpLCBnZXRfdWludDEoKSwgZ2V0X3UxNl9hcnIyKCksIGdldF91aW50MigpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIyCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5NS05NwogICAgLy8gc3RydWN0MiA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQyKCksIGdldF9zdHJpbmcyKCksIGdldF91aW50MSgpLCBnZXRfdTE2X2FycjIoKSwgZ2V0X3VpbnQyKCkKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgYnl0ZWNfMiAvLyAweDAwMWMKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCAyOCAvLyAyOAogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5OAogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTkKICAgIC8vIGFycmF5WzFdID0gc3RydWN0Mi5jb3B5KCkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTAxCiAgICAvLyBsb2coYXJyYXlbMF0pCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIGRpZyA0CiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIHVuY292ZXIgNAogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDIKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgcG9wCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3UxNl9hcnIxKCkgLT4gYnl0ZXM6CmdldF91MTZfYXJyMToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjE4LTIxOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdTE2X2FycjEoKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlVJbnQxNl06CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjIwCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5VSW50MTYoMioqMTYgLSAxKSwgYXJjNC5VSW50MTYoMCksIGFyYzQuVUludDE2KDQyKSkKICAgIHB1c2hieXRlcyAweDAwMDNmZmZmMDAwMDAwMmEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdTE2X2FycjIoKSAtPiBieXRlczoKZ2V0X3UxNl9hcnIyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjMtMjI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91MTZfYXJyMigpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDE2XToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjUKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlVJbnQxNigxKSwgYXJjNC5VSW50MTYoMiksIGFyYzQuVUludDE2KDMpLCBhcmM0LlVJbnQxNig0KSkKICAgIHB1c2hieXRlcyAweDAwMDQwMDAxMDAwMjAwMDMwMDA0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50KCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gb25lID0gU3RhdGljU3RydWN0KGdldF91aW50MSgpLCBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMSgpLCBnZXRfYnl0ZTIoKSkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTAKICAgIC8vIHR3byA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTEKICAgIC8vIHRocmVlID0gU3RhdGljU3RydWN0KGdldF91aW50MigpLCBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMigpLCBnZXRfYnl0ZTEoKSkpCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNhbGxzdWIgZ2V0X2J5dGUxCiAgICBjb25jYXQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTMKICAgIC8vIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTItMTE0CiAgICAvLyBmb3VyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExNQogICAgLy8gZml2ZSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMTYtMTIyCiAgICAvLyBzdHJ1Y3QxID0gTmVzdGVkRHluYW1pY1N0cnVjdCgKICAgIC8vICAgICBvbmU9b25lLmNvcHkoKSwKICAgIC8vICAgICB0d289dHdvLmNvcHkoKSwKICAgIC8vICAgICB0aHJlZT10aHJlZS5jb3B5KCksCiAgICAvLyAgICAgZm91cj1mb3VyLmNvcHkoKSwKICAgIC8vICAgICBmaXZlPWZpdmUuY29weSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlYyA1IC8vIDB4MDAxYQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBkaWcgMQogICAgKwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTI1CiAgICAvLyB0d289RHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMigpLCBnZXRfc3RyaW5nMSgpKSwgICMgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHN0cnVjdDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMjMtMTI5CiAgICAvLyBzdHJ1Y3QyID0gTmVzdGVkRHluYW1pY1N0cnVjdCgKICAgIC8vICAgICBvbmU9b25lLmNvcHkoKSwKICAgIC8vICAgICB0d289RHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMigpLCBnZXRfc3RyaW5nMSgpKSwgICMgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHN0cnVjdDEKICAgIC8vICAgICB0aHJlZT10aHJlZS5jb3B5KCksCiAgICAvLyAgICAgZm91cj1mb3VyLmNvcHkoKSwKICAgIC8vICAgICBmaXZlPWZpdmUuY29weSgpLAogICAgLy8gKQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gc3RydWN0Mi50d28gPSB0d28uY29weSgpICAjIG5vdyBzdHJ1Y3QyIHNob3VsZCBtYXRjaCBzdHJ1Y3QxCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgZGlnIDIKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBkaWcgMQogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICArCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgcmVwbGFjZTIgMjIKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgNAogICAgKwogICAgdW5jb3ZlciAyCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMjQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgc3RydWN0MS5ieXRlcyA9PSBzdHJ1Y3QyLmJ5dGVzLCAic3RydWN0MSBkb2VzIG5vdCBtYXRjaCBzdHJ1Y3QyIgogICAgPT0KICAgIGFzc2VydCAvLyBzdHJ1Y3QxIGRvZXMgbm90IG1hdGNoIHN0cnVjdDIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24oKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb246CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfdHVwbGVfbW9kaWZpY2F0aW9uKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM2CiAgICAvLyBvbmUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQxKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gdHdvID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gdGhyZWUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUyKCksIGdldF9ieXRlMSgpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfdTE2X2FycjEKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEzOS0xNDEKICAgIC8vIGZvdXIxID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gZ2V0X3VpbnQxKCksCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDQKICAgIC8vIGdldF9zdHJpbmcxKCksCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gZ2V0X3VpbnQyKCksCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDYKICAgIC8vIGdldF91MTZfYXJyMSgpICsgKGFyYzQuVUludDE2KDEyMyksKSwgICMgbm9xYTogUlVGMDA1CiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAwN2IKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAyCiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gZ2V0X3VpbnQxKCksCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNDItMTQ4CiAgICAvLyBmb3VyMiA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQxKCksCiAgICAvLyAgICAgZ2V0X3N0cmluZzEoKSwKICAgIC8vICAgICBnZXRfdWludDIoKSwKICAgIC8vICAgICBnZXRfdTE2X2FycjEoKSArIChhcmM0LlVJbnQxNigxMjMpLCksICAjIG5vcWE6IFJVRjAwNQogICAgLy8gICAgIGdldF91aW50MSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gZml2ZSA9IER5bmFtaWNTdHJ1Y3QoZ2V0X3N0cmluZzEoKSwgZ2V0X3N0cmluZzIoKSkKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzIKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNTAtMTU4CiAgICAvLyB0dXAxID0gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIG9uZS5jb3B5KCksCiAgICAvLyAgICAgICAgIHR3by5jb3B5KCksCiAgICAvLyAgICAgICAgIHRocmVlLmNvcHkoKSwKICAgIC8vICAgICAgICAgZm91cjEuY29weSgpLAogICAgLy8gICAgICAgICBmaXZlLmNvcHkoKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDUKICAgIGJ5dGVjIDUgLy8gMHgwMDFhCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNTktMTY3CiAgICAvLyB0dXAyID0gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIG9uZS5jb3B5KCksCiAgICAvLyAgICAgICAgIHR3by5jb3B5KCksCiAgICAvLyAgICAgICAgIHRocmVlLmNvcHkoKSwKICAgIC8vICAgICAgICAgZm91cjIuY29weSgpLAogICAgLy8gICAgICAgICBmaXZlLmNvcHkoKSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNjkKICAgIC8vIHR1cDJbM10uZC5wb3AoKQogICAgZHVwCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgZGlnIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18yIC8vIDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZQogICAgYnVyeSAxCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDQKICAgIGV4dHJhY3QzCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDUKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHN3YXAKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIC0KICAgIHVuY292ZXIgMgogICAgbGVuCiAgICBkaWcgMgogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgICsKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAyNAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzAKICAgIC8vIGFzc2VydCB0dXAxLmJ5dGVzID09IHR1cDIuYnl0ZXMsICJ0dXAxIGRvZXMgbm90IG1hdGNoIHR1cDIiCiAgICA9PQogICAgYXNzZXJ0IC8vIHR1cDEgZG9lcyBub3QgbWF0Y2ggdHVwMgogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZShhcnJheTogYnl0ZXMsIGZpeGVkX2J5dGVfc2l6ZTogdWludDY0KSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemU6CiAgICBwcm90byAyIDIKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDAKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMAogICAgZHVwCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZHVwMgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0MwogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQoYXJyYXk6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDEgMgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGJ5dGVjXzMgLy8gMHgKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIGIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMwogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IDEKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudChhcnJheV9pdGVtc19jb3VudDogdWludDY0LCBhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW1zX2NvdW50OiB1aW50NjQsIG5ld19oZWFkX2FuZF90YWlsOiBieXRlcykgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgYnl0ZWNfMyAvLyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0LCBhcnJheV9sZW5ndGg6IHVpbnQ2NCkgLT4gYnl0ZXM6CnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC00CiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZGlnIDMKICAgIC0KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBjb3ZlciAzCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1Ygo=",
+ "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": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.destructured.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.destructured.ir
index 86603710bf..c90ed30b2c 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.destructured.ir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.destructured.ir
@@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@10: // bare_routing_L38
@@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
return 1u
block@14: // after_if_else_L38
return 0u
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.ir
index 72e532cfca..f49f3cc535 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.ir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.ir
@@ -16,55 +16,55 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (== tmp%15#0 NoOp)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (!= tmp%17#0 0u)
- (assert tmp%18#0) // is not creating
+ (assert tmp%18#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (== tmp%19#0 NoOp)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (== tmp%23#0 NoOp)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
let tmp%26#0: bool = (!= tmp%25#0 0u)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@8: // switch_case_default_L38
@@ -77,7 +77,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (== tmp%28#0 0u)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.__algopy_default_create()
return 1u
block@12: // switch_case_default_L38
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_1.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_1.ir
index f50df3e9b3..df6050a2b4 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_1.ir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_1.ir
@@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@10: // bare_routing_L38
@@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
return 1u
block@14: // after_if_else_L38
return 0u
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_2.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_2.ir
index 4c66c3ec72..b1771bfc9e 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_2.ir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_2.ir
@@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@10: // bare_routing_L38
@@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
return 1u
block@14: // after_if_else_L38
return 0u
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_3.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_3.ir
index b4b9829bc0..08685c3832 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_3.ir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_3.ir
@@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@10: // bare_routing_L38
@@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
return 1u
block@14: // after_if_else_L38
return 0u
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_4.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_4.ir
index a01d2bbc4a..a1af477627 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_4.ir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_4.ir
@@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@10: // bare_routing_L38
@@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
return 1u
block@14: // after_if_else_L38
return 0u
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_5.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_5.ir
index 11198ea423..ce80d32b7e 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_5.ir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_5.ir
@@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@10: // bare_routing_L38
@@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
return 1u
block@14: // after_if_else_L38
return 0u
diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_6.ir b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_6.ir
index 63386337ae..39bf6095e0 100644
--- a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_6.ir
+++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.ssa.opt_pass_6.ir
@@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@10: // bare_routing_L38
@@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
return 1u
block@14: // after_if_else_L38
return 0u
diff --git a/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.approval.teal b/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.approval.teal
index 482571a29c..501c0eb530 100644
--- a/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.approval.teal
+++ b/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.approval.teal
@@ -21,9 +21,9 @@ __puya_arc4_router__:
__puya_arc4_router___test_static_elements_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_static_elements
intc_1 // 1
retsub
@@ -31,9 +31,9 @@ __puya_arc4_router___test_static_elements_route@2:
__puya_arc4_router___test_dynamic_elements_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_dynamic_elements
intc_1 // 1
retsub
@@ -41,9 +41,9 @@ __puya_arc4_router___test_dynamic_elements_route@3:
__puya_arc4_router___test_mixed_single_dynamic_elements_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_mixed_single_dynamic_elements
intc_1 // 1
retsub
@@ -51,9 +51,9 @@ __puya_arc4_router___test_mixed_single_dynamic_elements_route@4:
__puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_mixed_multiple_dynamic_elements
intc_1 // 1
retsub
@@ -61,9 +61,9 @@ __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5:
__puya_arc4_router___test_nested_struct_replacement_route@6:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_nested_struct_replacement
intc_1 // 1
retsub
@@ -71,9 +71,9 @@ __puya_arc4_router___test_nested_struct_replacement_route@6:
__puya_arc4_router___test_nested_tuple_modification_route@7:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_nested_tuple_modification
intc_1 // 1
retsub
@@ -83,7 +83,7 @@ __puya_arc4_router___bare_routing@10:
bnz __puya_arc4_router___after_if_else@14
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.destructured.ir b/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.destructured.ir
index 86603710bf..c90ed30b2c 100644
--- a/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.destructured.ir
+++ b/test_cases/arc4_dynamic_arrays/out_O2/DynamicArrayContract.destructured.ir
@@ -15,49 +15,49 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
- (assert tmp%17#0) // is not creating
+ (assert tmp%17#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (! tmp%23#0)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
- (assert tmp%25#0) // is not creating
+ (assert tmp%25#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@10: // bare_routing_L38
@@ -66,7 +66,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (! tmp%28#0)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
return 1u
block@14: // after_if_else_L38
return 0u
diff --git a/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.approval.teal b/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.approval.teal
index b2cb51c6f8..87f6da9435 100644
--- a/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.approval.teal
+++ b/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.approval.teal
@@ -33,11 +33,11 @@ __puya_arc4_router___test_static_elements_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_static_elements
intc_2 // 1
retsub
@@ -48,11 +48,11 @@ __puya_arc4_router___test_dynamic_elements_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_dynamic_elements
intc_2 // 1
retsub
@@ -63,11 +63,11 @@ __puya_arc4_router___test_mixed_single_dynamic_elements_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_mixed_single_dynamic_elements
intc_2 // 1
retsub
@@ -78,11 +78,11 @@ __puya_arc4_router___test_mixed_multiple_dynamic_elements_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_mixed_multiple_dynamic_elements
intc_2 // 1
retsub
@@ -93,11 +93,11 @@ __puya_arc4_router___test_nested_struct_replacement_route@6:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_nested_struct_replacement
intc_2 // 1
retsub
@@ -108,11 +108,11 @@ __puya_arc4_router___test_nested_tuple_modification_route@7:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_nested_tuple_modification
intc_2 // 1
retsub
@@ -133,7 +133,7 @@ __puya_arc4_router_____algopy_default_create@11:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_2 // 1
retsub
diff --git a/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.destructured.ir b/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.destructured.ir
index d4d68d664f..e1e9e4cb00 100644
--- a/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.destructured.ir
+++ b/test_cases/arc4_dynamic_arrays/out_unoptimized/DynamicArrayContract.destructured.ir
@@ -16,55 +16,55 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@2: // test_static_elements_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_static_elements()
return 1u
block@3: // test_dynamic_elements_route_L56
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_dynamic_elements()
return 1u
block@4: // test_mixed_single_dynamic_elements_route_L75
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_single_dynamic_elements()
return 1u
block@5: // test_mixed_multiple_dynamic_elements_route_L90
let tmp%15#0: uint64 = (txn OnCompletion)
let tmp%16#0: bool = (== tmp%15#0 NoOp)
- (assert tmp%16#0) // OnCompletion is NoOp
+ (assert tmp%16#0) // OnCompletion is not NoOp
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (!= tmp%17#0 0u)
- (assert tmp%18#0) // is not creating
+ (assert tmp%18#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_mixed_multiple_dynamic_elements()
return 1u
block@6: // test_nested_struct_replacement_route_L107
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (== tmp%19#0 NoOp)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_struct_replacement()
return 1u
block@7: // test_nested_tuple_modification_route_L134
let tmp%23#0: uint64 = (txn OnCompletion)
let tmp%24#0: bool = (== tmp%23#0 NoOp)
- (assert tmp%24#0) // OnCompletion is NoOp
+ (assert tmp%24#0) // OnCompletion is not NoOp
let tmp%25#0: uint64 = (txn ApplicationID)
let tmp%26#0: bool = (!= tmp%25#0 0u)
- (assert tmp%26#0) // is not creating
+ (assert tmp%26#0) // can only call when not creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.test_nested_tuple_modification()
return 1u
block@8: // switch_case_default_L38
@@ -77,7 +77,7 @@ contract test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract:
block@11: // __algopy_default_create_L1
let tmp%28#0: uint64 = (txn ApplicationID)
let tmp%29#0: bool = (== tmp%28#0 0u)
- (assert tmp%29#0) // is creating
+ (assert tmp%29#0) // can only call when creating
test_cases.arc4_dynamic_arrays.contract.DynamicArrayContract.__algopy_default_create()
return 1u
block@12: // switch_case_default_L38
diff --git a/test_cases/arc4_dynamic_arrays/puya.log b/test_cases/arc4_dynamic_arrays/puya.log
index 016351cc46..02e6383b8a 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.approval.mir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.mir
index 6e29593f13..45b7dec6b0 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.mir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.mir
@@ -34,9 +34,9 @@ __puya_arc4_router___xyz_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
callsub xyz tmp%7#0
byte 0x151f7c75 tmp%7#0,0x151f7c75
l-load tmp%7#0 1 0x151f7c75,tmp%7#0
@@ -50,9 +50,9 @@ __puya_arc4_router___xyz_raw_route@3:
// @arc4.abimethod
txn OnCompletion tmp%9#0
! tmp%10#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%11#0
- assert // is not creating
+ assert // can only call when not creating
callsub xyz_raw tmp%13#0
byte 0x151f7c75 tmp%13#0,0x151f7c75
l-load tmp%13#0 1 0x151f7c75,tmp%13#0
@@ -71,7 +71,7 @@ __puya_arc4_router___bare_routing@6:
__puya_arc4_router_____algopy_default_create@7:
txn ApplicationID tmp%16#0
! tmp%17#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.teal b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.teal
index fcc75ed098..3ba40307fb 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.teal
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.approval.teal
@@ -25,9 +25,9 @@ __puya_arc4_router___xyz_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub xyz
bytec_0 // 0x151f7c75
swap
@@ -41,9 +41,9 @@ __puya_arc4_router___xyz_raw_route@3:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub xyz_raw
bytec_0 // 0x151f7c75
swap
@@ -59,7 +59,7 @@ __puya_arc4_router___bare_routing@6:
bnz __puya_arc4_router___after_if_else@10
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc32.json b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc32.json
index cc42214eeb..bdd842620e 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc32.json
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMDAzMDAwNjAwMDkwMDBjMDAwMTU4MDAwMTU5MDAwMTVhCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDZiMTBlNTI3IDB4OTRkZGIxYzIgLy8gbWV0aG9kICJ4eXooKXN0cmluZ1tdIiwgbWV0aG9kICJ4eXpfcmF3KClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3JvdXRlQDI6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB4eXoKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB4eXpfcmF3CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLmR5bmFtaWNfc3RyaW5nX2FycmF5LkFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdC54eXooKSAtPiBieXRlczoKeHl6OgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHh5eihzZWxmKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ106CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6Ny0xMQogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5KAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJYIiksCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoIlkiKSwKICAgIC8vICAgICBhcmM0LlN0cmluZygiWiIpLAogICAgLy8gKQogICAgYnl0ZWNfMSAvLyAweDAwMDMwMDA2MDAwOTAwMGMwMDAxNTgwMDAxNTkwMDAxNWEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF90eXBlcy5keW5hbWljX3N0cmluZ19hcnJheS5BcmM0RHluYW1pY1N0cmluZ0FycmF5Q29udHJhY3QueHl6X3JhdygpIC0+IGJ5dGVzOgp4eXpfcmF3OgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxMy0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgeHl6X3JhdyhzZWxmKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ106CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MTUtMTkKICAgIC8vIHJhdyA9IGFyYzQuRHluYW1pY0FycmF5KAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg4OCkpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg4OSkpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg5MCkpLAogICAgLy8gKQogICAgYnl0ZWNfMSAvLyAweDAwMDMwMDA2MDAwOTAwMGMwMDAxNTgwMDAxNTkwMDAxNWEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MjAKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10uZnJvbV9ieXRlcyhyYXcuYnl0ZXMpCiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMDAzMDAwNjAwMDkwMDBjMDAwMTU4MDAwMTU5MDAwMTVhCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDZiMTBlNTI3IDB4OTRkZGIxYzIgLy8gbWV0aG9kICJ4eXooKXN0cmluZ1tdIiwgbWV0aG9kICJ4eXpfcmF3KClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3JvdXRlQDI6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHh5egogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3Jhd19yb3V0ZUAzOgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgeHl6X3JhdwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjQKICAgIC8vIGNsYXNzIEFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo0CiAgICAvLyBjbGFzcyBBcmM0RHluYW1pY1N0cmluZ0FycmF5Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Lnh5eigpIC0+IGJ5dGVzOgp4eXo6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgeHl6KHNlbGYpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo3LTExCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXkoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoIlgiKSwKICAgIC8vICAgICBhcmM0LlN0cmluZygiWSIpLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJaIiksCiAgICAvLyApCiAgICBieXRlY18xIC8vIDB4MDAwMzAwMDYwMDA5MDAwYzAwMDE1ODAwMDE1OTAwMDE1YQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLmR5bmFtaWNfc3RyaW5nX2FycmF5LkFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdC54eXpfcmF3KCkgLT4gYnl0ZXM6Cnh5el9yYXc6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjEzLTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB4eXpfcmF3KHNlbGYpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxNS0xOQogICAgLy8gcmF3ID0gYXJjNC5EeW5hbWljQXJyYXkoCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDg4KSksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDg5KSksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDkwKSksCiAgICAvLyApCiAgICBieXRlY18xIC8vIDB4MDAwMzAwMDYwMDA5MDAwYzAwMDE1ODAwMDE1OTAwMDE1YQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToyMAogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXS5mcm9tX2J5dGVzKHJhdy5ieXRlcykKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
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..7a65d2c54d
--- /dev/null
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc56.json
@@ -0,0 +1,120 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 68,
+ 84
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 105
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 71,
+ 87
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMDAzMDAwNjAwMDkwMDBjMDAwMTU4MDAwMTU5MDAwMTVhCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDZiMTBlNTI3IDB4OTRkZGIxYzIgLy8gbWV0aG9kICJ4eXooKXN0cmluZ1tdIiwgbWV0aG9kICJ4eXpfcmF3KClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3JvdXRlQDI6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHh5egogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3Jhd19yb3V0ZUAzOgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgeHl6X3JhdwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjQKICAgIC8vIGNsYXNzIEFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo0CiAgICAvLyBjbGFzcyBBcmM0RHluYW1pY1N0cmluZ0FycmF5Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Lnh5eigpIC0+IGJ5dGVzOgp4eXo6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgeHl6KHNlbGYpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo3LTExCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQXJyYXkoCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoIlgiKSwKICAgIC8vICAgICBhcmM0LlN0cmluZygiWSIpLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJaIiksCiAgICAvLyApCiAgICBieXRlY18xIC8vIDB4MDAwMzAwMDYwMDA5MDAwYzAwMDE1ODAwMDE1OTAwMDE1YQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLmR5bmFtaWNfc3RyaW5nX2FycmF5LkFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdC54eXpfcmF3KCkgLT4gYnl0ZXM6Cnh5el9yYXc6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjEzLTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB4eXpfcmF3KHNlbGYpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxNS0xOQogICAgLy8gcmF3ID0gYXJjNC5EeW5hbWljQXJyYXkoCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDg4KSksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDg5KSksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQXJyYXkoYXJjNC5CeXRlKDkwKSksCiAgICAvLyApCiAgICBieXRlY18xIC8vIDB4MDAwMzAwMDYwMDA5MDAwYzAwMDE1ODAwMDE1OTAwMDE1YQogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToyMAogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5W2FyYzQuU3RyaW5nXS5mcm9tX2J5dGVzKHJhdy5ieXRlcykKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiACAQAmAgQVH3x1EQADAAYACQAMAAFYAAFZAAFaiAABQ4oAATEbQQA3ggIEaxDlJwSU3bHCNhoAjgIAAgASI4kxGRREMRhEiAAjKExQsCKJMRkURDEYRIgAGChMULAiiTEZQAAGMRgURCKJI4mKAAEpiYoAASmJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.destructured.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.destructured.ir
index 9663aaaf53..cd2de72fe9 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.destructured.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.ir
index c23df53c99..d07c743082 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.ir
@@ -16,10 +16,10 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -27,10 +27,10 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 NoOp)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (!= tmp%11#0 0u)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -45,7 +45,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (== tmp%16#0 0u)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.__algopy_default_create()
return 1u
block@8: // switch_case_default_L4
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_1.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_1.ir
index 52efe60ff5..277759cddc 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_1.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_1.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_10.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_10.ir
index 5895e30179..dd80183432 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_10.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_10.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_11.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_11.ir
index 6581d4843a..f6914af9f6 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_11.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_11.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_12.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_12.ir
index d65503c117..e101e425ff 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_12.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_12.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_13.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_13.ir
index 9663aaaf53..cd2de72fe9 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_13.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_13.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_2.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_2.ir
index 305375d093..88801e399b 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_2.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_2.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_3.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_3.ir
index 1c06d2a5ba..5688daa819 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_3.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_3.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_4.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_4.ir
index 8ec92f7379..79944bce21 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_4.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_4.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_5.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_5.ir
index e91d61e8c1..4485e21a8d 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_5.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_5.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_6.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_6.ir
index 7093b68e1d..a1a1515c17 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_6.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_6.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_7.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_7.ir
index dc24ce04ba..bcb500ffa6 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_7.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_7.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_8.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_8.ir
index 9affae8a2d..9e994d6c82 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_8.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_8.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_9.ir b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_9.ir
index c33b934285..ef77535a0e 100644
--- a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_9.ir
+++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.ssa.opt_pass_9.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/MutableParams2.approval.teal b/test_cases/arc4_types/out/MutableParams2.approval.teal
index 4be905d621..221c2b6813 100644
--- a/test_cases/arc4_types/out/MutableParams2.approval.teal
+++ b/test_cases/arc4_types/out/MutableParams2.approval.teal
@@ -24,9 +24,9 @@ __puya_arc4_router___test_array_rebinding_route@2:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_array_rebinding
intc_1 // 1
retsub
@@ -38,7 +38,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/arc4_types/out/MutableParams2.arc32.json b/test_cases/arc4_types/out/MutableParams2.arc32.json
index 1514d314eb..f84855e35f 100644
--- a/test_cases/arc4_types/out/MutableParams2.arc32.json
+++ b/test_cases/arc4_types/out/MutableParams2.arc32.json
@@ -7,7 +7,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg2YWM0YTU1NyAvLyBtZXRob2QgInRlc3RfYXJyYXlfcmViaW5kaW5nKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMjoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJyYXlfcmViaW5kaW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLnRlc3RfYXJyYXlfcmViaW5kaW5nKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9yZWJpbmRpbmc6CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcnJheV9yZWJpbmRpbmcoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NwogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDApCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjgKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1UcnVlKQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgbWF5YmVfbW9kaWZ5X2FycmF5CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo5CiAgICAvLyBhc3NlcnQgYSA9PSBhcmM0LkR5bmFtaWNCeXRlcygwLCAxKQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjExCiAgICAvLyBhID0gYXJjNC5EeW5hbWljQnl0ZXMoMSkKICAgIHB1c2hieXRlcyAweDAwMDEwMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTIKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1GYWxzZSkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG1heWJlX21vZGlmeV9hcnJheQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTMKICAgIC8vIGFzc2VydCBhID09IGFyYzQuRHluYW1pY0J5dGVzKDEsIDQyLCA0KQogICAgcHVzaGJ5dGVzIDB4MDAwMzAxMmEwNAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLm11dGFibGVfcGFyYW1zMi5NdXRhYmxlUGFyYW1zMi5tYXliZV9tb2RpZnlfYXJyYXkoYTogYnl0ZXMsIGFzc2lnbl9sb2NhbDogdWludDY0KSAtPiBieXRlczoKbWF5YmVfbW9kaWZ5X2FycmF5OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTUtMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbWF5YmVfbW9kaWZ5X2FycmF5KHNlbGYsIGE6IGFyYzQuRHluYW1pY0J5dGVzLCAqLCBhc3NpZ25fbG9jYWw6IGJvb2wpIC0+IE5vbmU6ICAjIHYwCiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTcKICAgIC8vIGlmIGFzc2lnbl9sb2NhbDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTgKICAgIC8vIGEuYXBwZW5kKGFyYzQuQnl0ZSgxKSkgICMgdjE6IG1vZGlmeSBvdXQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAxCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weToyMQogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDEsIDIsIDQpICAjIHY0OiBsb2NhbCBvbmx5CiAgICBwdXNoYnl0ZXMgMHgwMDAzMDEwMjA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfYnVyeSAtMgogICAgYiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMwoKbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjIzCiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNDIpKSAgIyB2NTogbW9kaWZ5IG91dAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MmEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IC0yCgptYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjI1CiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNCkpICAjIHY2OiBtb2RpZnkgb3V0IElGIG5vdCBiIEVMU0UgbG9jYWwgb25seQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCm1heWJlX21vZGlmeV9hcnJheV9hZnRlcl9pZl9lbHNlQDE1OgogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg2YWM0YTU1NyAvLyBtZXRob2QgInRlc3RfYXJyYXlfcmViaW5kaW5nKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMjoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcnJheV9yZWJpbmRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NAogICAgLy8gY2xhc3MgTXV0YWJsZVBhcmFtczIoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLnRlc3RfYXJyYXlfcmViaW5kaW5nKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9yZWJpbmRpbmc6CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcnJheV9yZWJpbmRpbmcoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NwogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDApCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjgKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1UcnVlKQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgbWF5YmVfbW9kaWZ5X2FycmF5CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo5CiAgICAvLyBhc3NlcnQgYSA9PSBhcmM0LkR5bmFtaWNCeXRlcygwLCAxKQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjExCiAgICAvLyBhID0gYXJjNC5EeW5hbWljQnl0ZXMoMSkKICAgIHB1c2hieXRlcyAweDAwMDEwMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTIKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1GYWxzZSkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG1heWJlX21vZGlmeV9hcnJheQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTMKICAgIC8vIGFzc2VydCBhID09IGFyYzQuRHluYW1pY0J5dGVzKDEsIDQyLCA0KQogICAgcHVzaGJ5dGVzIDB4MDAwMzAxMmEwNAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLm11dGFibGVfcGFyYW1zMi5NdXRhYmxlUGFyYW1zMi5tYXliZV9tb2RpZnlfYXJyYXkoYTogYnl0ZXMsIGFzc2lnbl9sb2NhbDogdWludDY0KSAtPiBieXRlczoKbWF5YmVfbW9kaWZ5X2FycmF5OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTUtMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbWF5YmVfbW9kaWZ5X2FycmF5KHNlbGYsIGE6IGFyYzQuRHluYW1pY0J5dGVzLCAqLCBhc3NpZ25fbG9jYWw6IGJvb2wpIC0+IE5vbmU6ICAjIHYwCiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTcKICAgIC8vIGlmIGFzc2lnbl9sb2NhbDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTgKICAgIC8vIGEuYXBwZW5kKGFyYzQuQnl0ZSgxKSkgICMgdjE6IG1vZGlmeSBvdXQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAxCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weToyMQogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDEsIDIsIDQpICAjIHY0OiBsb2NhbCBvbmx5CiAgICBwdXNoYnl0ZXMgMHgwMDAzMDEwMjA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfYnVyeSAtMgogICAgYiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMwoKbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjIzCiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNDIpKSAgIyB2NTogbW9kaWZ5IG91dAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MmEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IC0yCgptYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjI1CiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNCkpICAjIHY2OiBtb2RpZnkgb3V0IElGIG5vdCBiIEVMU0UgbG9jYWwgb25seQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCm1heWJlX21vZGlmeV9hcnJheV9hZnRlcl9pZl9lbHNlQDE1OgogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
diff --git a/test_cases/arc4_types/out/MutableParams2.arc56.json b/test_cases/arc4_types/out/MutableParams2.arc56.json
new file mode 100644
index 0000000000..4cca59f0bb
--- /dev/null
+++ b/test_cases/arc4_types/out/MutableParams2.arc56.json
@@ -0,0 +1,102 @@
+{
+ "name": "MutableParams2",
+ "structs": {},
+ "methods": [
+ {
+ "name": "test_array_rebinding",
+ "args": [],
+ "returns": {
+ "type": "void"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [],
+ "recommendations": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 35
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 52
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 38
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg2YWM0YTU1NyAvLyBtZXRob2QgInRlc3RfYXJyYXlfcmViaW5kaW5nKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcnJheV9yZWJpbmRpbmdfcm91dGVAMjoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcnJheV9yZWJpbmRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NAogICAgLy8gY2xhc3MgTXV0YWJsZVBhcmFtczIoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjQKICAgIC8vIGNsYXNzIE11dGFibGVQYXJhbXMyKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLnRlc3RfYXJyYXlfcmViaW5kaW5nKCkgLT4gdm9pZDoKdGVzdF9hcnJheV9yZWJpbmRpbmc6CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcnJheV9yZWJpbmRpbmcoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6NwogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDApCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjgKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1UcnVlKQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgbWF5YmVfbW9kaWZ5X2FycmF5CiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weTo5CiAgICAvLyBhc3NlcnQgYSA9PSBhcmM0LkR5bmFtaWNCeXRlcygwLCAxKQogICAgcHVzaGJ5dGVzIDB4MDAwMjAwMDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjExCiAgICAvLyBhID0gYXJjNC5EeW5hbWljQnl0ZXMoMSkKICAgIHB1c2hieXRlcyAweDAwMDEwMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTIKICAgIC8vIHNlbGYubWF5YmVfbW9kaWZ5X2FycmF5KGEsIGFzc2lnbl9sb2NhbD1GYWxzZSkKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIG1heWJlX21vZGlmeV9hcnJheQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTMKICAgIC8vIGFzc2VydCBhID09IGFyYzQuRHluYW1pY0J5dGVzKDEsIDQyLCA0KQogICAgcHVzaGJ5dGVzIDB4MDAwMzAxMmEwNAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLm11dGFibGVfcGFyYW1zMi5NdXRhYmxlUGFyYW1zMi5tYXliZV9tb2RpZnlfYXJyYXkoYTogYnl0ZXMsIGFzc2lnbl9sb2NhbDogdWludDY0KSAtPiBieXRlczoKbWF5YmVfbW9kaWZ5X2FycmF5OgogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTUtMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbWF5YmVfbW9kaWZ5X2FycmF5KHNlbGYsIGE6IGFyYzQuRHluYW1pY0J5dGVzLCAqLCBhc3NpZ25fbG9jYWw6IGJvb2wpIC0+IE5vbmU6ICAjIHYwCiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gMQogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTcKICAgIC8vIGlmIGFzc2lnbl9sb2NhbDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMAogICAgLy8gYXJjNF90eXBlcy9tdXRhYmxlX3BhcmFtczIucHk6MTgKICAgIC8vIGEuYXBwZW5kKGFyYzQuQnl0ZSgxKSkgICMgdjE6IG1vZGlmeSBvdXQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDAxCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBhcmM0X3R5cGVzL211dGFibGVfcGFyYW1zMi5weToyMQogICAgLy8gYSA9IGFyYzQuRHluYW1pY0J5dGVzKDEsIDIsIDQpICAjIHY0OiBsb2NhbCBvbmx5CiAgICBwdXNoYnl0ZXMgMHgwMDAzMDEwMjA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfYnVyeSAtMgogICAgYiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMwoKbWF5YmVfbW9kaWZ5X2FycmF5X2Vsc2VfYm9keUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjIzCiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNDIpKSAgIyB2NTogbW9kaWZ5IG91dAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MmEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9idXJ5IC0yCgptYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIGFyYzRfdHlwZXMvbXV0YWJsZV9wYXJhbXMyLnB5OjI1CiAgICAvLyBhLmFwcGVuZChhcmM0LkJ5dGUoNCkpICAjIHY2OiBtb2RpZnkgb3V0IElGIG5vdCBiIEVMU0UgbG9jYWwgb25seQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgLTIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBtYXliZV9tb2RpZnlfYXJyYXlfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCm1heWJlX21vZGlmeV9hcnJheV9hZnRlcl9pZl9lbHNlQDE1OgogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMubXV0YWJsZV9wYXJhbXMyLk11dGFibGVQYXJhbXMyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiACAAGIAAFDigABMRtBABuABGrEpVc2GgCOAQACIokxGRREMRhEiAAPI4kxGUAABjEYFEQjiSKJigAAgAMAAQAjiAAbgAQAAgABEkSAAwABASKIAAqABQADASoEEkSJigIBIiOL/0EAJov+VwIAgAEBUEkVFlcGAkxQjP6ABQADAQIEIowBi/6MAIz+QgAZi/5XAgCAASpQSRUWVwYCTFBHAoz+jACM/ov+VwIAgAEEUEkVFlcGAkxQjP6LAUEABIv+jACJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/arc4_types/out/MutableParams2.destructured.ir b/test_cases/arc4_types/out/MutableParams2.destructured.ir
index e39aa56ece..c49d5095cc 100644
--- a/test_cases/arc4_types/out/MutableParams2.destructured.ir
+++ b/test_cases/arc4_types/out/MutableParams2.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@5: // bare_routing_L4
@@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.ir b/test_cases/arc4_types/out/MutableParams2.ssa.ir
index e9b1880586..c269fbae23 100644
--- a/test_cases/arc4_types/out/MutableParams2.ssa.ir
+++ b/test_cases/arc4_types/out/MutableParams2.ssa.ir
@@ -16,10 +16,10 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@3: // switch_case_default_L4
@@ -32,7 +32,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (== tmp%8#0 0u)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
test_cases.arc4_types.mutable_params2.MutableParams2.__algopy_default_create()
return 1u
block@7: // switch_case_default_L4
diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_1.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_1.ir
index 962e5bb1a6..97e8c2a623 100644
--- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_1.ir
+++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_1.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@5: // bare_routing_L4
@@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_2.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_2.ir
index 60427fa195..71ef69f96b 100644
--- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_2.ir
+++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_2.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@5: // bare_routing_L4
@@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_3.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_3.ir
index 9827062f58..69d62d6816 100644
--- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_3.ir
+++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_3.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@5: // bare_routing_L4
@@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_4.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_4.ir
index 8567cf917e..1a851bae1f 100644
--- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_4.ir
+++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_4.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@5: // bare_routing_L4
@@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_5.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_5.ir
index 7a6e5a4609..dc588445a3 100644
--- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_5.ir
+++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_5.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@5: // bare_routing_L4
@@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_6.ir b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_6.ir
index 5116c57fed..bc418f5719 100644
--- a/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_6.ir
+++ b/test_cases/arc4_types/out/MutableParams2.ssa.opt_pass_6.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@5: // bare_routing_L4
@@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.approval.teal b/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.approval.teal
index 1b55a7e756..afd90af95d 100644
--- a/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.approval.teal
+++ b/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.approval.teal
@@ -21,9 +21,9 @@ __puya_arc4_router__:
__puya_arc4_router___xyz_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub xyz
bytec_0 // 0x151f7c75
swap
@@ -35,9 +35,9 @@ __puya_arc4_router___xyz_route@2:
__puya_arc4_router___xyz_raw_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub xyz_raw
bytec_0 // 0x151f7c75
swap
@@ -51,7 +51,7 @@ __puya_arc4_router___bare_routing@6:
bnz __puya_arc4_router___after_if_else@10
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.destructured.ir b/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.destructured.ir
index 9663aaaf53..cd2de72fe9 100644
--- a/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.destructured.ir
+++ b/test_cases/arc4_types/out_O2/Arc4DynamicStringArrayContract.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,9 +25,9 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -38,7 +38,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (! tmp%16#0)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
return 1u
block@10: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out_O2/MutableParams2.approval.teal b/test_cases/arc4_types/out_O2/MutableParams2.approval.teal
index 0c43532309..feb6100a87 100644
--- a/test_cases/arc4_types/out_O2/MutableParams2.approval.teal
+++ b/test_cases/arc4_types/out_O2/MutableParams2.approval.teal
@@ -20,9 +20,9 @@ __puya_arc4_router__:
__puya_arc4_router___test_array_rebinding_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_array_rebinding
intc_1 // 1
retsub
@@ -32,7 +32,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/arc4_types/out_O2/MutableParams2.destructured.ir b/test_cases/arc4_types/out_O2/MutableParams2.destructured.ir
index e39aa56ece..c49d5095cc 100644
--- a/test_cases/arc4_types/out_O2/MutableParams2.destructured.ir
+++ b/test_cases/arc4_types/out_O2/MutableParams2.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@5: // bare_routing_L4
@@ -26,7 +26,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.approval.teal b/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.approval.teal
index 1917b71a43..6459c02648 100644
--- a/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.approval.teal
+++ b/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.approval.teal
@@ -29,11 +29,11 @@ __puya_arc4_router___xyz_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub xyz
bytec 5 // 0x151f7c75
swap
@@ -48,11 +48,11 @@ __puya_arc4_router___xyz_raw_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub xyz_raw
bytec 5 // 0x151f7c75
swap
@@ -77,7 +77,7 @@ __puya_arc4_router_____algopy_default_create@7:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_2 // 1
retsub
diff --git a/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.destructured.ir b/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.destructured.ir
index 6c0cc18301..a945f13c28 100644
--- a/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.destructured.ir
+++ b/test_cases/arc4_types/out_unoptimized/Arc4DynamicStringArrayContract.destructured.ir
@@ -16,10 +16,10 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@2: // xyz_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -27,10 +27,10 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@3: // xyz_raw_route_L13
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 NoOp)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (!= tmp%11#0 0u)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
let tmp%13#0: bytes = test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.xyz_raw()
let tmp%14#0: bytes = (concat 0x151f7c75 tmp%13#0)
(log tmp%14#0)
@@ -45,7 +45,7 @@ contract test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContra
block@7: // __algopy_default_create_L1
let tmp%16#0: uint64 = (txn ApplicationID)
let tmp%17#0: bool = (== tmp%16#0 0u)
- (assert tmp%17#0) // is creating
+ (assert tmp%17#0) // can only call when creating
test_cases.arc4_types.dynamic_string_array.Arc4DynamicStringArrayContract.__algopy_default_create()
return 1u
block@8: // switch_case_default_L4
diff --git a/test_cases/arc4_types/out_unoptimized/MutableParams2.approval.teal b/test_cases/arc4_types/out_unoptimized/MutableParams2.approval.teal
index 3df87a2107..9bf164f1e3 100644
--- a/test_cases/arc4_types/out_unoptimized/MutableParams2.approval.teal
+++ b/test_cases/arc4_types/out_unoptimized/MutableParams2.approval.teal
@@ -28,11 +28,11 @@ __puya_arc4_router___test_array_rebinding_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_array_rebinding
intc_1 // 1
retsub
@@ -53,7 +53,7 @@ __puya_arc4_router_____algopy_default_create@6:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/test_cases/arc4_types/out_unoptimized/MutableParams2.destructured.ir b/test_cases/arc4_types/out_unoptimized/MutableParams2.destructured.ir
index d9f9171777..5221b2a9a5 100644
--- a/test_cases/arc4_types/out_unoptimized/MutableParams2.destructured.ir
+++ b/test_cases/arc4_types/out_unoptimized/MutableParams2.destructured.ir
@@ -16,10 +16,10 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@2: // test_array_rebinding_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.arc4_types.mutable_params2.MutableParams2.test_array_rebinding()
return 1u
block@3: // switch_case_default_L4
@@ -32,7 +32,7 @@ contract test_cases.arc4_types.mutable_params2.MutableParams2:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (== tmp%8#0 0u)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
test_cases.arc4_types.mutable_params2.MutableParams2.__algopy_default_create()
return 1u
block@7: // switch_case_default_L4
diff --git a/test_cases/arc4_types/puya.log b/test_cases/arc4_types/puya.log
index 870b42f462..ed12f1b78a 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
@@ -21792,6 +21792,7 @@ info: Writing arc4_types/out/Arc4MutationContract.clear.bin
info: Writing arc4_types/out/Arc4MutationContract.approval.puya.map
info: Writing arc4_types/out/Arc4MutationContract.clear.puya.map
info: Writing arc4_types/out/MutableParams2.arc32.json
+info: Writing arc4_types/out/MutableParams2.arc56.json
info: Writing arc4_types/out/MutableParams2.approval.teal
info: Writing arc4_types/out/MutableParams2.clear.teal
info: Writing arc4_types/out/MutableParams2.approval.bin
@@ -21805,6 +21806,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/arc_56/contract.py b/test_cases/arc_56/contract.py
new file mode 100644
index 0000000000..5c7d7557cb
--- /dev/null
+++ b/test_cases/arc_56/contract.py
@@ -0,0 +1,120 @@
+from algopy import (
+ ARC4Contract,
+ Box,
+ BoxMap,
+ BoxRef,
+ GlobalState,
+ LocalState,
+ String,
+ TemplateVar,
+ UInt64,
+ arc4,
+ subroutine,
+)
+
+
+class SharedStruct(arc4.Struct):
+ """This struct is shared"""
+
+ foo: arc4.DynamicBytes
+ bar: arc4.UInt8
+
+
+class EventOnly(arc4.Struct):
+ """This struct is only used in an event"""
+
+ x: arc4.UInt64
+ y: arc4.UInt64
+
+
+class TopLevelStruct(arc4.Struct):
+ a: arc4.UInt64
+ b: arc4.String
+ shared: SharedStruct
+
+
+class StateStruct(arc4.Struct):
+ a: arc4.UInt64
+ b: arc4.String
+
+
+class Contract(ARC4Contract):
+
+ def __init__(self) -> None:
+ self.g_struct = GlobalState(StateStruct)
+ self.g_uint64 = GlobalState(UInt64, key=b"gu")
+ self.g_address = GlobalState(arc4.Address, key=b"ga")
+
+ self.l_struct = LocalState(StateStruct)
+ self.l_uint64 = LocalState(UInt64, key=b"lu")
+ self.l_address = LocalState(arc4.Address, key=b"la")
+
+ self.b_struct = Box(StateStruct)
+ self.b_uint64 = Box(UInt64, key=b"bu")
+ self.b_address = Box(arc4.Address, key=b"ba")
+
+ self.box_map_struct = BoxMap(StateStruct, SharedStruct)
+ self.box_map_uint64 = BoxMap(UInt64, SharedStruct, key_prefix=b"bmu")
+ self.box_map_address = BoxMap(arc4.Address, SharedStruct, key_prefix=b"bma")
+
+ self.box_ref = BoxRef()
+ self.box_ref2 = BoxRef(key=b"br")
+
+ @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ def bare_create(self) -> None:
+ pass
+
+ @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ def create(self) -> None:
+ pass
+
+ @arc4.baremethod(create="require", allow_actions=["DeleteApplication"])
+ def transient(self) -> None:
+ pass
+
+ @arc4.abimethod()
+ def struct_arg(self, arg: TopLevelStruct, shared: SharedStruct) -> UInt64:
+ assert arg.shared == shared, "this might error"
+ return UInt64(42)
+
+ @arc4.abimethod(readonly=True)
+ def struct_return(self, arg: TopLevelStruct) -> SharedStruct:
+ assert arg.shared == echo(arg.shared), "this won't error"
+ return arg.shared
+
+ @arc4.abimethod(name="emits_error", readonly=True)
+ def errors(self, arg: TopLevelStruct) -> None:
+ assert arg.a.bytes == arc4.UInt8(0).bytes, "this will error"
+
+ @arc4.abimethod()
+ def emitter(self) -> None:
+ arc4.emit(SharedStruct(foo=arc4.DynamicBytes(b"hello1"), bar=arc4.UInt8(42)))
+
+ arc4.emit(
+ "Anonymous",
+ String("hello"),
+ SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)),
+ )
+
+ @arc4.abimethod()
+ def conditional_emit(self, should_emit: bool) -> None:
+ if should_emit:
+ arc4.emit(
+ "Anonymous2",
+ EventOnly(arc4.UInt64(42), arc4.UInt64(43)),
+ SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)),
+ )
+
+ @arc4.abimethod()
+ def template_value(self) -> tuple[SharedStruct, UInt64, String, arc4.UInt8]:
+ return (
+ TemplateVar[SharedStruct]("STRUCT"),
+ TemplateVar[UInt64]("AVM_UINT64"),
+ TemplateVar[String]("AVM_STRING"),
+ TemplateVar[arc4.UInt8]("ARC4_UINT8"),
+ )
+
+
+@subroutine
+def echo(s: SharedStruct) -> SharedStruct:
+ return s
diff --git a/test_cases/arc_56/out/Contract.approval.mir b/test_cases/arc_56/out/Contract.approval.mir
new file mode 100644
index 0000000000..b2ca886fd6
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.approval.mir
@@ -0,0 +1,403 @@
+// Op Stack (out)
+// test_cases.arc_56.contract.Contract.approval_program() -> uint64:
+main_block@0:
+ callsub __puya_arc4_router__ tmp%1#0
+ return
+
+
+// test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> uint64:
+__puya_arc4_router__:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ proto 0 1
+
+__puya_arc4_router___block@0:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txn NumAppArgs tmp%0#0
+ bz __puya_arc4_router___bare_routing@11
+ // Implicit fall through to __puya_arc4_router___abi_routing@1
+
+__puya_arc4_router___abi_routing@1:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 0 tmp%2#0
+ method create()void tmp%2#0,Method(create()void)
+ method struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64 tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64)
+ method struct_return((uint64,string,(byte[],uint8)))(byte[],uint8) tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8))
+ method emits_error((uint64,string,(byte[],uint8)))void tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void)
+ method emitter()void tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void),Method(emitter()void)
+ method conditional_emit(bool)void tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void),Method(emitter()void),Method(conditional_emit(bool)void)
+ method template_value()((byte[],uint8),uint64,string,uint8) tmp%2#0,Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void),Method(emitter()void),Method(conditional_emit(bool)void),Method(template_value()((byte[],uint8),uint64,string,uint8))
+ l-load tmp%2#0 7 Method(create()void),Method(struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64),Method(struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)),Method(emits_error((uint64,string,(byte[],uint8)))void),Method(emitter()void),Method(conditional_emit(bool)void),Method(template_value()((byte[],uint8),uint64,string,uint8)),tmp%2#0
+ match __puya_arc4_router___create_route@2 __puya_arc4_router___struct_arg_route@3 __puya_arc4_router___struct_return_route@4 __puya_arc4_router___emits_error_route@5 __puya_arc4_router___emitter_route@6 __puya_arc4_router___conditional_emit_route@7 __puya_arc4_router___template_value_route@8
+ int 0 0
+ retsub 0
+
+__puya_arc4_router___create_route@2:
+ // arc_56/contract.py:67
+ // @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ txn OnCompletion tmp%3#0
+ int 1 tmp%3#0,1
+ l-load tmp%3#0 1 1,tmp%3#0
+ shl tmp%4#0
+ int 3 tmp%4#0,3
+ & tmp%5#0
+ assert // OnCompletion is not one of NoOp, OptIn
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___struct_arg_route@3:
+ // arc_56/contract.py:75
+ // @arc4.abimethod()
+ txn OnCompletion tmp%6#0
+ ! tmp%7#0
+ assert // OnCompletion is not NoOp
+ txn ApplicationID tmp%8#0
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1 tmp%10#0
+ txna ApplicationArgs 2 tmp%10#0,tmp%11#0
+ // arc_56/contract.py:75
+ // @arc4.abimethod()
+ l-load tmp%10#0 1 tmp%11#0,tmp%10#0
+ l-load tmp%11#0 1 tmp%10#0,tmp%11#0
+ callsub struct_arg to_encode%0#0
+ itob val_as_bytes%0#0
+ byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75
+ l-load val_as_bytes%0#0 1 0x151f7c75,val_as_bytes%0#0
+ concat tmp%12#0
+ log
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___struct_return_route@4:
+ // arc_56/contract.py:80
+ // @arc4.abimethod(readonly=True)
+ txn OnCompletion tmp%13#0
+ ! tmp%14#0
+ assert // OnCompletion is not NoOp
+ txn ApplicationID tmp%15#0
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1 tmp%17#0
+ // arc_56/contract.py:80
+ // @arc4.abimethod(readonly=True)
+ callsub struct_return tmp%18#0
+ byte 0x151f7c75 tmp%18#0,0x151f7c75
+ l-load tmp%18#0 1 0x151f7c75,tmp%18#0
+ concat tmp%19#0
+ log
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___emits_error_route@5:
+ // arc_56/contract.py:85
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ txn OnCompletion tmp%20#0
+ ! tmp%21#0
+ assert // OnCompletion is not NoOp
+ txn ApplicationID tmp%22#0
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1 tmp%24#0
+ // arc_56/contract.py:85
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ callsub errors
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___emitter_route@6:
+ // arc_56/contract.py:89
+ // @arc4.abimethod()
+ txn OnCompletion tmp%25#0
+ ! tmp%26#0
+ assert // OnCompletion is not NoOp
+ txn ApplicationID tmp%27#0
+ assert // can only call when not creating
+ callsub emitter
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___conditional_emit_route@7:
+ // arc_56/contract.py:99
+ // @arc4.abimethod()
+ txn OnCompletion tmp%29#0
+ ! tmp%30#0
+ assert // OnCompletion is not NoOp
+ txn ApplicationID tmp%31#0
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1 tmp%33#0
+ int 0 tmp%33#0,0
+ getbit tmp%34#0
+ // arc_56/contract.py:99
+ // @arc4.abimethod()
+ callsub conditional_emit
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___template_value_route@8:
+ // arc_56/contract.py:108
+ // @arc4.abimethod()
+ txn OnCompletion tmp%35#0
+ ! tmp%36#0
+ assert // OnCompletion is not NoOp
+ txn ApplicationID tmp%37#0
+ assert // can only call when not creating
+ callsub template_value elements_to_encode%0#0,elements_to_encode%1#0,elements_to_encode%2#0,elements_to_encode%3#0
+ l-load elements_to_encode%1#0 2 elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,elements_to_encode%1#0
+ itob elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0
+ l-load-copy elements_to_encode%2#0 2 elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0,elements_to_encode%2#0 (copy)
+ len elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0,length%0#0
+ itob elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0,as_bytes%0#0
+ extract 6 2 elements_to_encode%0#0,elements_to_encode%2#0,elements_to_encode%3#0,val_as_bytes%1#0,length_uint16%0#0
+ l-load elements_to_encode%2#0 3 elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,length_uint16%0#0,elements_to_encode%2#0
+ concat elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0
+ l-load-copy elements_to_encode%0#0 3 elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,elements_to_encode%0#0 (copy)
+ len elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,data_length%0#0
+ int 13 elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,data_length%0#0,13
+ l-load data_length%0#0 1 elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,13,data_length%0#0
+ + elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,current_tail_offset%1#0
+ byte 0x000d elements_to_encode%0#0,elements_to_encode%3#0,val_as_bytes%1#0,encoded_value%0#0,current_tail_offset%1#0,0x000d
+ l-load val_as_bytes%1#0 3 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,current_tail_offset%1#0,0x000d,val_as_bytes%1#0
+ concat elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,current_tail_offset%1#0,encoded_tuple_buffer%2#0
+ l-load current_tail_offset%1#0 1 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%2#0,current_tail_offset%1#0
+ itob elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%2#0,as_bytes%2#0
+ extract 6 2 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%2#0,offset_as_uint16%1#0
+ l-load encoded_tuple_buffer%2#0 1 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,offset_as_uint16%1#0,encoded_tuple_buffer%2#0
+ l-load offset_as_uint16%1#0 1 elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%2#0,offset_as_uint16%1#0
+ concat elements_to_encode%0#0,elements_to_encode%3#0,encoded_value%0#0,encoded_tuple_buffer%3#0
+ l-load elements_to_encode%3#0 2 elements_to_encode%0#0,encoded_value%0#0,encoded_tuple_buffer%3#0,elements_to_encode%3#0
+ concat elements_to_encode%0#0,encoded_value%0#0,encoded_tuple_buffer%4#0
+ l-load elements_to_encode%0#0 2 encoded_value%0#0,encoded_tuple_buffer%4#0,elements_to_encode%0#0
+ concat encoded_value%0#0,encoded_tuple_buffer%5#0
+ l-load encoded_value%0#0 1 encoded_tuple_buffer%5#0,encoded_value%0#0
+ concat encoded_tuple_buffer%6#0
+ byte 0x151f7c75 encoded_tuple_buffer%6#0,0x151f7c75
+ l-load encoded_tuple_buffer%6#0 1 0x151f7c75,encoded_tuple_buffer%6#0
+ concat tmp%39#0
+ log
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___bare_routing@11:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txn OnCompletion tmp%40#0
+ switch __puya_arc4_router___bare_create@12 __puya_arc4_router___bare_create@12 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___transient@13
+ int 0 0
+ retsub 0
+
+__puya_arc4_router___bare_create@12:
+ // arc_56/contract.py:63-64
+ // @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ // def bare_create(self) -> None:
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___transient@13:
+ // arc_56/contract.py:71
+ // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"])
+ txn ApplicationID tmp%41#0
+ ! tmp%42#0
+ assert // can only call when creating
+ // arc_56/contract.py:71-72
+ // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"])
+ // def transient(self) -> None:
+ int 1 1
+ retsub 1
+
+__puya_arc4_router___after_if_else@16:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ int 0 0
+ retsub 0
+
+
+// test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+struct_arg: (𝕡) arg#0,shared#0 |
+ // arc_56/contract.py:75-76
+ // @arc4.abimethod()
+ // def struct_arg(self, arg: TopLevelStruct, shared: SharedStruct) -> UInt64:
+ proto 2 1 (𝕡) arg#0,shared#0 |
+
+struct_arg_block@0: (𝕡) arg#0,shared#0 |
+ // arc_56/contract.py:77
+ // assert arg.shared == shared, "this might error"
+ p-load arg#0 (𝕡) arg#0,shared#0 | arg#0 (copy)
+ int 10 (𝕡) arg#0,shared#0 | arg#0 (copy),10
+ extract_uint16 (𝕡) arg#0,shared#0 | item_start_offset%0#0
+ p-load arg#0 (𝕡) arg#0,shared#0 | item_start_offset%0#0,arg#0 (copy)
+ len (𝕡) arg#0,shared#0 | item_start_offset%0#0,item_end_offset%0#0
+ p-load arg#0 (𝕡) arg#0,shared#0 | item_start_offset%0#0,item_end_offset%0#0,arg#0 (copy)
+ l-load item_start_offset%0#0 2 (𝕡) arg#0,shared#0 | item_end_offset%0#0,arg#0 (copy),item_start_offset%0#0
+ l-load item_end_offset%0#0 2 (𝕡) arg#0,shared#0 | arg#0 (copy),item_start_offset%0#0,item_end_offset%0#0
+ substring3 (𝕡) arg#0,shared#0 | tmp%0#0
+ p-load shared#0 (𝕡) arg#0,shared#0 | tmp%0#0,shared#0 (copy)
+ == (𝕡) arg#0,shared#0 | tmp%1#0
+ assert // this might error (𝕡) arg#0,shared#0 |
+ // arc_56/contract.py:78
+ // return UInt64(42)
+ int 42 (𝕡) arg#0,shared#0 | 42
+ retsub 42
+
+
+// test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+struct_return: (𝕡) arg#0 |
+ // arc_56/contract.py:80-81
+ // @arc4.abimethod(readonly=True)
+ // def struct_return(self, arg: TopLevelStruct) -> SharedStruct:
+ proto 1 1 (𝕡) arg#0 |
+
+struct_return_block@0: (𝕡) arg#0 |
+ // arc_56/contract.py:82
+ // assert arg.shared == echo(arg.shared), "this won't error"
+ p-load arg#0 (𝕡) arg#0 | arg#0 (copy)
+ int 10 (𝕡) arg#0 | arg#0 (copy),10
+ extract_uint16 (𝕡) arg#0 | item_start_offset%0#0
+ p-load arg#0 (𝕡) arg#0 | item_start_offset%0#0,arg#0 (copy)
+ len (𝕡) arg#0 | item_start_offset%0#0,item_end_offset%0#0
+ p-load arg#0 (𝕡) arg#0 | item_start_offset%0#0,item_end_offset%0#0,arg#0 (copy)
+ l-load item_start_offset%0#0 2 (𝕡) arg#0 | item_end_offset%0#0,arg#0 (copy),item_start_offset%0#0
+ l-load item_end_offset%0#0 2 (𝕡) arg#0 | arg#0 (copy),item_start_offset%0#0,item_end_offset%0#0
+ substring3 (𝕡) arg#0 | tmp%0#0
+ l-load-copy tmp%0#0 0 (𝕡) arg#0 | tmp%0#0,tmp%0#0 (copy)
+ callsub echo (𝕡) arg#0 | tmp%0#0,echo%0#0,echo%1#0
+ pop 1 (𝕡) arg#0 | tmp%0#0,echo%0#0
+ l-store echo%0#0 0 (𝕡) arg#0 | tmp%0#0,echo%0#0
+ l-load-copy tmp%0#0 1 (𝕡) arg#0 | tmp%0#0,echo%0#0,tmp%0#0 (copy)
+ l-load echo%0#0 1 (𝕡) arg#0 | tmp%0#0,tmp%0#0 (copy),echo%0#0
+ == (𝕡) arg#0 | tmp%0#0,tmp%2#0
+ assert // this won't error (𝕡) arg#0 | tmp%0#0
+ // arc_56/contract.py:83
+ // return arg.shared
+ l-load tmp%0#0 0 (𝕡) arg#0 | tmp%0#0
+ retsub tmp%0#0
+
+
+// test_cases.arc_56.contract.echo(s: bytes) -> bytes, bytes:
+echo: (𝕡) s#0 |
+ // arc_56/contract.py:118-119
+ // @subroutine
+ // def echo(s: SharedStruct) -> SharedStruct:
+ proto 1 2 (𝕡) s#0 |
+
+echo_block@0: (𝕡) s#0 |
+ // arc_56/contract.py:120
+ // return s
+ p-load s#0 (𝕡) s#0 | s#0 (copy)
+ p-load s#0 (𝕡) s#0 | s#0 (copy),s#0 (copy)
+ retsub s#0 (copy),s#0 (copy)
+
+
+// test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+errors: (𝕡) arg#0 |
+ // arc_56/contract.py:85-86
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ // def errors(self, arg: TopLevelStruct) -> None:
+ proto 1 0 (𝕡) arg#0 |
+
+errors_block@0: (𝕡) arg#0 |
+ // arc_56/contract.py:87
+ // assert arg.a.bytes == arc4.UInt8(0).bytes, "this will error"
+ p-load arg#0 (𝕡) arg#0 | arg#0 (copy)
+ extract 0 8 // on error: Index access is out of bounds (𝕡) arg#0 | tmp%0#0
+ byte 0x00 (𝕡) arg#0 | tmp%0#0,0x00
+ == (𝕡) arg#0 | tmp%1#0
+ assert // this will error (𝕡) arg#0 |
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.emitter() -> void:
+emitter:
+ // arc_56/contract.py:89-90
+ // @arc4.abimethod()
+ // def emitter(self) -> None:
+ proto 0 0
+
+emitter_block@0:
+ // arc_56/contract.py:91
+ // arc4.emit(SharedStruct(foo=arc4.DynamicBytes(b"hello1"), bar=arc4.UInt8(42)))
+ method SharedStruct(byte[],uint8) Method(SharedStruct(byte[],uint8))
+ byte 0x00032a000668656c6c6f31 Method(SharedStruct(byte[],uint8)),0x00032a000668656c6c6f31
+ concat event%0#0
+ log
+ // arc_56/contract.py:93-97
+ // arc4.emit(
+ // "Anonymous",
+ // String("hello"),
+ // SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)),
+ // )
+ method Anonymous(string,(byte[],uint8)) Method(Anonymous(string,(byte[],uint8)))
+ byte 0x0004000b000568656c6c6f00032a000668656c6c6f32 Method(Anonymous(string,(byte[],uint8))),0x0004000b000568656c6c6f00032a000668656c6c6f32
+ concat event%1#0
+ log
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.conditional_emit(should_emit: uint64) -> void:
+conditional_emit: (𝕡) should_emit#0 |
+ // arc_56/contract.py:99-100
+ // @arc4.abimethod()
+ // def conditional_emit(self, should_emit: bool) -> None:
+ proto 1 0 (𝕡) should_emit#0 |
+
+conditional_emit_block@0: (𝕡) should_emit#0 |
+ // arc_56/contract.py:101
+ // if should_emit:
+ p-load should_emit#0 (𝕡) should_emit#0 | should_emit#0 (copy)
+ bz conditional_emit_after_if_else@2 (𝕡) should_emit#0 |
+ // Implicit fall through to conditional_emit_if_body@1 (𝕡) should_emit#0 |
+
+conditional_emit_if_body@1: (𝕡) should_emit#0 |
+ // arc_56/contract.py:102-106
+ // arc4.emit(
+ // "Anonymous2",
+ // EventOnly(arc4.UInt64(42), arc4.UInt64(43)),
+ // SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)),
+ // )
+ method Anonymous2((uint64,uint64),(byte[],uint8)) (𝕡) should_emit#0 | Method(Anonymous2((uint64,uint64),(byte[],uint8)))
+ byte 0x000000000000002a000000000000002b001200032a000668656c6c6f33 (𝕡) should_emit#0 | Method(Anonymous2((uint64,uint64),(byte[],uint8))),0x000000000000002a000000000000002b001200032a000668656c6c6f33
+ concat (𝕡) should_emit#0 | event%0#0
+ log (𝕡) should_emit#0 |
+ // Implicit fall through to conditional_emit_after_if_else@2 (𝕡) should_emit#0 |
+
+conditional_emit_after_if_else@2: (𝕡) should_emit#0 |
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.template_value() -> bytes, uint64, bytes, bytes:
+template_value:
+ // arc_56/contract.py:108-109
+ // @arc4.abimethod()
+ // def template_value(self) -> tuple[SharedStruct, UInt64, String, arc4.UInt8]:
+ proto 0 4
+
+template_value_block@0:
+ // arc_56/contract.py:111
+ // TemplateVar[SharedStruct]("STRUCT"),
+ byte TMPL_STRUCT TMPL_STRUCT
+ // arc_56/contract.py:112
+ // TemplateVar[UInt64]("AVM_UINT64"),
+ int TMPL_AVM_UINT64 TMPL_STRUCT,TMPL_AVM_UINT64
+ // arc_56/contract.py:113
+ // TemplateVar[String]("AVM_STRING"),
+ byte TMPL_AVM_STRING TMPL_STRUCT,TMPL_AVM_UINT64,TMPL_AVM_STRING
+ // arc_56/contract.py:114
+ // TemplateVar[arc4.UInt8]("ARC4_UINT8"),
+ byte TMPL_ARC4_UINT8 TMPL_STRUCT,TMPL_AVM_UINT64,TMPL_AVM_STRING,TMPL_ARC4_UINT8
+ // arc_56/contract.py:110-115
+ // return (
+ // TemplateVar[SharedStruct]("STRUCT"),
+ // TemplateVar[UInt64]("AVM_UINT64"),
+ // TemplateVar[String]("AVM_STRING"),
+ // TemplateVar[arc4.UInt8]("ARC4_UINT8"),
+ // )
+ retsub TMPL_STRUCT,TMPL_AVM_UINT64,TMPL_AVM_STRING,TMPL_ARC4_UINT8
+
+
diff --git a/test_cases/arc_56/out/Contract.approval.teal b/test_cases/arc_56/out/Contract.approval.teal
new file mode 100644
index 0000000000..72a8a4092f
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.approval.teal
@@ -0,0 +1,355 @@
+#pragma version 10
+
+test_cases.arc_56.contract.Contract.approval_program:
+ intcblock 1 0 10 TMPL_AVM_UINT64
+ bytecblock 0x151f7c75 TMPL_STRUCT TMPL_AVM_STRING TMPL_ARC4_UINT8
+ callsub __puya_arc4_router__
+ return
+
+
+// test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> uint64:
+__puya_arc4_router__:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ proto 0 1
+ txn NumAppArgs
+ bz __puya_arc4_router___bare_routing@11
+ pushbytess 0x4c5c61ba 0x97e8e4a7 0x76c4de11 0xc1ca7709 0x6de762c2 0x59fc5282 0x9d9eecb0 // method "create()void", method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64", method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)", method "emits_error((uint64,string,(byte[],uint8)))void", method "emitter()void", method "conditional_emit(bool)void", method "template_value()((byte[],uint8),uint64,string,uint8)"
+ txna ApplicationArgs 0
+ match __puya_arc4_router___create_route@2 __puya_arc4_router___struct_arg_route@3 __puya_arc4_router___struct_return_route@4 __puya_arc4_router___emits_error_route@5 __puya_arc4_router___emitter_route@6 __puya_arc4_router___conditional_emit_route@7 __puya_arc4_router___template_value_route@8
+ intc_1 // 0
+ retsub
+
+__puya_arc4_router___create_route@2:
+ // arc_56/contract.py:67
+ // @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ intc_0 // 1
+ txn OnCompletion
+ shl
+ pushint 3 // 3
+ &
+ assert // OnCompletion is not one of NoOp, OptIn
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___struct_arg_route@3:
+ // arc_56/contract.py:75
+ // @arc4.abimethod()
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1
+ txna ApplicationArgs 2
+ // arc_56/contract.py:75
+ // @arc4.abimethod()
+ callsub struct_arg
+ itob
+ bytec_0 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___struct_return_route@4:
+ // arc_56/contract.py:80
+ // @arc4.abimethod(readonly=True)
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1
+ // arc_56/contract.py:80
+ // @arc4.abimethod(readonly=True)
+ callsub struct_return
+ bytec_0 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___emits_error_route@5:
+ // arc_56/contract.py:85
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1
+ // arc_56/contract.py:85
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ callsub errors
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___emitter_route@6:
+ // arc_56/contract.py:89
+ // @arc4.abimethod()
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ callsub emitter
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___conditional_emit_route@7:
+ // arc_56/contract.py:99
+ // @arc4.abimethod()
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1
+ intc_1 // 0
+ getbit
+ // arc_56/contract.py:99
+ // @arc4.abimethod()
+ callsub conditional_emit
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___template_value_route@8:
+ // arc_56/contract.py:108
+ // @arc4.abimethod()
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ callsub template_value
+ uncover 2
+ itob
+ dig 2
+ len
+ itob
+ extract 6 2
+ uncover 3
+ concat
+ dig 3
+ len
+ pushint 13 // 13
+ +
+ pushbytes 0x000d
+ uncover 3
+ concat
+ swap
+ itob
+ extract 6 2
+ concat
+ uncover 2
+ concat
+ uncover 2
+ concat
+ swap
+ concat
+ bytec_0 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___bare_routing@11:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txn OnCompletion
+ switch __puya_arc4_router___bare_create@12 __puya_arc4_router___bare_create@12 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___transient@13
+ intc_1 // 0
+ retsub
+
+__puya_arc4_router___bare_create@12:
+ // arc_56/contract.py:63-64
+ // @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ // def bare_create(self) -> None:
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___transient@13:
+ // arc_56/contract.py:71
+ // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"])
+ txn ApplicationID
+ !
+ assert // can only call when creating
+ // arc_56/contract.py:71-72
+ // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"])
+ // def transient(self) -> None:
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___after_if_else@16:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ intc_1 // 0
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+struct_arg:
+ // arc_56/contract.py:75-76
+ // @arc4.abimethod()
+ // def struct_arg(self, arg: TopLevelStruct, shared: SharedStruct) -> UInt64:
+ proto 2 1
+ // arc_56/contract.py:77
+ // assert arg.shared == shared, "this might error"
+ frame_dig -2
+ intc_2 // 10
+ extract_uint16
+ frame_dig -2
+ len
+ frame_dig -2
+ cover 2
+ substring3
+ frame_dig -1
+ ==
+ assert // this might error
+ // arc_56/contract.py:78
+ // return UInt64(42)
+ pushint 42 // 42
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+struct_return:
+ // arc_56/contract.py:80-81
+ // @arc4.abimethod(readonly=True)
+ // def struct_return(self, arg: TopLevelStruct) -> SharedStruct:
+ proto 1 1
+ // arc_56/contract.py:82
+ // assert arg.shared == echo(arg.shared), "this won't error"
+ frame_dig -1
+ intc_2 // 10
+ extract_uint16
+ frame_dig -1
+ len
+ frame_dig -1
+ cover 2
+ substring3
+ dup
+ callsub echo
+ pop
+ dig 1
+ ==
+ assert // this won't error
+ // arc_56/contract.py:83
+ // return arg.shared
+ retsub
+
+
+// test_cases.arc_56.contract.echo(s: bytes) -> bytes, bytes:
+echo:
+ // arc_56/contract.py:118-119
+ // @subroutine
+ // def echo(s: SharedStruct) -> SharedStruct:
+ proto 1 2
+ // arc_56/contract.py:120
+ // return s
+ frame_dig -1
+ dup
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+errors:
+ // arc_56/contract.py:85-86
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ // def errors(self, arg: TopLevelStruct) -> None:
+ proto 1 0
+ // arc_56/contract.py:87
+ // assert arg.a.bytes == arc4.UInt8(0).bytes, "this will error"
+ frame_dig -1
+ extract 0 8 // on error: Index access is out of bounds
+ pushbytes 0x00
+ ==
+ assert // this will error
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.emitter() -> void:
+emitter:
+ // arc_56/contract.py:89-90
+ // @arc4.abimethod()
+ // def emitter(self) -> None:
+ proto 0 0
+ // arc_56/contract.py:91
+ // arc4.emit(SharedStruct(foo=arc4.DynamicBytes(b"hello1"), bar=arc4.UInt8(42)))
+ pushbytess 0xd93f374e 0x00032a000668656c6c6f31 // method "SharedStruct(byte[],uint8)", 0x00032a000668656c6c6f31
+ concat
+ log
+ // arc_56/contract.py:93-97
+ // arc4.emit(
+ // "Anonymous",
+ // String("hello"),
+ // SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)),
+ // )
+ pushbytess 0x1e72af4e 0x0004000b000568656c6c6f00032a000668656c6c6f32 // method "Anonymous(string,(byte[],uint8))", 0x0004000b000568656c6c6f00032a000668656c6c6f32
+ concat
+ log
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.conditional_emit(should_emit: uint64) -> void:
+conditional_emit:
+ // arc_56/contract.py:99-100
+ // @arc4.abimethod()
+ // def conditional_emit(self, should_emit: bool) -> None:
+ proto 1 0
+ // arc_56/contract.py:101
+ // if should_emit:
+ frame_dig -1
+ bz conditional_emit_after_if_else@2
+ // arc_56/contract.py:102-106
+ // arc4.emit(
+ // "Anonymous2",
+ // EventOnly(arc4.UInt64(42), arc4.UInt64(43)),
+ // SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)),
+ // )
+ pushbytess 0x11c547ba 0x000000000000002a000000000000002b001200032a000668656c6c6f33 // method "Anonymous2((uint64,uint64),(byte[],uint8))", 0x000000000000002a000000000000002b001200032a000668656c6c6f33
+ concat
+ log
+
+conditional_emit_after_if_else@2:
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.template_value() -> bytes, uint64, bytes, bytes:
+template_value:
+ // arc_56/contract.py:108-109
+ // @arc4.abimethod()
+ // def template_value(self) -> tuple[SharedStruct, UInt64, String, arc4.UInt8]:
+ proto 0 4
+ // arc_56/contract.py:111
+ // TemplateVar[SharedStruct]("STRUCT"),
+ bytec_1 // TMPL_STRUCT
+ // arc_56/contract.py:112
+ // TemplateVar[UInt64]("AVM_UINT64"),
+ intc_3 // TMPL_AVM_UINT64
+ // arc_56/contract.py:113
+ // TemplateVar[String]("AVM_STRING"),
+ bytec_2 // TMPL_AVM_STRING
+ // arc_56/contract.py:114
+ // TemplateVar[arc4.UInt8]("ARC4_UINT8"),
+ bytec_3 // TMPL_ARC4_UINT8
+ // arc_56/contract.py:110-115
+ // return (
+ // TemplateVar[SharedStruct]("STRUCT"),
+ // TemplateVar[UInt64]("AVM_UINT64"),
+ // TemplateVar[String]("AVM_STRING"),
+ // TemplateVar[arc4.UInt8]("ARC4_UINT8"),
+ // )
+ retsub
diff --git a/test_cases/arc_56/out/Contract.arc32.json b/test_cases/arc_56/out/Contract.arc32.json
new file mode 100644
index 0000000000..ccd02f8edd
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.arc32.json
@@ -0,0 +1,266 @@
+{
+ "hints": {
+ "create()void": {
+ "call_config": {
+ "no_op": "ALL",
+ "opt_in": "ALL"
+ }
+ },
+ "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64": {
+ "call_config": {
+ "no_op": "CALL"
+ },
+ "structs": {
+ "arg": {
+ "name": "TopLevelStruct",
+ "elements": [
+ [
+ "a",
+ "uint64"
+ ],
+ [
+ "b",
+ "string"
+ ],
+ [
+ "shared",
+ "(byte[],uint8)"
+ ]
+ ]
+ },
+ "shared": {
+ "name": "SharedStruct",
+ "elements": [
+ [
+ "foo",
+ "byte[]"
+ ],
+ [
+ "bar",
+ "uint8"
+ ]
+ ]
+ }
+ }
+ },
+ "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)": {
+ "read_only": true,
+ "call_config": {
+ "no_op": "CALL"
+ },
+ "structs": {
+ "arg": {
+ "name": "TopLevelStruct",
+ "elements": [
+ [
+ "a",
+ "uint64"
+ ],
+ [
+ "b",
+ "string"
+ ],
+ [
+ "shared",
+ "(byte[],uint8)"
+ ]
+ ]
+ },
+ "output": {
+ "name": "SharedStruct",
+ "elements": [
+ [
+ "foo",
+ "byte[]"
+ ],
+ [
+ "bar",
+ "uint8"
+ ]
+ ]
+ }
+ }
+ },
+ "emits_error((uint64,string,(byte[],uint8)))void": {
+ "read_only": true,
+ "call_config": {
+ "no_op": "CALL"
+ },
+ "structs": {
+ "arg": {
+ "name": "TopLevelStruct",
+ "elements": [
+ [
+ "a",
+ "uint64"
+ ],
+ [
+ "b",
+ "string"
+ ],
+ [
+ "shared",
+ "(byte[],uint8)"
+ ]
+ ]
+ }
+ }
+ },
+ "emitter()void": {
+ "call_config": {
+ "no_op": "CALL"
+ }
+ },
+ "conditional_emit(bool)void": {
+ "call_config": {
+ "no_op": "CALL"
+ }
+ },
+ "template_value()((byte[],uint8),uint64,string,uint8)": {
+ "call_config": {
+ "no_op": "CALL"
+ }
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMCBUTVBMX0FWTV9VSU5UNjQKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSBUTVBMX1NUUlVDVCBUTVBMX0FWTV9TVFJJTkcgVE1QTF9BUkM0X1VJTlQ4CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTEKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweDk3ZThlNGE3IDB4NzZjNGRlMTEgMHhjMWNhNzcwOSAweDZkZTc2MmMyIDB4NTlmYzUyODIgMHg5ZDllZWNiMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAic3RydWN0X2FyZygodWludDY0LHN0cmluZywoYnl0ZVtdLHVpbnQ4KSksKGJ5dGVbXSx1aW50OCkpdWludDY0IiwgbWV0aG9kICJzdHJ1Y3RfcmV0dXJuKCh1aW50NjQsc3RyaW5nLChieXRlW10sdWludDgpKSkoYnl0ZVtdLHVpbnQ4KSIsIG1ldGhvZCAiZW1pdHNfZXJyb3IoKHVpbnQ2NCxzdHJpbmcsKGJ5dGVbXSx1aW50OCkpKXZvaWQiLCBtZXRob2QgImVtaXR0ZXIoKXZvaWQiLCBtZXRob2QgImNvbmRpdGlvbmFsX2VtaXQoYm9vbCl2b2lkIiwgbWV0aG9kICJ0ZW1wbGF0ZV92YWx1ZSgpKChieXRlW10sdWludDgpLHVpbnQ2NCxzdHJpbmcsdWludDgpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RydWN0X2FyZ19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0cnVjdF9yZXR1cm5fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0c19lcnJvcl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VtaXR0ZXJfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jb25kaXRpb25hbF9lbWl0X3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVtcGxhdGVfdmFsdWVfcm91dGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IiwgYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBvbmUgb2YgTm9PcCwgT3B0SW4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0cnVjdF9hcmdfcm91dGVAMzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzdHJ1Y3RfYXJnCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zdHJ1Y3RfcmV0dXJuX3JvdXRlQDQ6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBzdHJ1Y3RfcmV0dXJuCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0c19lcnJvcl9yb3V0ZUA1OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT0iZW1pdHNfZXJyb3IiLCByZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJlbWl0c19lcnJvciIsIHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGVycm9ycwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdHRlcl9yb3V0ZUA2OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGVtaXR0ZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbmRpdGlvbmFsX2VtaXRfcm91dGVANzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBjb25kaXRpb25hbF9lbWl0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZW1wbGF0ZV92YWx1ZV9yb3V0ZUA4OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZW1wbGF0ZV92YWx1ZQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgMTMgLy8gMTMKICAgICsKICAgIHB1c2hieXRlcyAweDAwMGQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDExOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfY3JlYXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfY3JlYXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3RyYW5zaWVudEAxMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9jcmVhdGVAMTI6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJhbGxvdyIsIGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgYmFyZV9jcmVhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3RyYW5zaWVudEAxMzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiLCBhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NzEtNzIKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIiwgYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgdHJhbnNpZW50KHNlbGYpIC0+IE5vbmU6CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LkNvbnRyYWN0LnN0cnVjdF9hcmcoYXJnOiBieXRlcywgc2hhcmVkOiBieXRlcykgLT4gdWludDY0OgpzdHJ1Y3RfYXJnOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHN0cnVjdF9hcmcoc2VsZiwgYXJnOiBUb3BMZXZlbFN0cnVjdCwgc2hhcmVkOiBTaGFyZWRTdHJ1Y3QpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBhc3NlcnQgYXJnLnNoYXJlZCA9PSBzaGFyZWQsICJ0aGlzIG1pZ2h0IGVycm9yIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgZnJhbWVfZGlnIC0yCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gdGhpcyBtaWdodCBlcnJvcgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gVUludDY0KDQyKQogICAgcHVzaGludCA0MiAvLyA0MgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3Quc3RydWN0X3JldHVybihhcmc6IGJ5dGVzKSAtPiBieXRlczoKc3RydWN0X3JldHVybjoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MC04MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgc3RydWN0X3JldHVybihzZWxmLCBhcmc6IFRvcExldmVsU3RydWN0KSAtPiBTaGFyZWRTdHJ1Y3Q6CiAgICBwcm90byAxIDEKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MgogICAgLy8gYXNzZXJ0IGFyZy5zaGFyZWQgPT0gZWNobyhhcmcuc2hhcmVkKSwgInRoaXMgd29uJ3QgZXJyb3IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY2FsbHN1YiBlY2hvCiAgICBwb3AKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHRoaXMgd29uJ3QgZXJyb3IKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MwogICAgLy8gcmV0dXJuIGFyZy5zaGFyZWQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LmVjaG8oczogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZWNobzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTgtMTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVjaG8oczogU2hhcmVkU3RydWN0KSAtPiBTaGFyZWRTdHJ1Y3Q6CiAgICBwcm90byAxIDIKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMjAKICAgIC8vIHJldHVybiBzCiAgICBmcmFtZV9kaWcgLTEKICAgIGR1cAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QuZXJyb3JzKGFyZzogYnl0ZXMpIC0+IHZvaWQ6CmVycm9yczoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4NS04NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImVtaXRzX2Vycm9yIiwgcmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBlcnJvcnMoc2VsZiwgYXJnOiBUb3BMZXZlbFN0cnVjdCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NlcnQgYXJnLmEuYnl0ZXMgPT0gYXJjNC5VSW50OCgwKS5ieXRlcywgInRoaXMgd2lsbCBlcnJvciIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgPT0KICAgIGFzc2VydCAvLyB0aGlzIHdpbGwgZXJyb3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LkNvbnRyYWN0LmVtaXR0ZXIoKSAtPiB2b2lkOgplbWl0dGVyOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGVtaXR0ZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhcmM0LmVtaXQoU2hhcmVkU3RydWN0KGZvbz1hcmM0LkR5bmFtaWNCeXRlcyhiImhlbGxvMSIpLCBiYXI9YXJjNC5VSW50OCg0MikpKQogICAgcHVzaGJ5dGVzcyAweGQ5M2YzNzRlIDB4MDAwMzJhMDAwNjY4NjU2YzZjNmYzMSAvLyBtZXRob2QgIlNoYXJlZFN0cnVjdChieXRlW10sdWludDgpIiwgMHgwMDAzMmEwMDA2Njg2NTZjNmM2ZjMxCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjkzLTk3CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIkFub255bW91cyIsCiAgICAvLyAgICAgU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgIFNoYXJlZFN0cnVjdChmb289YXJjNC5EeW5hbWljQnl0ZXMoYiJoZWxsbzIiKSwgYmFyPWFyYzQuVUludDgoNDIpKSwKICAgIC8vICkKICAgIHB1c2hieXRlc3MgMHgxZTcyYWY0ZSAweDAwMDQwMDBiMDAwNTY4NjU2YzZjNmYwMDAzMmEwMDA2Njg2NTZjNmM2ZjMyIC8vIG1ldGhvZCAiQW5vbnltb3VzKHN0cmluZywoYnl0ZVtdLHVpbnQ4KSkiLCAweDAwMDQwMDBiMDAwNTY4NjU2YzZjNmYwMDAzMmEwMDA2Njg2NTZjNmM2ZjMyCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QuY29uZGl0aW9uYWxfZW1pdChzaG91bGRfZW1pdDogdWludDY0KSAtPiB2b2lkOgpjb25kaXRpb25hbF9lbWl0OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjb25kaXRpb25hbF9lbWl0KHNlbGYsIHNob3VsZF9lbWl0OiBib29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6MTAxCiAgICAvLyBpZiBzaG91bGRfZW1pdDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogY29uZGl0aW9uYWxfZW1pdF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMDItMTA2CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIkFub255bW91czIiLAogICAgLy8gICAgIEV2ZW50T25seShhcmM0LlVJbnQ2NCg0MiksIGFyYzQuVUludDY0KDQzKSksCiAgICAvLyAgICAgU2hhcmVkU3RydWN0KGZvbz1hcmM0LkR5bmFtaWNCeXRlcyhiImhlbGxvMyIpLCBiYXI9YXJjNC5VSW50OCg0MikpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAweDExYzU0N2JhIDB4MDAwMDAwMDAwMDAwMDAyYTAwMDAwMDAwMDAwMDAwMmIwMDEyMDAwMzJhMDAwNjY4NjU2YzZjNmYzMyAvLyBtZXRob2QgIkFub255bW91czIoKHVpbnQ2NCx1aW50NjQpLChieXRlW10sdWludDgpKSIsIDB4MDAwMDAwMDAwMDAwMDAyYTAwMDAwMDAwMDAwMDAwMmIwMDEyMDAwMzJhMDAwNjY4NjU2YzZjNmYzMwogICAgY29uY2F0CiAgICBsb2cKCmNvbmRpdGlvbmFsX2VtaXRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QudGVtcGxhdGVfdmFsdWUoKSAtPiBieXRlcywgdWludDY0LCBieXRlcywgYnl0ZXM6CnRlbXBsYXRlX3ZhbHVlOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVtcGxhdGVfdmFsdWUoc2VsZikgLT4gdHVwbGVbU2hhcmVkU3RydWN0LCBVSW50NjQsIFN0cmluZywgYXJjNC5VSW50OF06CiAgICBwcm90byAwIDQKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTEKICAgIC8vIFRlbXBsYXRlVmFyW1NoYXJlZFN0cnVjdF0oIlNUUlVDVCIpLAogICAgYnl0ZWNfMSAvLyBUTVBMX1NUUlVDVAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMgogICAgLy8gVGVtcGxhdGVWYXJbVUludDY0XSgiQVZNX1VJTlQ2NCIpLAogICAgaW50Y18zIC8vIFRNUExfQVZNX1VJTlQ2NAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMwogICAgLy8gVGVtcGxhdGVWYXJbU3RyaW5nXSgiQVZNX1NUUklORyIpLAogICAgYnl0ZWNfMiAvLyBUTVBMX0FWTV9TVFJJTkcKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTQKICAgIC8vIFRlbXBsYXRlVmFyW2FyYzQuVUludDhdKCJBUkM0X1VJTlQ4IiksCiAgICBieXRlY18zIC8vIFRNUExfQVJDNF9VSU5UOAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMC0xMTUKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgVGVtcGxhdGVWYXJbU2hhcmVkU3RydWN0XSgiU1RSVUNUIiksCiAgICAvLyAgICAgVGVtcGxhdGVWYXJbVUludDY0XSgiQVZNX1VJTlQ2NCIpLAogICAgLy8gICAgIFRlbXBsYXRlVmFyW1N0cmluZ10oIkFWTV9TVFJJTkciKSwKICAgIC8vICAgICBUZW1wbGF0ZVZhclthcmM0LlVJbnQ4XSgiQVJDNF9VSU5UOCIpLAogICAgLy8gKQogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "state": {
+ "global": {
+ "num_byte_slices": 2,
+ "num_uints": 1
+ },
+ "local": {
+ "num_byte_slices": 2,
+ "num_uints": 1
+ }
+ },
+ "schema": {
+ "global": {
+ "declared": {
+ "g_address": {
+ "type": "bytes",
+ "key": "ga"
+ },
+ "g_struct": {
+ "type": "bytes",
+ "key": "g_struct"
+ },
+ "g_uint64": {
+ "type": "uint64",
+ "key": "gu"
+ }
+ },
+ "reserved": {}
+ },
+ "local": {
+ "declared": {
+ "l_address": {
+ "type": "bytes",
+ "key": "la"
+ },
+ "l_struct": {
+ "type": "bytes",
+ "key": "l_struct"
+ },
+ "l_uint64": {
+ "type": "uint64",
+ "key": "lu"
+ }
+ },
+ "reserved": {}
+ }
+ },
+ "contract": {
+ "name": "Contract",
+ "methods": [
+ {
+ "name": "create",
+ "args": [],
+ "readonly": false,
+ "returns": {
+ "type": "void"
+ }
+ },
+ {
+ "name": "struct_arg",
+ "args": [
+ {
+ "type": "(uint64,string,(byte[],uint8))",
+ "name": "arg"
+ },
+ {
+ "type": "(byte[],uint8)",
+ "name": "shared"
+ }
+ ],
+ "readonly": false,
+ "returns": {
+ "type": "uint64"
+ }
+ },
+ {
+ "name": "struct_return",
+ "args": [
+ {
+ "type": "(uint64,string,(byte[],uint8))",
+ "name": "arg"
+ }
+ ],
+ "readonly": true,
+ "returns": {
+ "type": "(byte[],uint8)"
+ }
+ },
+ {
+ "name": "emits_error",
+ "args": [
+ {
+ "type": "(uint64,string,(byte[],uint8))",
+ "name": "arg"
+ }
+ ],
+ "readonly": true,
+ "returns": {
+ "type": "void"
+ }
+ },
+ {
+ "name": "emitter",
+ "args": [],
+ "readonly": false,
+ "returns": {
+ "type": "void"
+ }
+ },
+ {
+ "name": "conditional_emit",
+ "args": [
+ {
+ "type": "bool",
+ "name": "should_emit"
+ }
+ ],
+ "readonly": false,
+ "returns": {
+ "type": "void"
+ }
+ },
+ {
+ "name": "template_value",
+ "args": [],
+ "readonly": false,
+ "returns": {
+ "type": "((byte[],uint8),uint64,string,uint8)"
+ }
+ }
+ ],
+ "networks": {}
+ },
+ "bare_call_config": {
+ "no_op": "ALL",
+ "opt_in": "ALL",
+ "delete_application": "CREATE"
+ }
+}
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.arc56.json b/test_cases/arc_56/out/Contract.arc56.json
new file mode 100644
index 0000000000..60df709acf
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.arc56.json
@@ -0,0 +1,495 @@
+{
+ "name": "Contract",
+ "structs": {
+ "EventOnly": [
+ {
+ "name": "x",
+ "type": "uint64"
+ },
+ {
+ "name": "y",
+ "type": "uint64"
+ }
+ ],
+ "SharedStruct": [
+ {
+ "name": "foo",
+ "type": "byte[]"
+ },
+ {
+ "name": "bar",
+ "type": "uint8"
+ }
+ ],
+ "StateStruct": [
+ {
+ "name": "a",
+ "type": "uint64"
+ },
+ {
+ "name": "b",
+ "type": "string"
+ }
+ ],
+ "TopLevelStruct": [
+ {
+ "name": "a",
+ "type": "uint64"
+ },
+ {
+ "name": "b",
+ "type": "string"
+ },
+ {
+ "name": "shared",
+ "type": "SharedStruct"
+ }
+ ]
+ },
+ "methods": [
+ {
+ "name": "create",
+ "args": [],
+ "returns": {
+ "type": "void"
+ },
+ "actions": {
+ "create": [
+ "NoOp",
+ "OptIn"
+ ],
+ "call": [
+ "NoOp",
+ "OptIn"
+ ]
+ },
+ "readonly": false,
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "name": "struct_arg",
+ "args": [
+ {
+ "type": "(uint64,string,(byte[],uint8))",
+ "struct": "TopLevelStruct",
+ "name": "arg"
+ },
+ {
+ "type": "(byte[],uint8)",
+ "struct": "SharedStruct",
+ "name": "shared"
+ }
+ ],
+ "returns": {
+ "type": "uint64"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "name": "struct_return",
+ "args": [
+ {
+ "type": "(uint64,string,(byte[],uint8))",
+ "struct": "TopLevelStruct",
+ "name": "arg"
+ }
+ ],
+ "returns": {
+ "type": "(byte[],uint8)",
+ "struct": "SharedStruct"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": true,
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "name": "emits_error",
+ "args": [
+ {
+ "type": "(uint64,string,(byte[],uint8))",
+ "struct": "TopLevelStruct",
+ "name": "arg"
+ }
+ ],
+ "returns": {
+ "type": "void"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": true,
+ "events": [],
+ "recommendations": {}
+ },
+ {
+ "name": "emitter",
+ "args": [],
+ "returns": {
+ "type": "void"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [
+ {
+ "name": "SharedStruct",
+ "args": [
+ {
+ "type": "byte[]",
+ "name": "foo"
+ },
+ {
+ "type": "uint8",
+ "name": "bar"
+ }
+ ],
+ "desc": "This struct is shared"
+ },
+ {
+ "name": "Anonymous",
+ "args": [
+ {
+ "type": "string",
+ "name": "field1"
+ },
+ {
+ "type": "(byte[],uint8)",
+ "name": "field2",
+ "struct": "SharedStruct"
+ }
+ ]
+ }
+ ],
+ "recommendations": {}
+ },
+ {
+ "name": "conditional_emit",
+ "args": [
+ {
+ "type": "bool",
+ "name": "should_emit"
+ }
+ ],
+ "returns": {
+ "type": "void"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [
+ {
+ "name": "Anonymous2",
+ "args": [
+ {
+ "type": "(uint64,uint64)",
+ "name": "field1",
+ "struct": "EventOnly"
+ },
+ {
+ "type": "(byte[],uint8)",
+ "name": "field2",
+ "struct": "SharedStruct"
+ }
+ ]
+ }
+ ],
+ "recommendations": {}
+ },
+ {
+ "name": "template_value",
+ "args": [],
+ "returns": {
+ "type": "((byte[],uint8),uint64,string,uint8)"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [],
+ "recommendations": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 1,
+ "bytes": 2
+ },
+ "local": {
+ "ints": 1,
+ "bytes": 2
+ }
+ },
+ "keys": {
+ "global": {
+ "g_struct": {
+ "keyType": "AVMString",
+ "valueType": "StateStruct",
+ "key": "Z19zdHJ1Y3Q="
+ },
+ "g_uint64": {
+ "keyType": "AVMBytes",
+ "valueType": "AVMUint64",
+ "key": "Z3U="
+ },
+ "g_address": {
+ "keyType": "AVMBytes",
+ "valueType": "address",
+ "key": "Z2E="
+ }
+ },
+ "local": {
+ "l_struct": {
+ "keyType": "AVMString",
+ "valueType": "StateStruct",
+ "key": "bF9zdHJ1Y3Q="
+ },
+ "l_uint64": {
+ "keyType": "AVMBytes",
+ "valueType": "AVMUint64",
+ "key": "bHU="
+ },
+ "l_address": {
+ "keyType": "AVMBytes",
+ "valueType": "address",
+ "key": "bGE="
+ }
+ },
+ "box": {
+ "b_struct": {
+ "keyType": "AVMString",
+ "valueType": "StateStruct",
+ "key": "Yl9zdHJ1Y3Q="
+ },
+ "b_uint64": {
+ "keyType": "AVMBytes",
+ "valueType": "AVMUint64",
+ "key": "YnU="
+ },
+ "b_address": {
+ "keyType": "AVMBytes",
+ "valueType": "address",
+ "key": "YmE="
+ },
+ "box_ref": {
+ "keyType": "AVMString",
+ "valueType": "AVMBytes",
+ "key": "Ym94X3JlZg=="
+ },
+ "box_ref2": {
+ "keyType": "AVMBytes",
+ "valueType": "AVMBytes",
+ "key": "YnI="
+ }
+ }
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {
+ "box_map_struct": {
+ "keyType": "StateStruct",
+ "valueType": "SharedStruct",
+ "prefix": "Ym94X21hcF9zdHJ1Y3Q="
+ },
+ "box_map_uint64": {
+ "keyType": "AVMUint64",
+ "valueType": "SharedStruct",
+ "prefix": "Ym11"
+ },
+ "box_map_address": {
+ "keyType": "address",
+ "valueType": "SharedStruct",
+ "prefix": "Ym1h"
+ }
+ }
+ }
+ },
+ "bareActions": {
+ "create": [
+ "DeleteApplication",
+ "NoOp",
+ "OptIn"
+ ],
+ "call": [
+ "NoOp",
+ "OptIn"
+ ]
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 113,
+ 136,
+ 155,
+ 170,
+ 182,
+ 199
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 107
+ ],
+ "errorMessage": "OnCompletion is not one of NoOp, OptIn"
+ },
+ {
+ "pc": [
+ 275
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 116,
+ 139,
+ 158,
+ 173,
+ 185,
+ 202
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 298
+ ],
+ "errorMessage": "this might error"
+ },
+ {
+ "pc": [
+ 346
+ ],
+ "errorMessage": "this will error"
+ },
+ {
+ "pc": [
+ 325
+ ],
+ "errorMessage": "this won't error"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAxMCBUTVBMX0FWTV9VSU5UNjQKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSBUTVBMX1NUUlVDVCBUTVBMX0FWTV9TVFJJTkcgVE1QTF9BUkM0X1VJTlQ4CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTEKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweDk3ZThlNGE3IDB4NzZjNGRlMTEgMHhjMWNhNzcwOSAweDZkZTc2MmMyIDB4NTlmYzUyODIgMHg5ZDllZWNiMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAic3RydWN0X2FyZygodWludDY0LHN0cmluZywoYnl0ZVtdLHVpbnQ4KSksKGJ5dGVbXSx1aW50OCkpdWludDY0IiwgbWV0aG9kICJzdHJ1Y3RfcmV0dXJuKCh1aW50NjQsc3RyaW5nLChieXRlW10sdWludDgpKSkoYnl0ZVtdLHVpbnQ4KSIsIG1ldGhvZCAiZW1pdHNfZXJyb3IoKHVpbnQ2NCxzdHJpbmcsKGJ5dGVbXSx1aW50OCkpKXZvaWQiLCBtZXRob2QgImVtaXR0ZXIoKXZvaWQiLCBtZXRob2QgImNvbmRpdGlvbmFsX2VtaXQoYm9vbCl2b2lkIiwgbWV0aG9kICJ0ZW1wbGF0ZV92YWx1ZSgpKChieXRlW10sdWludDgpLHVpbnQ2NCxzdHJpbmcsdWludDgpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc3RydWN0X2FyZ19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0cnVjdF9yZXR1cm5fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0c19lcnJvcl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VtaXR0ZXJfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jb25kaXRpb25hbF9lbWl0X3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVtcGxhdGVfdmFsdWVfcm91dGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IiwgYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGludGNfMCAvLyAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBvbmUgb2YgTm9PcCwgT3B0SW4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0cnVjdF9hcmdfcm91dGVAMzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzdHJ1Y3RfYXJnCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zdHJ1Y3RfcmV0dXJuX3JvdXRlQDQ6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBzdHJ1Y3RfcmV0dXJuCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lbWl0c19lcnJvcl9yb3V0ZUA1OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT0iZW1pdHNfZXJyb3IiLCByZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NDEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPSJlbWl0c19lcnJvciIsIHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGVycm9ycwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdHRlcl9yb3V0ZUA2OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGVtaXR0ZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NvbmRpdGlvbmFsX2VtaXRfcm91dGVANzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBjb25kaXRpb25hbF9lbWl0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZW1wbGF0ZV92YWx1ZV9yb3V0ZUA4OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjEwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZW1wbGF0ZV92YWx1ZQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgMTMgLy8gMTMKICAgICsKICAgIHB1c2hieXRlcyAweDAwMGQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDExOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfY3JlYXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfY3JlYXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTYgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3RyYW5zaWVudEAxMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9jcmVhdGVAMTI6CiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NjMtNjQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJhbGxvdyIsIGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgYmFyZV9jcmVhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3RyYW5zaWVudEAxMzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo3MQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiLCBhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6NzEtNzIKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIiwgYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgdHJhbnNpZW50KHNlbGYpIC0+IE5vbmU6CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjQxCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LkNvbnRyYWN0LnN0cnVjdF9hcmcoYXJnOiBieXRlcywgc2hhcmVkOiBieXRlcykgLT4gdWludDY0OgpzdHJ1Y3RfYXJnOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHN0cnVjdF9hcmcoc2VsZiwgYXJnOiBUb3BMZXZlbFN0cnVjdCwgc2hhcmVkOiBTaGFyZWRTdHJ1Y3QpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBhc3NlcnQgYXJnLnNoYXJlZCA9PSBzaGFyZWQsICJ0aGlzIG1pZ2h0IGVycm9yIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgZnJhbWVfZGlnIC0yCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gdGhpcyBtaWdodCBlcnJvcgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojc4CiAgICAvLyByZXR1cm4gVUludDY0KDQyKQogICAgcHVzaGludCA0MiAvLyA0MgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3Quc3RydWN0X3JldHVybihhcmc6IGJ5dGVzKSAtPiBieXRlczoKc3RydWN0X3JldHVybjoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MC04MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgc3RydWN0X3JldHVybihzZWxmLCBhcmc6IFRvcExldmVsU3RydWN0KSAtPiBTaGFyZWRTdHJ1Y3Q6CiAgICBwcm90byAxIDEKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MgogICAgLy8gYXNzZXJ0IGFyZy5zaGFyZWQgPT0gZWNobyhhcmcuc2hhcmVkKSwgInRoaXMgd29uJ3QgZXJyb3IiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY2FsbHN1YiBlY2hvCiAgICBwb3AKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHRoaXMgd29uJ3QgZXJyb3IKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4MwogICAgLy8gcmV0dXJuIGFyZy5zaGFyZWQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LmVjaG8oczogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZWNobzoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTgtMTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVjaG8oczogU2hhcmVkU3RydWN0KSAtPiBTaGFyZWRTdHJ1Y3Q6CiAgICBwcm90byAxIDIKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMjAKICAgIC8vIHJldHVybiBzCiAgICBmcmFtZV9kaWcgLTEKICAgIGR1cAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QuZXJyb3JzKGFyZzogYnl0ZXMpIC0+IHZvaWQ6CmVycm9yczoKICAgIC8vIGFyY181Ni9jb250cmFjdC5weTo4NS04NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9ImVtaXRzX2Vycm9yIiwgcmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBlcnJvcnMoc2VsZiwgYXJnOiBUb3BMZXZlbFN0cnVjdCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBhc3NlcnQgYXJnLmEuYnl0ZXMgPT0gYXJjNC5VSW50OCgwKS5ieXRlcywgInRoaXMgd2lsbCBlcnJvciIKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgPT0KICAgIGFzc2VydCAvLyB0aGlzIHdpbGwgZXJyb3IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjXzU2LmNvbnRyYWN0LkNvbnRyYWN0LmVtaXR0ZXIoKSAtPiB2b2lkOgplbWl0dGVyOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojg5LTkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGVtaXR0ZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjkxCiAgICAvLyBhcmM0LmVtaXQoU2hhcmVkU3RydWN0KGZvbz1hcmM0LkR5bmFtaWNCeXRlcyhiImhlbGxvMSIpLCBiYXI9YXJjNC5VSW50OCg0MikpKQogICAgcHVzaGJ5dGVzcyAweGQ5M2YzNzRlIDB4MDAwMzJhMDAwNjY4NjU2YzZjNmYzMSAvLyBtZXRob2QgIlNoYXJlZFN0cnVjdChieXRlW10sdWludDgpIiwgMHgwMDAzMmEwMDA2Njg2NTZjNmM2ZjMxCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjkzLTk3CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIkFub255bW91cyIsCiAgICAvLyAgICAgU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgIFNoYXJlZFN0cnVjdChmb289YXJjNC5EeW5hbWljQnl0ZXMoYiJoZWxsbzIiKSwgYmFyPWFyYzQuVUludDgoNDIpKSwKICAgIC8vICkKICAgIHB1c2hieXRlc3MgMHgxZTcyYWY0ZSAweDAwMDQwMDBiMDAwNTY4NjU2YzZjNmYwMDAzMmEwMDA2Njg2NTZjNmM2ZjMyIC8vIG1ldGhvZCAiQW5vbnltb3VzKHN0cmluZywoYnl0ZVtdLHVpbnQ4KSkiLCAweDAwMDQwMDBiMDAwNTY4NjU2YzZjNmYwMDAzMmEwMDA2Njg2NTZjNmM2ZjMyCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QuY29uZGl0aW9uYWxfZW1pdChzaG91bGRfZW1pdDogdWludDY0KSAtPiB2b2lkOgpjb25kaXRpb25hbF9lbWl0OgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5Ojk5LTEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBjb25kaXRpb25hbF9lbWl0KHNlbGYsIHNob3VsZF9lbWl0OiBib29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhcmNfNTYvY29udHJhY3QucHk6MTAxCiAgICAvLyBpZiBzaG91bGRfZW1pdDoKICAgIGZyYW1lX2RpZyAtMQogICAgYnogY29uZGl0aW9uYWxfZW1pdF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMDItMTA2CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgIkFub255bW91czIiLAogICAgLy8gICAgIEV2ZW50T25seShhcmM0LlVJbnQ2NCg0MiksIGFyYzQuVUludDY0KDQzKSksCiAgICAvLyAgICAgU2hhcmVkU3RydWN0KGZvbz1hcmM0LkR5bmFtaWNCeXRlcyhiImhlbGxvMyIpLCBiYXI9YXJjNC5VSW50OCg0MikpLAogICAgLy8gKQogICAgcHVzaGJ5dGVzcyAweDExYzU0N2JhIDB4MDAwMDAwMDAwMDAwMDAyYTAwMDAwMDAwMDAwMDAwMmIwMDEyMDAwMzJhMDAwNjY4NjU2YzZjNmYzMyAvLyBtZXRob2QgIkFub255bW91czIoKHVpbnQ2NCx1aW50NjQpLChieXRlW10sdWludDgpKSIsIDB4MDAwMDAwMDAwMDAwMDAyYTAwMDAwMDAwMDAwMDAwMmIwMDEyMDAwMzJhMDAwNjY4NjU2YzZjNmYzMwogICAgY29uY2F0CiAgICBsb2cKCmNvbmRpdGlvbmFsX2VtaXRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmNfNTYuY29udHJhY3QuQ29udHJhY3QudGVtcGxhdGVfdmFsdWUoKSAtPiBieXRlcywgdWludDY0LCBieXRlcywgYnl0ZXM6CnRlbXBsYXRlX3ZhbHVlOgogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVtcGxhdGVfdmFsdWUoc2VsZikgLT4gdHVwbGVbU2hhcmVkU3RydWN0LCBVSW50NjQsIFN0cmluZywgYXJjNC5VSW50OF06CiAgICBwcm90byAwIDQKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTEKICAgIC8vIFRlbXBsYXRlVmFyW1NoYXJlZFN0cnVjdF0oIlNUUlVDVCIpLAogICAgYnl0ZWNfMSAvLyBUTVBMX1NUUlVDVAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMgogICAgLy8gVGVtcGxhdGVWYXJbVUludDY0XSgiQVZNX1VJTlQ2NCIpLAogICAgaW50Y18zIC8vIFRNUExfQVZNX1VJTlQ2NAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMwogICAgLy8gVGVtcGxhdGVWYXJbU3RyaW5nXSgiQVZNX1NUUklORyIpLAogICAgYnl0ZWNfMiAvLyBUTVBMX0FWTV9TVFJJTkcKICAgIC8vIGFyY181Ni9jb250cmFjdC5weToxMTQKICAgIC8vIFRlbXBsYXRlVmFyW2FyYzQuVUludDhdKCJBUkM0X1VJTlQ4IiksCiAgICBieXRlY18zIC8vIFRNUExfQVJDNF9VSU5UOAogICAgLy8gYXJjXzU2L2NvbnRyYWN0LnB5OjExMC0xMTUKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgVGVtcGxhdGVWYXJbU2hhcmVkU3RydWN0XSgiU1RSVUNUIiksCiAgICAvLyAgICAgVGVtcGxhdGVWYXJbVUludDY0XSgiQVZNX1VJTlQ2NCIpLAogICAgLy8gICAgIFRlbXBsYXRlVmFyW1N0cmluZ10oIkFWTV9TVFJJTkciKSwKICAgIC8vICAgICBUZW1wbGF0ZVZhclthcmM0LlVJbnQ4XSgiQVJDNF9VSU5UOCIpLAogICAgLy8gKQogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyY181Ni5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "byteCode": {
+ "approval": "CiAEAQAKeyYEBBUffHUHAAP/AAJIaQVIZWxsbwH/iAABQ4oAATEbQQDSggcETFxhugSX6OSnBHbE3hEEwcp3CQRt52LCBFn8UoIEnZ7ssDYaAI4HAAIADAAjADYARQBRAGIjiSIxGZCBAxpEIokxGRREMRhENhoBNhoCiACaFihMULAiiTEZFEQxGEQ2GgGIAJwoTFCwIokxGRREMRhENhoBiACpIokxGRREMRhEiACrIokxGRREMRhENhoBI1OIANMiiTEZFEQxGESIAPdPAhZLAhUWVwYCTwNQSwMVgQ0IgAIADU8DUEwWVwYCUE8CUE8CUExQKExQsCKJMRmNBgACAAIACgAKAAoABCOJIokxGBREIokjiYoCAYv+JFmL/hWL/k4CUov/EkSBKomKAQGL/yRZi/8Vi/9OAlJJiAAGSEsBEkSJigECi/9JiYoBAIv/VwAIgAEAEkSJigAAggIE2T83TgsAAyoABmhlbGxvMVCwggIEHnKvThYABAALAAVoZWxsbwADKgAGaGVsbG8yULCJigEAi/9BACeCAgQRxUe6HQAAAAAAAAAqAAAAAAAAACsAEgADKgAGaGVsbG8zULCJigAEKSUqK4k=",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [
+ {
+ "name": "SharedStruct",
+ "args": [
+ {
+ "type": "byte[]",
+ "name": "foo"
+ },
+ {
+ "type": "uint8",
+ "name": "bar"
+ }
+ ],
+ "desc": "This struct is shared"
+ },
+ {
+ "name": "Anonymous",
+ "args": [
+ {
+ "type": "string",
+ "name": "field1"
+ },
+ {
+ "type": "(byte[],uint8)",
+ "name": "field2",
+ "struct": "SharedStruct"
+ }
+ ]
+ },
+ {
+ "name": "Anonymous2",
+ "args": [
+ {
+ "type": "(uint64,uint64)",
+ "name": "field1",
+ "struct": "EventOnly"
+ },
+ {
+ "type": "(byte[],uint8)",
+ "name": "field2",
+ "struct": "SharedStruct"
+ }
+ ]
+ }
+ ],
+ "templateVariables": {
+ "STRUCT": {
+ "type": "SharedStruct",
+ "value": "AAP/AAJIaQ=="
+ },
+ "AVM_UINT64": {
+ "type": "AVMUint64",
+ "value": "AAAAAAAAAHs="
+ },
+ "AVM_STRING": {
+ "type": "AVMString",
+ "value": "SGVsbG8="
+ },
+ "ARC4_UINT8": {
+ "type": "uint8",
+ "value": "/w=="
+ }
+ }
+}
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.clear.mir b/test_cases/arc_56/out/Contract.clear.mir
new file mode 100644
index 0000000000..b72a9c6b48
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.clear.mir
@@ -0,0 +1,7 @@
+// Op Stack (out)
+// test_cases.arc_56.contract.Contract.clear_state_program() -> uint64:
+main_block@0:
+ int 1 1
+ return
+
+
diff --git a/test_cases/arc_56/out/Contract.clear.teal b/test_cases/arc_56/out/Contract.clear.teal
new file mode 100644
index 0000000000..883b1f693b
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.clear.teal
@@ -0,0 +1,5 @@
+#pragma version 10
+
+test_cases.arc_56.contract.Contract.clear_state_program:
+ pushint 1 // 1
+ return
diff --git a/test_cases/arc_56/out/Contract.destructured.ir b/test_cases/arc_56/out/Contract.destructured.ir
new file mode 100644
index 0000000000..e66d0bbe01
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.destructured.ir
@@ -0,0 +1,164 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31)
+ (log event%0#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" 0x0004000b000568656c6c6f00032a000668656c6c6f32)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.ir b/test_cases/arc_56/out/Contract.ssa.ir
new file mode 100644
index 0000000000..3823a10578
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.ir
@@ -0,0 +1,290 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%0#0: bool = (txn ApplicationID)
+ goto tmp%0#0 ? block@2 : block@1
+ block@1: // call __init___L1
+ test_cases.arc_56.contract.Contract.__init__()
+ goto block@2
+ block@2: // after_if_else_L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__init__() -> void:
+ block@0: // L43
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ let tmp%1#0: bool = (!= tmp%0#0 0u)
+ goto tmp%1#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@9}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ test_cases.arc_56.contract.Contract.create()
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (== tmp%6#0 NoOp)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ let tmp%9#0: bool = (!= tmp%8#0 0u)
+ (assert tmp%9#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (== tmp%13#0 NoOp)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ let tmp%16#0: bool = (!= tmp%15#0 0u)
+ (assert tmp%16#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (== tmp%20#0 NoOp)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ let tmp%23#0: bool = (!= tmp%22#0 0u)
+ (assert tmp%23#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (== tmp%25#0 NoOp)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ let tmp%28#0: bool = (!= tmp%27#0 0u)
+ (assert tmp%28#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (== tmp%29#0 NoOp)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ let tmp%32#0: bool = (!= tmp%31#0 0u)
+ (assert tmp%32#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (== tmp%35#0 NoOp)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ let tmp%38#0: bool = (!= tmp%37#0 0u)
+ (assert tmp%38#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let current_tail_offset%0#0: uint64 = 13u
+ let encoded_tuple_buffer%0#0: bytes = 0x
+ let as_bytes%1#0: bytes = (itob current_tail_offset%0#0)
+ let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0)
+ let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 offset_as_uint16%0#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ current_tail_offset%0#0 data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let data_length%1#0: uint64 = (len encoded_value%0#0)
+ let current_tail_offset%2#0: uint64 = (+ current_tail_offset%1#0 data_length%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@9: // switch_case_default_L41
+ goto block@10
+ block@10: // switch_case_next_L41
+ goto block@16
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ switch tmp%40#0 {0u => block@12, 1u => block@12, 5u => block@13, * => block@14}
+ block@12: // bare_create_L63
+ test_cases.arc_56.contract.Contract.bare_create()
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (== tmp%41#0 0u)
+ (assert tmp%42#0) // can only call when creating
+ test_cases.arc_56.contract.Contract.transient()
+ return 1u
+ block@14: // switch_case_default_L41
+ goto block@15
+ block@15: // switch_case_next_L41
+ goto block@16
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.create() -> void:
+ block@0: // L67
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let item_start_offset%1#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%1#0: uint64 = (len arg#0)
+ let tmp%1#0: bytes = (substring3 arg#0 item_start_offset%1#0 item_end_offset%1#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%1#0)
+ let tmp%1#1: bytes = echo%1#0
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ let item_start_offset%2#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%2#0: uint64 = (len arg#0)
+ let tmp%3#0: bytes = (substring3 arg#0 item_start_offset%2#0 item_end_offset%2#0)
+ return tmp%3#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ let s%is_original#0: bool = 1u
+ let s%out#0: bytes = s#0
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = (extract3 arg#0 0u 8u) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let length%0#0: uint64 = (len 0x68656c6c6f31)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f31)
+ let current_tail_offset%0#0: uint64 = 3u
+ let encoded_tuple_buffer%0#0: bytes = 0x
+ let as_bytes%1#0: bytes = (itob current_tail_offset%0#0)
+ let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0)
+ let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 offset_as_uint16%0#0)
+ let data_length%0#0: uint64 = (len encoded_value%0#0)
+ let current_tail_offset%1#0: uint64 = (+ current_tail_offset%0#0 data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x2a)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 encoded_value%0#0)
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0)
+ (log event%0#0)
+ let length%1#0: uint64 = (len "hello")
+ let as_bytes%2#0: bytes = (itob length%1#0)
+ let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_value%1#0: bytes = (concat length_uint16%1#0 "hello")
+ let length%2#0: uint64 = (len 0x68656c6c6f32)
+ let as_bytes%3#0: bytes = (itob length%2#0)
+ let length_uint16%2#0: bytes = ((extract 6 2) as_bytes%3#0)
+ let encoded_value%2#0: bytes = (concat length_uint16%2#0 0x68656c6c6f32)
+ let current_tail_offset%2#0: uint64 = 3u
+ let encoded_tuple_buffer%4#0: bytes = 0x
+ let as_bytes%4#0: bytes = (itob current_tail_offset%2#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%4#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 offset_as_uint16%1#0)
+ let data_length%1#0: uint64 = (len encoded_value%2#0)
+ let current_tail_offset%3#0: uint64 = (+ current_tail_offset%2#0 data_length%1#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 0x2a)
+ let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 encoded_value%2#0)
+ let current_tail_offset%4#0: uint64 = 4u
+ let encoded_tuple_buffer%8#0: bytes = 0x
+ let as_bytes%5#0: bytes = (itob current_tail_offset%4#0)
+ let offset_as_uint16%2#0: bytes = ((extract 6 2) as_bytes%5#0)
+ let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%8#0 offset_as_uint16%2#0)
+ let data_length%2#0: uint64 = (len encoded_value%1#0)
+ let current_tail_offset%5#0: uint64 = (+ current_tail_offset%4#0 data_length%2#0)
+ let as_bytes%6#0: bytes = (itob current_tail_offset%5#0)
+ let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 offset_as_uint16%3#0)
+ let data_length%3#0: uint64 = (len encoded_tuple_buffer%7#0)
+ let current_tail_offset%6#0: uint64 = (+ current_tail_offset%5#0 data_length%3#0)
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let current_tail_offset%0#0: uint64 = 16u
+ let encoded_tuple_buffer%0#0: bytes = 0x
+ let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 0x000000000000002a)
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x000000000000002b)
+ let length%0#0: uint64 = (len 0x68656c6c6f33)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f33)
+ let current_tail_offset%1#0: uint64 = 3u
+ let encoded_tuple_buffer%3#0: bytes = 0x
+ let as_bytes%1#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 offset_as_uint16%0#0)
+ let data_length%0#0: uint64 = (len encoded_value%0#0)
+ let current_tail_offset%2#0: uint64 = (+ current_tail_offset%1#0 data_length%0#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 0x2a)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let current_tail_offset%3#0: uint64 = 18u
+ let encoded_tuple_buffer%7#0: bytes = 0x
+ let encoded_tuple_buffer%8#0: bytes = (concat encoded_tuple_buffer%7#0 encoded_tuple_buffer%2#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%3#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%8#0 offset_as_uint16%1#0)
+ let data_length%1#0: uint64 = (len encoded_tuple_buffer%6#0)
+ let current_tail_offset%4#0: uint64 = (+ current_tail_offset%3#0 data_length%1#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0)
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ subroutine test_cases.arc_56.contract.Contract.bare_create() -> void:
+ block@0: // L63
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.transient() -> void:
+ block@0: // L71
+ return
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_1.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_1.ir
new file mode 100644
index 0000000000..c7236f5a8e
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_1.ir
@@ -0,0 +1,220 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%0#0: bool = (txn ApplicationID)
+ goto tmp%0#0 ? block@2 : block@1
+ block@1: // call __init___L1
+ goto block@2
+ block@2: // after_if_else_L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let offset_as_uint16%0#0: bytes = 0x000d
+ let encoded_tuple_buffer%1#0: bytes = offset_as_uint16%0#0
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let data_length%1#0: uint64 = (len encoded_value%0#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let length%0#0: uint64 = 6u
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f31)
+ let offset_as_uint16%0#0: bytes = 0x0003
+ let encoded_tuple_buffer%1#0: bytes = offset_as_uint16%0#0
+ let data_length%0#0: uint64 = (len encoded_value%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x2a)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 encoded_value%0#0)
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0)
+ (log event%0#0)
+ let length%1#0: uint64 = 5u
+ let as_bytes%2#0: bytes = (itob length%1#0)
+ let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_value%1#0: bytes = (concat length_uint16%1#0 "hello")
+ let length%2#0: uint64 = 6u
+ let as_bytes%3#0: bytes = (itob length%2#0)
+ let length_uint16%2#0: bytes = ((extract 6 2) as_bytes%3#0)
+ let encoded_value%2#0: bytes = (concat length_uint16%2#0 0x68656c6c6f32)
+ let offset_as_uint16%1#0: bytes = 0x0003
+ let encoded_tuple_buffer%5#0: bytes = offset_as_uint16%1#0
+ let data_length%1#0: uint64 = (len encoded_value%2#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 0x2a)
+ let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 encoded_value%2#0)
+ let offset_as_uint16%2#0: bytes = 0x0004
+ let encoded_tuple_buffer%9#0: bytes = offset_as_uint16%2#0
+ let data_length%2#0: uint64 = (len encoded_value%1#0)
+ let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0)
+ let as_bytes%6#0: bytes = (itob current_tail_offset%5#0)
+ let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 offset_as_uint16%3#0)
+ let data_length%3#0: uint64 = (len encoded_tuple_buffer%7#0)
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let encoded_tuple_buffer%1#0: bytes = 0x000000000000002a
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x000000000000002b)
+ let length%0#0: uint64 = 6u
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f33)
+ let offset_as_uint16%0#0: bytes = 0x0003
+ let encoded_tuple_buffer%4#0: bytes = offset_as_uint16%0#0
+ let data_length%0#0: uint64 = (len encoded_value%0#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 0x2a)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let encoded_tuple_buffer%8#0: bytes = encoded_tuple_buffer%2#0
+ let offset_as_uint16%1#0: bytes = 0x0012
+ let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%8#0 offset_as_uint16%1#0)
+ let data_length%1#0: uint64 = (len encoded_tuple_buffer%6#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0)
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_10.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_10.ir
new file mode 100644
index 0000000000..e66d0bbe01
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_10.ir
@@ -0,0 +1,164 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31)
+ (log event%0#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" 0x0004000b000568656c6c6f00032a000668656c6c6f32)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_2.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_2.ir
new file mode 100644
index 0000000000..89fc4ae026
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_2.ir
@@ -0,0 +1,191 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%0#0: bool = (txn ApplicationID)
+ goto block@2
+ block@2: // after_if_else_L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let length_uint16%0#0: bytes = 0x0006
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f31)
+ let encoded_tuple_buffer%2#0: bytes = 0x00032a
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 encoded_value%0#0)
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0)
+ (log event%0#0)
+ let length_uint16%1#0: bytes = 0x0005
+ let encoded_value%1#0: bytes = (concat length_uint16%1#0 "hello")
+ let length_uint16%2#0: bytes = 0x0006
+ let encoded_value%2#0: bytes = (concat length_uint16%2#0 0x68656c6c6f32)
+ let encoded_tuple_buffer%6#0: bytes = 0x00032a
+ let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 encoded_value%2#0)
+ let data_length%2#0: uint64 = (len encoded_value%1#0)
+ let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0)
+ let as_bytes%6#0: bytes = (itob current_tail_offset%5#0)
+ let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0)
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let encoded_tuple_buffer%2#0: bytes = 0x000000000000002a000000000000002b
+ let length_uint16%0#0: bytes = 0x0006
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f33)
+ let encoded_tuple_buffer%5#0: bytes = 0x00032a
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%2#0 0x0012)
+ let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0)
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_3.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_3.ir
new file mode 100644
index 0000000000..0625585356
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_3.ir
@@ -0,0 +1,180 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let encoded_value%0#0: bytes = 0x000668656c6c6f31
+ let encoded_tuple_buffer%3#0: bytes = (concat 0x00032a encoded_value%0#0)
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0)
+ (log event%0#0)
+ let encoded_value%1#0: bytes = 0x000568656c6c6f
+ let encoded_value%2#0: bytes = 0x000668656c6c6f32
+ let encoded_tuple_buffer%7#0: bytes = (concat 0x00032a encoded_value%2#0)
+ let data_length%2#0: uint64 = (len encoded_value%1#0)
+ let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0)
+ let as_bytes%6#0: bytes = (itob current_tail_offset%5#0)
+ let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0)
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let encoded_value%0#0: bytes = 0x000668656c6c6f33
+ let encoded_tuple_buffer%6#0: bytes = (concat 0x00032a encoded_value%0#0)
+ let encoded_tuple_buffer%9#0: bytes = 0x000000000000002a000000000000002b0012
+ let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0)
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_4.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_4.ir
new file mode 100644
index 0000000000..3e7709a473
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_4.ir
@@ -0,0 +1,175 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let encoded_tuple_buffer%3#0: bytes = 0x00032a000668656c6c6f31
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0)
+ (log event%0#0)
+ let encoded_tuple_buffer%7#0: bytes = 0x00032a000668656c6c6f32
+ let data_length%2#0: uint64 = 7u
+ let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0)
+ let as_bytes%6#0: bytes = (itob current_tail_offset%5#0)
+ let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0)
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 0x000568656c6c6f)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let encoded_tuple_buffer%6#0: bytes = 0x00032a000668656c6c6f33
+ let encoded_tuple_buffer%10#0: bytes = (concat 0x000000000000002a000000000000002b0012 encoded_tuple_buffer%6#0)
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_5.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_5.ir
new file mode 100644
index 0000000000..7086ebbe50
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_5.ir
@@ -0,0 +1,171 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31)
+ (log event%0#0)
+ let current_tail_offset%5#0: uint64 = 11u
+ let as_bytes%6#0: bytes = (itob current_tail_offset%5#0)
+ let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0)
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 0x000568656c6c6f)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 0x00032a000668656c6c6f32)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let encoded_tuple_buffer%10#0: bytes = 0x000000000000002a000000000000002b001200032a000668656c6c6f33
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_6.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_6.ir
new file mode 100644
index 0000000000..8624f8f768
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_6.ir
@@ -0,0 +1,168 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31)
+ (log event%0#0)
+ let offset_as_uint16%3#0: bytes = 0x000b
+ let encoded_tuple_buffer%10#0: bytes = (concat 0x0004 offset_as_uint16%3#0)
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 0x000568656c6c6f)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 0x00032a000668656c6c6f32)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_7.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_7.ir
new file mode 100644
index 0000000000..9f9e2bbdb1
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_7.ir
@@ -0,0 +1,167 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31)
+ (log event%0#0)
+ let encoded_tuple_buffer%10#0: bytes = 0x0004000b
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 0x000568656c6c6f)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 0x00032a000668656c6c6f32)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_8.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_8.ir
new file mode 100644
index 0000000000..3969c10884
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_8.ir
@@ -0,0 +1,166 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31)
+ (log event%0#0)
+ let encoded_tuple_buffer%11#0: bytes = 0x0004000b000568656c6c6f
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 0x00032a000668656c6c6f32)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/Contract.ssa.opt_pass_9.ir b/test_cases/arc_56/out/Contract.ssa.opt_pass_9.ir
new file mode 100644
index 0000000000..d23c1c2c44
--- /dev/null
+++ b/test_cases/arc_56/out/Contract.ssa.opt_pass_9.ir
@@ -0,0 +1,165 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31)
+ (log event%0#0)
+ let encoded_tuple_buffer%12#0: bytes = 0x0004000b000568656c6c6f00032a000668656c6c6f32
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out/client_Contract.py b/test_cases/arc_56/out/client_Contract.py
new file mode 100644
index 0000000000..767d3f8567
--- /dev/null
+++ b/test_cases/arc_56/out/client_Contract.py
@@ -0,0 +1,56 @@
+# This file is auto-generated, do not modify
+# flake8: noqa
+# fmt: off
+import typing
+
+import algopy
+
+class SharedStruct(algopy.arc4.Struct):
+ foo: algopy.arc4.DynamicBytes
+ bar: algopy.arc4.UIntN[typing.Literal[8]]
+
+class TopLevelStruct(algopy.arc4.Struct):
+ a: algopy.arc4.UIntN[typing.Literal[64]]
+ b: algopy.arc4.String
+ shared: SharedStruct
+
+class Contract(algopy.arc4.ARC4Client, typing.Protocol):
+ @algopy.arc4.abimethod(allow_actions=['NoOp', 'OptIn'], create='allow')
+ def create(
+ self,
+ ) -> None: ...
+
+ @algopy.arc4.abimethod
+ def struct_arg(
+ self,
+ arg: TopLevelStruct,
+ shared: SharedStruct,
+ ) -> algopy.arc4.UIntN[typing.Literal[64]]: ...
+
+ @algopy.arc4.abimethod(readonly=True)
+ def struct_return(
+ self,
+ arg: TopLevelStruct,
+ ) -> SharedStruct: ...
+
+ @algopy.arc4.abimethod(readonly=True)
+ def emits_error(
+ self,
+ arg: TopLevelStruct,
+ ) -> None: ...
+
+ @algopy.arc4.abimethod
+ def emitter(
+ self,
+ ) -> None: ...
+
+ @algopy.arc4.abimethod
+ def conditional_emit(
+ self,
+ should_emit: algopy.arc4.Bool,
+ ) -> None: ...
+
+ @algopy.arc4.abimethod
+ def template_value(
+ self,
+ ) -> algopy.arc4.Tuple[algopy.arc4.Tuple[algopy.arc4.DynamicBytes, algopy.arc4.UIntN[typing.Literal[8]]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.String, algopy.arc4.UIntN[typing.Literal[8]]]: ...
diff --git a/test_cases/arc_56/out/module.awst b/test_cases/arc_56/out/module.awst
new file mode 100644
index 0000000000..775bcb68a9
--- /dev/null
+++ b/test_cases/arc_56/out/module.awst
@@ -0,0 +1,100 @@
+contract Contract
+{
+ method_resolution_order: (
+ algopy.arc4.ARC4Contract,
+ )
+ globals {
+ ['g_struct']: test_cases.arc_56.contract.StateStruct
+ [hex<"6775">]: uint64
+ [hex<"6761">]: arc4.static_array
+ }
+ locals {
+ ['l_struct']: test_cases.arc_56.contract.StateStruct
+ [hex<"6C75">]: uint64
+ [hex<"6C61">]: arc4.static_array
+ }
+ boxes {
+ ['b_struct']: test_cases.arc_56.contract.StateStruct
+ [hex<"6275">]: uint64
+ [hex<"6261">]: arc4.static_array
+ ['box_map_struct']: test_cases.arc_56.contract.StateStruct => test_cases.arc_56.contract.SharedStruct
+ [hex<"626D75">]: uint64 => test_cases.arc_56.contract.SharedStruct
+ [hex<"626D61">]: arc4.static_array => test_cases.arc_56.contract.SharedStruct
+ ['box_ref']: bytes
+ [hex<"6272">]: bytes
+ }
+
+ subroutine test_cases.arc_56.contract.Contract.approval_program(): bool
+ {
+ if (!(txn())) {
+ this::__init__()
+ }
+ return arc4_router()
+ }
+
+ subroutine algopy.arc4.ARC4Contract.clear_state_program(): bool
+ {
+ return true
+ }
+
+ subroutine test_cases.arc_56.contract.Contract.__init__(): void
+ {
+ }
+
+ baremethod test_cases.arc_56.contract.Contract.bare_create(): void
+ {
+ }
+
+ abimethod test_cases.arc_56.contract.Contract.create(): void
+ {
+ }
+
+ baremethod test_cases.arc_56.contract.Contract.transient(): void
+ {
+ }
+
+ abimethod test_cases.arc_56.contract.Contract.struct_arg(arg: test_cases.arc_56.contract.TopLevelStruct, shared: test_cases.arc_56.contract.SharedStruct): uint64
+ {
+ assert(arg.shared == shared, comment="this might error")
+ return 42u
+ }
+
+ abimethod test_cases.arc_56.contract.Contract.struct_return(arg: test_cases.arc_56.contract.TopLevelStruct): test_cases.arc_56.contract.SharedStruct
+ {
+ assert(arg.shared == test_cases.arc_56.contract.echo(arg.shared), comment="this won't error")
+ return arg.shared
+ }
+
+ abimethod[name_override=emits_error] test_cases.arc_56.contract.Contract.errors(arg: test_cases.arc_56.contract.TopLevelStruct): void
+ {
+ assert(reinterpret_cast(arg.a) == reinterpret_cast(0_arc4u8), comment="this will error")
+ }
+
+ abimethod test_cases.arc_56.contract.Contract.emitter(): void
+ {
+ emit('SharedStruct(byte[],uint8)', new test_cases.arc_56.contract.SharedStruct(foo=arc4_encode(hex<"68656C6C6F31">, arc4.dynamic_array), bar=42_arc4u8))
+ emit('Anonymous(string,(byte[],uint8))', new Anonymous(field1=arc4_encode('hello', arc4.dynamic_array), field2=new test_cases.arc_56.contract.SharedStruct(foo=arc4_encode(hex<"68656C6C6F32">, arc4.dynamic_array), bar=42_arc4u8)))
+ }
+
+ abimethod test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool): void
+ {
+ if (should_emit) {
+ emit('Anonymous2((uint64,uint64),(byte[],uint8))', new Anonymous2(field1=new test_cases.arc_56.contract.EventOnly(x=42_arc4u64, y=43_arc4u64), field2=new test_cases.arc_56.contract.SharedStruct(foo=arc4_encode(hex<"68656C6C6F33">, arc4.dynamic_array), bar=42_arc4u8)))
+ }
+ }
+
+ abimethod test_cases.arc_56.contract.Contract.template_value(): tuple
+ {
+ return (TemplateVar[test_cases.arc_56.contract.SharedStruct](TMPL_STRUCT), TemplateVar[uint64](TMPL_AVM_UINT64), TemplateVar[string](TMPL_AVM_STRING), TemplateVar[arc4.uint8](TMPL_ARC4_UINT8))
+ }
+
+ subroutine algopy.arc4.ARC4Contract.approval_program(): bool
+ {
+ return arc4_router()
+ }
+}
+
+subroutine echo(s: test_cases.arc_56.contract.SharedStruct): test_cases.arc_56.contract.SharedStruct
+{
+ return s
+}
\ No newline at end of file
diff --git a/test_cases/arc_56/out_O2/Contract.approval.teal b/test_cases/arc_56/out_O2/Contract.approval.teal
new file mode 100644
index 0000000000..0e1c40e44e
--- /dev/null
+++ b/test_cases/arc_56/out_O2/Contract.approval.teal
@@ -0,0 +1,247 @@
+#pragma version 10
+
+test_cases.arc_56.contract.Contract.approval_program:
+ intcblock 1 0 10 TMPL_AVM_UINT64
+ bytecblock 0x151f7c75 TMPL_STRUCT TMPL_AVM_STRING TMPL_ARC4_UINT8
+ callsub __puya_arc4_router__
+ return
+
+
+// test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> uint64:
+__puya_arc4_router__:
+ proto 0 1
+ txn NumAppArgs
+ bz __puya_arc4_router___bare_routing@11
+ pushbytess 0x4c5c61ba 0x97e8e4a7 0x76c4de11 0xc1ca7709 0x6de762c2 0x59fc5282 0x9d9eecb0 // method "create()void", method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64", method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)", method "emits_error((uint64,string,(byte[],uint8)))void", method "emitter()void", method "conditional_emit(bool)void", method "template_value()((byte[],uint8),uint64,string,uint8)"
+ txna ApplicationArgs 0
+ match __puya_arc4_router___create_route@2 __puya_arc4_router___struct_arg_route@3 __puya_arc4_router___struct_return_route@4 __puya_arc4_router___emits_error_route@5 __puya_arc4_router___emitter_route@6 __puya_arc4_router___conditional_emit_route@7 __puya_arc4_router___template_value_route@8
+ intc_1 // 0
+ retsub
+
+__puya_arc4_router___create_route@2:
+ intc_0 // 1
+ txn OnCompletion
+ shl
+ pushint 3 // 3
+ &
+ assert // OnCompletion is not one of NoOp, OptIn
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___struct_arg_route@3:
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ txna ApplicationArgs 1
+ txna ApplicationArgs 2
+ callsub struct_arg
+ itob
+ bytec_0 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___struct_return_route@4:
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ txna ApplicationArgs 1
+ callsub struct_return
+ bytec_0 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___emits_error_route@5:
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ txna ApplicationArgs 1
+ callsub errors
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___emitter_route@6:
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ callsub emitter
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___conditional_emit_route@7:
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ txna ApplicationArgs 1
+ intc_1 // 0
+ getbit
+ callsub conditional_emit
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___template_value_route@8:
+ txn OnCompletion
+ !
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ assert // can only call when not creating
+ callsub template_value
+ uncover 2
+ itob
+ dig 2
+ len
+ itob
+ extract 6 2
+ uncover 3
+ concat
+ dig 3
+ len
+ pushint 13 // 13
+ +
+ pushbytes 0x000d
+ uncover 3
+ concat
+ swap
+ itob
+ extract 6 2
+ concat
+ uncover 2
+ concat
+ uncover 2
+ concat
+ swap
+ concat
+ bytec_0 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___bare_routing@11:
+ txn OnCompletion
+ switch __puya_arc4_router___bare_create@12 __puya_arc4_router___bare_create@12 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___after_if_else@16 __puya_arc4_router___transient@13
+ intc_1 // 0
+ retsub
+
+__puya_arc4_router___bare_create@12:
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___transient@13:
+ txn ApplicationID
+ !
+ assert // can only call when creating
+ intc_0 // 1
+ retsub
+
+__puya_arc4_router___after_if_else@16:
+ intc_1 // 0
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+struct_arg:
+ proto 2 1
+ frame_dig -2
+ intc_2 // 10
+ extract_uint16
+ frame_dig -2
+ len
+ frame_dig -2
+ cover 2
+ substring3
+ frame_dig -1
+ ==
+ assert // this might error
+ pushint 42 // 42
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+struct_return:
+ proto 1 1
+ frame_dig -1
+ intc_2 // 10
+ extract_uint16
+ frame_dig -1
+ len
+ frame_dig -1
+ cover 2
+ substring3
+ dup
+ callsub echo
+ pop
+ dig 1
+ ==
+ assert // this won't error
+ retsub
+
+
+// test_cases.arc_56.contract.echo(s: bytes) -> bytes, bytes:
+echo:
+ proto 1 2
+ frame_dig -1
+ dup
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+errors:
+ proto 1 0
+ frame_dig -1
+ extract 0 8 // on error: Index access is out of bounds
+ pushbytes 0x00
+ ==
+ assert // this will error
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.emitter() -> void:
+emitter:
+ proto 0 0
+ pushbytess 0xd93f374e 0x00032a000668656c6c6f31 // method "SharedStruct(byte[],uint8)", 0x00032a000668656c6c6f31
+ concat
+ log
+ pushbytess 0x1e72af4e 0x0004000b000568656c6c6f00032a000668656c6c6f32 // method "Anonymous(string,(byte[],uint8))", 0x0004000b000568656c6c6f00032a000668656c6c6f32
+ concat
+ log
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.conditional_emit(should_emit: uint64) -> void:
+conditional_emit:
+ proto 1 0
+ frame_dig -1
+ bz conditional_emit_after_if_else@2
+ pushbytess 0x11c547ba 0x000000000000002a000000000000002b001200032a000668656c6c6f33 // method "Anonymous2((uint64,uint64),(byte[],uint8))", 0x000000000000002a000000000000002b001200032a000668656c6c6f33
+ concat
+ log
+
+conditional_emit_after_if_else@2:
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.template_value() -> bytes, uint64, bytes, bytes:
+template_value:
+ proto 0 4
+ bytec_1 // TMPL_STRUCT
+ intc_3 // TMPL_AVM_UINT64
+ bytec_2 // TMPL_AVM_STRING
+ bytec_3 // TMPL_ARC4_UINT8
+ retsub
diff --git a/test_cases/arc_56/out_O2/Contract.clear.teal b/test_cases/arc_56/out_O2/Contract.clear.teal
new file mode 100644
index 0000000000..883b1f693b
--- /dev/null
+++ b/test_cases/arc_56/out_O2/Contract.clear.teal
@@ -0,0 +1,5 @@
+#pragma version 10
+
+test_cases.arc_56.contract.Contract.clear_state_program:
+ pushint 1 // 1
+ return
diff --git a/test_cases/arc_56/out_O2/Contract.destructured.ir b/test_cases/arc_56/out_O2/Contract.destructured.ir
new file mode 100644
index 0000000000..e66d0bbe01
--- /dev/null
+++ b/test_cases/arc_56/out_O2/Contract.destructured.ir
@@ -0,0 +1,164 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ goto tmp%0#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (! tmp%6#0)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ (assert tmp%8#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (! tmp%13#0)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ (assert tmp%15#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (! tmp%20#0)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ (assert tmp%22#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (! tmp%25#0)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ (assert tmp%27#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (! tmp%29#0)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ (assert tmp%31#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (! tmp%35#0)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ (assert tmp%37#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat 0x000d val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ goto_nth [block@12, block@12, block@16, block@16, block@16, block@13][tmp%40#0] else return 0u
+ block@12: // bare_create_L63
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (! tmp%41#0)
+ (assert tmp%42#0) // can only call when creating
+ return 1u
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%0#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ return tmp%0#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = ((extract 0 8) arg#0) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" 0x00032a000668656c6c6f31)
+ (log event%0#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" 0x0004000b000568656c6c6f00032a000668656c6c6f32)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" 0x000000000000002a000000000000002b001200032a000668656c6c6f33)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/out_unoptimized/Contract.approval.teal b/test_cases/arc_56/out_unoptimized/Contract.approval.teal
new file mode 100644
index 0000000000..9273c50511
--- /dev/null
+++ b/test_cases/arc_56/out_unoptimized/Contract.approval.teal
@@ -0,0 +1,561 @@
+#pragma version 10
+
+test_cases.arc_56.contract.Contract.approval_program:
+ intcblock 0 1 3 10 TMPL_AVM_UINT64
+ bytecblock 0x 0x151f7c75 0x2a 0x68656c6c6f31 "hello" 0x68656c6c6f32 0x68656c6c6f33 TMPL_STRUCT TMPL_AVM_STRING TMPL_ARC4_UINT8
+ txn ApplicationID
+ bnz main_after_if_else@2
+ callsub __init__
+
+main_after_if_else@2:
+ callsub __puya_arc4_router__
+ return
+
+
+// test_cases.arc_56.contract.Contract.__init__() -> void:
+__init__:
+ // arc_56/contract.py:43
+ // def __init__(self) -> None:
+ proto 0 0
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> uint64:
+__puya_arc4_router__:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ proto 0 1
+ txn NumAppArgs
+ intc_0 // 0
+ !=
+ bz __puya_arc4_router___bare_routing@11
+ txna ApplicationArgs 0
+ pushbytes 0x4c5c61ba // method "create()void"
+ pushbytes 0x97e8e4a7 // method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64"
+ pushbytes 0x76c4de11 // method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)"
+ pushbytes 0xc1ca7709 // method "emits_error((uint64,string,(byte[],uint8)))void"
+ pushbytes 0x6de762c2 // method "emitter()void"
+ pushbytes 0x59fc5282 // method "conditional_emit(bool)void"
+ pushbytes 0x9d9eecb0 // method "template_value()((byte[],uint8),uint64,string,uint8)"
+ uncover 7
+ match __puya_arc4_router___create_route@2 __puya_arc4_router___struct_arg_route@3 __puya_arc4_router___struct_return_route@4 __puya_arc4_router___emits_error_route@5 __puya_arc4_router___emitter_route@6 __puya_arc4_router___conditional_emit_route@7 __puya_arc4_router___template_value_route@8
+ b __puya_arc4_router___switch_case_default@9
+
+__puya_arc4_router___create_route@2:
+ // arc_56/contract.py:67
+ // @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ txn OnCompletion
+ intc_1 // 1
+ swap
+ shl
+ intc_2 // 3
+ &
+ assert // OnCompletion is not one of NoOp, OptIn
+ callsub create
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___struct_arg_route@3:
+ // arc_56/contract.py:75
+ // @arc4.abimethod()
+ txn OnCompletion
+ intc_0 // NoOp
+ ==
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ intc_0 // 0
+ !=
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1
+ txna ApplicationArgs 2
+ // arc_56/contract.py:75
+ // @arc4.abimethod()
+ callsub struct_arg
+ itob
+ bytec_1 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___struct_return_route@4:
+ // arc_56/contract.py:80
+ // @arc4.abimethod(readonly=True)
+ txn OnCompletion
+ intc_0 // NoOp
+ ==
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ intc_0 // 0
+ !=
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1
+ // arc_56/contract.py:80
+ // @arc4.abimethod(readonly=True)
+ callsub struct_return
+ bytec_1 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___emits_error_route@5:
+ // arc_56/contract.py:85
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ txn OnCompletion
+ intc_0 // NoOp
+ ==
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ intc_0 // 0
+ !=
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1
+ // arc_56/contract.py:85
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ callsub errors
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___emitter_route@6:
+ // arc_56/contract.py:89
+ // @arc4.abimethod()
+ txn OnCompletion
+ intc_0 // NoOp
+ ==
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ intc_0 // 0
+ !=
+ assert // can only call when not creating
+ callsub emitter
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___conditional_emit_route@7:
+ // arc_56/contract.py:99
+ // @arc4.abimethod()
+ txn OnCompletion
+ intc_0 // NoOp
+ ==
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ intc_0 // 0
+ !=
+ assert // can only call when not creating
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txna ApplicationArgs 1
+ intc_0 // 0
+ getbit
+ // arc_56/contract.py:99
+ // @arc4.abimethod()
+ callsub conditional_emit
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___template_value_route@8:
+ // arc_56/contract.py:108
+ // @arc4.abimethod()
+ txn OnCompletion
+ intc_0 // NoOp
+ ==
+ assert // OnCompletion is not NoOp
+ txn ApplicationID
+ intc_0 // 0
+ !=
+ assert // can only call when not creating
+ callsub template_value
+ cover 3
+ cover 2
+ swap
+ cover 2
+ itob
+ cover 2
+ dup
+ len
+ itob
+ extract 6 2
+ swap
+ concat
+ cover 2
+ pushint 13 // 13
+ itob
+ extract 6 2
+ bytec_0 // 0x
+ swap
+ concat
+ dig 1
+ len
+ pushint 13 // 13
+ +
+ swap
+ uncover 3
+ concat
+ swap
+ itob
+ extract 6 2
+ concat
+ uncover 3
+ concat
+ swap
+ concat
+ swap
+ concat
+ bytec_1 // 0x151f7c75
+ swap
+ concat
+ log
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___switch_case_default@9:
+ b __puya_arc4_router___after_if_else@16
+
+__puya_arc4_router___bare_routing@11:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ txn OnCompletion
+ intc_0 // 0
+ intc_1 // 1
+ pushint 5 // 5
+ uncover 3
+ match __puya_arc4_router___bare_create@12 __puya_arc4_router___bare_create@12 __puya_arc4_router___transient@13
+ b __puya_arc4_router___switch_case_default@14
+
+__puya_arc4_router___bare_create@12:
+ // arc_56/contract.py:63-64
+ // @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ // def bare_create(self) -> None:
+ callsub bare_create
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___transient@13:
+ // arc_56/contract.py:71
+ // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"])
+ txn ApplicationID
+ intc_0 // 0
+ ==
+ assert // can only call when creating
+ // arc_56/contract.py:71-72
+ // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"])
+ // def transient(self) -> None:
+ callsub transient
+ intc_1 // 1
+ retsub
+
+__puya_arc4_router___switch_case_default@14:
+
+__puya_arc4_router___after_if_else@16:
+ // arc_56/contract.py:41
+ // class Contract(ARC4Contract):
+ intc_0 // 0
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.create() -> void:
+create:
+ // arc_56/contract.py:67-68
+ // @arc4.abimethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ // def create(self) -> None:
+ proto 0 0
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+struct_arg:
+ // arc_56/contract.py:75-76
+ // @arc4.abimethod()
+ // def struct_arg(self, arg: TopLevelStruct, shared: SharedStruct) -> UInt64:
+ proto 2 1
+ // arc_56/contract.py:77
+ // assert arg.shared == shared, "this might error"
+ frame_dig -2
+ intc_3 // 10
+ extract_uint16
+ frame_dig -2
+ len
+ frame_dig -2
+ uncover 2
+ uncover 2
+ substring3
+ frame_dig -1
+ ==
+ assert // this might error
+ // arc_56/contract.py:78
+ // return UInt64(42)
+ pushint 42 // 42
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+struct_return:
+ // arc_56/contract.py:80-81
+ // @arc4.abimethod(readonly=True)
+ // def struct_return(self, arg: TopLevelStruct) -> SharedStruct:
+ proto 1 1
+ // arc_56/contract.py:82
+ // assert arg.shared == echo(arg.shared), "this won't error"
+ frame_dig -1
+ intc_3 // 10
+ extract_uint16
+ frame_dig -1
+ len
+ frame_dig -1
+ uncover 2
+ uncover 2
+ substring3
+ frame_dig -1
+ intc_3 // 10
+ extract_uint16
+ frame_dig -1
+ len
+ frame_dig -1
+ uncover 2
+ uncover 2
+ substring3
+ callsub echo
+ pop
+ ==
+ assert // this won't error
+ // arc_56/contract.py:83
+ // return arg.shared
+ frame_dig -1
+ intc_3 // 10
+ extract_uint16
+ frame_dig -1
+ len
+ frame_dig -1
+ uncover 2
+ uncover 2
+ substring3
+ retsub
+
+
+// test_cases.arc_56.contract.echo(s: bytes) -> bytes, bytes:
+echo:
+ // arc_56/contract.py:118-119
+ // @subroutine
+ // def echo(s: SharedStruct) -> SharedStruct:
+ proto 1 2
+ // arc_56/contract.py:120
+ // return s
+ frame_dig -1
+ dup
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+errors:
+ // arc_56/contract.py:85-86
+ // @arc4.abimethod(name="emits_error", readonly=True)
+ // def errors(self, arg: TopLevelStruct) -> None:
+ proto 1 0
+ // arc_56/contract.py:87
+ // assert arg.a.bytes == arc4.UInt8(0).bytes, "this will error"
+ frame_dig -1
+ intc_0 // 0
+ pushint 8 // 8
+ extract3 // on error: Index access is out of bounds
+ pushbytes 0x00
+ ==
+ assert // this will error
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.emitter() -> void:
+emitter:
+ // arc_56/contract.py:89-90
+ // @arc4.abimethod()
+ // def emitter(self) -> None:
+ proto 0 0
+ // arc_56/contract.py:91
+ // arc4.emit(SharedStruct(foo=arc4.DynamicBytes(b"hello1"), bar=arc4.UInt8(42)))
+ bytec_3 // 0x68656c6c6f31
+ len
+ itob
+ extract 6 2
+ bytec_3 // 0x68656c6c6f31
+ concat
+ intc_2 // 3
+ itob
+ extract 6 2
+ bytec_0 // 0x
+ swap
+ concat
+ bytec_2 // 0x2a
+ concat
+ swap
+ concat
+ pushbytes 0xd93f374e // method "SharedStruct(byte[],uint8)"
+ swap
+ concat
+ log
+ // arc_56/contract.py:95
+ // String("hello"),
+ bytec 4 // "hello"
+ len
+ itob
+ extract 6 2
+ bytec 4 // "hello"
+ concat
+ // arc_56/contract.py:96
+ // SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)),
+ bytec 5 // 0x68656c6c6f32
+ len
+ itob
+ extract 6 2
+ bytec 5 // 0x68656c6c6f32
+ concat
+ intc_2 // 3
+ itob
+ extract 6 2
+ bytec_0 // 0x
+ swap
+ concat
+ bytec_2 // 0x2a
+ concat
+ swap
+ concat
+ // arc_56/contract.py:93-97
+ // arc4.emit(
+ // "Anonymous",
+ // String("hello"),
+ // SharedStruct(foo=arc4.DynamicBytes(b"hello2"), bar=arc4.UInt8(42)),
+ // )
+ pushint 4 // 4
+ itob
+ extract 6 2
+ bytec_0 // 0x
+ swap
+ concat
+ dig 2
+ len
+ pushint 4 // 4
+ +
+ itob
+ extract 6 2
+ concat
+ uncover 2
+ concat
+ swap
+ concat
+ pushbytes 0x1e72af4e // method "Anonymous(string,(byte[],uint8))"
+ swap
+ concat
+ log
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.conditional_emit(should_emit: uint64) -> void:
+conditional_emit:
+ // arc_56/contract.py:99-100
+ // @arc4.abimethod()
+ // def conditional_emit(self, should_emit: bool) -> None:
+ proto 1 0
+ // arc_56/contract.py:101
+ // if should_emit:
+ frame_dig -1
+ bz conditional_emit_after_if_else@2
+ // arc_56/contract.py:104
+ // EventOnly(arc4.UInt64(42), arc4.UInt64(43)),
+ bytec_0 // 0x
+ pushbytes 0x000000000000002a
+ concat
+ pushbytes 0x000000000000002b
+ concat
+ // arc_56/contract.py:105
+ // SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)),
+ bytec 6 // 0x68656c6c6f33
+ len
+ itob
+ extract 6 2
+ bytec 6 // 0x68656c6c6f33
+ concat
+ intc_2 // 3
+ itob
+ extract 6 2
+ bytec_0 // 0x
+ swap
+ concat
+ bytec_2 // 0x2a
+ concat
+ swap
+ concat
+ // arc_56/contract.py:102-106
+ // arc4.emit(
+ // "Anonymous2",
+ // EventOnly(arc4.UInt64(42), arc4.UInt64(43)),
+ // SharedStruct(foo=arc4.DynamicBytes(b"hello3"), bar=arc4.UInt8(42)),
+ // )
+ bytec_0 // 0x
+ uncover 2
+ concat
+ pushint 18 // 18
+ itob
+ extract 6 2
+ concat
+ swap
+ concat
+ pushbytes 0x11c547ba // method "Anonymous2((uint64,uint64),(byte[],uint8))"
+ swap
+ concat
+ log
+
+conditional_emit_after_if_else@2:
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.template_value() -> bytes, uint64, bytes, bytes:
+template_value:
+ // arc_56/contract.py:108-109
+ // @arc4.abimethod()
+ // def template_value(self) -> tuple[SharedStruct, UInt64, String, arc4.UInt8]:
+ proto 0 4
+ // arc_56/contract.py:111
+ // TemplateVar[SharedStruct]("STRUCT"),
+ bytec 7 // TMPL_STRUCT
+ // arc_56/contract.py:112
+ // TemplateVar[UInt64]("AVM_UINT64"),
+ intc 4 // TMPL_AVM_UINT64
+ // arc_56/contract.py:113
+ // TemplateVar[String]("AVM_STRING"),
+ bytec 8 // TMPL_AVM_STRING
+ // arc_56/contract.py:114
+ // TemplateVar[arc4.UInt8]("ARC4_UINT8"),
+ bytec 9 // TMPL_ARC4_UINT8
+ // arc_56/contract.py:110-115
+ // return (
+ // TemplateVar[SharedStruct]("STRUCT"),
+ // TemplateVar[UInt64]("AVM_UINT64"),
+ // TemplateVar[String]("AVM_STRING"),
+ // TemplateVar[arc4.UInt8]("ARC4_UINT8"),
+ // )
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.bare_create() -> void:
+bare_create:
+ // arc_56/contract.py:63-64
+ // @arc4.baremethod(create="allow", allow_actions=["NoOp", "OptIn"])
+ // def bare_create(self) -> None:
+ proto 0 0
+ retsub
+
+
+// test_cases.arc_56.contract.Contract.transient() -> void:
+transient:
+ // arc_56/contract.py:71-72
+ // @arc4.baremethod(create="require", allow_actions=["DeleteApplication"])
+ // def transient(self) -> None:
+ proto 0 0
+ retsub
diff --git a/test_cases/arc_56/out_unoptimized/Contract.clear.teal b/test_cases/arc_56/out_unoptimized/Contract.clear.teal
new file mode 100644
index 0000000000..883b1f693b
--- /dev/null
+++ b/test_cases/arc_56/out_unoptimized/Contract.clear.teal
@@ -0,0 +1,5 @@
+#pragma version 10
+
+test_cases.arc_56.contract.Contract.clear_state_program:
+ pushint 1 // 1
+ return
diff --git a/test_cases/arc_56/out_unoptimized/Contract.destructured.ir b/test_cases/arc_56/out_unoptimized/Contract.destructured.ir
new file mode 100644
index 0000000000..b07d431d36
--- /dev/null
+++ b/test_cases/arc_56/out_unoptimized/Contract.destructured.ir
@@ -0,0 +1,261 @@
+contract test_cases.arc_56.contract.Contract:
+ program approval:
+ subroutine test_cases.arc_56.contract.Contract.approval_program() -> bool:
+ block@0: // L1
+ let tmp%0#0: bool = (txn ApplicationID)
+ goto tmp%0#0 ? block@2 : block@1
+ block@1: // call __init___L1
+ test_cases.arc_56.contract.Contract.__init__()
+ goto block@2
+ block@2: // after_if_else_L1
+ let tmp%1#0: bool = test_cases.arc_56.contract.Contract.__puya_arc4_router__()
+ return tmp%1#0
+
+ subroutine test_cases.arc_56.contract.Contract.__init__() -> void:
+ block@0: // L43
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__() -> bool:
+ block@0: // L41
+ let tmp%0#0: uint64 = (txn NumAppArgs)
+ let tmp%1#0: bool = (!= tmp%0#0 0u)
+ goto tmp%1#0 ? block@1 : block@11
+ block@1: // abi_routing_L41
+ let tmp%2#0: bytes = (txna ApplicationArgs 0)
+ switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@9}
+ block@2: // create_route_L67
+ let tmp%3#0: uint64 = (txn OnCompletion)
+ let tmp%4#0: uint64 = (shl 1u tmp%3#0)
+ let tmp%5#0: uint64 = (& tmp%4#0 3u)
+ (assert tmp%5#0) // OnCompletion is not one of NoOp, OptIn
+ test_cases.arc_56.contract.Contract.create()
+ return 1u
+ block@3: // struct_arg_route_L75
+ let tmp%6#0: uint64 = (txn OnCompletion)
+ let tmp%7#0: bool = (== tmp%6#0 NoOp)
+ (assert tmp%7#0) // OnCompletion is not NoOp
+ let tmp%8#0: uint64 = (txn ApplicationID)
+ let tmp%9#0: bool = (!= tmp%8#0 0u)
+ (assert tmp%9#0) // can only call when not creating
+ let tmp%10#0: bytes = (txna ApplicationArgs 1)
+ let tmp%11#0: bytes = (txna ApplicationArgs 2)
+ let to_encode%0#0: uint64 = test_cases.arc_56.contract.Contract.struct_arg(tmp%10#0, tmp%11#0)
+ let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
+ let tmp%12#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
+ (log tmp%12#0)
+ return 1u
+ block@4: // struct_return_route_L80
+ let tmp%13#0: uint64 = (txn OnCompletion)
+ let tmp%14#0: bool = (== tmp%13#0 NoOp)
+ (assert tmp%14#0) // OnCompletion is not NoOp
+ let tmp%15#0: uint64 = (txn ApplicationID)
+ let tmp%16#0: bool = (!= tmp%15#0 0u)
+ (assert tmp%16#0) // can only call when not creating
+ let tmp%17#0: bytes = (txna ApplicationArgs 1)
+ let tmp%18#0: bytes = test_cases.arc_56.contract.Contract.struct_return(tmp%17#0)
+ let tmp%19#0: bytes = (concat 0x151f7c75 tmp%18#0)
+ (log tmp%19#0)
+ return 1u
+ block@5: // emits_error_route_L85
+ let tmp%20#0: uint64 = (txn OnCompletion)
+ let tmp%21#0: bool = (== tmp%20#0 NoOp)
+ (assert tmp%21#0) // OnCompletion is not NoOp
+ let tmp%22#0: uint64 = (txn ApplicationID)
+ let tmp%23#0: bool = (!= tmp%22#0 0u)
+ (assert tmp%23#0) // can only call when not creating
+ let tmp%24#0: bytes = (txna ApplicationArgs 1)
+ test_cases.arc_56.contract.Contract.errors(tmp%24#0)
+ return 1u
+ block@6: // emitter_route_L89
+ let tmp%25#0: uint64 = (txn OnCompletion)
+ let tmp%26#0: bool = (== tmp%25#0 NoOp)
+ (assert tmp%26#0) // OnCompletion is not NoOp
+ let tmp%27#0: uint64 = (txn ApplicationID)
+ let tmp%28#0: bool = (!= tmp%27#0 0u)
+ (assert tmp%28#0) // can only call when not creating
+ test_cases.arc_56.contract.Contract.emitter()
+ return 1u
+ block@7: // conditional_emit_route_L99
+ let tmp%29#0: uint64 = (txn OnCompletion)
+ let tmp%30#0: bool = (== tmp%29#0 NoOp)
+ (assert tmp%30#0) // OnCompletion is not NoOp
+ let tmp%31#0: uint64 = (txn ApplicationID)
+ let tmp%32#0: bool = (!= tmp%31#0 0u)
+ (assert tmp%32#0) // can only call when not creating
+ let tmp%33#0: bytes = (txna ApplicationArgs 1)
+ let tmp%34#0: bool = (getbit tmp%33#0 0u)
+ test_cases.arc_56.contract.Contract.conditional_emit(tmp%34#0)
+ return 1u
+ block@8: // template_value_route_L108
+ let tmp%35#0: uint64 = (txn OnCompletion)
+ let tmp%36#0: bool = (== tmp%35#0 NoOp)
+ (assert tmp%36#0) // OnCompletion is not NoOp
+ let tmp%37#0: uint64 = (txn ApplicationID)
+ let tmp%38#0: bool = (!= tmp%37#0 0u)
+ (assert tmp%38#0) // can only call when not creating
+ let (elements_to_encode%0#0: bytes, elements_to_encode%1#0: uint64, elements_to_encode%2#0: bytes, elements_to_encode%3#0: bytes) = test_cases.arc_56.contract.Contract.template_value()
+ let val_as_bytes%1#0: bytes = (itob elements_to_encode%1#0)
+ let length%0#0: uint64 = (len elements_to_encode%2#0)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 elements_to_encode%2#0)
+ let as_bytes%1#0: bytes = (itob 13u)
+ let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0)
+ let encoded_tuple_buffer%1#0: bytes = (concat 0x offset_as_uint16%0#0)
+ let data_length%0#0: uint64 = (len elements_to_encode%0#0)
+ let current_tail_offset%1#0: uint64 = (+ 13u data_length%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 val_as_bytes%1#0)
+ let as_bytes%2#0: bytes = (itob current_tail_offset%1#0)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 elements_to_encode%3#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 elements_to_encode%0#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let tmp%39#0: bytes = (concat 0x151f7c75 encoded_tuple_buffer%6#0)
+ (log tmp%39#0)
+ return 1u
+ block@9: // switch_case_default_L41
+ goto block@10
+ block@10: // switch_case_next_L41
+ goto block@16
+ block@11: // bare_routing_L41
+ let tmp%40#0: uint64 = (txn OnCompletion)
+ switch tmp%40#0 {0u => block@12, 1u => block@12, 5u => block@13, * => block@14}
+ block@12: // bare_create_L63
+ test_cases.arc_56.contract.Contract.bare_create()
+ return 1u
+ block@13: // transient_L71
+ let tmp%41#0: uint64 = (txn ApplicationID)
+ let tmp%42#0: bool = (== tmp%41#0 0u)
+ (assert tmp%42#0) // can only call when creating
+ test_cases.arc_56.contract.Contract.transient()
+ return 1u
+ block@14: // switch_case_default_L41
+ goto block@15
+ block@15: // switch_case_next_L41
+ goto block@16
+ block@16: // after_if_else_L41
+ return 0u
+
+ subroutine test_cases.arc_56.contract.Contract.create() -> void:
+ block@0: // L67
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.struct_arg(arg: bytes, shared: bytes) -> uint64:
+ block@0: // L75
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let tmp%1#0: bool = (== tmp%0#0 shared#0)
+ (assert tmp%1#0) // this might error
+ return 42u
+
+ subroutine test_cases.arc_56.contract.Contract.struct_return(arg: bytes) -> bytes:
+ block@0: // L80
+ let item_start_offset%0#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%0#0: uint64 = (len arg#0)
+ let tmp%0#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0)
+ let item_start_offset%1#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%1#0: uint64 = (len arg#0)
+ let tmp%1#0: bytes = (substring3 arg#0 item_start_offset%1#0 item_end_offset%1#0)
+ let (echo%0#0: bytes, echo%1#0: bytes) = test_cases.arc_56.contract.echo(tmp%1#0)
+ let tmp%2#0: bool = (== tmp%0#0 echo%0#0)
+ (assert tmp%2#0) // this won't error
+ let item_start_offset%2#0: uint64 = (extract_uint16 arg#0 10u)
+ let item_end_offset%2#0: uint64 = (len arg#0)
+ let tmp%3#0: bytes = (substring3 arg#0 item_start_offset%2#0 item_end_offset%2#0)
+ return tmp%3#0
+
+ subroutine test_cases.arc_56.contract.echo(s: bytes) -> :
+ block@0: // L118
+ return s#0 s#0
+
+ subroutine test_cases.arc_56.contract.Contract.errors(arg: bytes) -> void:
+ block@0: // L85
+ let tmp%0#0: bytes = (extract3 arg#0 0u 8u) // on error: Index access is out of bounds
+ let tmp%1#0: bool = (== tmp%0#0 0x00)
+ (assert tmp%1#0) // this will error
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.emitter() -> void:
+ block@0: // L89
+ let length%0#0: uint64 = (len 0x68656c6c6f31)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f31)
+ let as_bytes%1#0: bytes = (itob 3u)
+ let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0)
+ let encoded_tuple_buffer%1#0: bytes = (concat 0x offset_as_uint16%0#0)
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x2a)
+ let encoded_tuple_buffer%3#0: bytes = (concat encoded_tuple_buffer%2#0 encoded_value%0#0)
+ let event%0#0: bytes = (concat method "SharedStruct(byte[],uint8)" encoded_tuple_buffer%3#0)
+ (log event%0#0)
+ let length%1#0: uint64 = (len "hello")
+ let as_bytes%2#0: bytes = (itob length%1#0)
+ let length_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_value%1#0: bytes = (concat length_uint16%1#0 "hello")
+ let length%2#0: uint64 = (len 0x68656c6c6f32)
+ let as_bytes%3#0: bytes = (itob length%2#0)
+ let length_uint16%2#0: bytes = ((extract 6 2) as_bytes%3#0)
+ let encoded_value%2#0: bytes = (concat length_uint16%2#0 0x68656c6c6f32)
+ let as_bytes%4#0: bytes = (itob 3u)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%4#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat 0x offset_as_uint16%1#0)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 0x2a)
+ let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 encoded_value%2#0)
+ let as_bytes%5#0: bytes = (itob 4u)
+ let offset_as_uint16%2#0: bytes = ((extract 6 2) as_bytes%5#0)
+ let encoded_tuple_buffer%9#0: bytes = (concat 0x offset_as_uint16%2#0)
+ let data_length%2#0: uint64 = (len encoded_value%1#0)
+ let current_tail_offset%5#0: uint64 = (+ 4u data_length%2#0)
+ let as_bytes%6#0: bytes = (itob current_tail_offset%5#0)
+ let offset_as_uint16%3#0: bytes = ((extract 6 2) as_bytes%6#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 offset_as_uint16%3#0)
+ let encoded_tuple_buffer%11#0: bytes = (concat encoded_tuple_buffer%10#0 encoded_value%1#0)
+ let encoded_tuple_buffer%12#0: bytes = (concat encoded_tuple_buffer%11#0 encoded_tuple_buffer%7#0)
+ let event%1#0: bytes = (concat method "Anonymous(string,(byte[],uint8))" encoded_tuple_buffer%12#0)
+ (log event%1#0)
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.conditional_emit(should_emit: bool) -> void:
+ block@0: // L99
+ goto should_emit#0 ? block@1 : block@2
+ block@1: // if_body_L102
+ let encoded_tuple_buffer%1#0: bytes = (concat 0x 0x000000000000002a)
+ let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 0x000000000000002b)
+ let length%0#0: uint64 = (len 0x68656c6c6f33)
+ let as_bytes%0#0: bytes = (itob length%0#0)
+ let length_uint16%0#0: bytes = ((extract 6 2) as_bytes%0#0)
+ let encoded_value%0#0: bytes = (concat length_uint16%0#0 0x68656c6c6f33)
+ let as_bytes%1#0: bytes = (itob 3u)
+ let offset_as_uint16%0#0: bytes = ((extract 6 2) as_bytes%1#0)
+ let encoded_tuple_buffer%4#0: bytes = (concat 0x offset_as_uint16%0#0)
+ let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 0x2a)
+ let encoded_tuple_buffer%6#0: bytes = (concat encoded_tuple_buffer%5#0 encoded_value%0#0)
+ let encoded_tuple_buffer%8#0: bytes = (concat 0x encoded_tuple_buffer%2#0)
+ let as_bytes%2#0: bytes = (itob 18u)
+ let offset_as_uint16%1#0: bytes = ((extract 6 2) as_bytes%2#0)
+ let encoded_tuple_buffer%9#0: bytes = (concat encoded_tuple_buffer%8#0 offset_as_uint16%1#0)
+ let encoded_tuple_buffer%10#0: bytes = (concat encoded_tuple_buffer%9#0 encoded_tuple_buffer%6#0)
+ let event%0#0: bytes = (concat method "Anonymous2((uint64,uint64),(byte[],uint8))" encoded_tuple_buffer%10#0)
+ (log event%0#0)
+ goto block@2
+ block@2: // after_if_else_L101
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.template_value() -> :
+ block@0: // L108
+ return TemplateVar[bytes](TMPL_STRUCT) TemplateVar[uint64](TMPL_AVM_UINT64) TemplateVar[bytes](TMPL_AVM_STRING) TemplateVar[bytes](TMPL_ARC4_UINT8)
+
+ subroutine test_cases.arc_56.contract.Contract.bare_create() -> void:
+ block@0: // L63
+ return
+
+ subroutine test_cases.arc_56.contract.Contract.transient() -> void:
+ block@0: // L71
+ return
+
+ program clear-state:
+ subroutine algopy.arc4.ARC4Contract.clear_state_program() -> bool:
+ block@0: // L1
+ return 1u
\ No newline at end of file
diff --git a/test_cases/arc_56/puya.log b/test_cases/arc_56/puya.log
new file mode 100644
index 0000000000..e1199e069f
--- /dev/null
+++ b/test_cases/arc_56/puya.log
@@ -0,0 +1,2319 @@
+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={'STRUCT': b'/x00/x03/xff/x00/x02Hi', 'AVM_UINT64': 123, 'AVM_STRING': b'Hello', 'ARC4_UINT8': b'/xff'}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc_56'], output_awst=True, output_awst_json=False, output_client=True, log_level=)
+info: Found python prefix: /.venv
+info: writing arc_56/out/module.awst
+debug: Sealing block@0: // L12
+debug: Terminated block@0: // L12
+debug: Looking for 'required_budget_with_buffer' in an unsealed block creating an incomplete Phi: block@1: // while_top_L20
+debug: Created Phi assignment: let required_budget_with_buffer#1: uint64 = undefined while trying to resolve 'required_budget_with_buffer' in block@1: // while_top_L20
+debug: Terminated block@1: // while_top_L20
+debug: Sealing block@2: // while_body_L21
+debug: Looking for 'fee_source' in an unsealed block creating an incomplete Phi: block@1: // while_top_L20
+debug: Created Phi assignment: let fee_source#1: uint64 = undefined while trying to resolve 'fee_source' in block@1: // while_top_L20
+debug: Terminated block@2: // while_body_L21
+debug: Sealing block@3: // switch_case_0_L28
+debug: Terminated block@3: // switch_case_0_L28
+debug: Sealing block@4: // switch_case_1_L30
+debug: Terminated block@4: // switch_case_1_L30
+debug: Sealing block@5: // switch_case_default_L26
+debug: Terminated block@5: // switch_case_default_L26
+debug: Sealing block@6: // switch_case_next_L26
+debug: Terminated block@6: // switch_case_next_L26
+debug: Sealing block@1: // while_top_L20
+debug: Added required_budget_with_buffer#0 to Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0) in block@0: // L12
+debug: Created Phi assignment: let required_budget_with_buffer#2: uint64 = undefined while trying to resolve 'required_budget_with_buffer' in block@6: // switch_case_next_L26
+debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3) in block@3: // switch_case_0_L28
+debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4) in block@4: // switch_case_1_L30
+debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) in block@5: // switch_case_default_L26
+debug: Replacing trivial Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) (required_budget_with_buffer#2) with required_budget_with_buffer#1
+debug: Deleting Phi assignment: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5)
+debug: Replaced trivial Phi node: let required_budget_with_buffer#2: uint64 = φ(required_budget_with_buffer#1 <- block@3, required_budget_with_buffer#1 <- block@4, required_budget_with_buffer#1 <- block@5) (required_budget_with_buffer#2) with required_budget_with_buffer#1 in current definition for 1 blocks
+debug: Added required_budget_with_buffer#1 to Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) in block@6: // switch_case_next_L26
+debug: Replacing trivial Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) (required_budget_with_buffer#1) with required_budget_with_buffer#0
+debug: Deleting Phi assignment: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6)
+debug: Replaced trivial Phi node: let required_budget_with_buffer#1: uint64 = φ(required_budget_with_buffer#0 <- block@0, required_budget_with_buffer#1 <- block@6) (required_budget_with_buffer#1) with required_budget_with_buffer#0 in current definition for 6 blocks
+debug: Added fee_source#0 to Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0) in block@0: // L12
+debug: Created Phi assignment: let fee_source#2: uint64 = undefined while trying to resolve 'fee_source' in block@6: // switch_case_next_L26
+debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3) in block@3: // switch_case_0_L28
+debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4) in block@4: // switch_case_1_L30
+debug: Added fee_source#1 to Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) in block@5: // switch_case_default_L26
+debug: Replacing trivial Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) (fee_source#2) with fee_source#1
+debug: Deleting Phi assignment: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5)
+debug: Replaced trivial Phi node: let fee_source#2: uint64 = φ(fee_source#1 <- block@3, fee_source#1 <- block@4, fee_source#1 <- block@5) (fee_source#2) with fee_source#1 in current definition for 1 blocks
+debug: Added fee_source#1 to Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) in block@6: // switch_case_next_L26
+debug: Replacing trivial Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) (fee_source#1) with fee_source#0
+debug: Deleting Phi assignment: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6)
+debug: Replaced trivial Phi node: let fee_source#1: uint64 = φ(fee_source#0 <- block@0, fee_source#1 <- block@6) (fee_source#1) with fee_source#0 in current definition for 6 blocks
+debug: Sealing block@7: // after_while_L20
+debug: Terminated block@7: // after_while_L20
+debug: Sealing block@0: // L4
+debug: Terminated block@0: // L4
+debug: Looking for 'start' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11
+debug: Created Phi assignment: let start#1: uint64 = undefined while trying to resolve 'start' in block@1: // while_top_L11
+debug: Looking for 'item' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11
+debug: Created Phi assignment: let item#1: bytes = undefined while trying to resolve 'item' in block@1: // while_top_L11
+debug: Looking for 'sequence' in an unsealed block creating an incomplete Phi: block@1: // while_top_L11
+debug: Created Phi assignment: let sequence#1: bytes = undefined while trying to resolve 'sequence' in block@1: // while_top_L11
+debug: Terminated block@1: // while_top_L11
+debug: Sealing block@2: // while_body_L12
+debug: Terminated block@2: // while_body_L12
+debug: Sealing block@3: // if_body_L13
+debug: Terminated block@3: // if_body_L13
+debug: Sealing block@4: // after_if_else_L12
+debug: Terminated block@4: // after_if_else_L12
+debug: Sealing block@1: // while_top_L11
+debug: Added start#0 to Phi node: let start#1: uint64 = φ(start#0 <- block@0) in block@0: // L4
+debug: Added start#2 to Phi node: let start#1: uint64 = φ(start#0 <- block@0, start#2 <- block@4) in block@4: // after_if_else_L12
+debug: Added item#0 to Phi node: let item#1: bytes = φ(item#0 <- block@0) in block@0: // L4
+debug: Added item#1 to Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) in block@4: // after_if_else_L12
+debug: Replacing trivial Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) (item#1) with item#0
+debug: Deleting Phi assignment: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4)
+debug: Replaced trivial Phi node: let item#1: bytes = φ(item#0 <- block@0, item#1 <- block@4) (item#1) with item#0 in current definition for 3 blocks
+debug: Added sequence#0 to Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0) in block@0: // L4
+debug: Added sequence#1 to Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) in block@4: // after_if_else_L12
+debug: Replacing trivial Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) (sequence#1) with sequence#0
+debug: Deleting Phi assignment: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4)
+debug: Replaced trivial Phi node: let sequence#1: bytes = φ(sequence#0 <- block@0, sequence#1 <- block@4) (sequence#1) with sequence#0 in current definition for 3 blocks
+debug: Sealing block@5: // after_while_L11
+debug: Terminated block@5: // after_while_L11
+debug: Sealing block@0: // L25
+debug: Terminated block@0: // L25
+debug: Sealing block@0: // L44
+debug: Terminated block@0: // L44
+debug: Sealing block@0: // L62
+debug: Terminated block@0: // L62
+debug: Sealing block@0: // L92
+debug: Terminated block@0: // L92
+debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L110
+debug: Created Phi assignment: let head_offset#1: uint64 = undefined while trying to resolve 'head_offset' in block@1: // for_header_L110
+debug: Terminated block@1: // for_header_L110
+debug: Sealing block@2: // for_body_L111
+debug: Looking for 'head_and_tail' in an unsealed block creating an incomplete Phi: block@1: // for_header_L110
+debug: Created Phi assignment: let head_and_tail#1: bytes = undefined while trying to resolve 'head_and_tail' in block@1: // for_header_L110
+debug: Looking for 'new_head' in an unsealed block creating an incomplete Phi: block@1: // for_header_L110
+debug: Created Phi assignment: let new_head#1: bytes = undefined while trying to resolve 'new_head' in block@1: // for_header_L110
+debug: Terminated block@2: // for_body_L111
+debug: Sealing block@3: // for_footer_L110
+debug: Terminated block@3: // for_footer_L110
+debug: Sealing block@1: // for_header_L110
+debug: Added head_offset#0 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0) in block@0: // L92
+debug: Added head_offset#2 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0, head_offset#2 <- block@3) in block@3: // for_footer_L110
+debug: Added head_and_tail#0 to Phi node: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0) in block@0: // L92
+debug: Added head_and_tail#1 to Phi node: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0, head_and_tail#1 <- block@3) in block@3: // for_footer_L110
+debug: Replacing trivial Phi node: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0, head_and_tail#1 <- block@3) (head_and_tail#1) with head_and_tail#0
+debug: Deleting Phi assignment: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0, head_and_tail#1 <- block@3)
+debug: Replaced trivial Phi node: let head_and_tail#1: bytes = φ(head_and_tail#0 <- block@0, head_and_tail#1 <- block@3) (head_and_tail#1) with head_and_tail#0 in current definition for 3 blocks
+debug: Added new_head#0 to Phi node: let new_head#1: bytes = φ(new_head#0 <- block@0) in block@0: // L92
+debug: Added new_head#2 to Phi node: let new_head#1: bytes = φ(new_head#0 <- block@0, new_head#2 <- block@3) in block@3: // for_footer_L110
+debug: Sealing block@4: // after_for_L110
+debug: Created Phi assignment: let length_minus_1#1: uint64 = undefined while trying to resolve 'length_minus_1' in block@1: // for_header_L110
+debug: Added length_minus_1#0 to Phi node: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0) in block@0: // L92
+debug: Added length_minus_1#1 to Phi node: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0, length_minus_1#1 <- block@3) in block@3: // for_footer_L110
+debug: Replacing trivial Phi node: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0, length_minus_1#1 <- block@3) (length_minus_1#1) with length_minus_1#0
+debug: Deleting Phi assignment: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0, length_minus_1#1 <- block@3)
+debug: Replaced trivial Phi node: let length_minus_1#1: uint64 = φ(length_minus_1#0 <- block@0, length_minus_1#1 <- block@3) (length_minus_1#1) with length_minus_1#0 in current definition for 3 blocks
+debug: Created Phi assignment: let popped_header_offset#1: uint64 = undefined while trying to resolve 'popped_header_offset' in block@1: // for_header_L110
+debug: Added popped_header_offset#0 to Phi node: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0) in block@0: // L92
+debug: Added popped_header_offset#1 to Phi node: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0, popped_header_offset#1 <- block@3) in block@3: // for_footer_L110
+debug: Replacing trivial Phi node: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0, popped_header_offset#1 <- block@3) (popped_header_offset#1) with popped_header_offset#0
+debug: Deleting Phi assignment: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0, popped_header_offset#1 <- block@3)
+debug: Replaced trivial Phi node: let popped_header_offset#1: uint64 = φ(popped_header_offset#0 <- block@0, popped_header_offset#1 <- block@3) (popped_header_offset#1) with popped_header_offset#0 in current definition for 3 blocks
+debug: Created Phi assignment: let popped_offset#1: uint64 = undefined while trying to resolve 'popped_offset' in block@1: // for_header_L110
+debug: Added popped_offset#0 to Phi node: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0) in block@0: // L92
+debug: Added popped_offset#1 to Phi node: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0, popped_offset#1 <- block@3) in block@3: // for_footer_L110
+debug: Replacing trivial Phi node: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0, popped_offset#1 <- block@3) (popped_offset#1) with popped_offset#0
+debug: Deleting Phi assignment: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0, popped_offset#1 <- block@3)
+debug: Replaced trivial Phi node: let popped_offset#1: uint64 = φ(popped_offset#0 <- block@0, popped_offset#1 <- block@3) (popped_offset#1) with popped_offset#0 in current definition for 3 blocks
+debug: Created Phi assignment: let popped#1: bytes = undefined while trying to resolve 'popped' in block@1: // for_header_L110
+debug: Added popped#0 to Phi node: let popped#1: bytes = φ(popped#0 <- block@0) in block@0: // L92
+debug: Added popped#1 to Phi node: let popped#1: bytes = φ(popped#0 <- block@0, popped#1 <- block@3) in block@3: // for_footer_L110
+debug: Replacing trivial Phi node: let popped#1: bytes = φ(popped#0 <- block@0, popped#1 <- block@3) (popped#1) with popped#0
+debug: Deleting Phi assignment: let popped#1: bytes = φ(popped#0 <- block@0, popped#1 <- block@3)
+debug: Replaced trivial Phi node: let popped#1: bytes = φ(popped#0 <- block@0, popped#1 <- block@3) (popped#1) with popped#0 in current definition for 3 blocks
+debug: Terminated block@4: // after_for_L110
+debug: Sealing block@0: // L124
+debug: Terminated block@0: // L124
+debug: Sealing block@1: // if_body_L147
+debug: Terminated block@1: // if_body_L147
+debug: Sealing block@2: // after_if_else_L146
+debug: Created Phi assignment: let array_length#1: uint64 = undefined while trying to resolve 'array_length' in block@2: // after_if_else_L146
+debug: Added array_length#0 to Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0) in block@0: // L124
+debug: Added array_length#0 to Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) in block@1: // if_body_L147
+debug: Replacing trivial Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) (array_length#1) with array_length#0
+debug: Deleting Phi assignment: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1)
+debug: Replaced trivial Phi node: let array_length#1: uint64 = φ(array_length#0 <- block@0, array_length#0 <- block@1) (array_length#1) with array_length#0 in current definition for 1 blocks
+debug: Created Phi assignment: let is_packed#1: bool = undefined while trying to resolve 'is_packed' in block@2: // after_if_else_L146
+debug: Added is_packed#0 to Phi node: let is_packed#1: bool = φ(is_packed#0 <- block@0) in block@0: // L124
+debug: Added is_packed#0 to Phi node: let is_packed#1: bool = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) in block@1: // if_body_L147
+debug: Replacing trivial Phi node: let is_packed#1: bool = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) (is_packed#1) with is_packed#0
+debug: Deleting Phi assignment: let is_packed#1: bool = φ(is_packed#0 <- block@0, is_packed#0 <- block@1)
+debug: Replaced trivial Phi node: let is_packed#1: bool = φ(is_packed#0 <- block@0, is_packed#0 <- block@1) (is_packed#1) with is_packed#0 in current definition for 1 blocks
+debug: Created Phi assignment: let new_items_count#1: uint64 = undefined while trying to resolve 'new_items_count' in block@2: // after_if_else_L146
+debug: Added new_items_count#0 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0) in block@0: // L124
+debug: Added new_items_count#0 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) in block@1: // if_body_L147
+debug: Replacing trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) (new_items_count#1) with new_items_count#0
+debug: Deleting Phi assignment: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1)
+debug: Replaced trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#0 <- block@1) (new_items_count#1) with new_items_count#0 in current definition for 1 blocks
+debug: Terminated block@2: // after_if_else_L146
+debug: Looking for 'i' in an unsealed block creating an incomplete Phi: block@3: // for_header_L150
+debug: Created Phi assignment: let i#1: uint64 = undefined while trying to resolve 'i' in block@3: // for_header_L150
+debug: Terminated block@3: // for_header_L150
+debug: Sealing block@4: // for_body_L151
+debug: Looking for 'result' in an unsealed block creating an incomplete Phi: block@3: // for_header_L150
+debug: Created Phi assignment: let result#2: bytes = undefined while trying to resolve 'result' in block@3: // for_header_L150
+debug: Looking for 'write_offset' in an unsealed block creating an incomplete Phi: block@3: // for_header_L150
+debug: Created Phi assignment: let write_offset#1: uint64 = undefined while trying to resolve 'write_offset' in block@3: // for_header_L150
+debug: Looking for 'new_items_bytes' in an unsealed block creating an incomplete Phi: block@3: // for_header_L150
+debug: Created Phi assignment: let new_items_bytes#1: bytes = undefined while trying to resolve 'new_items_bytes' in block@3: // for_header_L150
+debug: Terminated block@4: // for_body_L151
+debug: Sealing block@5: // for_footer_L150
+debug: Terminated block@5: // for_footer_L150
+debug: Sealing block@3: // for_header_L150
+debug: Added i#0 to Phi node: let i#1: uint64 = φ(i#0 <- block@2) in block@2: // after_if_else_L146
+debug: Added i#2 to Phi node: let i#1: uint64 = φ(i#0 <- block@2, i#2 <- block@5) in block@5: // for_footer_L150
+debug: Created Phi assignment: let result#4: bytes = undefined while trying to resolve 'result' in block@2: // after_if_else_L146
+debug: Added result#0 to Phi node: let result#4: bytes = φ(result#0 <- block@0) in block@0: // L124
+debug: Added result#1 to Phi node: let result#4: bytes = φ(result#0 <- block@0, result#1 <- block@1) in block@1: // if_body_L147
+debug: Added result#4 to Phi node: let result#2: bytes = φ(result#4 <- block@2) in block@2: // after_if_else_L146
+debug: Added result#3 to Phi node: let result#2: bytes = φ(result#4 <- block@2, result#3 <- block@5) in block@5: // for_footer_L150
+debug: Added write_offset#0 to Phi node: let write_offset#1: uint64 = φ(write_offset#0 <- block@2) in block@2: // after_if_else_L146
+debug: Added write_offset#2 to Phi node: let write_offset#1: uint64 = φ(write_offset#0 <- block@2, write_offset#2 <- block@5) in block@5: // for_footer_L150
+debug: Created Phi assignment: let new_items_bytes#2: bytes = undefined while trying to resolve 'new_items_bytes' in block@2: // after_if_else_L146
+debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0) in block@0: // L124
+debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) in block@1: // if_body_L147
+debug: Replacing trivial Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) (new_items_bytes#2) with new_items_bytes#0
+debug: Deleting Phi assignment: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1)
+debug: Replaced trivial Phi node: let new_items_bytes#2: bytes = φ(new_items_bytes#0 <- block@0, new_items_bytes#0 <- block@1) (new_items_bytes#2) with new_items_bytes#0 in current definition for 1 blocks
+debug: Added new_items_bytes#0 to Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2) in block@2: // after_if_else_L146
+debug: Added new_items_bytes#1 to Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2, new_items_bytes#1 <- block@5) in block@5: // for_footer_L150
+debug: Replacing trivial Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2, new_items_bytes#1 <- block@5) (new_items_bytes#1) with new_items_bytes#0
+debug: Deleting Phi assignment: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2, new_items_bytes#1 <- block@5)
+debug: Replaced trivial Phi node: let new_items_bytes#1: bytes = φ(new_items_bytes#0 <- block@2, new_items_bytes#1 <- block@5) (new_items_bytes#1) with new_items_bytes#0 in current definition for 3 blocks
+debug: Sealing block@6: // after_for_L150
+debug: Terminated block@6: // after_for_L150
+debug: Sealing block@0: // L157
+debug: Terminated block@0: // L157
+debug: Sealing block@0: // L189
+debug: Terminated block@0: // L189
+debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L199
+debug: Created Phi assignment: let head_offset#1: uint64 = undefined while trying to resolve 'head_offset' in block@1: // for_header_L199
+debug: Terminated block@1: // for_header_L199
+debug: Sealing block@2: // for_body_L200
+debug: Looking for 'array_head_and_tail' in an unsealed block creating an incomplete Phi: block@1: // for_header_L199
+debug: Created Phi assignment: let array_head_and_tail#1: bytes = undefined while trying to resolve 'array_head_and_tail' in block@1: // for_header_L199
+debug: Looking for 'new_head' in an unsealed block creating an incomplete Phi: block@1: // for_header_L199
+debug: Created Phi assignment: let new_head#1: bytes = undefined while trying to resolve 'new_head' in block@1: // for_header_L199
+debug: Looking for 'item_offset_adjustment' in an unsealed block creating an incomplete Phi: block@1: // for_header_L199
+debug: Created Phi assignment: let item_offset_adjustment#1: uint64 = undefined while trying to resolve 'item_offset_adjustment' in block@1: // for_header_L199
+debug: Terminated block@2: // for_body_L200
+debug: Sealing block@3: // for_footer_L199
+debug: Terminated block@3: // for_footer_L199
+debug: Sealing block@1: // for_header_L199
+debug: Added head_offset#0 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0) in block@0: // L189
+debug: Added head_offset#2 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0, head_offset#2 <- block@3) in block@3: // for_footer_L199
+debug: Added array_head_and_tail#0 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0) in block@0: // L189
+debug: Added array_head_and_tail#1 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#1 <- block@3) in block@3: // for_footer_L199
+debug: Replacing trivial Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#1 <- block@3) (array_head_and_tail#1) with array_head_and_tail#0
+debug: Deleting Phi assignment: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#1 <- block@3)
+debug: Replaced trivial Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#1 <- block@3) (array_head_and_tail#1) with array_head_and_tail#0 in current definition for 3 blocks
+debug: Added new_head#0 to Phi node: let new_head#1: bytes = φ(new_head#0 <- block@0) in block@0: // L189
+debug: Added new_head#2 to Phi node: let new_head#1: bytes = φ(new_head#0 <- block@0, new_head#2 <- block@3) in block@3: // for_footer_L199
+debug: Added item_offset_adjustment#0 to Phi node: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0) in block@0: // L189
+debug: Added item_offset_adjustment#1 to Phi node: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0, item_offset_adjustment#1 <- block@3) in block@3: // for_footer_L199
+debug: Replacing trivial Phi node: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0, item_offset_adjustment#1 <- block@3) (item_offset_adjustment#1) with item_offset_adjustment#0
+debug: Deleting Phi assignment: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0, item_offset_adjustment#1 <- block@3)
+debug: Replaced trivial Phi node: let item_offset_adjustment#1: uint64 = φ(item_offset_adjustment#0 <- block@0, item_offset_adjustment#1 <- block@3) (item_offset_adjustment#1) with item_offset_adjustment#0 in current definition for 3 blocks
+debug: Sealing block@4: // after_for_L199
+debug: Created Phi assignment: let new_items_count#1: uint64 = undefined while trying to resolve 'new_items_count' in block@1: // for_header_L199
+debug: Added new_items_count#0 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0) in block@0: // L189
+debug: Added new_items_count#1 to Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#1 <- block@3) in block@3: // for_footer_L199
+debug: Replacing trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#1 <- block@3) (new_items_count#1) with new_items_count#0
+debug: Deleting Phi assignment: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#1 <- block@3)
+debug: Replaced trivial Phi node: let new_items_count#1: uint64 = φ(new_items_count#0 <- block@0, new_items_count#1 <- block@3) (new_items_count#1) with new_items_count#0 in current definition for 3 blocks
+debug: Terminated block@4: // after_for_L199
+debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@5: // for_header_L204
+debug: Created Phi assignment: let head_offset#4: uint64 = undefined while trying to resolve 'head_offset' in block@5: // for_header_L204
+debug: Terminated block@5: // for_header_L204
+debug: Sealing block@6: // for_body_L205
+debug: Looking for 'new_head_and_tail' in an unsealed block creating an incomplete Phi: block@5: // for_header_L204
+debug: Created Phi assignment: let new_head_and_tail#1: bytes = undefined while trying to resolve 'new_head_and_tail' in block@5: // for_header_L204
+debug: Looking for 'new_head' in an unsealed block creating an incomplete Phi: block@5: // for_header_L204
+debug: Created Phi assignment: let new_head#3: bytes = undefined while trying to resolve 'new_head' in block@5: // for_header_L204
+debug: Looking for 'item_offset_adjustment' in an unsealed block creating an incomplete Phi: block@5: // for_header_L204
+debug: Created Phi assignment: let item_offset_adjustment#3: uint64 = undefined while trying to resolve 'item_offset_adjustment' in block@5: // for_header_L204
+debug: Terminated block@6: // for_body_L205
+debug: Sealing block@7: // for_footer_L204
+debug: Terminated block@7: // for_footer_L204
+debug: Sealing block@5: // for_header_L204
+debug: Added head_offset#3 to Phi node: let head_offset#4: uint64 = φ(head_offset#3 <- block@4) in block@4: // after_for_L199
+debug: Added head_offset#5 to Phi node: let head_offset#4: uint64 = φ(head_offset#3 <- block@4, head_offset#5 <- block@7) in block@7: // for_footer_L204
+debug: Created Phi assignment: let new_head_and_tail#2: bytes = undefined while trying to resolve 'new_head_and_tail' in block@1: // for_header_L199
+debug: Added new_head_and_tail#0 to Phi node: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0) in block@0: // L189
+debug: Added new_head_and_tail#2 to Phi node: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) in block@3: // for_footer_L199
+debug: Replacing trivial Phi node: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) (new_head_and_tail#2) with new_head_and_tail#0
+debug: Deleting Phi assignment: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3)
+debug: Replaced trivial Phi node: let new_head_and_tail#2: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) (new_head_and_tail#2) with new_head_and_tail#0 in current definition for 3 blocks
+debug: Added new_head_and_tail#0 to Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4) in block@4: // after_for_L199
+debug: Added new_head_and_tail#1 to Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4, new_head_and_tail#1 <- block@7) in block@7: // for_footer_L204
+debug: Replacing trivial Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4, new_head_and_tail#1 <- block@7) (new_head_and_tail#1) with new_head_and_tail#0
+debug: Deleting Phi assignment: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4, new_head_and_tail#1 <- block@7)
+debug: Replaced trivial Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@4, new_head_and_tail#1 <- block@7) (new_head_and_tail#1) with new_head_and_tail#0 in current definition for 3 blocks
+debug: Added new_head#1 to Phi node: let new_head#3: bytes = φ(new_head#1 <- block@4) in block@4: // after_for_L199
+debug: Added new_head#4 to Phi node: let new_head#3: bytes = φ(new_head#1 <- block@4, new_head#4 <- block@7) in block@7: // for_footer_L204
+debug: Added item_offset_adjustment#2 to Phi node: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4) in block@4: // after_for_L199
+debug: Added item_offset_adjustment#3 to Phi node: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4, item_offset_adjustment#3 <- block@7) in block@7: // for_footer_L204
+debug: Replacing trivial Phi node: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4, item_offset_adjustment#3 <- block@7) (item_offset_adjustment#3) with item_offset_adjustment#2
+debug: Deleting Phi assignment: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4, item_offset_adjustment#3 <- block@7)
+debug: Replaced trivial Phi node: let item_offset_adjustment#3: uint64 = φ(item_offset_adjustment#2 <- block@4, item_offset_adjustment#3 <- block@7) (item_offset_adjustment#3) with item_offset_adjustment#2 in current definition for 3 blocks
+debug: Sealing block@8: // after_for_L204
+debug: Created Phi assignment: let array_items_count#1: uint64 = undefined while trying to resolve 'array_items_count' in block@5: // for_header_L204
+debug: Created Phi assignment: let array_items_count#2: uint64 = undefined while trying to resolve 'array_items_count' in block@1: // for_header_L199
+debug: Added array_items_count#0 to Phi node: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0) in block@0: // L189
+debug: Added array_items_count#2 to Phi node: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0, array_items_count#2 <- block@3) in block@3: // for_footer_L199
+debug: Replacing trivial Phi node: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0, array_items_count#2 <- block@3) (array_items_count#2) with array_items_count#0
+debug: Deleting Phi assignment: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0, array_items_count#2 <- block@3)
+debug: Replaced trivial Phi node: let array_items_count#2: uint64 = φ(array_items_count#0 <- block@0, array_items_count#2 <- block@3) (array_items_count#2) with array_items_count#0 in current definition for 3 blocks
+debug: Added array_items_count#0 to Phi node: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4) in block@4: // after_for_L199
+debug: Added array_items_count#1 to Phi node: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4, array_items_count#1 <- block@7) in block@7: // for_footer_L204
+debug: Replacing trivial Phi node: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4, array_items_count#1 <- block@7) (array_items_count#1) with array_items_count#0
+debug: Deleting Phi assignment: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4, array_items_count#1 <- block@7)
+debug: Replaced trivial Phi node: let array_items_count#1: uint64 = φ(array_items_count#0 <- block@4, array_items_count#1 <- block@7) (array_items_count#1) with array_items_count#0 in current definition for 3 blocks
+debug: Created Phi assignment: let new_items_count#2: uint64 = undefined while trying to resolve 'new_items_count' in block@5: // for_header_L204
+debug: Added new_items_count#0 to Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4) in block@4: // after_for_L199
+debug: Added new_items_count#2 to Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4, new_items_count#2 <- block@7) in block@7: // for_footer_L204
+debug: Replacing trivial Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4, new_items_count#2 <- block@7) (new_items_count#2) with new_items_count#0
+debug: Deleting Phi assignment: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4, new_items_count#2 <- block@7)
+debug: Replaced trivial Phi node: let new_items_count#2: uint64 = φ(new_items_count#0 <- block@4, new_items_count#2 <- block@7) (new_items_count#2) with new_items_count#0 in current definition for 3 blocks
+debug: Created Phi assignment: let array_head_and_tail#2: bytes = undefined while trying to resolve 'array_head_and_tail' in block@5: // for_header_L204
+debug: Added array_head_and_tail#0 to Phi node: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4) in block@4: // after_for_L199
+debug: Added array_head_and_tail#2 to Phi node: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4, array_head_and_tail#2 <- block@7) in block@7: // for_footer_L204
+debug: Replacing trivial Phi node: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4, array_head_and_tail#2 <- block@7) (array_head_and_tail#2) with array_head_and_tail#0
+debug: Deleting Phi assignment: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4, array_head_and_tail#2 <- block@7)
+debug: Replaced trivial Phi node: let array_head_and_tail#2: bytes = φ(array_head_and_tail#0 <- block@4, array_head_and_tail#2 <- block@7) (array_head_and_tail#2) with array_head_and_tail#0 in current definition for 3 blocks
+debug: Terminated block@8: // after_for_L204
+debug: Sealing block@0: // L217
+debug: Terminated block@0: // L217
+debug: Sealing block@0: // L240
+debug: Terminated block@0: // L240
+debug: Sealing block@0: // L252
+debug: Terminated block@0: // L252
+debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L269
+debug: Created Phi assignment: let head_offset#1: uint64 = undefined while trying to resolve 'head_offset' in block@1: // for_header_L269
+debug: Terminated block@1: // for_header_L269
+debug: Sealing block@2: // for_body_L270
+debug: Looking for 'new_head_and_tail' in an unsealed block creating an incomplete Phi: block@1: // for_header_L269
+debug: Created Phi assignment: let new_head_and_tail#1: bytes = undefined while trying to resolve 'new_head_and_tail' in block@1: // for_header_L269
+debug: Looking for 'new_item_length' in an unsealed block creating an incomplete Phi: block@1: // for_header_L269
+debug: Created Phi assignment: let new_item_length#1: uint64 = undefined while trying to resolve 'new_item_length' in block@1: // for_header_L269
+debug: Looking for 'original_item_length' in an unsealed block creating an incomplete Phi: block@1: // for_header_L269
+debug: Created Phi assignment: let original_item_length#1: uint64 = undefined while trying to resolve 'original_item_length' in block@1: // for_header_L269
+debug: Terminated block@2: // for_body_L270
+debug: Sealing block@3: // for_footer_L269
+debug: Terminated block@3: // for_footer_L269
+debug: Sealing block@1: // for_header_L269
+debug: Added head_offset#0 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0) in block@0: // L252
+debug: Added head_offset#2 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0, head_offset#2 <- block@3) in block@3: // for_footer_L269
+debug: Added new_head_and_tail#0 to Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@0) in block@0: // L252
+debug: Added new_head_and_tail#2 to Phi node: let new_head_and_tail#1: bytes = φ(new_head_and_tail#0 <- block@0, new_head_and_tail#2 <- block@3) in block@3: // for_footer_L269
+debug: Added new_item_length#0 to Phi node: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0) in block@0: // L252
+debug: Added new_item_length#1 to Phi node: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0, new_item_length#1 <- block@3) in block@3: // for_footer_L269
+debug: Replacing trivial Phi node: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0, new_item_length#1 <- block@3) (new_item_length#1) with new_item_length#0
+debug: Deleting Phi assignment: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0, new_item_length#1 <- block@3)
+debug: Replaced trivial Phi node: let new_item_length#1: uint64 = φ(new_item_length#0 <- block@0, new_item_length#1 <- block@3) (new_item_length#1) with new_item_length#0 in current definition for 3 blocks
+debug: Added original_item_length#0 to Phi node: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0) in block@0: // L252
+debug: Added original_item_length#1 to Phi node: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0, original_item_length#1 <- block@3) in block@3: // for_footer_L269
+debug: Replacing trivial Phi node: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0, original_item_length#1 <- block@3) (original_item_length#1) with original_item_length#0
+debug: Deleting Phi assignment: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0, original_item_length#1 <- block@3)
+debug: Replaced trivial Phi node: let original_item_length#1: uint64 = φ(original_item_length#0 <- block@0, original_item_length#1 <- block@3) (original_item_length#1) with original_item_length#0 in current definition for 3 blocks
+debug: Sealing block@4: // after_for_L269
+debug: Terminated block@4: // after_for_L269
+debug: Sealing block@0: // L278
+debug: Terminated block@0: // L278
+debug: Sealing block@0: // L306
+debug: Terminated block@0: // L306
+debug: Looking for 'head_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L327
+debug: Created Phi assignment: let head_offset#1: uint64 = undefined while trying to resolve 'head_offset' in block@1: // for_header_L327
+debug: Terminated block@1: // for_header_L327
+debug: Sealing block@2: // for_body_L328
+debug: Looking for 'tail_offset' in an unsealed block creating an incomplete Phi: block@1: // for_header_L327
+debug: Created Phi assignment: let tail_offset#1: uint64 = undefined while trying to resolve 'tail_offset' in block@1: // for_header_L327
+debug: Looking for 'array_head_and_tail' in an unsealed block creating an incomplete Phi: block@1: // for_header_L327
+debug: Created Phi assignment: let array_head_and_tail#1: bytes = undefined while trying to resolve 'array_head_and_tail' in block@1: // for_header_L327
+debug: Terminated block@2: // for_body_L328
+debug: Sealing block@3: // for_footer_L327
+debug: Terminated block@3: // for_footer_L327
+debug: Sealing block@1: // for_header_L327
+debug: Added head_offset#0 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0) in block@0: // L306
+debug: Added head_offset#3 to Phi node: let head_offset#1: uint64 = φ(head_offset#0 <- block@0, head_offset#3 <- block@3) in block@3: // for_footer_L327
+debug: Added tail_offset#0 to Phi node: let tail_offset#1: uint64 = φ(tail_offset#0 <- block@0) in block@0: // L306
+debug: Added tail_offset#2 to Phi node: let tail_offset#1: uint64 = φ(tail_offset#0 <- block@0, tail_offset#2 <- block@3) in block@3: // for_footer_L327
+debug: Added array_head_and_tail#0 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0) in block@0: // L306
+debug: Added array_head_and_tail#2 to Phi node: let array_head_and_tail#1: bytes = φ(array_head_and_tail#0 <- block@0, array_head_and_tail#2 <- block@3) in block@3: // for_footer_L327
+debug: Sealing block@4: // after_for_L327
+debug: Terminated block@4: // after_for_L327
+debug: Sealing block@0: // L41
+debug: Terminated block@0: // L41
+debug: Sealing block@1: // abi_routing_L41
+debug: Terminated block@1: // abi_routing_L41
+debug: Sealing block@2: // create_route_L67
+debug: Terminated block@2: // create_route_L67
+debug: Sealing block@3: // struct_arg_route_L75
+debug: Terminated block@3: // struct_arg_route_L75
+debug: Sealing block@4: // struct_return_route_L80
+debug: Terminated block@4: // struct_return_route_L80
+debug: Sealing block@5: // emits_error_route_L85
+debug: Terminated block@5: // emits_error_route_L85
+debug: Sealing block@6: // emitter_route_L89
+debug: Terminated block@6: // emitter_route_L89
+debug: Sealing block@7: // conditional_emit_route_L99
+debug: Terminated block@7: // conditional_emit_route_L99
+debug: Sealing block@8: // template_value_route_L108
+debug: Terminated block@8: // template_value_route_L108
+debug: Sealing block@9: // switch_case_default_L41
+debug: Terminated block@9: // switch_case_default_L41
+debug: Sealing block@10: // switch_case_next_L41
+debug: Terminated block@10: // switch_case_next_L41
+debug: Sealing block@11: // bare_routing_L41
+debug: Terminated block@11: // bare_routing_L41
+debug: Sealing block@12: // bare_create_L63
+debug: Terminated block@12: // bare_create_L63
+debug: Sealing block@13: // transient_L71
+debug: Terminated block@13: // transient_L71
+debug: Sealing block@14: // switch_case_default_L41
+debug: Terminated block@14: // switch_case_default_L41
+debug: Sealing block@15: // switch_case_next_L41
+debug: Terminated block@15: // switch_case_next_L41
+debug: Sealing block@16: // after_if_else_L41
+debug: Terminated block@16: // after_if_else_L41
+debug: Sealing block@0: // L43
+debug: Terminated block@0: // L43
+debug: Sealing block@0: // L67
+debug: Terminated block@0: // L67
+debug: Sealing block@0: // L75
+debug: Terminated block@0: // L75
+debug: Sealing block@0: // L80
+debug: Terminated block@0: // L80
+debug: Sealing block@0: // L118
+debug: Terminated block@0: // L118
+debug: Sealing block@0: // L85
+debug: Terminated block@0: // L85
+debug: Sealing block@0: // L89
+debug: Terminated block@0: // L89
+debug: Sealing block@0: // L99
+debug: Terminated block@0: // L99
+debug: Sealing block@1: // if_body_L102
+debug: Terminated block@1: // if_body_L102
+debug: Sealing block@2: // after_if_else_L101
+debug: Terminated block@2: // after_if_else_L101
+debug: Sealing block@0: // L108
+debug: Terminated block@0: // L108
+debug: Sealing block@0: // L63
+debug: Terminated block@0: // L63
+debug: Sealing block@0: // L71
+debug: Terminated block@0: // L71
+debug: Sealing block@0: // L1
+debug: Terminated block@0: // L1
+debug: Sealing block@1: // call __init___L1
+debug: Terminated block@1: // call __init___L1
+debug: Sealing block@2: // after_if_else_L1
+debug: Terminated block@2: // after_if_else_L1
+debug: Sealing block@0: // L1
+debug: Terminated block@0: // L1
+debug: Output IR to arc_56/out/Contract.ssa.ir
+info: optimizing test_cases.arc_56.contract.Contract at level 1
+debug: Begin optimization pass 1/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__init__
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (== tmp%6#0 NoOp) to (! tmp%6#0)
+debug: Simplified (== tmp%13#0 NoOp) to (! tmp%13#0)
+debug: Simplified (== tmp%20#0 NoOp) to (! tmp%20#0)
+debug: Simplified (== tmp%25#0 NoOp) to (! tmp%25#0)
+debug: Simplified (== tmp%29#0 NoOp) to (! tmp%29#0)
+debug: Simplified (== tmp%35#0 NoOp) to (! tmp%35#0)
+debug: Simplified ((extract 6 2) as_bytes%1#0) to 0x000d
+debug: Simplified (concat 0x offset_as_uint16%0#0) to offset_as_uint16%0#0
+debug: Simplified (== tmp%41#0 0u) to (! tmp%41#0)
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable tmp%1#0
+debug: Removing unused variable tmp%9#0
+debug: Removing unused variable tmp%16#0
+debug: Removing unused variable tmp%23#0
+debug: Removing unused variable tmp%28#0
+debug: Removing unused variable tmp%32#0
+debug: Removing unused variable tmp%38#0
+debug: Removing unused variable current_tail_offset%0#0
+debug: Removing unused variable encoded_tuple_buffer%0#0
+debug: Removing unused variable as_bytes%1#0
+debug: Removing unused variable current_tail_offset%2#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: inlining the default target of a switch/goto nth
+debug: adding block@1: // abi_routing_L41 as a predecessor of block@10: // switch_case_next_L41 due to inlining of block@9: // switch_case_default_L41
+debug: simplified terminator of block@1: // abi_routing_L41 from switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@9} to switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@10}
+debug: simplifying a switch with constants into goto nth
+debug: simplified terminator of block@11: // bare_routing_L41 from switch tmp%40#0 {0u => block@12, 1u => block@12, 5u => block@13, * => block@14} to goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@14
+debug: inlining the default target of a switch/goto nth
+debug: adding block@1: // abi_routing_L41 as a predecessor of block@16: // after_if_else_L41 due to inlining of block@10: // switch_case_next_L41
+debug: simplified terminator of block@1: // abi_routing_L41 from switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@10} to switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@16}
+debug: inlining the default target of a switch/goto nth
+debug: adding block@11: // bare_routing_L41 as a predecessor of block@15: // switch_case_next_L41 due to inlining of block@14: // switch_case_default_L41
+debug: simplified terminator of block@11: // bare_routing_L41 from goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@14 to goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@15
+debug: inlining the default target of a switch/goto nth
+debug: simplified terminator of block@1: // abi_routing_L41 from switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => block@16} to switch tmp%2#0 {method "create()void" => block@2, method "struct_arg((uint64,string,(byte[],uint8)),(byte[],uint8))uint64" => block@3, method "struct_return((uint64,string,(byte[],uint8)))(byte[],uint8)" => block@4, method "emits_error((uint64,string,(byte[],uint8)))void" => block@5, method "emitter()void" => block@6, method "conditional_emit(bool)void" => block@7, method "template_value()((byte[],uint8),uint64,string,uint8)" => block@8, * => return 0u}
+debug: inlining the default target of a switch/goto nth
+debug: adding block@11: // bare_routing_L41 as a predecessor of block@16: // after_if_else_L41 due to inlining of block@15: // switch_case_next_L41
+debug: simplified terminator of block@11: // bare_routing_L41 from goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@15 to goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@16
+debug: inlining the default target of a switch/goto nth
+debug: simplified terminator of block@11: // bare_routing_L41 from goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else goto block@16 to goto_nth [block@12, block@12, block@14, block@14, block@14, block@13][tmp%40#0] else return 0u
+debug: Optimizer: Remove Linear Jump
+debug: Replaced predecessor block@10: // switch_case_next_L41 with block@9: // switch_case_default_L41 in block@16: // after_if_else_L41
+debug: Merged linear block@10: // switch_case_next_L41 into block@9: // switch_case_default_L41
+debug: Replaced predecessor block@15: // switch_case_next_L41 with block@14: // switch_case_default_L41 in block@16: // after_if_else_L41
+debug: Merged linear block@15: // switch_case_next_L41 into block@14: // switch_case_default_L41
+debug: Optimizer: Remove Empty Blocks
+debug: Removed empty block: block@9: // switch_case_default_L41
+debug: Removed empty block: block@14: // switch_case_default_L41
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.create
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Found equivalence set: echo%1#0, tmp%1#1
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Replacing redundant declaration let item_start_offset%1#0: uint64 = (extract_uint16 arg#0 10u) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=uint64, name='item_start_offset%0', version=0),)
+debug: Replacing redundant declaration let item_end_offset%1#0: uint64 = (len arg#0) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=uint64, name='item_end_offset%0', version=0),)
+debug: Replacing redundant declaration let item_start_offset%2#0: uint64 = (extract_uint16 arg#0 10u) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=uint64, name='item_start_offset%0', version=0),)
+debug: Replacing redundant declaration let item_end_offset%2#0: uint64 = (len arg#0) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=uint64, name='item_end_offset%0', version=0),)
+debug: Found equivalence set: item_start_offset%0#0, item_start_offset%1#0, item_start_offset%2#0
+debug: Replacing {item_start_offset%1#0, item_start_offset%2#0} with item_start_offset%0#0 made 2 modifications
+debug: Found equivalence set: item_end_offset%0#0, item_end_offset%1#0, item_end_offset%2#0
+debug: Replacing {item_end_offset%1#0, item_end_offset%2#0} with item_end_offset%0#0 made 2 modifications
+debug: Replacing redundant declaration let tmp%1#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=bytes, name='tmp%0', version=0),)
+debug: Replacing redundant declaration let tmp%3#0: bytes = (substring3 arg#0 item_start_offset%0#0 item_end_offset%0#0) with copy of existing registers (Register(source_location=arc_56/contract.py:82:15-25, ir_type=bytes, name='tmp%0', version=0),)
+debug: Found equivalence set: tmp%0#0, tmp%1#0, tmp%3#0
+debug: Replacing {tmp%1#0, tmp%3#0} with tmp%0#0 made 2 modifications
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Found equivalence set: s#0, s%out#0
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable s%is_original#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (extract3 arg#0 0u 8u) // on error: Index access is out of bounds to ((extract 0 8) arg#0) // on error: Index access is out of bounds
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (len 0x68656c6c6f31) to 6u
+debug: Simplified ((extract 6 2) as_bytes%1#0) to 0x0003
+debug: Simplified (concat 0x offset_as_uint16%0#0) to offset_as_uint16%0#0
+debug: Simplified (len "hello") to 5u
+debug: Simplified (len 0x68656c6c6f32) to 6u
+debug: Simplified ((extract 6 2) as_bytes%4#0) to 0x0003
+debug: Simplified (concat 0x offset_as_uint16%1#0) to offset_as_uint16%1#0
+debug: Simplified ((extract 6 2) as_bytes%5#0) to 0x0004
+debug: Simplified (concat 0x offset_as_uint16%2#0) to offset_as_uint16%2#0
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable current_tail_offset%0#0
+debug: Removing unused variable encoded_tuple_buffer%0#0
+debug: Removing unused variable as_bytes%1#0
+debug: Removing unused variable current_tail_offset%1#0
+debug: Removing unused variable current_tail_offset%2#0
+debug: Removing unused variable encoded_tuple_buffer%4#0
+debug: Removing unused variable as_bytes%4#0
+debug: Removing unused variable current_tail_offset%3#0
+debug: Removing unused variable current_tail_offset%4#0
+debug: Removing unused variable encoded_tuple_buffer%8#0
+debug: Removing unused variable as_bytes%5#0
+debug: Removing unused variable current_tail_offset%6#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x 0x000000000000002a) to 0x000000000000002a
+debug: Simplified (len 0x68656c6c6f33) to 6u
+debug: Simplified ((extract 6 2) as_bytes%1#0) to 0x0003
+debug: Simplified (concat 0x offset_as_uint16%0#0) to offset_as_uint16%0#0
+debug: Simplified (concat 0x encoded_tuple_buffer%2#0) to encoded_tuple_buffer%2#0
+debug: Simplified ((extract 6 2) as_bytes%2#0) to 0x0012
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable current_tail_offset%0#0
+debug: Removing unused variable encoded_tuple_buffer%0#0
+debug: Removing unused variable current_tail_offset%1#0
+debug: Removing unused variable encoded_tuple_buffer%3#0
+debug: Removing unused variable as_bytes%1#0
+debug: Removing unused variable current_tail_offset%2#0
+debug: Removing unused variable current_tail_offset%3#0
+debug: Removing unused variable encoded_tuple_buffer%7#0
+debug: Removing unused variable as_bytes%2#0
+debug: Removing unused variable current_tail_offset%4#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.bare_create
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.transient
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Splitting parallel copies prior to optimization
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_1.ir
+debug: Begin optimization pass 2/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: replaced goto tmp%0#0 ? block@2 : block@2 with goto block@2
+debug: Removed empty block: block@1: // call __init___L1
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable offset_as_uint16%0#0
+debug: Removing unused variable encoded_tuple_buffer%1#0
+debug: Removing unused variable data_length%1#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified ((extract 6 2) as_bytes%0#0) to 0x0006
+debug: Simplified (concat 0x0003 0x2a) to 0x00032a
+debug: Simplified ((extract 6 2) as_bytes%2#0) to 0x0005
+debug: Simplified ((extract 6 2) as_bytes%3#0) to 0x0006
+debug: Simplified (concat 0x0003 0x2a) to 0x00032a
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable length%0#0
+debug: Removing unused variable as_bytes%0#0
+debug: Removing unused variable offset_as_uint16%0#0
+debug: Removing unused variable encoded_tuple_buffer%1#0
+debug: Removing unused variable data_length%0#0
+debug: Removing unused variable length%1#0
+debug: Removing unused variable as_bytes%2#0
+debug: Removing unused variable length%2#0
+debug: Removing unused variable as_bytes%3#0
+debug: Removing unused variable offset_as_uint16%1#0
+debug: Removing unused variable encoded_tuple_buffer%5#0
+debug: Removing unused variable data_length%1#0
+debug: Removing unused variable offset_as_uint16%2#0
+debug: Removing unused variable encoded_tuple_buffer%9#0
+debug: Removing unused variable data_length%3#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Found equivalence set: encoded_tuple_buffer%2#0, encoded_tuple_buffer%8#0
+debug: Replacing {encoded_tuple_buffer%8#0} with encoded_tuple_buffer%2#0 made 1 modifications
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x000000000000002a 0x000000000000002b) to 0x000000000000002a000000000000002b
+debug: Simplified ((extract 6 2) as_bytes%0#0) to 0x0006
+debug: Simplified (concat 0x0003 0x2a) to 0x00032a
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_tuple_buffer%1#0
+debug: Removing unused variable length%0#0
+debug: Removing unused variable as_bytes%0#0
+debug: Removing unused variable offset_as_uint16%0#0
+debug: Removing unused variable encoded_tuple_buffer%4#0
+debug: Removing unused variable data_length%0#0
+debug: Removing unused variable offset_as_uint16%1#0
+debug: Removing unused variable data_length%1#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_2.ir
+debug: Begin optimization pass 3/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable tmp%0#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Merged linear block@2: // after_if_else_L1 into block@0: // L1
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x0006 0x68656c6c6f31) to 0x000668656c6c6f31
+debug: Simplified (concat 0x0005 "hello") to 0x000568656c6c6f
+debug: Simplified (concat 0x0006 0x68656c6c6f32) to 0x000668656c6c6f32
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable length_uint16%0#0
+debug: Removing unused variable encoded_tuple_buffer%2#0
+debug: Removing unused variable length_uint16%1#0
+debug: Removing unused variable length_uint16%2#0
+debug: Removing unused variable encoded_tuple_buffer%6#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x0006 0x68656c6c6f33) to 0x000668656c6c6f33
+debug: Simplified (concat 0x000000000000002a000000000000002b 0x0012) to 0x000000000000002a000000000000002b0012
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_tuple_buffer%2#0
+debug: Removing unused variable length_uint16%0#0
+debug: Removing unused variable encoded_tuple_buffer%5#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_3.ir
+debug: Begin optimization pass 4/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x00032a 0x000668656c6c6f31) to 0x00032a000668656c6c6f31
+debug: Simplified (concat 0x00032a 0x000668656c6c6f32) to 0x00032a000668656c6c6f32
+debug: Simplified (len 0x000568656c6c6f) to 7u
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_value%0#0
+debug: Removing unused variable encoded_value%1#0
+debug: Removing unused variable encoded_value%2#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x00032a 0x000668656c6c6f33) to 0x00032a000668656c6c6f33
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_value%0#0
+debug: Removing unused variable encoded_tuple_buffer%9#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_4.ir
+debug: Begin optimization pass 5/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (+ 4u 7u) to 11u
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_tuple_buffer%3#0
+debug: Removing unused variable encoded_tuple_buffer%7#0
+debug: Removing unused variable data_length%2#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x000000000000002a000000000000002b0012 0x00032a000668656c6c6f33) to 0x000000000000002a000000000000002b001200032a000668656c6c6f33
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_tuple_buffer%6#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_5.ir
+debug: Begin optimization pass 6/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified ((extract 6 2) as_bytes%6#0) to 0x000b
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable current_tail_offset%5#0
+debug: Removing unused variable as_bytes%6#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_tuple_buffer%10#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_6.ir
+debug: Begin optimization pass 7/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x0004 0x000b) to 0x0004000b
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable offset_as_uint16%3#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_7.ir
+debug: Begin optimization pass 8/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x0004000b 0x000568656c6c6f) to 0x0004000b000568656c6c6f
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_tuple_buffer%10#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_8.ir
+debug: Begin optimization pass 9/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Simplified (concat 0x0004000b000568656c6c6f 0x00032a000668656c6c6f32) to 0x0004000b000568656c6c6f00032a000668656c6c6f32
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_tuple_buffer%11#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_9.ir
+debug: Begin optimization pass 10/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Removing unused variable encoded_tuple_buffer%12#0
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Output IR to arc_56/out/Contract.ssa.opt_pass_10.ir
+debug: Begin optimization pass 11/100
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.approval_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_arg
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.struct_return
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.echo
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.errors
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.emitter
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.conditional_emit
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine test_cases.arc_56.contract.Contract.template_value
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: Optimizing subroutine algopy.arc4.ARC4Contract.clear_state_program
+debug: Optimizer: Constant Replacer
+debug: Optimizer: Copy Propagation
+debug: Optimizer: Intrinsic Simplifier
+debug: Optimizer: Remove Unused Variables
+debug: Optimizer: Inner Txn Field Replacer
+debug: Optimizer: Replace Compiled References
+debug: Optimizer: Simplify Control Ops
+debug: Optimizer: Remove Linear Jump
+debug: Optimizer: Remove Empty Blocks
+debug: Optimizer: Remove Unreachable Blocks
+debug: Optimizer: Repeated Expression Elimination
+debug: Optimizer: Remove Calls To No Op Subroutines
+debug: No optimizations performed in pass 11, ending loop
+debug: Removing Phis from test_cases.arc_56.contract.Contract.approval_program
+debug: Removing Phis from test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Removing Phis from test_cases.arc_56.contract.Contract.struct_arg
+debug: Removing Phis from test_cases.arc_56.contract.Contract.struct_return
+debug: Removing Phis from test_cases.arc_56.contract.echo
+debug: Removing Phis from test_cases.arc_56.contract.Contract.errors
+debug: Removing Phis from test_cases.arc_56.contract.Contract.emitter
+debug: Removing Phis from test_cases.arc_56.contract.Contract.conditional_emit
+debug: Removing Phis from test_cases.arc_56.contract.Contract.template_value
+debug: Removing Phis from algopy.arc4.ARC4Contract.clear_state_program
+debug: Coalescing local variables in test_cases.arc_56.contract.Contract.approval_program using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in test_cases.arc_56.contract.Contract.__puya_arc4_router__ using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in test_cases.arc_56.contract.Contract.struct_arg using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in test_cases.arc_56.contract.Contract.struct_return using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in test_cases.arc_56.contract.echo using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in test_cases.arc_56.contract.Contract.errors using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in test_cases.arc_56.contract.Contract.emitter using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in test_cases.arc_56.contract.Contract.conditional_emit using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in test_cases.arc_56.contract.Contract.template_value using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Coalescing local variables in algopy.arc4.ARC4Contract.clear_state_program using strategy RootOperandGrouping
+debug: Coalescing resulted in 0 replacement/s
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.approval_program
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.struct_arg
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.struct_return
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.echo
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.errors
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.emitter
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.conditional_emit
+debug: Sequentializing parallel copies in test_cases.arc_56.contract.Contract.template_value
+debug: Sequentializing parallel copies in algopy.arc4.ARC4Contract.clear_state_program
+debug: Performing post-SSA optimizations
+debug: Output IR to arc_56/out/Contract.destructured.ir
+debug: Inserted main_block@0.ops[1]: 'l-store-copy tmp%1#0 0'
+debug: Replaced main_block@0.ops[3]: 'v-load tmp%1#0' with 'l-load tmp%1#0'
+debug: Inserted __puya_arc4_router___block@0.ops[1]: 'l-store-copy tmp%0#0 0'
+debug: Replaced __puya_arc4_router___block@0.ops[3]: 'v-load tmp%0#0' with 'l-load tmp%0#0'
+debug: Inserted __puya_arc4_router___abi_routing@1.ops[1]: 'l-store-copy tmp%2#0 0'
+debug: Replaced __puya_arc4_router___abi_routing@1.ops[10]: 'v-load tmp%2#0' with 'l-load tmp%2#0'
+debug: Inserted __puya_arc4_router___create_route@2.ops[5]: 'l-store-copy tmp%4#0 0'
+debug: Replaced __puya_arc4_router___create_route@2.ops[7]: 'v-load tmp%4#0' with 'l-load tmp%4#0'
+debug: Inserted __puya_arc4_router___create_route@2.ops[10]: 'l-store-copy tmp%5#0 0'
+debug: Replaced __puya_arc4_router___create_route@2.ops[12]: 'v-load tmp%5#0' with 'l-load tmp%5#0'
+debug: Inserted __puya_arc4_router___create_route@2.ops[1]: 'l-store-copy tmp%3#0 0'
+debug: Replaced __puya_arc4_router___create_route@2.ops[4]: 'v-load tmp%3#0' with 'l-load tmp%3#0'
+debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[1]: 'l-store-copy tmp%6#0 0'
+debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[3]: 'v-load tmp%6#0' with 'l-load tmp%6#0'
+debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[5]: 'l-store-copy tmp%7#0 0'
+debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[7]: 'v-load tmp%7#0' with 'l-load tmp%7#0'
+debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[10]: 'l-store-copy tmp%8#0 0'
+debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[12]: 'v-load tmp%8#0' with 'l-load tmp%8#0'
+debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[21]: 'l-store-copy to_encode%0#0 0'
+debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[23]: 'v-load to_encode%0#0' with 'l-load to_encode%0#0'
+debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[29]: 'l-store-copy tmp%12#0 0'
+debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[31]: 'v-load tmp%12#0' with 'l-load tmp%12#0'
+debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[17]: 'l-store-copy tmp%11#0 0'
+debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[20]: 'v-load tmp%11#0' with 'l-load tmp%11#0'
+debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[26]: 'l-store-copy val_as_bytes%0#0 0'
+debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[29]: 'v-load val_as_bytes%0#0' with 'l-load val_as_bytes%0#0'
+debug: Inserted __puya_arc4_router___struct_arg_route@3.ops[15]: 'l-store-copy tmp%10#0 0'
+debug: Replaced __puya_arc4_router___struct_arg_route@3.ops[20]: 'v-load tmp%10#0' with 'l-load tmp%10#0'
+debug: Inserted __puya_arc4_router___struct_return_route@4.ops[1]: 'l-store-copy tmp%13#0 0'
+debug: Replaced __puya_arc4_router___struct_return_route@4.ops[3]: 'v-load tmp%13#0' with 'l-load tmp%13#0'
+debug: Inserted __puya_arc4_router___struct_return_route@4.ops[5]: 'l-store-copy tmp%14#0 0'
+debug: Replaced __puya_arc4_router___struct_return_route@4.ops[7]: 'v-load tmp%14#0' with 'l-load tmp%14#0'
+debug: Inserted __puya_arc4_router___struct_return_route@4.ops[10]: 'l-store-copy tmp%15#0 0'
+debug: Replaced __puya_arc4_router___struct_return_route@4.ops[12]: 'v-load tmp%15#0' with 'l-load tmp%15#0'
+debug: Inserted __puya_arc4_router___struct_return_route@4.ops[15]: 'l-store-copy tmp%17#0 0'
+debug: Replaced __puya_arc4_router___struct_return_route@4.ops[17]: 'v-load tmp%17#0' with 'l-load tmp%17#0'
+debug: Inserted __puya_arc4_router___struct_return_route@4.ops[23]: 'l-store-copy tmp%19#0 0'
+debug: Replaced __puya_arc4_router___struct_return_route@4.ops[25]: 'v-load tmp%19#0' with 'l-load tmp%19#0'
+debug: Inserted __puya_arc4_router___struct_return_route@4.ops[19]: 'l-store-copy tmp%18#0 0'
+debug: Replaced __puya_arc4_router___struct_return_route@4.ops[22]: 'v-load tmp%18#0' with 'l-load tmp%18#0'
+debug: Inserted __puya_arc4_router___emits_error_route@5.ops[1]: 'l-store-copy tmp%20#0 0'
+debug: Replaced __puya_arc4_router___emits_error_route@5.ops[3]: 'v-load tmp%20#0' with 'l-load tmp%20#0'
+debug: Inserted __puya_arc4_router___emits_error_route@5.ops[5]: 'l-store-copy tmp%21#0 0'
+debug: Replaced __puya_arc4_router___emits_error_route@5.ops[7]: 'v-load tmp%21#0' with 'l-load tmp%21#0'
+debug: Inserted __puya_arc4_router___emits_error_route@5.ops[10]: 'l-store-copy tmp%22#0 0'
+debug: Replaced __puya_arc4_router___emits_error_route@5.ops[12]: 'v-load tmp%22#0' with 'l-load tmp%22#0'
+debug: Inserted __puya_arc4_router___emits_error_route@5.ops[15]: 'l-store-copy tmp%24#0 0'
+debug: Replaced __puya_arc4_router___emits_error_route@5.ops[17]: 'v-load tmp%24#0' with 'l-load tmp%24#0'
+debug: Inserted __puya_arc4_router___emitter_route@6.ops[1]: 'l-store-copy tmp%25#0 0'
+debug: Replaced __puya_arc4_router___emitter_route@6.ops[3]: 'v-load tmp%25#0' with 'l-load tmp%25#0'
+debug: Inserted __puya_arc4_router___emitter_route@6.ops[5]: 'l-store-copy tmp%26#0 0'
+debug: Replaced __puya_arc4_router___emitter_route@6.ops[7]: 'v-load tmp%26#0' with 'l-load tmp%26#0'
+debug: Inserted __puya_arc4_router___emitter_route@6.ops[10]: 'l-store-copy tmp%27#0 0'
+debug: Replaced __puya_arc4_router___emitter_route@6.ops[12]: 'v-load tmp%27#0' with 'l-load tmp%27#0'
+debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[1]: 'l-store-copy tmp%29#0 0'
+debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[3]: 'v-load tmp%29#0' with 'l-load tmp%29#0'
+debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[5]: 'l-store-copy tmp%30#0 0'
+debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[7]: 'v-load tmp%30#0' with 'l-load tmp%30#0'
+debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[10]: 'l-store-copy tmp%31#0 0'
+debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[12]: 'v-load tmp%31#0' with 'l-load tmp%31#0'
+debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[15]: 'l-store-copy tmp%33#0 0'
+debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[17]: 'v-load tmp%33#0' with 'l-load tmp%33#0'
+debug: Inserted __puya_arc4_router___conditional_emit_route@7.ops[20]: 'l-store-copy tmp%34#0 0'
+debug: Replaced __puya_arc4_router___conditional_emit_route@7.ops[22]: 'v-load tmp%34#0' with 'l-load tmp%34#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[1]: 'l-store-copy tmp%35#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[3]: 'v-load tmp%35#0' with 'l-load tmp%35#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[5]: 'l-store-copy tmp%36#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[7]: 'v-load tmp%36#0' with 'l-load tmp%36#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[10]: 'l-store-copy tmp%37#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[12]: 'v-load tmp%37#0' with 'l-load tmp%37#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[24]: 'l-store-copy length%0#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[26]: 'v-load length%0#0' with 'l-load length%0#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[28]: 'l-store-copy as_bytes%0#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[30]: 'v-load as_bytes%0#0' with 'l-load as_bytes%0#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[32]: 'l-store-copy length_uint16%0#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[34]: 'v-load length_uint16%0#0' with 'l-load length_uint16%0#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[51]: 'l-store-copy as_bytes%2#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[53]: 'v-load as_bytes%2#0' with 'l-load as_bytes%2#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[59]: 'l-store-copy encoded_tuple_buffer%3#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[61]: 'v-load encoded_tuple_buffer%3#0' with 'l-load encoded_tuple_buffer%3#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[64]: 'l-store-copy encoded_tuple_buffer%4#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[66]: 'v-load encoded_tuple_buffer%4#0' with 'l-load encoded_tuple_buffer%4#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[69]: 'l-store-copy encoded_tuple_buffer%5#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[71]: 'v-load encoded_tuple_buffer%5#0' with 'l-load encoded_tuple_buffer%5#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[78]: 'l-store-copy tmp%39#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[80]: 'v-load tmp%39#0' with 'l-load tmp%39#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[17]: 'l-store-copy elements_to_encode%1#0 1'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[20]: 'v-load elements_to_encode%1#0' with 'l-load elements_to_encode%1#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[41]: 'l-store-copy data_length%0#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[44]: 'v-load data_length%0#0' with 'l-load data_length%0#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[57]: 'l-store-copy offset_as_uint16%1#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[60]: 'v-load offset_as_uint16%1#0' with 'l-load offset_as_uint16%1#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[77]: 'l-store-copy encoded_tuple_buffer%6#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[80]: 'v-load encoded_tuple_buffer%6#0' with 'l-load encoded_tuple_buffer%6#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[46]: 'l-store-copy current_tail_offset%1#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[52]: 'v-load current_tail_offset%1#0' with 'l-load current_tail_offset%1#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[16]: 'l-store-copy elements_to_encode%2#0 2'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[24]: 'v-load elements_to_encode%2#0' with 'l-load elements_to_encode%2#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[52]: 'l-store-copy encoded_tuple_buffer%2#0 1'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[62]: 'v-load encoded_tuple_buffer%2#0' with 'l-load encoded_tuple_buffer%2#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[25]: 'l-store-copy elements_to_encode%2#0 0'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[38]: 'v-load elements_to_encode%2#0' with 'l-load elements_to_encode%2#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[20]: 'l-store-copy elements_to_encode%0#0 2'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[42]: 'v-load elements_to_encode%0#0' with 'l-load elements_to_encode%0#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[24]: 'l-store-copy val_as_bytes%1#0 2'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[53]: 'v-load val_as_bytes%1#0' with 'l-load val_as_bytes%1#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[44]: 'l-store-copy elements_to_encode%0#0 1'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[77]: 'v-load elements_to_encode%0#0' with 'l-load elements_to_encode%0#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[42]: 'l-store-copy encoded_value%0#0 2'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[83]: 'v-load encoded_value%0#0' with 'l-load encoded_value%0#0'
+debug: Inserted __puya_arc4_router___template_value_route@8.ops[15]: 'l-store-copy elements_to_encode%3#0 3'
+debug: Replaced __puya_arc4_router___template_value_route@8.ops[74]: 'v-load elements_to_encode%3#0' with 'l-load elements_to_encode%3#0'
+debug: Inserted __puya_arc4_router___bare_routing@11.ops[1]: 'l-store-copy tmp%40#0 0'
+debug: Replaced __puya_arc4_router___bare_routing@11.ops[3]: 'v-load tmp%40#0' with 'l-load tmp%40#0'
+debug: Inserted __puya_arc4_router___transient@13.ops[1]: 'l-store-copy tmp%41#0 0'
+debug: Replaced __puya_arc4_router___transient@13.ops[3]: 'v-load tmp%41#0' with 'l-load tmp%41#0'
+debug: Inserted __puya_arc4_router___transient@13.ops[5]: 'l-store-copy tmp%42#0 0'
+debug: Replaced __puya_arc4_router___transient@13.ops[7]: 'v-load tmp%42#0' with 'l-load tmp%42#0'
+debug: Inserted struct_arg_block@0.ops[11]: 'l-store-copy tmp%0#0 0'
+debug: Replaced struct_arg_block@0.ops[13]: 'v-load tmp%0#0' with 'l-load tmp%0#0'
+debug: Inserted struct_arg_block@0.ops[16]: 'l-store-copy tmp%1#0 0'
+debug: Replaced struct_arg_block@0.ops[18]: 'v-load tmp%1#0' with 'l-load tmp%1#0'
+debug: Inserted struct_arg_block@0.ops[6]: 'l-store-copy item_end_offset%0#0 0'
+debug: Replaced struct_arg_block@0.ops[10]: 'v-load item_end_offset%0#0' with 'l-load item_end_offset%0#0'
+debug: Inserted struct_arg_block@0.ops[3]: 'l-store-copy item_start_offset%0#0 0'
+debug: Replaced struct_arg_block@0.ops[10]: 'v-load item_start_offset%0#0' with 'l-load item_start_offset%0#0'
+debug: Inserted struct_return_block@0.ops[11]: 'l-store-copy tmp%0#0 0'
+debug: Replaced struct_return_block@0.ops[13]: 'v-load tmp%0#0' with 'l-load tmp%0#0'
+debug: Inserted struct_return_block@0.ops[20]: 'l-store-copy tmp%2#0 0'
+debug: Replaced struct_return_block@0.ops[22]: 'v-load tmp%2#0' with 'l-load tmp%2#0'
+debug: Inserted struct_return_block@0.ops[16]: 'l-store-copy echo%0#0 0'
+debug: Replaced struct_return_block@0.ops[19]: 'v-load echo%0#0' with 'l-load echo%0#0'
+debug: Inserted struct_return_block@0.ops[6]: 'l-store-copy item_end_offset%0#0 0'
+debug: Replaced struct_return_block@0.ops[10]: 'v-load item_end_offset%0#0' with 'l-load item_end_offset%0#0'
+debug: Inserted struct_return_block@0.ops[15]: 'l-store-copy tmp%0#0 0'
+debug: Replaced struct_return_block@0.ops[20]: 'v-load tmp%0#0' with 'l-load tmp%0#0'
+debug: Inserted struct_return_block@0.ops[3]: 'l-store-copy item_start_offset%0#0 0'
+debug: Replaced struct_return_block@0.ops[10]: 'v-load item_start_offset%0#0' with 'l-load item_start_offset%0#0'
+debug: Inserted struct_return_block@0.ops[22]: 'l-store-copy tmp%0#0 1'
+debug: Replaced struct_return_block@0.ops[29]: 'v-load tmp%0#0' with 'l-load tmp%0#0'
+debug: Inserted errors_block@0.ops[2]: 'l-store-copy tmp%0#0 0'
+debug: Replaced errors_block@0.ops[4]: 'v-load tmp%0#0' with 'l-load tmp%0#0'
+debug: Inserted errors_block@0.ops[7]: 'l-store-copy tmp%1#0 0'
+debug: Replaced errors_block@0.ops[9]: 'v-load tmp%1#0' with 'l-load tmp%1#0'
+debug: Inserted emitter_block@0.ops[3]: 'l-store-copy event%0#0 0'
+debug: Replaced emitter_block@0.ops[5]: 'v-load event%0#0' with 'l-load event%0#0'
+debug: Inserted emitter_block@0.ops[10]: 'l-store-copy event%1#0 0'
+debug: Replaced emitter_block@0.ops[12]: 'v-load event%1#0' with 'l-load event%1#0'
+debug: Inserted conditional_emit_if_body@1.ops[3]: 'l-store-copy event%0#0 0'
+debug: Replaced conditional_emit_if_body@1.ops[5]: 'v-load event%0#0' with 'l-load event%0#0'
+debug: Found 3 edge set/s for test_cases.arc_56.contract.Contract.__puya_arc4_router__
+debug: Found 1 edge set/s for test_cases.arc_56.contract.Contract.conditional_emit
+info: Writing arc_56/out/Contract.arc32.json
+info: Writing arc_56/out/Contract.arc56.json
+info: Writing arc_56/out/Contract.approval.teal
+info: Writing arc_56/out/Contract.clear.teal
+info: Writing arc_56/out/Contract.approval.bin
+info: Writing arc_56/out/Contract.clear.bin
+info: Writing arc_56/out/Contract.approval.puya.map
+info: Writing arc_56/out/Contract.clear.puya.map
+info: writing arc_56/out/client_Contract.py
\ No newline at end of file
diff --git a/test_cases/arc_56/template.vars b/test_cases/arc_56/template.vars
new file mode 100644
index 0000000000..6909f62702
--- /dev/null
+++ b/test_cases/arc_56/template.vars
@@ -0,0 +1,4 @@
+STRUCT=0x0003FF00024869
+AVM_UINT64=123
+AVM_STRING="Hello"
+ARC4_UINT8=0xFF
diff --git a/test_cases/asset/puya.log b/test_cases/asset/puya.log
index 2856abd0c2..2c1f3f8f5d 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 0b18e4e363..a3a46bc32f 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_11/out/Contract.approval.teal b/test_cases/avm_11/out/Contract.approval.teal
index e05c11f54b..adca28a0f1 100644
--- a/test_cases/avm_11/out/Contract.approval.teal
+++ b/test_cases/avm_11/out/Contract.approval.teal
@@ -24,9 +24,9 @@ __puya_arc4_router___test_new_ops_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_new_ops
intc_1 // 1
retsub
@@ -38,7 +38,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/avm_11/out/Contract.arc32.json b/test_cases/avm_11/out/Contract.arc32.json
index 39c621d99b..3263ec3ac5 100644
--- a/test_cases/avm_11/out/Contract.arc32.json
+++ b/test_cases/avm_11/out/Contract.arc32.json
@@ -7,7 +7,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fMTEuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweGMyYjhkZDhhIC8vIG1ldGhvZCAidGVzdF9uZXdfb3BzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXdfb3BzX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmV3X29wc19yb3V0ZUAyOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9uZXdfb3BzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTExKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTExKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC50ZXN0X25ld19vcHMoKSAtPiB2b2lkOgp0ZXN0X25ld19vcHM6CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfbmV3X29wcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTMtMTQKICAgIC8vICMgb3AgZnVuY3Rpb25zCiAgICAvLyBhc3NlcnQgbm90IG9wLmZhbGNvbl92ZXJpZnkoYiIiLCBiIiIsIG9wLmJ6ZXJvKDE3OTMpKQogICAgcHVzaGludCAxNzkzIC8vIDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IG9wLnN1bWhhc2g1MTIoYiIiKQogICAgcHVzaGJ5dGVzIDB4CiAgICBzdW1oYXNoNTEyCiAgICBsZW4KICAgIGFzc2VydAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhc3NlcnQgb3Aub25saW5lX3N0YWtlKCkKICAgIG9ubGluZV9zdGFrZQogICAgYXNzZXJ0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjMtMjQKICAgIC8vICMgQmxvY2sKICAgIC8vIGFzc2VydCBub3Qgb3AuQmxvY2suYmxrX3Byb3Bvc2VyKDApLCAicHJvcG9zZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrUHJvcG9zZXIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBwcm9wb3NlcgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX2ZlZXNfY29sbGVjdGVkKDApLCAiZmVlcyBjb2xsZWN0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrRmVlc0NvbGxlY3RlZAogICAgYXNzZXJ0IC8vIGZlZXMgY29sbGVjdGVkCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYm9udXMoMCksICJib251cyIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtCb251cwogICAgYXNzZXJ0IC8vIGJvbnVzCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjcKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYnJhbmNoKDApLCAiYnJhbmNoIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa0JyYW5jaAogICAgbGVuCiAgICBhc3NlcnQgLy8gYnJhbmNoCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfZmVlX3NpbmsoMCksICJmZWUgc2luayIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtGZWVTaW5rCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZmVlIHNpbmsKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkJsb2NrLmJsa19wcm90b2NvbCgwKSwgInByb3RvY29sIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3RvY29sCiAgICBsZW4KICAgIGFzc2VydCAvLyBwcm90b2NvbAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX3R4bl9jb3VudGVyKDApLCAidHhuIGNvdW50ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrVHhuQ291bnRlcgogICAgYXNzZXJ0IC8vIHR4biBjb3VudGVyCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfcHJvcG9zZXJfcGF5b3V0KDApLCAicHJvcG9zZXIgcGF5b3V0IgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3Bvc2VyUGF5b3V0CiAgICBhc3NlcnQgLy8gcHJvcG9zZXIgcGF5b3V0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzMtMzQKICAgIC8vICMgR2xvYmFsCiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZW5hYmxlZCwgInBheW91dHNfZW5hYmxlZCIKICAgIGdsb2JhbCBQYXlvdXRzRW5hYmxlZAogICAgYXNzZXJ0IC8vIHBheW91dHNfZW5hYmxlZAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZ29fb25saW5lX2ZlZSwgInBheW91dHNfZ29fb25saW5lX2ZlZSIKICAgIGdsb2JhbCBQYXlvdXRzR29PbmxpbmVGZWUKICAgIGFzc2VydCAvLyBwYXlvdXRzX2dvX29ubGluZV9mZWUKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX3BlcmNlbnQsICJwYXlvdXRzX3BlcmNlbnQiCiAgICBnbG9iYWwgUGF5b3V0c1BlcmNlbnQKICAgIGFzc2VydCAvLyBwYXlvdXRzX3BlcmNlbnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21pbl9iYWxhbmNlLCAicGF5b3V0c19taW5fYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWluX2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21heF9iYWxhbmNlLCAicGF5b3V0c19tYXhfYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWF4QmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWF4X2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo0MC00MQogICAgLy8gIyBWb3RlciBwYXJhbXMKICAgIC8vIGcsIGggPSBvcC5Wb3RlclBhcmFtc0dldC52b3Rlcl9iYWxhbmNlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckJhbGFuY2UKICAgIHBvcG4gMgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBpLCBqID0gb3AuVm90ZXJQYXJhbXNHZXQudm90ZXJfaW5jZW50aXZlX2VsaWdpYmxlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckluY2VudGl2ZUVsaWdpYmxlCiAgICBwb3BuIDIKICAgIHJldHN1Ygo=",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fMTEuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweGMyYjhkZDhhIC8vIG1ldGhvZCAidGVzdF9uZXdfb3BzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXdfb3BzX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmV3X29wc19yb3V0ZUAyOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25ld19vcHMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTExKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC50ZXN0X25ld19vcHMoKSAtPiB2b2lkOgp0ZXN0X25ld19vcHM6CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfbmV3X29wcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTMtMTQKICAgIC8vICMgb3AgZnVuY3Rpb25zCiAgICAvLyBhc3NlcnQgbm90IG9wLmZhbGNvbl92ZXJpZnkoYiIiLCBiIiIsIG9wLmJ6ZXJvKDE3OTMpKQogICAgcHVzaGludCAxNzkzIC8vIDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IG9wLnN1bWhhc2g1MTIoYiIiKQogICAgcHVzaGJ5dGVzIDB4CiAgICBzdW1oYXNoNTEyCiAgICBsZW4KICAgIGFzc2VydAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhc3NlcnQgb3Aub25saW5lX3N0YWtlKCkKICAgIG9ubGluZV9zdGFrZQogICAgYXNzZXJ0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjMtMjQKICAgIC8vICMgQmxvY2sKICAgIC8vIGFzc2VydCBub3Qgb3AuQmxvY2suYmxrX3Byb3Bvc2VyKDApLCAicHJvcG9zZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrUHJvcG9zZXIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBwcm9wb3NlcgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX2ZlZXNfY29sbGVjdGVkKDApLCAiZmVlcyBjb2xsZWN0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrRmVlc0NvbGxlY3RlZAogICAgYXNzZXJ0IC8vIGZlZXMgY29sbGVjdGVkCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYm9udXMoMCksICJib251cyIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtCb251cwogICAgYXNzZXJ0IC8vIGJvbnVzCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjcKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYnJhbmNoKDApLCAiYnJhbmNoIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa0JyYW5jaAogICAgbGVuCiAgICBhc3NlcnQgLy8gYnJhbmNoCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfZmVlX3NpbmsoMCksICJmZWUgc2luayIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtGZWVTaW5rCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZmVlIHNpbmsKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkJsb2NrLmJsa19wcm90b2NvbCgwKSwgInByb3RvY29sIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3RvY29sCiAgICBsZW4KICAgIGFzc2VydCAvLyBwcm90b2NvbAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX3R4bl9jb3VudGVyKDApLCAidHhuIGNvdW50ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrVHhuQ291bnRlcgogICAgYXNzZXJ0IC8vIHR4biBjb3VudGVyCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfcHJvcG9zZXJfcGF5b3V0KDApLCAicHJvcG9zZXIgcGF5b3V0IgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3Bvc2VyUGF5b3V0CiAgICBhc3NlcnQgLy8gcHJvcG9zZXIgcGF5b3V0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzMtMzQKICAgIC8vICMgR2xvYmFsCiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZW5hYmxlZCwgInBheW91dHNfZW5hYmxlZCIKICAgIGdsb2JhbCBQYXlvdXRzRW5hYmxlZAogICAgYXNzZXJ0IC8vIHBheW91dHNfZW5hYmxlZAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZ29fb25saW5lX2ZlZSwgInBheW91dHNfZ29fb25saW5lX2ZlZSIKICAgIGdsb2JhbCBQYXlvdXRzR29PbmxpbmVGZWUKICAgIGFzc2VydCAvLyBwYXlvdXRzX2dvX29ubGluZV9mZWUKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX3BlcmNlbnQsICJwYXlvdXRzX3BlcmNlbnQiCiAgICBnbG9iYWwgUGF5b3V0c1BlcmNlbnQKICAgIGFzc2VydCAvLyBwYXlvdXRzX3BlcmNlbnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21pbl9iYWxhbmNlLCAicGF5b3V0c19taW5fYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWluX2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21heF9iYWxhbmNlLCAicGF5b3V0c19tYXhfYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWF4QmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWF4X2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo0MC00MQogICAgLy8gIyBWb3RlciBwYXJhbXMKICAgIC8vIGcsIGggPSBvcC5Wb3RlclBhcmFtc0dldC52b3Rlcl9iYWxhbmNlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckJhbGFuY2UKICAgIHBvcG4gMgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBpLCBqID0gb3AuVm90ZXJQYXJhbXNHZXQudm90ZXJfaW5jZW50aXZlX2VsaWdpYmxlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckluY2VudGl2ZUVsaWdpYmxlCiAgICBwb3BuIDIKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
diff --git a/test_cases/avm_11/out/Contract.arc56.json b/test_cases/avm_11/out/Contract.arc56.json
new file mode 100644
index 0000000000..48144a2c95
--- /dev/null
+++ b/test_cases/avm_11/out/Contract.arc56.json
@@ -0,0 +1,180 @@
+{
+ "name": "Contract",
+ "structs": {},
+ "methods": [
+ {
+ "name": "test_new_ops",
+ "args": [],
+ "returns": {
+ "type": "void"
+ },
+ "actions": {
+ "create": [],
+ "call": [
+ "NoOp"
+ ]
+ },
+ "readonly": false,
+ "events": [],
+ "recommendations": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 35
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 93
+ ],
+ "errorMessage": "bonus"
+ },
+ {
+ "pc": [
+ 98
+ ],
+ "errorMessage": "branch"
+ },
+ {
+ "pc": [
+ 52
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 38
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 105
+ ],
+ "errorMessage": "fee sink"
+ },
+ {
+ "pc": [
+ 89
+ ],
+ "errorMessage": "fees collected"
+ },
+ {
+ "pc": [
+ 121
+ ],
+ "errorMessage": "payouts_enabled"
+ },
+ {
+ "pc": [
+ 124
+ ],
+ "errorMessage": "payouts_go_online_fee"
+ },
+ {
+ "pc": [
+ 133
+ ],
+ "errorMessage": "payouts_max_balance"
+ },
+ {
+ "pc": [
+ 130
+ ],
+ "errorMessage": "payouts_min_balance"
+ },
+ {
+ "pc": [
+ 127
+ ],
+ "errorMessage": "payouts_percent"
+ },
+ {
+ "pc": [
+ 85
+ ],
+ "errorMessage": "proposer"
+ },
+ {
+ "pc": [
+ 118
+ ],
+ "errorMessage": "proposer payout"
+ },
+ {
+ "pc": [
+ 110
+ ],
+ "errorMessage": "protocol"
+ },
+ {
+ "pc": [
+ 114
+ ],
+ "errorMessage": "txn counter"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fMTEuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweGMyYjhkZDhhIC8vIG1ldGhvZCAidGVzdF9uZXdfb3BzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXdfb3BzX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmV3X29wc19yb3V0ZUAyOgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25ld19vcHMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCwgYXZtX3ZlcnNpb249MTEpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QsIGF2bV92ZXJzaW9uPTExKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC50ZXN0X25ld19vcHMoKSAtPiB2b2lkOgp0ZXN0X25ld19vcHM6CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfbmV3X29wcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MTMtMTQKICAgIC8vICMgb3AgZnVuY3Rpb25zCiAgICAvLyBhc3NlcnQgbm90IG9wLmZhbGNvbl92ZXJpZnkoYiIiLCBiIiIsIG9wLmJ6ZXJvKDE3OTMpKQogICAgcHVzaGludCAxNzkzIC8vIDE3OTMKICAgIGJ6ZXJvCiAgICBwdXNoYnl0ZXMgMHgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBmYWxjb25fdmVyaWZ5CiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToxNQogICAgLy8gYXNzZXJ0IG9wLnN1bWhhc2g1MTIoYiIiKQogICAgcHVzaGJ5dGVzIDB4CiAgICBzdW1oYXNoNTEyCiAgICBsZW4KICAgIGFzc2VydAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhc3NlcnQgb3Aub25saW5lX3N0YWtlKCkKICAgIG9ubGluZV9zdGFrZQogICAgYXNzZXJ0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjMtMjQKICAgIC8vICMgQmxvY2sKICAgIC8vIGFzc2VydCBub3Qgb3AuQmxvY2suYmxrX3Byb3Bvc2VyKDApLCAicHJvcG9zZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrUHJvcG9zZXIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBwcm9wb3NlcgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX2ZlZXNfY29sbGVjdGVkKDApLCAiZmVlcyBjb2xsZWN0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrRmVlc0NvbGxlY3RlZAogICAgYXNzZXJ0IC8vIGZlZXMgY29sbGVjdGVkCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjYKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYm9udXMoMCksICJib251cyIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtCb251cwogICAgYXNzZXJ0IC8vIGJvbnVzCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjcKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfYnJhbmNoKDApLCAiYnJhbmNoIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa0JyYW5jaAogICAgbGVuCiAgICBhc3NlcnQgLy8gYnJhbmNoCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfZmVlX3NpbmsoMCksICJmZWUgc2luayIKICAgIGludGNfMCAvLyAwCiAgICBibG9jayBCbGtGZWVTaW5rCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZmVlIHNpbmsKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IG9wLkJsb2NrLmJsa19wcm90b2NvbCgwKSwgInByb3RvY29sIgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3RvY29sCiAgICBsZW4KICAgIGFzc2VydCAvLyBwcm90b2NvbAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgb3AuQmxvY2suYmxrX3R4bl9jb3VudGVyKDApLCAidHhuIGNvdW50ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYmxvY2sgQmxrVHhuQ291bnRlcgogICAgYXNzZXJ0IC8vIHR4biBjb3VudGVyCiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBvcC5CbG9jay5ibGtfcHJvcG9zZXJfcGF5b3V0KDApLCAicHJvcG9zZXIgcGF5b3V0IgogICAgaW50Y18wIC8vIDAKICAgIGJsb2NrIEJsa1Byb3Bvc2VyUGF5b3V0CiAgICBhc3NlcnQgLy8gcHJvcG9zZXIgcGF5b3V0CiAgICAvLyBhdm1fMTEvY29udHJhY3QucHk6MzMtMzQKICAgIC8vICMgR2xvYmFsCiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZW5hYmxlZCwgInBheW91dHNfZW5hYmxlZCIKICAgIGdsb2JhbCBQYXlvdXRzRW5hYmxlZAogICAgYXNzZXJ0IC8vIHBheW91dHNfZW5hYmxlZAogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjM1CiAgICAvLyBhc3NlcnQgb3AuR2xvYmFsLnBheW91dHNfZ29fb25saW5lX2ZlZSwgInBheW91dHNfZ29fb25saW5lX2ZlZSIKICAgIGdsb2JhbCBQYXlvdXRzR29PbmxpbmVGZWUKICAgIGFzc2VydCAvLyBwYXlvdXRzX2dvX29ubGluZV9mZWUKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX3BlcmNlbnQsICJwYXlvdXRzX3BlcmNlbnQiCiAgICBnbG9iYWwgUGF5b3V0c1BlcmNlbnQKICAgIGFzc2VydCAvLyBwYXlvdXRzX3BlcmNlbnQKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21pbl9iYWxhbmNlLCAicGF5b3V0c19taW5fYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWluX2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IG9wLkdsb2JhbC5wYXlvdXRzX21heF9iYWxhbmNlLCAicGF5b3V0c19tYXhfYmFsYW5jZSIKICAgIGdsb2JhbCBQYXlvdXRzTWF4QmFsYW5jZQogICAgYXNzZXJ0IC8vIHBheW91dHNfbWF4X2JhbGFuY2UKICAgIC8vIGF2bV8xMS9jb250cmFjdC5weTo0MC00MQogICAgLy8gIyBWb3RlciBwYXJhbXMKICAgIC8vIGcsIGggPSBvcC5Wb3RlclBhcmFtc0dldC52b3Rlcl9iYWxhbmNlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckJhbGFuY2UKICAgIHBvcG4gMgogICAgLy8gYXZtXzExL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBpLCBqID0gb3AuVm90ZXJQYXJhbXNHZXQudm90ZXJfaW5jZW50aXZlX2VsaWdpYmxlKDApCiAgICBpbnRjXzAgLy8gMAogICAgdm90ZXJfcGFyYW1zX2dldCBWb3RlckluY2VudGl2ZUVsaWdpYmxlCiAgICBwb3BuIDIKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCgp0ZXN0X2Nhc2VzLmF2bV8xMS5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "byteCode": {
+ "approval": "CyACAAGIAAFDigABMRtBABuABMK43Yo2GgCOAQACIokxGRREMRhEiAAPI4kxGUAABjEYFEQjiSKJigAAgYEOr4AASU8ChRREgACGFUR1RCLRAjIDEkQi0QNEItEERCLRBRVEItEGMgMTRCLRBxVEItEIRCLRCUQyEkQyE0QyFEQyFUQyFkQidABGAiJ0AUYCiQ==",
+ "clear": "C4EBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/avm_11/out/Contract.destructured.ir b/test_cases/avm_11/out/Contract.destructured.ir
index 0d60a684c3..7d0e031f4e 100644
--- a/test_cases/avm_11/out/Contract.destructured.ir
+++ b/test_cases/avm_11/out/Contract.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.avm_11.contract.Contract:
block@2: // test_new_ops_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.avm_11.contract.Contract.test_new_ops()
return 1u
block@5: // bare_routing_L9
@@ -26,7 +26,7 @@ contract test_cases.avm_11.contract.Contract:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L9
return 0u
diff --git a/test_cases/avm_11/out/Contract.ssa.ir b/test_cases/avm_11/out/Contract.ssa.ir
index 0112af3013..2e5b011f4e 100644
--- a/test_cases/avm_11/out/Contract.ssa.ir
+++ b/test_cases/avm_11/out/Contract.ssa.ir
@@ -16,10 +16,10 @@ contract test_cases.avm_11.contract.Contract:
block@2: // test_new_ops_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.avm_11.contract.Contract.test_new_ops()
return 1u
block@3: // switch_case_default_L9
@@ -32,7 +32,7 @@ contract test_cases.avm_11.contract.Contract:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (== tmp%8#0 0u)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
test_cases.avm_11.contract.Contract.__algopy_default_create()
return 1u
block@7: // switch_case_default_L9
diff --git a/test_cases/avm_11/out/Contract.ssa.opt_pass_1.ir b/test_cases/avm_11/out/Contract.ssa.opt_pass_1.ir
index 51f314905e..c64108251d 100644
--- a/test_cases/avm_11/out/Contract.ssa.opt_pass_1.ir
+++ b/test_cases/avm_11/out/Contract.ssa.opt_pass_1.ir
@@ -15,9 +15,9 @@ contract test_cases.avm_11.contract.Contract:
block@2: // test_new_ops_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.avm_11.contract.Contract.test_new_ops()
return 1u
block@5: // bare_routing_L9
@@ -26,7 +26,7 @@ contract test_cases.avm_11.contract.Contract:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L9
return 0u
diff --git a/test_cases/avm_11/out/Contract.ssa.opt_pass_2.ir b/test_cases/avm_11/out/Contract.ssa.opt_pass_2.ir
index 0d60a684c3..7d0e031f4e 100644
--- a/test_cases/avm_11/out/Contract.ssa.opt_pass_2.ir
+++ b/test_cases/avm_11/out/Contract.ssa.opt_pass_2.ir
@@ -15,9 +15,9 @@ contract test_cases.avm_11.contract.Contract:
block@2: // test_new_ops_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.avm_11.contract.Contract.test_new_ops()
return 1u
block@5: // bare_routing_L9
@@ -26,7 +26,7 @@ contract test_cases.avm_11.contract.Contract:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L9
return 0u
diff --git a/test_cases/avm_11/out_O2/Contract.approval.teal b/test_cases/avm_11/out_O2/Contract.approval.teal
index 7e0118f54d..28565a674d 100644
--- a/test_cases/avm_11/out_O2/Contract.approval.teal
+++ b/test_cases/avm_11/out_O2/Contract.approval.teal
@@ -20,9 +20,9 @@ __puya_arc4_router__:
__puya_arc4_router___test_new_ops_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_new_ops
intc_1 // 1
retsub
@@ -32,7 +32,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/avm_11/out_O2/Contract.destructured.ir b/test_cases/avm_11/out_O2/Contract.destructured.ir
index 0d60a684c3..7d0e031f4e 100644
--- a/test_cases/avm_11/out_O2/Contract.destructured.ir
+++ b/test_cases/avm_11/out_O2/Contract.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.avm_11.contract.Contract:
block@2: // test_new_ops_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.avm_11.contract.Contract.test_new_ops()
return 1u
block@5: // bare_routing_L9
@@ -26,7 +26,7 @@ contract test_cases.avm_11.contract.Contract:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (! tmp%8#0)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
return 1u
block@9: // after_if_else_L9
return 0u
diff --git a/test_cases/avm_11/out_unoptimized/Contract.approval.teal b/test_cases/avm_11/out_unoptimized/Contract.approval.teal
index 657ee040f3..7ead1d7aaa 100644
--- a/test_cases/avm_11/out_unoptimized/Contract.approval.teal
+++ b/test_cases/avm_11/out_unoptimized/Contract.approval.teal
@@ -27,11 +27,11 @@ __puya_arc4_router___test_new_ops_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_new_ops
intc_1 // 1
retsub
@@ -52,7 +52,7 @@ __puya_arc4_router_____algopy_default_create@6:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/test_cases/avm_11/out_unoptimized/Contract.destructured.ir b/test_cases/avm_11/out_unoptimized/Contract.destructured.ir
index 29ff61235b..25455ff178 100644
--- a/test_cases/avm_11/out_unoptimized/Contract.destructured.ir
+++ b/test_cases/avm_11/out_unoptimized/Contract.destructured.ir
@@ -16,10 +16,10 @@ contract test_cases.avm_11.contract.Contract:
block@2: // test_new_ops_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.avm_11.contract.Contract.test_new_ops()
return 1u
block@3: // switch_case_default_L9
@@ -32,7 +32,7 @@ contract test_cases.avm_11.contract.Contract:
block@6: // __algopy_default_create_L1
let tmp%8#0: uint64 = (txn ApplicationID)
let tmp%9#0: bool = (== tmp%8#0 0u)
- (assert tmp%9#0) // is creating
+ (assert tmp%9#0) // can only call when creating
test_cases.avm_11.contract.Contract.__algopy_default_create()
return 1u
block@7: // switch_case_default_L9
diff --git a/test_cases/avm_11/puya.log b/test_cases/avm_11/puya.log
index d4eac4176c..e8f60e7a51 100644
--- a/test_cases/avm_11/puya.log
+++ b/test_cases/avm_11/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_11'], 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_11'], output_awst=True, output_awst_json=False, output_client=True, log_level=)
info: Found python prefix: /.venv
info: writing avm_11/out/module.awst
debug: Sealing block@0: // L12
@@ -755,6 +755,7 @@ info: Writing avm_11/out/avm_11_sig.teal
info: Writing avm_11/out/avm_11_sig.bin
info: Writing avm_11/out/avm_11_sig.puya.map
info: Writing avm_11/out/Contract.arc32.json
+info: Writing avm_11/out/Contract.arc56.json
info: Writing avm_11/out/Contract.approval.teal
info: Writing avm_11/out/Contract.clear.teal
info: Writing avm_11/out/Contract.approval.bin
diff --git a/test_cases/avm_types_in_abi/out/TestContract.approval.mir b/test_cases/avm_types_in_abi/out/TestContract.approval.mir
index f94798cc64..f00aea2a3d 100644
--- a/test_cases/avm_types_in_abi/out/TestContract.approval.mir
+++ b/test_cases/avm_types_in_abi/out/TestContract.approval.mir
@@ -34,10 +34,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(allow_actions=["NoOp"], create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
// avm_types_in_abi/contract.py:4
// class TestContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -159,9 +159,9 @@ __puya_arc4_router___tuple_of_arc4_route@3:
// @arc4.abimethod
txn OnCompletion tmp%18#0
! tmp%19#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%20#0
- assert // is not creating
+ assert // can only call when not creating
// avm_types_in_abi/contract.py:4
// class TestContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%22#0
diff --git a/test_cases/avm_types_in_abi/out/TestContract.approval.teal b/test_cases/avm_types_in_abi/out/TestContract.approval.teal
index 496032664c..be3274343a 100644
--- a/test_cases/avm_types_in_abi/out/TestContract.approval.teal
+++ b/test_cases/avm_types_in_abi/out/TestContract.approval.teal
@@ -25,10 +25,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(allow_actions=["NoOp"], create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
// avm_types_in_abi/contract.py:4
// class TestContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -136,9 +136,9 @@ __puya_arc4_router___tuple_of_arc4_route@3:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// avm_types_in_abi/contract.py:4
// class TestContract(arc4.ARC4Contract):
txna ApplicationArgs 1
diff --git a/test_cases/avm_types_in_abi/out/TestContract.arc32.json b/test_cases/avm_types_in_abi/out/TestContract.arc32.json
index 4c1402368d..a47bf57821 100644
--- a/test_cases/avm_types_in_abi/out/TestContract.arc32.json
+++ b/test_cases/avm_types_in_abi/out/TestContract.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDY0CiAgICBieXRlY2Jsb2NrIDB4MDAgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDcKICAgIHB1c2hieXRlc3MgMHhmYjcxNjY1MiAweDdlYTY0MDc4IC8vIG1ldGhvZCAiY3JlYXRlKGJvb2wsdWludDY0LGJ5dGVbXSx1aW50NTEyLHN0cmluZywoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSkoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSIsIG1ldGhvZCAidHVwbGVfb2ZfYXJjNCgodWludDgsYWRkcmVzcykpKHVpbnQ4LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgZGlnIDEKICAgIGV4dHJhY3QgMSA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgIHB1c2hpbnQgOSAvLyA5CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA0CiAgICBleHRyYWN0IDExIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDUKICAgIGxlbgogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgYnl0ZWNfMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgZGlnIDQKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgNQogICAgYnwKICAgIGRpZyA0CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA0ZAogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBwdXNoaW50IDc3IC8vIDc3CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzOgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZXh0cmFjdCAxIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHR1cGxlX29mX2FyYzQKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXZtX3R5cGVzX2luX2FiaS5jb250cmFjdC5UZXN0Q29udHJhY3QuY3JlYXRlKGJvb2xfcGFyYW06IHVpbnQ2NCwgdWludDY0X3BhcmFtOiB1aW50NjQsIGJ5dGVzX3BhcmFtOiBieXRlcywgYmlndWludF9wYXJhbTogYnl0ZXMsIHN0cmluZ19wYXJhbTogYnl0ZXMsIHR1cGxlX3BhcmFtLjA6IHVpbnQ2NCwgdHVwbGVfcGFyYW0uMTogdWludDY0LCB0dXBsZV9wYXJhbS4yOiBieXRlcywgdHVwbGVfcGFyYW0uMzogYnl0ZXMsIHR1cGxlX3BhcmFtLjQ6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzLCBieXRlczoKY3JlYXRlOgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo1LTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiXSwgY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBib29sX3BhcmFtOiBib29sLAogICAgLy8gICAgIHVpbnQ2NF9wYXJhbTogVUludDY0LAogICAgLy8gICAgIGJ5dGVzX3BhcmFtOiBCeXRlcywKICAgIC8vICAgICBiaWd1aW50X3BhcmFtOiBCaWdVSW50LAogICAgLy8gICAgIHN0cmluZ19wYXJhbTogU3RyaW5nLAogICAgLy8gICAgIHR1cGxlX3BhcmFtOiB0dXBsZVtib29sLCBVSW50NjQsIEJ5dGVzLCBCaWdVSW50LCBTdHJpbmddLAogICAgLy8gKSAtPiB0dXBsZVtib29sLCBVSW50NjQsIEJ5dGVzLCBCaWdVSW50LCBTdHJpbmddOgogICAgcHJvdG8gMTAgNQogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxNgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSB0dXBsZV9wYXJhbQogICAgZnJhbWVfZGlnIC0xMAogICAgZnJhbWVfZGlnIC01CiAgICA9PQogICAgZnJhbWVfZGlnIC05CiAgICBmcmFtZV9kaWcgLTQKICAgID09CiAgICAmJgogICAgZnJhbWVfZGlnIC04CiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICAmJgogICAgZnJhbWVfZGlnIC03CiAgICBmcmFtZV9kaWcgLTIKICAgIGI9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgZnJhbWVfZGlnIC0xMAogICAgZnJhbWVfZGlnIC05CiAgICBmcmFtZV9kaWcgLTgKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIC02CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LnR1cGxlX29mX2FyYzQoYXJncy4wOiBieXRlcywgYXJncy4xOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgp0dXBsZV9vZl9hcmM0OgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOS0yMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdHVwbGVfb2ZfYXJjNCgKICAgIC8vICAgICBzZWxmLCBhcmdzOiB0dXBsZVthcmM0LlVJbnQ4LCBhcmM0LkFkZHJlc3NdCiAgICAvLyApIC0+IHR1cGxlW2FyYzQuVUludDgsIGFyYzQuQWRkcmVzc106CiAgICBwcm90byAyIDIKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBhcmdzWzBdLmJ5dGVzLmxlbmd0aCA9PSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBhcmdzWzFdLmJ5dGVzLmxlbmd0aCA9PSAzMgogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjUKICAgIC8vIHJldHVybiBhcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDY0CiAgICBieXRlY2Jsb2NrIDB4MDAgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDcKICAgIHB1c2hieXRlc3MgMHhmYjcxNjY1MiAweDdlYTY0MDc4IC8vIG1ldGhvZCAiY3JlYXRlKGJvb2wsdWludDY0LGJ5dGVbXSx1aW50NTEyLHN0cmluZywoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSkoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSIsIG1ldGhvZCAidHVwbGVfb2ZfYXJjNCgodWludDgsYWRkcmVzcykpKHVpbnQ4LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBkaWcgMQogICAgZXh0cmFjdCAxIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgcHVzaGludCA3NSAvLyA3NQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDQKICAgIGV4dHJhY3QgMTEgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiXSwgY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciA1CiAgICBifAogICAgZGlnIDQKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDRkCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgNzcgLy8gNzcKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190dXBsZV9vZl9hcmM0X3JvdXRlQDM6CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0dXBsZV9vZl9hcmM0CiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNyZWF0ZShib29sX3BhcmFtOiB1aW50NjQsIHVpbnQ2NF9wYXJhbTogdWludDY0LCBieXRlc19wYXJhbTogYnl0ZXMsIGJpZ3VpbnRfcGFyYW06IGJ5dGVzLCBzdHJpbmdfcGFyYW06IGJ5dGVzLCB0dXBsZV9wYXJhbS4wOiB1aW50NjQsIHR1cGxlX3BhcmFtLjE6IHVpbnQ2NCwgdHVwbGVfcGFyYW0uMjogYnl0ZXMsIHR1cGxlX3BhcmFtLjM6IGJ5dGVzLCB0dXBsZV9wYXJhbS40OiBieXRlcykgLT4gdWludDY0LCB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6CmNyZWF0ZToKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NS0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYm9vbF9wYXJhbTogYm9vbCwKICAgIC8vICAgICB1aW50NjRfcGFyYW06IFVJbnQ2NCwKICAgIC8vICAgICBieXRlc19wYXJhbTogQnl0ZXMsCiAgICAvLyAgICAgYmlndWludF9wYXJhbTogQmlnVUludCwKICAgIC8vICAgICBzdHJpbmdfcGFyYW06IFN0cmluZywKICAgIC8vICAgICB0dXBsZV9wYXJhbTogdHVwbGVbYm9vbCwgVUludDY0LCBCeXRlcywgQmlnVUludCwgU3RyaW5nXSwKICAgIC8vICkgLT4gdHVwbGVbYm9vbCwgVUludDY0LCBCeXRlcywgQmlnVUludCwgU3RyaW5nXToKICAgIHByb3RvIDEwIDUKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gdHVwbGVfcGFyYW0KICAgIGZyYW1lX2RpZyAtMTAKICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgIGZyYW1lX2RpZyAtOQogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtOAogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIC0yCiAgICBiPT0KICAgICYmCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIGZyYW1lX2RpZyAtMTAKICAgIGZyYW1lX2RpZyAtOQogICAgZnJhbWVfZGlnIC04CiAgICBmcmFtZV9kaWcgLTcKICAgIGZyYW1lX2RpZyAtNgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC50dXBsZV9vZl9hcmM0KGFyZ3MuMDogYnl0ZXMsIGFyZ3MuMTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKdHVwbGVfb2ZfYXJjNDoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTktMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHR1cGxlX29mX2FyYzQoCiAgICAvLyAgICAgc2VsZiwgYXJnczogdHVwbGVbYXJjNC5VSW50OCwgYXJjNC5BZGRyZXNzXQogICAgLy8gKSAtPiB0dXBsZVthcmM0LlVJbnQ4LCBhcmM0LkFkZHJlc3NdOgogICAgcHJvdG8gMiAyCiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgYXJnc1swXS5ieXRlcy5sZW5ndGggPT0gMQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXJnc1sxXS5ieXRlcy5sZW5ndGggPT0gMzIKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjI1CiAgICAvLyByZXR1cm4gYXJncwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
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..b092b842e0
--- /dev/null
+++ b/test_cases/avm_types_in_abi/out/TestContract.arc56.json
@@ -0,0 +1,153 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 53,
+ 221
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 57
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 224
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 165
+ ],
+ "errorMessage": "overflow"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDY0CiAgICBieXRlY2Jsb2NrIDB4MDAgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDcKICAgIHB1c2hieXRlc3MgMHhmYjcxNjY1MiAweDdlYTY0MDc4IC8vIG1ldGhvZCAiY3JlYXRlKGJvb2wsdWludDY0LGJ5dGVbXSx1aW50NTEyLHN0cmluZywoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSkoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSIsIG1ldGhvZCAidHVwbGVfb2ZfYXJjNCgodWludDgsYWRkcmVzcykpKHVpbnQ4LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBkaWcgMQogICAgZXh0cmFjdCAxIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA5IC8vIDkKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgcHVzaGludCA3NSAvLyA3NQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDQKICAgIGV4dHJhY3QgMTEgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiXSwgY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBkaWcgNAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciA1CiAgICBifAogICAgZGlnIDQKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDRkCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHB1c2hpbnQgNzcgLy8gNzcKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190dXBsZV9vZl9hcmM0X3JvdXRlQDM6CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0dXBsZV9vZl9hcmM0CiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNyZWF0ZShib29sX3BhcmFtOiB1aW50NjQsIHVpbnQ2NF9wYXJhbTogdWludDY0LCBieXRlc19wYXJhbTogYnl0ZXMsIGJpZ3VpbnRfcGFyYW06IGJ5dGVzLCBzdHJpbmdfcGFyYW06IGJ5dGVzLCB0dXBsZV9wYXJhbS4wOiB1aW50NjQsIHR1cGxlX3BhcmFtLjE6IHVpbnQ2NCwgdHVwbGVfcGFyYW0uMjogYnl0ZXMsIHR1cGxlX3BhcmFtLjM6IGJ5dGVzLCB0dXBsZV9wYXJhbS40OiBieXRlcykgLT4gdWludDY0LCB1aW50NjQsIGJ5dGVzLCBieXRlcywgYnl0ZXM6CmNyZWF0ZToKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NS0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYm9vbF9wYXJhbTogYm9vbCwKICAgIC8vICAgICB1aW50NjRfcGFyYW06IFVJbnQ2NCwKICAgIC8vICAgICBieXRlc19wYXJhbTogQnl0ZXMsCiAgICAvLyAgICAgYmlndWludF9wYXJhbTogQmlnVUludCwKICAgIC8vICAgICBzdHJpbmdfcGFyYW06IFN0cmluZywKICAgIC8vICAgICB0dXBsZV9wYXJhbTogdHVwbGVbYm9vbCwgVUludDY0LCBCeXRlcywgQmlnVUludCwgU3RyaW5nXSwKICAgIC8vICkgLT4gdHVwbGVbYm9vbCwgVUludDY0LCBCeXRlcywgQmlnVUludCwgU3RyaW5nXToKICAgIHByb3RvIDEwIDUKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gdHVwbGVfcGFyYW0KICAgIGZyYW1lX2RpZyAtMTAKICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgIGZyYW1lX2RpZyAtOQogICAgZnJhbWVfZGlnIC00CiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtOAogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIC0yCiAgICBiPT0KICAgICYmCiAgICBmcmFtZV9kaWcgLTYKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgICYmCiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIGZyYW1lX2RpZyAtMTAKICAgIGZyYW1lX2RpZyAtOQogICAgZnJhbWVfZGlnIC04CiAgICBmcmFtZV9kaWcgLTcKICAgIGZyYW1lX2RpZyAtNgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC50dXBsZV9vZl9hcmM0KGFyZ3MuMDogYnl0ZXMsIGFyZ3MuMTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKdHVwbGVfb2ZfYXJjNDoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MTktMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHR1cGxlX29mX2FyYzQoCiAgICAvLyAgICAgc2VsZiwgYXJnczogdHVwbGVbYXJjNC5VSW50OCwgYXJjNC5BZGRyZXNzXQogICAgLy8gKSAtPiB0dXBsZVthcmM0LlVJbnQ4LCBhcmM0LkFkZHJlc3NdOgogICAgcHJvdG8gMiAyCiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgYXJnc1swXS5ieXRlcy5sZW5ndGggPT0gMQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBhc3NlcnQgYXJnc1sxXS5ieXRlcy5sZW5ndGggPT0gMzIKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjI1CiAgICAvLyByZXR1cm4gYXJncwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiADAAFAJgIBAAQVH3x1iAABQ4oAATEbQQDbggIE+3FmUgR+pkB4NhoAjgIAAgCqIokxGRREMRgURDYaASJTNhoCFzYaA1cCADYaBDYaBVcCADYaBkkiUygiTwJUIlNLAVcBCBdLAoEJWUsDgUtZSwRPAksCUlcCAEsEVwtASwUVTwZPBE8CUlcCAIgAaigiTwZUTwQWSwQVFlcGAk8FUEsEFSQORCSvTwWrSwQVFlcGAk8FUE8ETwRQgAIATVBLAxWBTQhMTwNQTBZXBgJQTwJQTFApTFCwI4kxGRREMRhENhoBSVcAAUxXASCIADVQKUxQsCOJIomKCgWL9ov7Eov3i/wSEIv4i/0SEIv5i/6oEIv6i/8SEESL9ov3i/iL+Yv6iYoCAov+FSMSRIv/FYEgEkSL/ov/iQ==",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/avm_types_in_abi/out/TestContract.destructured.ir b/test_cases/avm_types_in_abi/out/TestContract.destructured.ir
index 6289519aa9..f6d1897305 100644
--- a/test_cases/avm_types_in_abi/out/TestContract.destructured.ir
+++ b/test_cases/avm_types_in_abi/out/TestContract.destructured.ir
@@ -15,10 +15,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@2: // create_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bool = (getbit tmp%7#0 0u)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -74,9 +74,9 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@3: // tuple_of_arc4_route_L19
let tmp%18#0: uint64 = (txn OnCompletion)
let tmp%19#0: bool = (! tmp%18#0)
- (assert tmp%19#0) // OnCompletion is NoOp
+ (assert tmp%19#0) // OnCompletion is not NoOp
let tmp%20#0: uint64 = (txn ApplicationID)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
let tmp%22#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 1) tmp%22#0) // on error: Index access is out of bounds
let item1%1#0: bytes = ((extract 1 32) tmp%22#0) // on error: Index access is out of bounds
diff --git a/test_cases/avm_types_in_abi/out/TestContract.ssa.ir b/test_cases/avm_types_in_abi/out/TestContract.ssa.ir
index 3595e70b0e..cae87c5a83 100644
--- a/test_cases/avm_types_in_abi/out/TestContract.ssa.ir
+++ b/test_cases/avm_types_in_abi/out/TestContract.ssa.ir
@@ -16,10 +16,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@2: // create_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bool = (getbit tmp%7#0 0u)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -84,10 +84,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@3: // tuple_of_arc4_route_L19
let tmp%18#0: uint64 = (txn OnCompletion)
let tmp%19#0: bool = (== tmp%18#0 NoOp)
- (assert tmp%19#0) // OnCompletion is NoOp
+ (assert tmp%19#0) // OnCompletion is not NoOp
let tmp%20#0: uint64 = (txn ApplicationID)
let tmp%21#0: bool = (!= tmp%20#0 0u)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%22#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = (extract3 tmp%22#0 0u 1u) // on error: Index access is out of bounds
let item1%1#0: bytes = (extract3 tmp%22#0 1u 32u) // on error: Index access is out of bounds
diff --git a/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_1.ir b/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_1.ir
index 6e1652e576..77dd90ca52 100644
--- a/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_1.ir
+++ b/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_1.ir
@@ -15,10 +15,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@2: // create_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bool = (getbit tmp%7#0 0u)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -76,9 +76,9 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@3: // tuple_of_arc4_route_L19
let tmp%18#0: uint64 = (txn OnCompletion)
let tmp%19#0: bool = (! tmp%18#0)
- (assert tmp%19#0) // OnCompletion is NoOp
+ (assert tmp%19#0) // OnCompletion is not NoOp
let tmp%20#0: uint64 = (txn ApplicationID)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
let tmp%22#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 1) tmp%22#0) // on error: Index access is out of bounds
let item1%1#0: bytes = ((extract 1 32) tmp%22#0) // on error: Index access is out of bounds
diff --git a/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_2.ir b/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_2.ir
index 6289519aa9..f6d1897305 100644
--- a/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_2.ir
+++ b/test_cases/avm_types_in_abi/out/TestContract.ssa.opt_pass_2.ir
@@ -15,10 +15,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@2: // create_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bool = (getbit tmp%7#0 0u)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -74,9 +74,9 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@3: // tuple_of_arc4_route_L19
let tmp%18#0: uint64 = (txn OnCompletion)
let tmp%19#0: bool = (! tmp%18#0)
- (assert tmp%19#0) // OnCompletion is NoOp
+ (assert tmp%19#0) // OnCompletion is not NoOp
let tmp%20#0: uint64 = (txn ApplicationID)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
let tmp%22#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 1) tmp%22#0) // on error: Index access is out of bounds
let item1%1#0: bytes = ((extract 1 32) tmp%22#0) // on error: Index access is out of bounds
diff --git a/test_cases/avm_types_in_abi/out_O2/TestContract.approval.teal b/test_cases/avm_types_in_abi/out_O2/TestContract.approval.teal
index ed3b263478..e5003bf0fd 100644
--- a/test_cases/avm_types_in_abi/out_O2/TestContract.approval.teal
+++ b/test_cases/avm_types_in_abi/out_O2/TestContract.approval.teal
@@ -21,10 +21,10 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
txna ApplicationArgs 1
intc_0 // 0
getbit
@@ -126,9 +126,9 @@ __puya_arc4_router___create_route@2:
__puya_arc4_router___tuple_of_arc4_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
dup
extract 0 1 // on error: Index access is out of bounds
diff --git a/test_cases/avm_types_in_abi/out_O2/TestContract.destructured.ir b/test_cases/avm_types_in_abi/out_O2/TestContract.destructured.ir
index 6289519aa9..f6d1897305 100644
--- a/test_cases/avm_types_in_abi/out_O2/TestContract.destructured.ir
+++ b/test_cases/avm_types_in_abi/out_O2/TestContract.destructured.ir
@@ -15,10 +15,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@2: // create_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bool = (getbit tmp%7#0 0u)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -74,9 +74,9 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@3: // tuple_of_arc4_route_L19
let tmp%18#0: uint64 = (txn OnCompletion)
let tmp%19#0: bool = (! tmp%18#0)
- (assert tmp%19#0) // OnCompletion is NoOp
+ (assert tmp%19#0) // OnCompletion is not NoOp
let tmp%20#0: uint64 = (txn ApplicationID)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
let tmp%22#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = ((extract 0 1) tmp%22#0) // on error: Index access is out of bounds
let item1%1#0: bytes = ((extract 1 32) tmp%22#0) // on error: Index access is out of bounds
diff --git a/test_cases/avm_types_in_abi/out_unoptimized/TestContract.approval.teal b/test_cases/avm_types_in_abi/out_unoptimized/TestContract.approval.teal
index 4dd078b437..1b5fa8b09a 100644
--- a/test_cases/avm_types_in_abi/out_unoptimized/TestContract.approval.teal
+++ b/test_cases/avm_types_in_abi/out_unoptimized/TestContract.approval.teal
@@ -29,11 +29,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
// avm_types_in_abi/contract.py:4
// class TestContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -175,11 +175,11 @@ __puya_arc4_router___tuple_of_arc4_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// avm_types_in_abi/contract.py:4
// class TestContract(arc4.ARC4Contract):
txna ApplicationArgs 1
diff --git a/test_cases/avm_types_in_abi/out_unoptimized/TestContract.destructured.ir b/test_cases/avm_types_in_abi/out_unoptimized/TestContract.destructured.ir
index 560d2aa01b..bb672be43b 100644
--- a/test_cases/avm_types_in_abi/out_unoptimized/TestContract.destructured.ir
+++ b/test_cases/avm_types_in_abi/out_unoptimized/TestContract.destructured.ir
@@ -16,10 +16,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@2: // create_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bool = (getbit tmp%7#0 0u)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -80,10 +80,10 @@ contract test_cases.avm_types_in_abi.contract.TestContract:
block@3: // tuple_of_arc4_route_L19
let tmp%18#0: uint64 = (txn OnCompletion)
let tmp%19#0: bool = (== tmp%18#0 NoOp)
- (assert tmp%19#0) // OnCompletion is NoOp
+ (assert tmp%19#0) // OnCompletion is not NoOp
let tmp%20#0: uint64 = (txn ApplicationID)
let tmp%21#0: bool = (!= tmp%20#0 0u)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%22#0: bytes = (txna ApplicationArgs 1)
let item0%1#0: bytes = (extract3 tmp%22#0 0u 1u) // on error: Index access is out of bounds
let item1%1#0: bytes = (extract3 tmp%22#0 1u 32u) // on error: Index access is out of bounds
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 7e7032760a..ac1cfc8f03 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.approval.mir b/test_cases/compile/out/Hello.approval.mir
index 7dd0ac573a..f21087581f 100644
--- a/test_cases/compile/out/Hello.approval.mir
+++ b/test_cases/compile/out/Hello.approval.mir
@@ -59,10 +59,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
// compile/apps.py:54
// class Hello(HelloBase):
txna ApplicationArgs 1 tmp%7#0
@@ -79,9 +79,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion tmp%9#0
int DeleteApplication tmp%9#0,DeleteApplication
== tmp%10#0
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID tmp%11#0
- assert // is not creating
+ assert // can only call when not creating
int 1 1
retsub 1
@@ -90,9 +90,9 @@ __puya_arc4_router___greet_route@4:
// @arc4.abimethod()
txn OnCompletion tmp%13#0
! tmp%14#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%15#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:54
// class Hello(HelloBase):
txna ApplicationArgs 1 tmp%17#0
@@ -127,7 +127,7 @@ __puya_arc4_router___update@8:
// compile/apps.py:29
// @arc4.baremethod(allow_actions=["UpdateApplication"])
txn ApplicationID tmp%21#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out/Hello.approval.teal b/test_cases/compile/out/Hello.approval.teal
index fac8cbce94..db302223b6 100644
--- a/test_cases/compile/out/Hello.approval.teal
+++ b/test_cases/compile/out/Hello.approval.teal
@@ -43,10 +43,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
// compile/apps.py:54
// class Hello(HelloBase):
txna ApplicationArgs 1
@@ -63,9 +63,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
@@ -74,9 +74,9 @@ __puya_arc4_router___greet_route@4:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:54
// class Hello(HelloBase):
txna ApplicationArgs 1
@@ -110,7 +110,7 @@ __puya_arc4_router___update@8:
// compile/apps.py:29
// @arc4.baremethod(allow_actions=["UpdateApplication"])
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out/Hello.arc32.json b/test_cases/compile/out/Hello.arc32.json
index ad12a1ba46..1001ce9425 100644
--- a/test_cases/compile/out/Hello.arc32.json
+++ b/test_cases/compile/out/Hello.arc32.json
@@ -17,7 +17,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiZ3JlZXRpbmciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIzCiAgICAvLyBzZWxmLmdyZWV0aW5nID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG8uX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHgyMGRmM2E1NCAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6MjktMzAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG8uY3JlYXRlKGdyZWV0aW5nOiBieXRlcykgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2LTU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoc2VsZiwgZ3JlZXRpbmc6IFN0cmluZykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU4CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gZ3JlZXRpbmcKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiZ3JlZXRpbmciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIzCiAgICAvLyBzZWxmLmdyZWV0aW5nID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG8uX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHgyMGRmM2E1NCAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NTQKICAgIC8vIGNsYXNzIEhlbGxvKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvLmNyZWF0ZShncmVldGluZzogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYsIGdyZWV0aW5nOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1OAogICAgLy8gc2VsZi5ncmVldGluZyA9IGdyZWV0aW5nCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
diff --git a/test_cases/compile/out/Hello.arc56.json b/test_cases/compile/out/Hello.arc56.json
new file mode 100644
index 0000000000..6b753576ba
--- /dev/null
+++ b/test_cases/compile/out/Hello.arc56.json
@@ -0,0 +1,165 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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"
+ ]
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 98
+ ],
+ "errorMessage": "OnCompletion is not DeleteApplication"
+ },
+ {
+ "pc": [
+ 77,
+ 107
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 81
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 101,
+ 110,
+ 151
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 168
+ ],
+ "errorMessage": "check self.greeting exists"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiZ3JlZXRpbmciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIzCiAgICAvLyBzZWxmLmdyZWV0aW5nID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG8uX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHgyMGRmM2E1NCAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NTQKICAgIC8vIGNsYXNzIEhlbGxvKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjU0CiAgICAvLyBjbGFzcyBIZWxsbyhIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvLmNyZWF0ZShncmVldGluZzogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYsIGdyZWV0aW5nOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1OAogICAgLy8gc2VsZi5ncmVldGluZyA9IGdyZWV0aW5nCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "byteCode": {
+ "approval": "CiACAQAmAQhncmVldGluZzEYQAADiAAEiAAJQ4oAACiAAGeJigABMRtBAF+CAwQg3zpUBCQ3jTwE0KKCADYaAI4DAAIAFQAgI4kxGRREMRgURDYaAVcCAIgAPyKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAqSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBACiL/2eJigEBIyhlRIABIFCL/1CJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/compile/out/Hello.destructured.ir b/test_cases/compile/out/Hello.destructured.ir
index 5f55bf1037..9860a08388 100644
--- a/test_cases/compile/out/Hello.destructured.ir
+++ b/test_cases/compile/out/Hello.destructured.ir
@@ -26,10 +26,10 @@ contract test_cases.compile.apps.Hello:
block@2: // create_route_L56
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
test_cases.compile.apps.Hello.create(tmp%8#0)
@@ -37,16 +37,16 @@ contract test_cases.compile.apps.Hello:
block@3: // delete_route_L25
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 DeleteApplication)
- (assert tmp%10#0) // OnCompletion is DeleteApplication
+ (assert tmp%10#0) // OnCompletion is not DeleteApplication
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = (txna ApplicationArgs 1)
let tmp%18#0: bytes = ((extract 2 0) tmp%17#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0)
@@ -62,7 +62,7 @@ contract test_cases.compile.apps.Hello:
switch tmp%20#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.Hello.create(greeting: bytes) -> void:
diff --git a/test_cases/compile/out/Hello.ssa.ir b/test_cases/compile/out/Hello.ssa.ir
index bad043f9b0..18d057532c 100644
--- a/test_cases/compile/out/Hello.ssa.ir
+++ b/test_cases/compile/out/Hello.ssa.ir
@@ -27,10 +27,10 @@ contract test_cases.compile.apps.Hello:
block@2: // create_route_L56
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
test_cases.compile.apps.Hello.create(tmp%8#0)
@@ -38,19 +38,19 @@ contract test_cases.compile.apps.Hello:
block@3: // delete_route_L25
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 DeleteApplication)
- (assert tmp%10#0) // OnCompletion is DeleteApplication
+ (assert tmp%10#0) // OnCompletion is not DeleteApplication
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (!= tmp%11#0 0u)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
test_cases.compile.apps.HelloBase.delete()
return 1u
block@4: // greet_route_L33
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (== tmp%13#0 NoOp)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (!= tmp%15#0 0u)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%17#0: bytes = (txna ApplicationArgs 1)
let tmp%18#0: bytes = ((extract 2 0) tmp%17#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0)
@@ -71,7 +71,7 @@ contract test_cases.compile.apps.Hello:
block@8: // update_L29
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
test_cases.compile.apps.HelloBase.update()
return 1u
block@9: // switch_case_default_L54
diff --git a/test_cases/compile/out/Hello.ssa.opt_pass_1.ir b/test_cases/compile/out/Hello.ssa.opt_pass_1.ir
index 5f55bf1037..9860a08388 100644
--- a/test_cases/compile/out/Hello.ssa.opt_pass_1.ir
+++ b/test_cases/compile/out/Hello.ssa.opt_pass_1.ir
@@ -26,10 +26,10 @@ contract test_cases.compile.apps.Hello:
block@2: // create_route_L56
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
test_cases.compile.apps.Hello.create(tmp%8#0)
@@ -37,16 +37,16 @@ contract test_cases.compile.apps.Hello:
block@3: // delete_route_L25
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 DeleteApplication)
- (assert tmp%10#0) // OnCompletion is DeleteApplication
+ (assert tmp%10#0) // OnCompletion is not DeleteApplication
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = (txna ApplicationArgs 1)
let tmp%18#0: bytes = ((extract 2 0) tmp%17#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0)
@@ -62,7 +62,7 @@ contract test_cases.compile.apps.Hello:
switch tmp%20#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.Hello.create(greeting: bytes) -> void:
diff --git a/test_cases/compile/out/HelloBase.approval.mir b/test_cases/compile/out/HelloBase.approval.mir
index e7dc2847d9..c80089c837 100644
--- a/test_cases/compile/out/HelloBase.approval.mir
+++ b/test_cases/compile/out/HelloBase.approval.mir
@@ -59,9 +59,9 @@ __puya_arc4_router___delete_route@2:
txn OnCompletion tmp%3#0
int DeleteApplication tmp%3#0,DeleteApplication
== tmp%4#0
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
int 1 1
retsub 1
@@ -70,9 +70,9 @@ __puya_arc4_router___greet_route@3:
// @arc4.abimethod()
txn OnCompletion tmp%7#0
! tmp%8#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%9#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:20
// class HelloBase(ARC4Contract):
txna ApplicationArgs 1 tmp%11#0
@@ -108,7 +108,7 @@ __puya_arc4_router___update@7:
// compile/apps.py:29
// @arc4.baremethod(allow_actions=["UpdateApplication"])
txn ApplicationID tmp%15#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
@@ -118,7 +118,7 @@ __puya_arc4_router___update@7:
__puya_arc4_router_____algopy_default_create@8:
txn ApplicationID tmp%17#0
! tmp%18#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/compile/out/HelloBase.approval.teal b/test_cases/compile/out/HelloBase.approval.teal
index 852236dabb..c4b95e259d 100644
--- a/test_cases/compile/out/HelloBase.approval.teal
+++ b/test_cases/compile/out/HelloBase.approval.teal
@@ -44,9 +44,9 @@ __puya_arc4_router___delete_route@2:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_1 // 1
retsub
@@ -55,9 +55,9 @@ __puya_arc4_router___greet_route@3:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:20
// class HelloBase(ARC4Contract):
txna ApplicationArgs 1
@@ -92,7 +92,7 @@ __puya_arc4_router___update@7:
// compile/apps.py:29
// @arc4.baremethod(allow_actions=["UpdateApplication"])
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
@@ -102,7 +102,7 @@ __puya_arc4_router___update@7:
__puya_arc4_router_____algopy_default_create@8:
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/compile/out/HelloBase.arc32.json b/test_cases/compile/out/HelloBase.arc32.json
index b02e06c7ca..d824be7591 100644
--- a/test_cases/compile/out/HelloBase.arc32.json
+++ b/test_cases/compile/out/HelloBase.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMgogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMwogICAgLy8gc2VsZi5ncmVldGluZyA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIwCiAgICAvLyBjbGFzcyBIZWxsb0Jhc2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdyZWV0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMAogICAgLy8gY2xhc3MgSGVsbG9CYXNlKEFSQzRDb250cmFjdCk6CiAgICBwdXNoaW50IDQgLy8gNAogICAgaW50Y18wIC8vIDAKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDgKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDg6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMgogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMwogICAgLy8gc2VsZi5ncmVldGluZyA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMAogICAgLy8gY2xhc3MgSGVsbG9CYXNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHVzaGludCA0IC8vIDQKICAgIGludGNfMCAvLyAwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVANyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA4CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVANzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAODoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
diff --git a/test_cases/compile/out/HelloBase.arc56.json b/test_cases/compile/out/HelloBase.arc56.json
new file mode 100644
index 0000000000..8b413d2d56
--- /dev/null
+++ b/test_cases/compile/out/HelloBase.arc56.json
@@ -0,0 +1,145 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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"
+ ]
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 72
+ ],
+ "errorMessage": "OnCompletion is not DeleteApplication"
+ },
+ {
+ "pc": [
+ 81
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 134
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 75,
+ 84,
+ 128
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 143
+ ],
+ "errorMessage": "check self.greeting exists"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMgogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMwogICAgLy8gc2VsZi5ncmVldGluZyA9IFN0cmluZygpCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMAogICAgLy8gY2xhc3MgSGVsbG9CYXNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgcHVzaGludCA0IC8vIDQKICAgIGludGNfMCAvLyAwCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVANyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA4CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVANzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAODoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
+ },
+ "byteCode": {
+ "approval": "CiACAAEmAQhncmVldGluZzEYQAADiAAEiAAJQ4oAACiAAGeJigABMRtBAEWCAgQkN408BNCiggA2GgCOAgACAA0iiTEZgQUSRDEYRCOJMRkURDEYRDYaAVcCAIgAK0kVFlcGAkxQgAQVH3x1TFCwI4mBBCIxGY4CAAIAByKJMRhEI4kxGBREI4mKAQEiKGVEgAEgUIv/UIk=",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/compile/out/HelloBase.destructured.ir b/test_cases/compile/out/HelloBase.destructured.ir
index c6ab9544b2..43b6feff2d 100644
--- a/test_cases/compile/out/HelloBase.destructured.ir
+++ b/test_cases/compile/out/HelloBase.destructured.ir
@@ -26,16 +26,16 @@ contract test_cases.compile.apps.HelloBase:
block@2: // delete_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 DeleteApplication)
- (assert tmp%4#0) // OnCompletion is DeleteApplication
+ (assert tmp%4#0) // OnCompletion is not DeleteApplication
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
return 1u
block@3: // greet_route_L33
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
let tmp%11#0: bytes = (txna ApplicationArgs 1)
let tmp%12#0: bytes = ((extract 2 0) tmp%11#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0)
@@ -51,12 +51,12 @@ contract test_cases.compile.apps.HelloBase:
switch tmp%14#0 {4u => block@7, 0u => block@8, * => return 0u}
block@7: // update_L29
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
return 1u
block@8: // __algopy_default_create_L1
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // is creating
+ (assert tmp%18#0) // can only call when creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out/HelloBase.ssa.ir b/test_cases/compile/out/HelloBase.ssa.ir
index 7659e2ca5a..1fb683af6a 100644
--- a/test_cases/compile/out/HelloBase.ssa.ir
+++ b/test_cases/compile/out/HelloBase.ssa.ir
@@ -27,19 +27,19 @@ contract test_cases.compile.apps.HelloBase:
block@2: // delete_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 DeleteApplication)
- (assert tmp%4#0) // OnCompletion is DeleteApplication
+ (assert tmp%4#0) // OnCompletion is not DeleteApplication
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.compile.apps.HelloBase.delete()
return 1u
block@3: // greet_route_L33
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%11#0: bytes = (txna ApplicationArgs 1)
let tmp%12#0: bytes = ((extract 2 0) tmp%11#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0)
@@ -60,13 +60,13 @@ contract test_cases.compile.apps.HelloBase:
block@7: // update_L29
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (!= tmp%15#0 0u)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
test_cases.compile.apps.HelloBase.update()
return 1u
block@8: // __algopy_default_create_L1
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (== tmp%17#0 0u)
- (assert tmp%18#0) // is creating
+ (assert tmp%18#0) // can only call when creating
test_cases.compile.apps.HelloBase.__algopy_default_create()
return 1u
block@9: // switch_case_default_L20
diff --git a/test_cases/compile/out/HelloBase.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloBase.ssa.opt_pass_1.ir
index c6ab9544b2..43b6feff2d 100644
--- a/test_cases/compile/out/HelloBase.ssa.opt_pass_1.ir
+++ b/test_cases/compile/out/HelloBase.ssa.opt_pass_1.ir
@@ -26,16 +26,16 @@ contract test_cases.compile.apps.HelloBase:
block@2: // delete_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 DeleteApplication)
- (assert tmp%4#0) // OnCompletion is DeleteApplication
+ (assert tmp%4#0) // OnCompletion is not DeleteApplication
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
return 1u
block@3: // greet_route_L33
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
let tmp%11#0: bytes = (txna ApplicationArgs 1)
let tmp%12#0: bytes = ((extract 2 0) tmp%11#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0)
@@ -51,12 +51,12 @@ contract test_cases.compile.apps.HelloBase:
switch tmp%14#0 {4u => block@7, 0u => block@8, * => return 0u}
block@7: // update_L29
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
return 1u
block@8: // __algopy_default_create_L1
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // is creating
+ (assert tmp%18#0) // can only call when creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out/HelloFactory.approval.mir b/test_cases/compile/out/HelloFactory.approval.mir
index 310bccd271..41be50ec3c 100644
--- a/test_cases/compile/out/HelloFactory.approval.mir
+++ b/test_cases/compile/out/HelloFactory.approval.mir
@@ -45,9 +45,9 @@ __puya_arc4_router___test_logicsig_route@2:
// @arc4.abimethod()
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_logicsig tmp%7#0
byte 0x151f7c75 tmp%7#0,0x151f7c75
l-load tmp%7#0 1 0x151f7c75,tmp%7#0
@@ -61,9 +61,9 @@ __puya_arc4_router___test_compile_contract_route@3:
// @arc4.abimethod()
txn OnCompletion tmp%9#0
! tmp%10#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%11#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract
int 1 1
retsub 1
@@ -73,9 +73,9 @@ __puya_arc4_router___test_compile_contract_tmpl_route@4:
// @arc4.abimethod()
txn OnCompletion tmp%13#0
! tmp%14#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%15#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_tmpl
int 1 1
retsub 1
@@ -85,9 +85,9 @@ __puya_arc4_router___test_compile_contract_prfx_route@5:
// @arc4.abimethod()
txn OnCompletion tmp%17#0
! tmp%18#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%19#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_prfx
int 1 1
retsub 1
@@ -97,9 +97,9 @@ __puya_arc4_router___test_compile_contract_large_route@6:
// @arc4.abimethod()
txn OnCompletion tmp%21#0
! tmp%22#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%23#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_large
int 1 1
retsub 1
@@ -109,9 +109,9 @@ __puya_arc4_router___test_arc4_create_route@7:
// @arc4.abimethod()
txn OnCompletion tmp%25#0
! tmp%26#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%27#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create
int 1 1
retsub 1
@@ -121,9 +121,9 @@ __puya_arc4_router___test_arc4_create_tmpl_route@8:
// @arc4.abimethod()
txn OnCompletion tmp%29#0
! tmp%30#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%31#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_tmpl
int 1 1
retsub 1
@@ -133,9 +133,9 @@ __puya_arc4_router___test_arc4_create_prfx_route@9:
// @arc4.abimethod()
txn OnCompletion tmp%33#0
! tmp%34#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%35#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_prfx
int 1 1
retsub 1
@@ -145,9 +145,9 @@ __puya_arc4_router___test_arc4_create_large_route@10:
// @arc4.abimethod()
txn OnCompletion tmp%37#0
! tmp%38#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%39#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_large
int 1 1
retsub 1
@@ -157,9 +157,9 @@ __puya_arc4_router___test_arc4_create_modified_compiled_route@11:
// @arc4.abimethod()
txn OnCompletion tmp%41#0
! tmp%42#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%43#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_modified_compiled
int 1 1
retsub 1
@@ -169,9 +169,9 @@ __puya_arc4_router___test_arc4_update_route@12:
// @arc4.abimethod()
txn OnCompletion tmp%45#0
! tmp%46#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%47#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_update
int 1 1
retsub 1
@@ -181,9 +181,9 @@ __puya_arc4_router___test_other_constants_route@13:
// @arc4.abimethod()
txn OnCompletion tmp%49#0
! tmp%50#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%51#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_other_constants
int 1 1
retsub 1
@@ -193,9 +193,9 @@ __puya_arc4_router___test_abi_call_create_params_route@14:
// @arc4.abimethod()
txn OnCompletion tmp%53#0
! tmp%54#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%55#0
- assert // is not creating
+ assert // can only call when not creating
callsub test_abi_call_create_params
int 1 1
retsub 1
@@ -210,7 +210,7 @@ __puya_arc4_router___bare_routing@17:
__puya_arc4_router_____algopy_default_create@18:
txn ApplicationID tmp%58#0
! tmp%59#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/compile/out/HelloFactory.approval.teal b/test_cases/compile/out/HelloFactory.approval.teal
index c6b12da303..8fae71bae6 100644
--- a/test_cases/compile/out/HelloFactory.approval.teal
+++ b/test_cases/compile/out/HelloFactory.approval.teal
@@ -25,9 +25,9 @@ __puya_arc4_router___test_logicsig_route@2:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_logicsig
bytec_0 // 0x151f7c75
swap
@@ -41,9 +41,9 @@ __puya_arc4_router___test_compile_contract_route@3:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract
intc_2 // 1
retsub
@@ -53,9 +53,9 @@ __puya_arc4_router___test_compile_contract_tmpl_route@4:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_tmpl
intc_2 // 1
retsub
@@ -65,9 +65,9 @@ __puya_arc4_router___test_compile_contract_prfx_route@5:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_prfx
intc_2 // 1
retsub
@@ -77,9 +77,9 @@ __puya_arc4_router___test_compile_contract_large_route@6:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_large
intc_2 // 1
retsub
@@ -89,9 +89,9 @@ __puya_arc4_router___test_arc4_create_route@7:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create
intc_2 // 1
retsub
@@ -101,9 +101,9 @@ __puya_arc4_router___test_arc4_create_tmpl_route@8:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_tmpl
intc_2 // 1
retsub
@@ -113,9 +113,9 @@ __puya_arc4_router___test_arc4_create_prfx_route@9:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_prfx
intc_2 // 1
retsub
@@ -125,9 +125,9 @@ __puya_arc4_router___test_arc4_create_large_route@10:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_large
intc_2 // 1
retsub
@@ -137,9 +137,9 @@ __puya_arc4_router___test_arc4_create_modified_compiled_route@11:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_modified_compiled
intc_2 // 1
retsub
@@ -149,9 +149,9 @@ __puya_arc4_router___test_arc4_update_route@12:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_update
intc_2 // 1
retsub
@@ -161,9 +161,9 @@ __puya_arc4_router___test_other_constants_route@13:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_other_constants
intc_2 // 1
retsub
@@ -173,9 +173,9 @@ __puya_arc4_router___test_abi_call_create_params_route@14:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_abi_call_create_params
intc_2 // 1
retsub
@@ -187,7 +187,7 @@ __puya_arc4_router___bare_routing@17:
bnz __puya_arc4_router___after_if_else@21
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_2 // 1
retsub
diff --git a/test_cases/compile/out/HelloFactory.arc32.json b/test_cases/compile/out/HelloFactory.arc32.json
index 93f68ee984..0f13d329c5 100644
--- a/test_cases/compile/out/HelloFactory.arc32.json
+++ b/test_cases/compile/out/HelloFactory.arc32.json
@@ -67,7 +67,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDYgMSA1CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgYmFzZTY0KENvRUJRdz09KSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgMHgwMDA1Nzc2ZjcyNmM2NCBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opIDB4NGM1YzYxYmEgMHgyMGRmM2E1NCAweDAwMDU3NDY4NjU3MjY1IGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KSAweDAwMDU2ODY1NmM2YzZmIGJhc2U2NChDaUFDQVFDSUFBRkRpZ0FCTVJ0QkFEaUNBZ1QxNVAxTkJDUTNqVHcyR2dDT0FnQUNBQmdqaVRFWkZFUXhHRVNJQUNRV2dBUVZIM3gxVEZDd0lva3hHWUVGRWtReEdFUWlpVEVaUUFBR01SZ1VSQ0tKSTRtS0FBR0lBQUlWaVlvQUFZQ0FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkgMHhmNWU0ZmQ0ZCAweDAwMDM2ODY1NzkgImhleSB0aGVyZSIgImhpIHRoZXJlIgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg2MGZmYTI5NSAweDJhMTc5OTVjIDB4ZWJhNzQyZWEgMHgzMzVhNjQzOCAweDAyOTQ3Y2EyIDB4YWUxZWU4NDAgMHg3YjkwNzNmNSAweDg1NGE2OGNhIDB4MWRhMDA0YTEgMHhjMTk5NWFiZCAweDdmNGU3NWY1IDB4MDE5NjU5MzcgMHg3ZmJmOGNjYSAvLyBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV90bXBsX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2xvZ2ljc2lnX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbG9naWNzaWcKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3QKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQ6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeF9yb3V0ZUA1OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlX3JvdXRlQDY6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfcm91dGVANzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfdG1wbF9yb3V0ZUA4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcmM0X2NyZWF0ZV90bXBsCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3ByZnhfcm91dGVAOToKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfcHJmeAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWRfcm91dGVAMTE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfdXBkYXRlX3JvdXRlQDEyOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcmM0X3VwZGF0ZQogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2xvZ2ljc2lnKCkgLT4gYnl0ZXM6CnRlc3RfbG9naWNzaWc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9sb2dpY3NpZyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhjb21waWxlX2xvZ2ljc2lnKGFsd2F5c19hcHByb3ZlX3NpZykuYWNjb3VudCkKICAgIHB1c2hieXRlcyBiYXNlMzIoVTNaWEVVTkZSU1VEUFBORkM2VTdPQllPNFM0QVVPRVA0UkRCSTIzTDJRNVRYM0s1TFRTUSkgLy8gYWRkciBVM1pYRVVORlJTVURQUE5GQzZVN09CWU80UzRBVU9FUDRSREJJMjNMMlE1VFgzSzVMVFNWV1FPS0ZNCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0KCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYtNDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoc3RyaW5nKXZvaWQiKSwgYXJjNC5TdHJpbmcoImhlbGxvIikpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz0xLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NDAKICAgIC8vIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMzLTM0CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICBieXRlYyA3IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDEwIC8vIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM2LTQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNi00MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0OAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTQ3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUxCiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU3CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTYKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1My01NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2MAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGVsbG8gd29ybGQiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjItNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjYKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IGdyZWV0aW5nfSkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjkKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgYnl0ZWMgNiAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODMKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04MgogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4NgogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5MgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkxCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODgtODkKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTUKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB3b3JsZCIKICAgIHB1c2hieXRlcyAweDAwMDk2ODY1NzkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3LTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQtMTEwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTktMTAyCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1ByZngsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygiaGkiKX0sIHRlbXBsYXRlX3ZhcnNfcHJlZml4PSJQUkZYXyIKICAgIC8vICkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ2lBQ0FRQW1BZ2huY21WbGRHbHVad0pvYVRFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNQogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNC0xMTAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTA0LTExMQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE2CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA0IC8vIDB4MDAwNTc3NmY3MjZjNjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExNQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTQtMTE4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExOQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHdvcmxkIgogICAgcHVzaGJ5dGVzIDB4MDAwODY4NjkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2U6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMwLTEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNS0xNDEKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMyLTEzMwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoTGFyZ2VQcm9ncmFtKQogICAgcHVzaGludCAyIC8vIDIKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMSAvLyBiYXNlNjQoQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDEyIC8vIGJhc2U2NChBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRfYmlnX2J5dGVzX2xlbmd0aCgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDUtMTQ2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUwCiAgICAvLyByZXN1bHQgPSBhcmM0LlVJbnQ2NC5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU1CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1MwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1OQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAxMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGUoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2MS0xNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYzLTE2NAogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKEhlbGxvLmNyZWF0ZSwgImhlbGxvIikuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDUgLy8gYmFzZTY0KENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUFFaUFBSlE0b0FBQ2lBQUdlSmlnQUJNUnRCQUYrQ0F3UWczenBVQkNRM2pUd0UwS0tDQURZYUFJNERBQUlBRlFBZ0k0a3hHUlJFTVJnVVJEWWFBVmNDQUlnQVB5S0pNUm1CQlJKRU1SaEVJb2t4R1JSRU1SaEVOaG9CVndJQWlBQXFTUlVXVndZQ1RGQ0FCQlVmZkhWTVVMQWlpWUVFTVJtT0FRQUNJNGt4R0VRaWlZb0JBQ2lMLzJlSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDAwMDU2ODY1NmM2YzZmCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjYtMTY3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjktMTc0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhlbGxvIHdvcmxkIgogICAgcHVzaGJ5dGVzICJoZWxsbyB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc4LTE3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODAtMTgxCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygidG1wbDIiKX0pCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA5IC8vIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODctMTg4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9UbXBsLmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTkwLTE5NQogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1RtcGwuZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5NwogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAidG1wbDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInRtcGwyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfcHJmeDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTktMjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfcHJmeChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjA1LTIwOAogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1ByZnguY3JlYXRlLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwMS0yMDQKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvUHJmeCwgdGVtcGxhdGVfdmFyc19wcmVmaXg9IlBSRlhfIiwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJwcmZ4MiIpfQogICAgLy8gKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3VndjbVo0TWpFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNS0yMDgKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMTAtMjExCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9QcmZ4LmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjEzLTIxOAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1ByZnguZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAicHJmeDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInByZngyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMi0yMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI0LTIyNQogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKExhcmdlUHJvZ3JhbSkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMTEgLy8gYmFzZTY0KENpQUNBUUNJQUFGRGlnQUJNUnRCQURpQ0FnVDE1UDFOQkNRM2pUdzJHZ0NPQWdBQ0FCZ2ppVEVaRkVReEdFU0lBQ1FXZ0FRVkgzeDFURkN3SW9reEdZRUZFa1F4R0VRaWlURVpRQUFHTVJnVVJDS0pJNG1LQUFHSUFBSVZpWW9BQVlDQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMiAvLyBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI3LTIyOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExhcmdlUHJvZ3JhbS5nZXRfYmlnX2J5dGVzX2xlbmd0aCwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyOQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoaW50IDQwOTYgLy8gNDA5NgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzMS0yMzUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTGFyZ2VQcm9ncmFtLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZV9tb2RpZmllZF9jb21waWxlZCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQ6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3LTIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MQogICAgLy8gbG9jYWxfdWludHM9VUludDY0KDMpLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgTG9jYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQzCiAgICAvLyBsb2NhbF9ieXRlcz1VSW50NjQoNSksCiAgICBpbnRjXzMgLy8gNQogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MgogICAgLy8gZ2xvYmFsX3VpbnRzPVVJbnQ2NCg0KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDQKICAgIC8vIGdsb2JhbF9ieXRlcz1VSW50NjQoNiksCiAgICBpbnRjXzEgLy8gNgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzkKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ4CiAgICAvLyBTdHJpbmcoImhleSIpLAogICAgYnl0ZWMgMTQgLy8gMHgwMDAzNjg2NTc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0Ni0yNTAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG8uY3JlYXRlLAogICAgLy8gICAgIFN0cmluZygiaGV5IiksCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1MgogICAgLy8gYXNzZXJ0IGFwcC5sb2NhbF9udW1fdWludCA9PSAzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTMKICAgIC8vIGFzc2VydCBhcHAuZ2xvYmFsX251bV91aW50ID09IDQKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTQKICAgIC8vIGFzc2VydCBhcHAubG9jYWxfbnVtX2J5dGVzID09IDUKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU1CiAgICAvLyBhc3NlcnQgYXBwLmdsb2JhbF9udW1fYnl0ZXMgPT0gNgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMSAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU3CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDggLy8gMHgwMDA1NzQ2ODY1NzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZXkgdGhlcmUiCiAgICBieXRlYyAxNSAvLyAiaGV5IHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2MS0yNjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoSGVsbG8uZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X3VwZGF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF91cGRhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0LTI2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzYKICAgIC8vIGxvY2FsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzUKICAgIC8vIGxvY2FsX2J5dGVzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MwogICAgLy8gZ2xvYmFsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjc0CiAgICAvLyBnbG9iYWxfYnl0ZXM9MiwKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MgogICAgLy8gZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjktMjc3CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyApLAogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY4CiAgICAvLyBIZWxsb1RtcGwsCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjgwLTI4MQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgInRoZXJlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4MgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlYyAxNiAvLyAiaGkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg0LTI4NQogICAgLy8gIyB1cGRhdGUgdGhlIGFwcAogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZShIZWxsbywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4Ny0yODgKICAgIC8vICMgY2FsbCB0aGUgdXBkYXRlZCBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODkKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHRoZXJlIgogICAgYnl0ZWMgMTYgLy8gImhpIHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5MS0yOTYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3Rfb3RoZXJfY29uc3RhbnRzKCkgLT4gdm9pZDoKdGVzdF9vdGhlcl9jb25zdGFudHM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk4LTI5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X290aGVyX2NvbnN0YW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAyLTMxMgogICAgLy8gY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgIH0sCiAgICAvLyApLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQUFFbUNRTnVkVzBJWjNKbFpYUnBibWNIWVdSa2NtVnpjd1p0WlhSb2IyUUVGUjk4ZFFSMGJYQnNBVUlnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQURFWVFBQURpQUFFaUFBVlE0b0FBQ2tuQldjb0p3Wm5LaWNIWnlzbkNHZUppZ0FCTVJ0QkFGdUNBd1RaS0ZwMEJDUTNqVHdFV3d3amRUWWFBSTREQUFJQUZRQWdJb2t4R1JSRU1SZ1VSSWdBTkJZbkJFeFFzQ09KTVJtQkJSSkVNUmhFSTRreEdSUkVNUmhFTmhvQlZ3SUFpQUFXU1JVV1Z3WUNURkFuQkV4UXNDT0pJb21LQUFFamlZb0JBU0lvWlVTQUFUQ2dGU01KSWlobFJJQUJNS0JMQVNNSVRFNENVaUlwWlVTQUFTQlFpLzlRVEZBaUttVkVVQ0lyWlVSUWlRPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAxCiAgICAvLyBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgcHVzaGJ5dGVzIDB4ZDkyODVhNzQgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxNQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb090aGVyQ29uc3RhbnRzLmdyZWV0LCAiSm9obm55IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg1YjBjMjM3NSAvLyBtZXRob2QgImdyZWV0KHN0cmluZylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjRhNmY2ODZlNmU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE4CiAgICAvLyBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICBwdXNoYnl0ZXNzIGJhc2UzMihOQlNXWTNEUEVCRkc2MkRPTlo0VEtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIDB4NDBlMzM1MzIgLy8gYmFzZTMyKE5CU1dZM0RQRUJGRzYyRE9OWjRUS0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSksIG1ldGhvZCAic29tZXRoaW5nKCl2b2lkIgogICAgY29uY2F0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE3LTMxOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAoCiAgICAvLyAgICAgYiJoZWxsbyBKb2hubnk1IiArIEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMgKyBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKQogICAgPT0KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjEtMzIyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCkgLT4gdm9pZDoKdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNC0zMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNgogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgNSAvLyBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzI3LTMzNwogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyOQogICAgLy8gU3RyaW5nKCJoZXkiKSwKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMzY4NjU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMzkKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNDEKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB0aGVyZSIKICAgIGJ5dGVjIDE1IC8vICJoZXkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzQzLTM0NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbChIZWxsby5kZWxldGUsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1Ygo=",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDYgMSA1CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgYmFzZTY0KENvRUJRdz09KSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgMHgwMDA1Nzc2ZjcyNmM2NCBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opIDB4NGM1YzYxYmEgMHgyMGRmM2E1NCAweDAwMDU3NDY4NjU3MjY1IGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KSAweDAwMDU2ODY1NmM2YzZmIGJhc2U2NChDaUFDQVFDSUFBRkRpZ0FCTVJ0QkFEaUNBZ1QxNVAxTkJDUTNqVHcyR2dDT0FnQUNBQmdqaVRFWkZFUXhHRVNJQUNRV2dBUVZIM3gxVEZDd0lva3hHWUVGRWtReEdFUWlpVEVaUUFBR01SZ1VSQ0tKSTRtS0FBR0lBQUlWaVlvQUFZQ0FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkgMHhmNWU0ZmQ0ZCAweDAwMDM2ODY1NzkgImhleSB0aGVyZSIgImhpIHRoZXJlIgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg2MGZmYTI5NSAweDJhMTc5OTVjIDB4ZWJhNzQyZWEgMHgzMzVhNjQzOCAweDAyOTQ3Y2EyIDB4YWUxZWU4NDAgMHg3YjkwNzNmNSAweDg1NGE2OGNhIDB4MWRhMDA0YTEgMHhjMTk5NWFiZCAweDdmNGU3NWY1IDB4MDE5NjU5MzcgMHg3ZmJmOGNjYSAvLyBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV90bXBsX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2xvZ2ljc2lnX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9sb2dpY3NpZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeF9yb3V0ZUA1OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANjoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfdG1wbF9yb3V0ZUA4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfcHJmeF9yb3V0ZUA5OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3ByZngKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbGFyZ2Vfcm91dGVAMTA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWRfcm91dGVAMTE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF91cGRhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfb3RoZXJfY29uc3RhbnRzX3JvdXRlQDEzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FiaV9jYWxsX2NyZWF0ZV9wYXJhbXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2xvZ2ljc2lnKCkgLT4gYnl0ZXM6CnRlc3RfbG9naWNzaWc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9sb2dpY3NpZyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhjb21waWxlX2xvZ2ljc2lnKGFsd2F5c19hcHByb3ZlX3NpZykuYWNjb3VudCkKICAgIHB1c2hieXRlcyBiYXNlMzIoVTNaWEVVTkZSU1VEUFBORkM2VTdPQllPNFM0QVVPRVA0UkRCSTIzTDJRNVRYM0s1TFRTUSkgLy8gYWRkciBVM1pYRVVORlJTVURQUE5GQzZVN09CWU80UzRBVU9FUDRSREJJMjNMMlE1VFgzSzVMVFNWV1FPS0ZNCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0KCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYtNDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoc3RyaW5nKXZvaWQiKSwgYXJjNC5TdHJpbmcoImhlbGxvIikpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz0xLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NDAKICAgIC8vIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMzLTM0CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICBieXRlYyA3IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDEwIC8vIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM2LTQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNi00MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0OAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTQ3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUxCiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU3CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTYKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1My01NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2MAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGVsbG8gd29ybGQiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjItNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjYKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IGdyZWV0aW5nfSkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjkKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgYnl0ZWMgNiAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODMKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04MgogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4NgogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5MgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkxCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODgtODkKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTUKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB3b3JsZCIKICAgIHB1c2hieXRlcyAweDAwMDk2ODY1NzkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3LTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQtMTEwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTktMTAyCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1ByZngsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygiaGkiKX0sIHRlbXBsYXRlX3ZhcnNfcHJlZml4PSJQUkZYXyIKICAgIC8vICkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ2lBQ0FRQW1BZ2huY21WbGRHbHVad0pvYVRFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNQogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNC0xMTAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTA0LTExMQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE2CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA0IC8vIDB4MDAwNTc3NmY3MjZjNjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExNQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTQtMTE4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExOQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHdvcmxkIgogICAgcHVzaGJ5dGVzIDB4MDAwODY4NjkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2U6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMwLTEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNS0xNDEKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMyLTEzMwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoTGFyZ2VQcm9ncmFtKQogICAgcHVzaGludCAyIC8vIDIKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMSAvLyBiYXNlNjQoQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDEyIC8vIGJhc2U2NChBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRfYmlnX2J5dGVzX2xlbmd0aCgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDUtMTQ2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUwCiAgICAvLyByZXN1bHQgPSBhcmM0LlVJbnQ2NC5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU1CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1MwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1OQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAxMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGUoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2MS0xNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYzLTE2NAogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKEhlbGxvLmNyZWF0ZSwgImhlbGxvIikuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDUgLy8gYmFzZTY0KENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUFFaUFBSlE0b0FBQ2lBQUdlSmlnQUJNUnRCQUYrQ0F3UWczenBVQkNRM2pUd0UwS0tDQURZYUFJNERBQUlBRlFBZ0k0a3hHUlJFTVJnVVJEWWFBVmNDQUlnQVB5S0pNUm1CQlJKRU1SaEVJb2t4R1JSRU1SaEVOaG9CVndJQWlBQXFTUlVXVndZQ1RGQ0FCQlVmZkhWTVVMQWlpWUVFTVJtT0FRQUNJNGt4R0VRaWlZb0JBQ2lMLzJlSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDAwMDU2ODY1NmM2YzZmCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjYtMTY3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjktMTc0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhlbGxvIHdvcmxkIgogICAgcHVzaGJ5dGVzICJoZWxsbyB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc4LTE3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODAtMTgxCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygidG1wbDIiKX0pCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA5IC8vIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODctMTg4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9UbXBsLmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTkwLTE5NQogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1RtcGwuZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5NwogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAidG1wbDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInRtcGwyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfcHJmeDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTktMjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfcHJmeChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjA1LTIwOAogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1ByZnguY3JlYXRlLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwMS0yMDQKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvUHJmeCwgdGVtcGxhdGVfdmFyc19wcmVmaXg9IlBSRlhfIiwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJwcmZ4MiIpfQogICAgLy8gKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3VndjbVo0TWpFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNS0yMDgKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMTAtMjExCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9QcmZ4LmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjEzLTIxOAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1ByZnguZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAicHJmeDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInByZngyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMi0yMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI0LTIyNQogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKExhcmdlUHJvZ3JhbSkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMTEgLy8gYmFzZTY0KENpQUNBUUNJQUFGRGlnQUJNUnRCQURpQ0FnVDE1UDFOQkNRM2pUdzJHZ0NPQWdBQ0FCZ2ppVEVaRkVReEdFU0lBQ1FXZ0FRVkgzeDFURkN3SW9reEdZRUZFa1F4R0VRaWlURVpRQUFHTVJnVVJDS0pJNG1LQUFHSUFBSVZpWW9BQVlDQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMiAvLyBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI3LTIyOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExhcmdlUHJvZ3JhbS5nZXRfYmlnX2J5dGVzX2xlbmd0aCwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyOQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoaW50IDQwOTYgLy8gNDA5NgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzMS0yMzUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTGFyZ2VQcm9ncmFtLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZV9tb2RpZmllZF9jb21waWxlZCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQ6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3LTIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MQogICAgLy8gbG9jYWxfdWludHM9VUludDY0KDMpLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgTG9jYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQzCiAgICAvLyBsb2NhbF9ieXRlcz1VSW50NjQoNSksCiAgICBpbnRjXzMgLy8gNQogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MgogICAgLy8gZ2xvYmFsX3VpbnRzPVVJbnQ2NCg0KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDQKICAgIC8vIGdsb2JhbF9ieXRlcz1VSW50NjQoNiksCiAgICBpbnRjXzEgLy8gNgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzkKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ4CiAgICAvLyBTdHJpbmcoImhleSIpLAogICAgYnl0ZWMgMTQgLy8gMHgwMDAzNjg2NTc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0Ni0yNTAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG8uY3JlYXRlLAogICAgLy8gICAgIFN0cmluZygiaGV5IiksCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1MgogICAgLy8gYXNzZXJ0IGFwcC5sb2NhbF9udW1fdWludCA9PSAzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTMKICAgIC8vIGFzc2VydCBhcHAuZ2xvYmFsX251bV91aW50ID09IDQKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTQKICAgIC8vIGFzc2VydCBhcHAubG9jYWxfbnVtX2J5dGVzID09IDUKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU1CiAgICAvLyBhc3NlcnQgYXBwLmdsb2JhbF9udW1fYnl0ZXMgPT0gNgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMSAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU3CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDggLy8gMHgwMDA1NzQ2ODY1NzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZXkgdGhlcmUiCiAgICBieXRlYyAxNSAvLyAiaGV5IHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2MS0yNjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoSGVsbG8uZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X3VwZGF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF91cGRhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0LTI2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzYKICAgIC8vIGxvY2FsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzUKICAgIC8vIGxvY2FsX2J5dGVzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MwogICAgLy8gZ2xvYmFsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjc0CiAgICAvLyBnbG9iYWxfYnl0ZXM9MiwKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MgogICAgLy8gZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjktMjc3CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyApLAogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY4CiAgICAvLyBIZWxsb1RtcGwsCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjgwLTI4MQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgInRoZXJlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4MgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlYyAxNiAvLyAiaGkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg0LTI4NQogICAgLy8gIyB1cGRhdGUgdGhlIGFwcAogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZShIZWxsbywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4Ny0yODgKICAgIC8vICMgY2FsbCB0aGUgdXBkYXRlZCBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODkKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHRoZXJlIgogICAgYnl0ZWMgMTYgLy8gImhpIHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5MS0yOTYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3Rfb3RoZXJfY29uc3RhbnRzKCkgLT4gdm9pZDoKdGVzdF9vdGhlcl9jb25zdGFudHM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk4LTI5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X290aGVyX2NvbnN0YW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAyLTMxMgogICAgLy8gY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgIH0sCiAgICAvLyApLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQUFFbUNRTnVkVzBJWjNKbFpYUnBibWNIWVdSa2NtVnpjd1p0WlhSb2IyUUVGUjk4ZFFSMGJYQnNBVUlnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQURFWVFBQURpQUFFaUFBVlE0b0FBQ2tuQldjb0p3Wm5LaWNIWnlzbkNHZUppZ0FCTVJ0QkFGdUNBd1RaS0ZwMEJDUTNqVHdFV3d3amRUWWFBSTREQUFJQUZRQWdJb2t4R1JSRU1SZ1VSSWdBTkJZbkJFeFFzQ09KTVJtQkJSSkVNUmhFSTRreEdSUkVNUmhFTmhvQlZ3SUFpQUFXU1JVV1Z3WUNURkFuQkV4UXNDT0pJb21LQUFFamlZb0JBU0lvWlVTQUFUQ2dGU01KSWlobFJJQUJNS0JMQVNNSVRFNENVaUlwWlVTQUFTQlFpLzlRVEZBaUttVkVVQ0lyWlVSUWlRPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAxCiAgICAvLyBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgcHVzaGJ5dGVzIDB4ZDkyODVhNzQgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxNQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb090aGVyQ29uc3RhbnRzLmdyZWV0LCAiSm9obm55IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg1YjBjMjM3NSAvLyBtZXRob2QgImdyZWV0KHN0cmluZylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjRhNmY2ODZlNmU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE4CiAgICAvLyBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICBwdXNoYnl0ZXNzIGJhc2UzMihOQlNXWTNEUEVCRkc2MkRPTlo0VEtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIDB4NDBlMzM1MzIgLy8gYmFzZTMyKE5CU1dZM0RQRUJGRzYyRE9OWjRUS0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSksIG1ldGhvZCAic29tZXRoaW5nKCl2b2lkIgogICAgY29uY2F0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE3LTMxOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAoCiAgICAvLyAgICAgYiJoZWxsbyBKb2hubnk1IiArIEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMgKyBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKQogICAgPT0KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjEtMzIyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCkgLT4gdm9pZDoKdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNC0zMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNgogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgNSAvLyBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzI3LTMzNwogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyOQogICAgLy8gU3RyaW5nKCJoZXkiKSwKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMzY4NjU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMzkKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNDEKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB0aGVyZSIKICAgIGJ5dGVjIDE1IC8vICJoZXkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzQzLTM0NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbChIZWxsby5kZWxldGUsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
diff --git a/test_cases/compile/out/HelloFactory.arc56.json b/test_cases/compile/out/HelloFactory.arc56.json
new file mode 100644
index 0000000000..62f3ad9739
--- /dev/null
+++ b/test_cases/compile/out/HelloFactory.arc56.json
@@ -0,0 +1,345 @@
+{
+ "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_create_modified_compiled",
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 5022,
+ 5115,
+ 5369,
+ 5457,
+ 5549,
+ 5643,
+ 5903,
+ 5995,
+ 6121,
+ 6219,
+ 6279,
+ 6657,
+ 6795
+ ],
+ "errorMessage": "ARC4 prefix is valid"
+ },
+ {
+ "pc": [
+ 4753,
+ 4769,
+ 4781,
+ 4793,
+ 4805,
+ 4817,
+ 4829,
+ 4841,
+ 4853,
+ 4865,
+ 4877,
+ 4889,
+ 4901
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 6064,
+ 6072,
+ 6080,
+ 6087
+ ],
+ "errorMessage": "application exists"
+ },
+ {
+ "pc": [
+ 4918
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 4756,
+ 4772,
+ 4784,
+ 4796,
+ 4808,
+ 4820,
+ 4832,
+ 4844,
+ 4856,
+ 4868,
+ 4880,
+ 4892,
+ 4904
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDYgMSA1CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgYmFzZTY0KENvRUJRdz09KSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgMHgwMDA1Nzc2ZjcyNmM2NCBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opIDB4NGM1YzYxYmEgMHgyMGRmM2E1NCAweDAwMDU3NDY4NjU3MjY1IGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KSAweDAwMDU2ODY1NmM2YzZmIGJhc2U2NChDaUFDQVFDSUFBRkRpZ0FCTVJ0QkFEaUNBZ1QxNVAxTkJDUTNqVHcyR2dDT0FnQUNBQmdqaVRFWkZFUXhHRVNJQUNRV2dBUVZIM3gxVEZDd0lva3hHWUVGRWtReEdFUWlpVEVaUUFBR01SZ1VSQ0tKSTRtS0FBR0lBQUlWaVlvQUFZQ0FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkgMHhmNWU0ZmQ0ZCAweDAwMDM2ODY1NzkgImhleSB0aGVyZSIgImhpIHRoZXJlIgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTcKICAgIHB1c2hieXRlc3MgMHg2MGZmYTI5NSAweDJhMTc5OTVjIDB4ZWJhNzQyZWEgMHgzMzVhNjQzOCAweDAyOTQ3Y2EyIDB4YWUxZWU4NDAgMHg3YjkwNzNmNSAweDg1NGE2OGNhIDB4MWRhMDA0YTEgMHhjMTk5NWFiZCAweDdmNGU3NWY1IDB4MDE5NjU5MzcgMHg3ZmJmOGNjYSAvLyBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV90bXBsX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2xvZ2ljc2lnX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9sb2dpY3NpZwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeF9yb3V0ZUA1OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANjoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfdG1wbF9yb3V0ZUA4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfcHJmeF9yb3V0ZUA5OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3ByZngKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbGFyZ2Vfcm91dGVAMTA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWRfcm91dGVAMTE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF91cGRhdGVfcm91dGVAMTI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF91cGRhdGUKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfb3RoZXJfY29uc3RhbnRzX3JvdXRlQDEzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDE0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FiaV9jYWxsX2NyZWF0ZV9wYXJhbXMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNQogICAgLy8gY2xhc3MgSGVsbG9GYWN0b3J5KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2xvZ2ljc2lnKCkgLT4gYnl0ZXM6CnRlc3RfbG9naWNzaWc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9sb2dpY3NpZyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOQogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhjb21waWxlX2xvZ2ljc2lnKGFsd2F5c19hcHByb3ZlX3NpZykuYWNjb3VudCkKICAgIHB1c2hieXRlcyBiYXNlMzIoVTNaWEVVTkZSU1VEUFBORkM2VTdPQllPNFM0QVVPRVA0UkRCSTIzTDJRNVRYM0s1TFRTUSkgLy8gYWRkciBVM1pYRVVORlJTVURQUE5GQzZVN09CWU80UzRBVU9FUDRSREJJMjNMMlE1VFgzSzVMVFNWV1FPS0ZNCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0KCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYtNDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoc3RyaW5nKXZvaWQiKSwgYXJjNC5TdHJpbmcoImhlbGxvIikpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz0xLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NDAKICAgIC8vIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMzLTM0CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICBieXRlYyA3IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDEwIC8vIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzYKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM2LTQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNi00MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0OAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTQ3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ2LTUwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUxCiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU3CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTYKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1My01NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTMtNTgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo2MAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGVsbG8gd29ybGQiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjItNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjYKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IGdyZWV0aW5nfSkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjkKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgYnl0ZWMgNiAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY4LTc4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODMKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04MgogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MS04NQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4NgogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5MgogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkxCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODgtODkKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg4LTkzCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTUKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB3b3JsZCIKICAgIHB1c2hieXRlcyAweDAwMDk2ODY1NzkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk3LTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQtMTEwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTktMTAyCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1ByZngsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygiaGkiKX0sIHRlbXBsYXRlX3ZhcnNfcHJlZml4PSJQUkZYXyIKICAgIC8vICkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ2lBQ0FRQW1BZ2huY21WbGRHbHVad0pvYVRFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNQogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNC0xMTAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTA0LTExMQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE2CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA0IC8vIDB4MDAwNTc3NmY3MjZjNjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE0LTExNQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTQtMTE4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExOQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMS0xMjYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjgKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHdvcmxkIgogICAgcHVzaGJ5dGVzIDB4MDAwODY4NjkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2U6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMwLTEzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNS0xNDEKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMyLTEzMwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoTGFyZ2VQcm9ncmFtKQogICAgcHVzaGludCAyIC8vIDIKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMSAvLyBiYXNlNjQoQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDEyIC8vIGJhc2U2NChBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM1LTE0MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRfYmlnX2J5dGVzX2xlbmd0aCgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDUtMTQ2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NS0xNDkKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUwCiAgICAvLyByZXN1bHQgPSBhcmM0LlVJbnQ2NC5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU1CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1MwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUyLTE1NwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1OQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAxMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGUoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2MS0xNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYzLTE2NAogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKEhlbGxvLmNyZWF0ZSwgImhlbGxvIikuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDUgLy8gYmFzZTY0KENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUFFaUFBSlE0b0FBQ2lBQUdlSmlnQUJNUnRCQUYrQ0F3UWczenBVQkNRM2pUd0UwS0tDQURZYUFJNERBQUlBRlFBZ0k0a3hHUlJFTVJnVVJEWWFBVmNDQUlnQVB5S0pNUm1CQlJKRU1SaEVJb2t4R1JSRU1SaEVOaG9CVndJQWlBQXFTUlVXVndZQ1RGQ0FCQlVmZkhWTVVMQWlpWUVFTVJtT0FRQUNJNGt4R0VRaWlZb0JBQ2lMLzJlSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDAwMDU2ODY1NmM2YzZmCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjYtMTY3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjktMTc0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhlbGxvIHdvcmxkIgogICAgcHVzaGJ5dGVzICJoZWxsbyB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc4LTE3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODAtMTgxCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygidG1wbDIiKX0pCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA5IC8vIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBQVNJQUFoRGlnQUFLQ2xuaVlvQUFURWJRUUJXZ2dNRVRGeGh1Z1FrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQXdBRnlPSk1Sa1VSREVZRkVRaWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUlra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRRWpLR1ZFZ0FFZ1VJdi9VSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4Mi0xODUKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODctMTg4CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9UbXBsLmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTkwLTE5NQogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1RtcGwuZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5NwogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAidG1wbDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInRtcGwyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfcHJmeDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTktMjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfcHJmeChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjA1LTIwOAogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1ByZnguY3JlYXRlLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwMS0yMDQKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvUHJmeCwgdGVtcGxhdGVfdmFyc19wcmVmaXg9IlBSRlhfIiwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJwcmZ4MiIpfQogICAgLy8gKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3VndjbVo0TWpFWVFBQURpQUFFaUFBSVE0b0FBQ2dwWjRtS0FBRXhHMEVBVm9JREJFeGNZYm9FSkRlTlBBVFFvb0lBTmhvQWpnTUFBZ0FNQUJjamlURVpGRVF4R0JSRUlva3hHWUVGRWtReEdFUWlpVEVaRkVReEdFUTJHZ0ZYQWdDSUFDSkpGUlpYQmdKTVVJQUVGUjk4ZFV4UXNDS0pnUVF4R1k0QkFBSWppVEVZUkNLSmlnRUJJeWhsUklBQklGQ0wvMUNKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNS0yMDgKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMTAtMjExCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9QcmZ4LmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjEzLTIxOAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1ByZnguZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAicHJmeDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInByZngyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMi0yMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI0LTIyNQogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKExhcmdlUHJvZ3JhbSkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMTEgLy8gYmFzZTY0KENpQUNBUUNJQUFGRGlnQUJNUnRCQURpQ0FnVDE1UDFOQkNRM2pUdzJHZ0NPQWdBQ0FCZ2ppVEVaRkVReEdFU0lBQ1FXZ0FRVkgzeDFURkN3SW9reEdZRUZFa1F4R0VRaWlURVpRQUFHTVJnVVJDS0pJNG1LQUFHSUFBSVZpWW9BQVlDQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMiAvLyBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI3LTIyOAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExhcmdlUHJvZ3JhbS5nZXRfYmlnX2J5dGVzX2xlbmd0aCwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyOQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoaW50IDQwOTYgLy8gNDA5NgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzMS0yMzUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTGFyZ2VQcm9ncmFtLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X2NyZWF0ZV9tb2RpZmllZF9jb21waWxlZCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfbW9kaWZpZWRfY29tcGlsZWQ6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM3LTIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX21vZGlmaWVkX2NvbXBpbGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MQogICAgLy8gbG9jYWxfdWludHM9VUludDY0KDMpLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgTG9jYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQzCiAgICAvLyBsb2NhbF9ieXRlcz1VSW50NjQoNSksCiAgICBpbnRjXzMgLy8gNQogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0MgogICAgLy8gZ2xvYmFsX3VpbnRzPVVJbnQ2NCg0KSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDQKICAgIC8vIGdsb2JhbF9ieXRlcz1VSW50NjQoNiksCiAgICBpbnRjXzEgLy8gNgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzkKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDYtMjUwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ4CiAgICAvLyBTdHJpbmcoImhleSIpLAogICAgYnl0ZWMgMTQgLy8gMHgwMDAzNjg2NTc5CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0Ni0yNTAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG8uY3JlYXRlLAogICAgLy8gICAgIFN0cmluZygiaGV5IiksCiAgICAvLyAgICAgY29tcGlsZWQ9Y29tcGlsZWQsCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1MgogICAgLy8gYXNzZXJ0IGFwcC5sb2NhbF9udW1fdWludCA9PSAzCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTMKICAgIC8vIGFzc2VydCBhcHAuZ2xvYmFsX251bV91aW50ID09IDQKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNTQKICAgIC8vIGFzc2VydCBhcHAubG9jYWxfbnVtX2J5dGVzID09IDUKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMyAvLyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU1CiAgICAvLyBhc3NlcnQgYXBwLmdsb2JhbF9udW1fYnl0ZXMgPT0gNgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGludGNfMSAvLyA2CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU3CiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDggLy8gMHgwMDA1NzQ2ODY1NzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZXkgdGhlcmUiCiAgICBieXRlYyAxNSAvLyAiaGV5IHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2MS0yNjIKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoSGVsbG8uZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X3VwZGF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF91cGRhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY0LTI2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzYKICAgIC8vIGxvY2FsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNzUKICAgIC8vIGxvY2FsX2J5dGVzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MwogICAgLy8gZ2xvYmFsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjc0CiAgICAvLyBnbG9iYWxfYnl0ZXM9MiwKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI3MgogICAgLy8gZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjktMjc3CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyApLAogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDkgLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFBU0lBQWhEaWdBQUtDbG5pWW9BQVRFYlFRQldnZ01FVEZ4aHVnUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FBd0FGeU9KTVJrVVJERVlGRVFpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBSWtrVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFFaktHVkVnQUVnVUl2L1VJaz0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjY4CiAgICAvLyBIZWxsb1RtcGwsCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjYtMjc4CiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjgwLTI4MQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgInRoZXJlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA4IC8vIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4MgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlYyAxNiAvLyAiaGkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg0LTI4NQogICAgLy8gIyB1cGRhdGUgdGhlIGFwcAogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZShIZWxsbywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA1IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFBRWlBQUpRNG9BQUNpQUFHZUppZ0FCTVJ0QkFGK0NBd1FnM3pwVUJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQUZRQWdJNGt4R1JSRU1SZ1VSRFlhQVZjQ0FJZ0FQeUtKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFxU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQUNpTC8yZUppZ0VCSXlobFJJQUJJRkNMLzFDSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4Ny0yODgKICAgIC8vICMgY2FsbCB0aGUgdXBkYXRlZCBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODkKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHRoZXJlIgogICAgYnl0ZWMgMTYgLy8gImhpIHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5MS0yOTYKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3Rfb3RoZXJfY29uc3RhbnRzKCkgLT4gdm9pZDoKdGVzdF9vdGhlcl9jb25zdGFudHM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk4LTI5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X290aGVyX2NvbnN0YW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAyLTMxMgogICAgLy8gY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgIH0sCiAgICAvLyApLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQUFFbUNRTnVkVzBJWjNKbFpYUnBibWNIWVdSa2NtVnpjd1p0WlhSb2IyUUVGUjk4ZFFSMGJYQnNBVUlnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQURFWVFBQURpQUFFaUFBVlE0b0FBQ2tuQldjb0p3Wm5LaWNIWnlzbkNHZUppZ0FCTVJ0QkFGdUNBd1RaS0ZwMEJDUTNqVHdFV3d3amRUWWFBSTREQUFJQUZRQWdJb2t4R1JSRU1SZ1VSSWdBTkJZbkJFeFFzQ09KTVJtQkJSSkVNUmhFSTRreEdSUkVNUmhFTmhvQlZ3SUFpQUFXU1JVV1Z3WUNURkFuQkV4UXNDT0pJb21LQUFFamlZb0JBU0lvWlVTQUFUQ2dGU01KSWlobFJJQUJNS0JMQVNNSVRFNENVaUlwWlVTQUFTQlFpLzlRVEZBaUttVkVVQ0lyWlVSUWlRPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAxCiAgICAvLyBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgcHVzaGJ5dGVzIDB4ZDkyODVhNzQgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzAwLTMxMwogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMxNQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb090aGVyQ29uc3RhbnRzLmdyZWV0LCAiSm9obm55IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg1YjBjMjM3NSAvLyBtZXRob2QgImdyZWV0KHN0cmluZylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjRhNmY2ODZlNmU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE4CiAgICAvLyBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICBwdXNoYnl0ZXNzIGJhc2UzMihOQlNXWTNEUEVCRkc2MkRPTlo0VEtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIDB4NDBlMzM1MzIgLy8gYmFzZTMyKE5CU1dZM0RQRUJGRzYyRE9OWjRUS0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSksIG1ldGhvZCAic29tZXRoaW5nKCl2b2lkIgogICAgY29uY2F0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzE3LTMxOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAoCiAgICAvLyAgICAgYiJoZWxsbyBKb2hubnk1IiArIEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMgKyBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKQogICAgPT0KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjEtMzIyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCkgLT4gdm9pZDoKdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNC0zMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyNgogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgNSAvLyBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQUVpQUFKUTRvQUFDaUFBR2VKaWdBQk1SdEJBRitDQXdRZzN6cFVCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFGUUFnSTRreEdSUkVNUmdVUkRZYUFWY0NBSWdBUHlLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBcVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFDaUwvMmVKaWdFQkl5aGxSSUFCSUZDTC8xQ0opCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzI3LTMzNwogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyOQogICAgLy8gU3RyaW5nKCJoZXkiKSwKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMzY4NjU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMjctMzM3CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMzkKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNDEKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB0aGVyZSIKICAgIGJ5dGVjIDE1IC8vICJoZXkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzQzLTM0NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbChIZWxsby5kZWxldGUsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
+ },
+ "byteCode": {
+ "approval": "CiAEAAYBBSYRBBUffHUECoEBQwQkN408BNCiggAHAAV3b3JsZLEBCiACAQAmAQhncmVldGluZzEYQAADiAAEiAAJQ4oAACiAAGeJigABMRtBAF+CAwQg3zpUBCQ3jTwE0KKCADYaAI4DAAIAFQAgI4kxGRREMRgURDYaAVcCAIgAPyKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAqSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBACiL/2eJigEBIyhlRIABIFCL/1CJBExcYboEIN86VAcABXRoZXJlpAEKIAIBACYCCGdyZWV0aW5nBHRtcGwxGEAAA4gABIgACEOKAAAoKWeJigABMRtBAFaCAwRMXGG6BCQ3jTwE0KKCADYaAI4DAAIADAAXI4kxGRREMRgURCKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAiSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBASMoZUSAASBQi/9QiQcABWhlbGxvgCAKIAIBAIgAAUOKAAExG0EAOIICBPXk/U0EJDeNPDYaAI4CAAIAGCOJMRkURDEYRIgAJBaABBUffHVMULAiiTEZgQUSRDEYRCKJMRlAAAYxGBREIokjiYoAAYgAAhWJigABgIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJBPXk/U0FAANoZXkJaGV5IHRoZXJlCGhpIHRoZXJliAABQ4oAATEbQQEEgg0EYP+ilQQqF5lcBOunQuoEM1pkOAQClHyiBK4e6EAEe5Bz9QSFSmjKBB2gBKEEwZlavQR/TnX1BAGWWTcEf7+MyjYaAI4NAAIAEgAeACoANgBCAE4AWgBmAHIAfgCKAJYiiTEZFEQxGESIAKMoTFCwJIkxGRREMRhEiAC5JIkxGRREMRhEiAEOJIkxGRREMRhEiAFdJIkxGRREMRhEiAJOJIkxGRREMRhEiAKYJIkxGRREMRhEiALuJIkxGRREMRhEiANAJIkxGRREMRhEiAQ4JIkxGRREMRhEiAR7JIkxGRREMRhEiATuJIkxGRREMRhEiAWAJIkxGRREMRhEiAciJIkxGUAABjEYFEQkiSKJigABgCCm83JRpYyoN72lF6n3Bw7kuAo4j+RGFGtr1Ds77V1c5YmKAACxJLI1KbJCJwWyQCcHshonCrIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRLElshkqshpMshgjshAisgGzgA0AC2hlbGxvIHdvcmxkEkSJigAAsSSyNSmyQicJskAnBrIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRLElshkqshpMshgjshAisgGzgAsACWhleSB3b3JsZBJEiYoAALEksjUpskKAogEKIAIBACYCCGdyZWV0aW5nAmhpMRhAAAOIAASIAAhDigAAKClniYoAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UImyQCcGshojshAisgGztD2xSbIYK7IaJwSyGiOyECKyAbO0PklXBABMVwAEKBJEsSWyGSqyGkyyGCOyECKyAbOACgAIaGkgd29ybGQSRImKAACxgQKyOCmyQicLskAnDLJAI7IQIrIBs7Q9sUmyGCcNshojshAisgGztD5JVwQATFcABCgSRLElshkqshpMshgjshAisgGzgAgAAAAAAAAQAKhEiYoAALEksjUpskInBbJAJweyGicKshojshAisgGztD2xSbIYK7IaJwSyGiOyECKyAbO0PklXBABMVwAEKBJEVwIAsSWyGUyyGCqyGiOyECKyAbOAC2hlbGxvIHdvcmxkEkSJigAAsSSyNSmyQicJskAnBrIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRFcCALElshlMshgqshojshAisgGzgAt0bXBsMiB3b3JsZBJEiYoAALEksjUpskKApQEKIAIBACYCCGdyZWV0aW5nBXByZngyMRhAAAOIAASIAAhDigAAKClniYoAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UImyQCcGshojshAisgGztD2xSbIYK7IaJwSyGiOyECKyAbO0PklXBABMVwAEKBJEVwIAsSWyGUyyGCqyGiOyECKyAbOAC3ByZngyIHdvcmxkEkSJigAAsYECsjgpskInC7JAJwyyQCOyECKyAbO0PbFJshgnDbIaI7IQIrIBs7Q+SVcEAExXAAQoEkQXgYAgEkSxJbIZshgqshojshAisgGziYoAALGBA7I2JbI3gQSyNCOyNSmyQicFskAnB7IaJw6yGiOyECKyAbO0PUlyBESBAxJESXICRIEEEkRJcgVEJRJESXIDRCMSRLFJshgrshonCLIaI7IQIrIBs7Q+SVcEAExXAAQoEkRXAgAnDxJEsSWyGbIYKrIaI7IQIrIBs4mKAACxgQKyNoECsjeBArI0gQKyNSSyOCmyQicJskAnBrIaI7IQIrIBs7Q9sUmyGCuyGicIshojshAisgGztD5JVwQATFcABCgSRFcCACcQEkSxKbJCJwWyQIEEshlJshgjshAisgGzsUmyGCuyGicIshojshAisgGztD5JVwQATFcABCgSRFcCACcQEkSxJbIZshgqshojshAisgGziYoAALGBBLI1KbJCgJUCCiACAAEmCQNudW0IZ3JlZXRpbmcHYWRkcmVzcwZtZXRob2QEFR98dQR0bXBsAUIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAADEYQAADiAAEiAAVQ4oAACknBWcoJwZnKicHZysnCGeJigABMRtBAFuCAwTZKFp0BCQ3jTwEWwwjdTYaAI4DAAIAFQAgIokxGRREMRgURIgANBYnBExQsCOJMRmBBRJEMRhEI4kxGRREMRhENhoBVwIAiAAWSRUWVwYCTFAnBExQsCOJIomKAAEjiYoBASIoZUSAATCgFSMJIihlRIABMKBLASMITE4CUiIpZUSAASBQi/9QTFAiKmVEUCIrZURQibJAgATZKFp0shojshAisgGztD2xSbIYgARbDCN1shqACAAGSm9obm55shojshAisgGztD5JVwQATFcABCgSRFcCAIICLWhlbGxvIEpvaG5ueTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARA4zUyUBJEsSWyGbIYKrIaI7IQIrIBs4mKAACxJLI1KbJCJwWyQCcHshonDrIaI7IQIrIBs7Q9sUmyGCuyGicIshojshAisgGztD5JVwQATFcABCgSRFcCACcPEkSxJbIZshgqshojshAisgGziQ==",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/compile/out/HelloFactory.destructured.ir b/test_cases/compile/out/HelloFactory.destructured.ir
index 6202c8048f..f54ebe9083 100644
--- a/test_cases/compile/out/HelloFactory.destructured.ir
+++ b/test_cases/compile/out/HelloFactory.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory:
block@2: // test_logicsig_route_L27
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory:
block@3: // test_compile_contract_route_L31
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract()
return 1u
block@4: // test_compile_contract_tmpl_route_L62
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl()
return 1u
block@5: // test_compile_contract_prfx_route_L97
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_prfx()
return 1u
block@6: // test_compile_contract_large_route_L130
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_large()
return 1u
block@7: // test_arc4_create_route_L161
let tmp%25#0: uint64 = (txn OnCompletion)
let tmp%26#0: bool = (! tmp%25#0)
- (assert tmp%26#0) // OnCompletion is NoOp
+ (assert tmp%26#0) // OnCompletion is not NoOp
let tmp%27#0: uint64 = (txn ApplicationID)
- (assert tmp%27#0) // is not creating
+ (assert tmp%27#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create()
return 1u
block@8: // test_arc4_create_tmpl_route_L178
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl()
return 1u
block@9: // test_arc4_create_prfx_route_L199
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_prfx()
return 1u
block@10: // test_arc4_create_large_route_L222
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_large()
return 1u
block@11: // test_arc4_create_modified_compiled_route_L237
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled()
return 1u
block@12: // test_arc4_update_route_L264
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_update()
return 1u
block@13: // test_other_constants_route_L298
let tmp%49#0: uint64 = (txn OnCompletion)
let tmp%50#0: bool = (! tmp%49#0)
- (assert tmp%50#0) // OnCompletion is NoOp
+ (assert tmp%50#0) // OnCompletion is not NoOp
let tmp%51#0: uint64 = (txn ApplicationID)
- (assert tmp%51#0) // is not creating
+ (assert tmp%51#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_other_constants()
return 1u
block@14: // test_abi_call_create_params_route_L324
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_abi_call_create_params()
return 1u
block@17: // bare_routing_L25
@@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory:
block@18: // __algopy_default_create_L1
let tmp%58#0: uint64 = (txn ApplicationID)
let tmp%59#0: bool = (! tmp%58#0)
- (assert tmp%59#0) // is creating
+ (assert tmp%59#0) // can only call when creating
return 1u
block@21: // after_if_else_L25
return 0u
diff --git a/test_cases/compile/out/HelloFactory.ssa.ir b/test_cases/compile/out/HelloFactory.ssa.ir
index 1c528baa31..96b6940b8d 100644
--- a/test_cases/compile/out/HelloFactory.ssa.ir
+++ b/test_cases/compile/out/HelloFactory.ssa.ir
@@ -16,10 +16,10 @@ contract test_cases.compile.factory.HelloFactory:
block@2: // test_logicsig_route_L27
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -27,109 +27,109 @@ contract test_cases.compile.factory.HelloFactory:
block@3: // test_compile_contract_route_L31
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 NoOp)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (!= tmp%11#0 0u)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract()
return 1u
block@4: // test_compile_contract_tmpl_route_L62
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (== tmp%13#0 NoOp)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (!= tmp%15#0 0u)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl()
return 1u
block@5: // test_compile_contract_prfx_route_L97
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (== tmp%17#0 NoOp)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
let tmp%20#0: bool = (!= tmp%19#0 0u)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_prfx()
return 1u
block@6: // test_compile_contract_large_route_L130
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (== tmp%21#0 NoOp)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
let tmp%24#0: bool = (!= tmp%23#0 0u)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_large()
return 1u
block@7: // test_arc4_create_route_L161
let tmp%25#0: uint64 = (txn OnCompletion)
let tmp%26#0: bool = (== tmp%25#0 NoOp)
- (assert tmp%26#0) // OnCompletion is NoOp
+ (assert tmp%26#0) // OnCompletion is not NoOp
let tmp%27#0: uint64 = (txn ApplicationID)
let tmp%28#0: bool = (!= tmp%27#0 0u)
- (assert tmp%28#0) // is not creating
+ (assert tmp%28#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create()
return 1u
block@8: // test_arc4_create_tmpl_route_L178
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (== tmp%29#0 NoOp)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
let tmp%32#0: bool = (!= tmp%31#0 0u)
- (assert tmp%32#0) // is not creating
+ (assert tmp%32#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl()
return 1u
block@9: // test_arc4_create_prfx_route_L199
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (== tmp%33#0 NoOp)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
let tmp%36#0: bool = (!= tmp%35#0 0u)
- (assert tmp%36#0) // is not creating
+ (assert tmp%36#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_prfx()
return 1u
block@10: // test_arc4_create_large_route_L222
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (== tmp%37#0 NoOp)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
let tmp%40#0: bool = (!= tmp%39#0 0u)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_large()
return 1u
block@11: // test_arc4_create_modified_compiled_route_L237
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (== tmp%41#0 NoOp)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
let tmp%44#0: bool = (!= tmp%43#0 0u)
- (assert tmp%44#0) // is not creating
+ (assert tmp%44#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled()
return 1u
block@12: // test_arc4_update_route_L264
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (== tmp%45#0 NoOp)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
let tmp%48#0: bool = (!= tmp%47#0 0u)
- (assert tmp%48#0) // is not creating
+ (assert tmp%48#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_update()
return 1u
block@13: // test_other_constants_route_L298
let tmp%49#0: uint64 = (txn OnCompletion)
let tmp%50#0: bool = (== tmp%49#0 NoOp)
- (assert tmp%50#0) // OnCompletion is NoOp
+ (assert tmp%50#0) // OnCompletion is not NoOp
let tmp%51#0: uint64 = (txn ApplicationID)
let tmp%52#0: bool = (!= tmp%51#0 0u)
- (assert tmp%52#0) // is not creating
+ (assert tmp%52#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_other_constants()
return 1u
block@14: // test_abi_call_create_params_route_L324
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (== tmp%53#0 NoOp)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
let tmp%56#0: bool = (!= tmp%55#0 0u)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_abi_call_create_params()
return 1u
block@15: // switch_case_default_L25
@@ -142,7 +142,7 @@ contract test_cases.compile.factory.HelloFactory:
block@18: // __algopy_default_create_L1
let tmp%58#0: uint64 = (txn ApplicationID)
let tmp%59#0: bool = (== tmp%58#0 0u)
- (assert tmp%59#0) // is creating
+ (assert tmp%59#0) // can only call when creating
test_cases.compile.factory.HelloFactory.__algopy_default_create()
return 1u
block@19: // switch_case_default_L25
diff --git a/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir
index fee0bc1400..c5b6838d95 100644
--- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir
+++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_1.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory:
block@2: // test_logicsig_route_L27
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory:
block@3: // test_compile_contract_route_L31
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract()
return 1u
block@4: // test_compile_contract_tmpl_route_L62
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl()
return 1u
block@5: // test_compile_contract_prfx_route_L97
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_prfx()
return 1u
block@6: // test_compile_contract_large_route_L130
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_large()
return 1u
block@7: // test_arc4_create_route_L161
let tmp%25#0: uint64 = (txn OnCompletion)
let tmp%26#0: bool = (! tmp%25#0)
- (assert tmp%26#0) // OnCompletion is NoOp
+ (assert tmp%26#0) // OnCompletion is not NoOp
let tmp%27#0: uint64 = (txn ApplicationID)
- (assert tmp%27#0) // is not creating
+ (assert tmp%27#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create()
return 1u
block@8: // test_arc4_create_tmpl_route_L178
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl()
return 1u
block@9: // test_arc4_create_prfx_route_L199
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_prfx()
return 1u
block@10: // test_arc4_create_large_route_L222
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_large()
return 1u
block@11: // test_arc4_create_modified_compiled_route_L237
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled()
return 1u
block@12: // test_arc4_update_route_L264
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_update()
return 1u
block@13: // test_other_constants_route_L298
let tmp%49#0: uint64 = (txn OnCompletion)
let tmp%50#0: bool = (! tmp%49#0)
- (assert tmp%50#0) // OnCompletion is NoOp
+ (assert tmp%50#0) // OnCompletion is not NoOp
let tmp%51#0: uint64 = (txn ApplicationID)
- (assert tmp%51#0) // is not creating
+ (assert tmp%51#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_other_constants()
return 1u
block@14: // test_abi_call_create_params_route_L324
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_abi_call_create_params()
return 1u
block@17: // bare_routing_L25
@@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory:
block@18: // __algopy_default_create_L1
let tmp%58#0: uint64 = (txn ApplicationID)
let tmp%59#0: bool = (! tmp%58#0)
- (assert tmp%59#0) // is creating
+ (assert tmp%59#0) // can only call when creating
return 1u
block@21: // after_if_else_L25
return 0u
diff --git a/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir b/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir
index be258d52e5..40339fe9f3 100644
--- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir
+++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_2.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory:
block@2: // test_logicsig_route_L27
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory:
block@3: // test_compile_contract_route_L31
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract()
return 1u
block@4: // test_compile_contract_tmpl_route_L62
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl()
return 1u
block@5: // test_compile_contract_prfx_route_L97
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_prfx()
return 1u
block@6: // test_compile_contract_large_route_L130
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_large()
return 1u
block@7: // test_arc4_create_route_L161
let tmp%25#0: uint64 = (txn OnCompletion)
let tmp%26#0: bool = (! tmp%25#0)
- (assert tmp%26#0) // OnCompletion is NoOp
+ (assert tmp%26#0) // OnCompletion is not NoOp
let tmp%27#0: uint64 = (txn ApplicationID)
- (assert tmp%27#0) // is not creating
+ (assert tmp%27#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create()
return 1u
block@8: // test_arc4_create_tmpl_route_L178
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl()
return 1u
block@9: // test_arc4_create_prfx_route_L199
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_prfx()
return 1u
block@10: // test_arc4_create_large_route_L222
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_large()
return 1u
block@11: // test_arc4_create_modified_compiled_route_L237
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled()
return 1u
block@12: // test_arc4_update_route_L264
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_update()
return 1u
block@13: // test_other_constants_route_L298
let tmp%49#0: uint64 = (txn OnCompletion)
let tmp%50#0: bool = (! tmp%49#0)
- (assert tmp%50#0) // OnCompletion is NoOp
+ (assert tmp%50#0) // OnCompletion is not NoOp
let tmp%51#0: uint64 = (txn ApplicationID)
- (assert tmp%51#0) // is not creating
+ (assert tmp%51#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_other_constants()
return 1u
block@14: // test_abi_call_create_params_route_L324
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_abi_call_create_params()
return 1u
block@17: // bare_routing_L25
@@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory:
block@18: // __algopy_default_create_L1
let tmp%58#0: uint64 = (txn ApplicationID)
let tmp%59#0: bool = (! tmp%58#0)
- (assert tmp%59#0) // is creating
+ (assert tmp%59#0) // can only call when creating
return 1u
block@21: // after_if_else_L25
return 0u
diff --git a/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir b/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir
index 3857f32607..951d8512d8 100644
--- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir
+++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_3.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory:
block@2: // test_logicsig_route_L27
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory:
block@3: // test_compile_contract_route_L31
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract()
return 1u
block@4: // test_compile_contract_tmpl_route_L62
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl()
return 1u
block@5: // test_compile_contract_prfx_route_L97
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_prfx()
return 1u
block@6: // test_compile_contract_large_route_L130
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_large()
return 1u
block@7: // test_arc4_create_route_L161
let tmp%25#0: uint64 = (txn OnCompletion)
let tmp%26#0: bool = (! tmp%25#0)
- (assert tmp%26#0) // OnCompletion is NoOp
+ (assert tmp%26#0) // OnCompletion is not NoOp
let tmp%27#0: uint64 = (txn ApplicationID)
- (assert tmp%27#0) // is not creating
+ (assert tmp%27#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create()
return 1u
block@8: // test_arc4_create_tmpl_route_L178
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl()
return 1u
block@9: // test_arc4_create_prfx_route_L199
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_prfx()
return 1u
block@10: // test_arc4_create_large_route_L222
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_large()
return 1u
block@11: // test_arc4_create_modified_compiled_route_L237
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled()
return 1u
block@12: // test_arc4_update_route_L264
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_update()
return 1u
block@13: // test_other_constants_route_L298
let tmp%49#0: uint64 = (txn OnCompletion)
let tmp%50#0: bool = (! tmp%49#0)
- (assert tmp%50#0) // OnCompletion is NoOp
+ (assert tmp%50#0) // OnCompletion is not NoOp
let tmp%51#0: uint64 = (txn ApplicationID)
- (assert tmp%51#0) // is not creating
+ (assert tmp%51#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_other_constants()
return 1u
block@14: // test_abi_call_create_params_route_L324
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_abi_call_create_params()
return 1u
block@17: // bare_routing_L25
@@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory:
block@18: // __algopy_default_create_L1
let tmp%58#0: uint64 = (txn ApplicationID)
let tmp%59#0: bool = (! tmp%58#0)
- (assert tmp%59#0) // is creating
+ (assert tmp%59#0) // can only call when creating
return 1u
block@21: // after_if_else_L25
return 0u
diff --git a/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir b/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir
index 507599d75e..f0194d837b 100644
--- a/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir
+++ b/test_cases/compile/out/HelloFactory.ssa.opt_pass_4.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory:
block@2: // test_logicsig_route_L27
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory:
block@3: // test_compile_contract_route_L31
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract()
return 1u
block@4: // test_compile_contract_tmpl_route_L62
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl()
return 1u
block@5: // test_compile_contract_prfx_route_L97
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_prfx()
return 1u
block@6: // test_compile_contract_large_route_L130
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_large()
return 1u
block@7: // test_arc4_create_route_L161
let tmp%25#0: uint64 = (txn OnCompletion)
let tmp%26#0: bool = (! tmp%25#0)
- (assert tmp%26#0) // OnCompletion is NoOp
+ (assert tmp%26#0) // OnCompletion is not NoOp
let tmp%27#0: uint64 = (txn ApplicationID)
- (assert tmp%27#0) // is not creating
+ (assert tmp%27#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create()
return 1u
block@8: // test_arc4_create_tmpl_route_L178
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl()
return 1u
block@9: // test_arc4_create_prfx_route_L199
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_prfx()
return 1u
block@10: // test_arc4_create_large_route_L222
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_large()
return 1u
block@11: // test_arc4_create_modified_compiled_route_L237
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled()
return 1u
block@12: // test_arc4_update_route_L264
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_update()
return 1u
block@13: // test_other_constants_route_L298
let tmp%49#0: uint64 = (txn OnCompletion)
let tmp%50#0: bool = (! tmp%49#0)
- (assert tmp%50#0) // OnCompletion is NoOp
+ (assert tmp%50#0) // OnCompletion is not NoOp
let tmp%51#0: uint64 = (txn ApplicationID)
- (assert tmp%51#0) // is not creating
+ (assert tmp%51#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_other_constants()
return 1u
block@14: // test_abi_call_create_params_route_L324
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_abi_call_create_params()
return 1u
block@17: // bare_routing_L25
@@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory:
block@18: // __algopy_default_create_L1
let tmp%58#0: uint64 = (txn ApplicationID)
let tmp%59#0: bool = (! tmp%58#0)
- (assert tmp%59#0) // is creating
+ (assert tmp%59#0) // can only call when creating
return 1u
block@21: // after_if_else_L25
return 0u
diff --git a/test_cases/compile/out/HelloOtherConstants.approval.mir b/test_cases/compile/out/HelloOtherConstants.approval.mir
index 878ab31c90..24ef5b0a14 100644
--- a/test_cases/compile/out/HelloOtherConstants.approval.mir
+++ b/test_cases/compile/out/HelloOtherConstants.approval.mir
@@ -74,10 +74,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
callsub create to_encode%0#0
itob val_as_bytes%0#0
byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75
@@ -93,9 +93,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion tmp%8#0
int DeleteApplication tmp%8#0,DeleteApplication
== tmp%9#0
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID tmp%10#0
- assert // is not creating
+ assert // can only call when not creating
int 1 1
retsub 1
@@ -104,9 +104,9 @@ __puya_arc4_router___greet_route@4:
// @arc4.abimethod()
txn OnCompletion tmp%12#0
! tmp%13#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%14#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:81
// class HelloOtherConstants(ARC4Contract):
txna ApplicationArgs 1 tmp%16#0
diff --git a/test_cases/compile/out/HelloOtherConstants.approval.teal b/test_cases/compile/out/HelloOtherConstants.approval.teal
index a6fe576c88..c6ed80195b 100644
--- a/test_cases/compile/out/HelloOtherConstants.approval.teal
+++ b/test_cases/compile/out/HelloOtherConstants.approval.teal
@@ -58,10 +58,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
callsub create
itob
bytec 4 // 0x151f7c75
@@ -77,9 +77,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_1 // 1
retsub
@@ -88,9 +88,9 @@ __puya_arc4_router___greet_route@4:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:81
// class HelloOtherConstants(ARC4Contract):
txna ApplicationArgs 1
diff --git a/test_cases/compile/out/HelloOtherConstants.arc32.json b/test_cases/compile/out/HelloOtherConstants.arc32.json
index 1871eb2710..be860072a6 100644
--- a/test_cases/compile/out/HelloOtherConstants.arc32.json
+++ b/test_cases/compile/out/HelloOtherConstants.arc32.json
@@ -17,7 +17,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrICJudW0iICJncmVldGluZyIgImFkZHJlc3MiICJtZXRob2QiIDB4MTUxZjdjNzUgVE1QTF9HUkVFVElORyBUTVBMX05VTSBUTVBMX0FDQ09VTlQgVE1QTF9NRVRIT0QKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9PdGhlckNvbnN0YW50cy5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMSAvLyAiZ3JlZXRpbmciCiAgICBieXRlYyA1IC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODUKICAgIC8vIHNlbGYubnVtID0gVGVtcGxhdGVWYXJbQmlnVUludF0oIk5VTSIpCiAgICBieXRlY18wIC8vICJudW0iCiAgICBieXRlYyA2IC8vIFRNUExfTlVNCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg2CiAgICAvLyBzZWxmLmFkZHJlc3MgPSBUZW1wbGF0ZVZhcltBY2NvdW50XSgiQUNDT1VOVCIpCiAgICBieXRlY18yIC8vICJhZGRyZXNzIgogICAgYnl0ZWMgNyAvLyBUTVBMX0FDQ09VTlQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODcKICAgIC8vIHNlbGYubWV0aG9kID0gVGVtcGxhdGVWYXJbQnl0ZXNdKCJNRVRIT0QiKQogICAgYnl0ZWNfMyAvLyAibWV0aG9kIgogICAgYnl0ZWMgOCAvLyBUTVBMX01FVEhPRAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDgKICAgIHB1c2hieXRlc3MgMHhkOTI4NWE3NCAweDI0Mzc4ZDNjIDB4NWIwYzIzNzUgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaXRvYgogICAgYnl0ZWMgNCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4MQogICAgLy8gY2xhc3MgSGVsbG9PdGhlckNvbnN0YW50cyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuY3JlYXRlKCkgLT4gdWludDY0OgpjcmVhdGU6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODktOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MQogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5Ny05OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6OTkKICAgIC8vIG51bV9hbHBoYSA9IChzZWxmLm51bSArIDQ4KS5ieXRlc1stMV0KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJudW0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MzAKICAgIGIrCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAibnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bSBleGlzdHMKICAgIHB1c2hieXRlcyAweDMwCiAgICBiKwogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBjb21waWxlL2FwcHMucHk6MTAxCiAgICAvLyBzZWxmLmdyZWV0aW5nLmJ5dGVzICsgYiIgIiArIG5hbWUuYnl0ZXMgKyBudW1fYWxwaGEgKyBzZWxmLmFkZHJlc3MuYnl0ZXMgKyBzZWxmLm1ldGhvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MjAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRkcmVzcyBleGlzdHMKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1ldGhvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRob2QgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weToxMDAtMTAyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuZ3JlZXRpbmcuYnl0ZXMgKyBiIiAiICsgbmFtZS5ieXRlcyArIG51bV9hbHBoYSArIHNlbGYuYWRkcmVzcy5ieXRlcyArIHNlbGYubWV0aG9kCiAgICAvLyApCiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrICJudW0iICJncmVldGluZyIgImFkZHJlc3MiICJtZXRob2QiIDB4MTUxZjdjNzUgVE1QTF9HUkVFVElORyBUTVBMX05VTSBUTVBMX0FDQ09VTlQgVE1QTF9NRVRIT0QKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9PdGhlckNvbnN0YW50cy5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMSAvLyAiZ3JlZXRpbmciCiAgICBieXRlYyA1IC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODUKICAgIC8vIHNlbGYubnVtID0gVGVtcGxhdGVWYXJbQmlnVUludF0oIk5VTSIpCiAgICBieXRlY18wIC8vICJudW0iCiAgICBieXRlYyA2IC8vIFRNUExfTlVNCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg2CiAgICAvLyBzZWxmLmFkZHJlc3MgPSBUZW1wbGF0ZVZhcltBY2NvdW50XSgiQUNDT1VOVCIpCiAgICBieXRlY18yIC8vICJhZGRyZXNzIgogICAgYnl0ZWMgNyAvLyBUTVBMX0FDQ09VTlQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODcKICAgIC8vIHNlbGYubWV0aG9kID0gVGVtcGxhdGVWYXJbQnl0ZXNdKCJNRVRIT0QiKQogICAgYnl0ZWNfMyAvLyAibWV0aG9kIgogICAgYnl0ZWMgOCAvLyBUTVBMX01FVEhPRAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDgKICAgIHB1c2hieXRlc3MgMHhkOTI4NWE3NCAweDI0Mzc4ZDNjIDB4NWIwYzIzNzUgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4MQogICAgLy8gY2xhc3MgSGVsbG9PdGhlckNvbnN0YW50cyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuY3JlYXRlKCkgLT4gdWludDY0OgpjcmVhdGU6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODktOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MQogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5Ny05OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6OTkKICAgIC8vIG51bV9hbHBoYSA9IChzZWxmLm51bSArIDQ4KS5ieXRlc1stMV0KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJudW0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MzAKICAgIGIrCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAibnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bSBleGlzdHMKICAgIHB1c2hieXRlcyAweDMwCiAgICBiKwogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBjb21waWxlL2FwcHMucHk6MTAxCiAgICAvLyBzZWxmLmdyZWV0aW5nLmJ5dGVzICsgYiIgIiArIG5hbWUuYnl0ZXMgKyBudW1fYWxwaGEgKyBzZWxmLmFkZHJlc3MuYnl0ZXMgKyBzZWxmLm1ldGhvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MjAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRkcmVzcyBleGlzdHMKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1ldGhvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRob2QgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weToxMDAtMTAyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuZ3JlZXRpbmcuYnl0ZXMgKyBiIiAiICsgbmFtZS5ieXRlcyArIG51bV9hbHBoYSArIHNlbGYuYWRkcmVzcy5ieXRlcyArIHNlbGYubWV0aG9kCiAgICAvLyApCiAgICByZXRzdWIK",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
diff --git a/test_cases/compile/out/HelloOtherConstants.arc56.json b/test_cases/compile/out/HelloOtherConstants.arc56.json
new file mode 100644
index 0000000000..3778260e34
--- /dev/null
+++ b/test_cases/compile/out/HelloOtherConstants.arc56.json
@@ -0,0 +1,208 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 179
+ ],
+ "errorMessage": "OnCompletion is not DeleteApplication"
+ },
+ {
+ "pc": [
+ 158,
+ 188
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 162
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 182,
+ 191
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 269
+ ],
+ "errorMessage": "check self.address exists"
+ },
+ {
+ "pc": [
+ 256
+ ],
+ "errorMessage": "check self.greeting exists"
+ },
+ {
+ "pc": [
+ 274
+ ],
+ "errorMessage": "check self.method exists"
+ },
+ {
+ "pc": [
+ 229,
+ 240
+ ],
+ "errorMessage": "check self.num exists"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrICJudW0iICJncmVldGluZyIgImFkZHJlc3MiICJtZXRob2QiIDB4MTUxZjdjNzUgVE1QTF9HUkVFVElORyBUTVBMX05VTSBUTVBMX0FDQ09VTlQgVE1QTF9NRVRIT0QKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9PdGhlckNvbnN0YW50cy5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMSAvLyAiZ3JlZXRpbmciCiAgICBieXRlYyA1IC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODUKICAgIC8vIHNlbGYubnVtID0gVGVtcGxhdGVWYXJbQmlnVUludF0oIk5VTSIpCiAgICBieXRlY18wIC8vICJudW0iCiAgICBieXRlYyA2IC8vIFRNUExfTlVNCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg2CiAgICAvLyBzZWxmLmFkZHJlc3MgPSBUZW1wbGF0ZVZhcltBY2NvdW50XSgiQUNDT1VOVCIpCiAgICBieXRlY18yIC8vICJhZGRyZXNzIgogICAgYnl0ZWMgNyAvLyBUTVBMX0FDQ09VTlQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODcKICAgIC8vIHNlbGYubWV0aG9kID0gVGVtcGxhdGVWYXJbQnl0ZXNdKCJNRVRIT0QiKQogICAgYnl0ZWNfMyAvLyAibWV0aG9kIgogICAgYnl0ZWMgOCAvLyBUTVBMX01FVEhPRAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDgKICAgIHB1c2hieXRlc3MgMHhkOTI4NWE3NCAweDI0Mzc4ZDNjIDB4NWIwYzIzNzUgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjgxCiAgICAvLyBjbGFzcyBIZWxsb090aGVyQ29uc3RhbnRzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4MQogICAgLy8gY2xhc3MgSGVsbG9PdGhlckNvbnN0YW50cyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuY3JlYXRlKCkgLT4gdWludDY0OgpjcmVhdGU6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODktOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5MQogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvT3RoZXJDb25zdGFudHMuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5Ny05OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6OTkKICAgIC8vIG51bV9hbHBoYSA9IChzZWxmLm51bSArIDQ4KS5ieXRlc1stMV0KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJudW0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MzAKICAgIGIrCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAibnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bSBleGlzdHMKICAgIHB1c2hieXRlcyAweDMwCiAgICBiKwogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBjb21waWxlL2FwcHMucHk6MTAxCiAgICAvLyBzZWxmLmdyZWV0aW5nLmJ5dGVzICsgYiIgIiArIG5hbWUuYnl0ZXMgKyBudW1fYWxwaGEgKyBzZWxmLmFkZHJlc3MuYnl0ZXMgKyBzZWxmLm1ldGhvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MjAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRkcmVzcyBleGlzdHMKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1ldGhvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRob2QgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weToxMDAtMTAyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuZ3JlZXRpbmcuYnl0ZXMgKyBiIiAiICsgbmFtZS5ieXRlcyArIG51bV9hbHBoYSArIHNlbGYuYWRkcmVzcy5ieXRlcyArIHNlbGYubWV0aG9kCiAgICAvLyApCiAgICByZXRzdWIK",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiACAAEmCQNudW0IZ3JlZXRpbmcHYWRkcmVzcwZtZXRob2QEFR98dQR0bXBsAUIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAADEYQAADiAAEiAAVQ4oAACknBWcoJwZnKicHZysnCGeJigABMRtBAFuCAwTZKFp0BCQ3jTwEWwwjdTYaAI4DAAIAFQAgIokxGRREMRgURIgANBYnBExQsCOJMRmBBRJEMRhEI4kxGRREMRhENhoBVwIAiAAWSRUWVwYCTFAnBExQsCOJIomKAAEjiYoBASIoZUSAATCgFSMJIihlRIABMKBLASMITE4CUiIpZUSAASBQi/9QTFAiKmVEUCIrZURQiQ==",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "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=="
+ }
+ }
+}
\ No newline at end of file
diff --git a/test_cases/compile/out/HelloOtherConstants.destructured.ir b/test_cases/compile/out/HelloOtherConstants.destructured.ir
index 4265c3d047..660d3dcfbe 100644
--- a/test_cases/compile/out/HelloOtherConstants.destructured.ir
+++ b/test_cases/compile/out/HelloOtherConstants.destructured.ir
@@ -29,10 +29,10 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@2: // create_route_L89
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -41,16 +41,16 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@3: // delete_route_L93
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
return 1u
block@4: // greet_route_L97
let tmp%12#0: uint64 = (txn OnCompletion)
let tmp%13#0: bool = (! tmp%12#0)
- (assert tmp%13#0) // OnCompletion is NoOp
+ (assert tmp%13#0) // OnCompletion is not NoOp
let tmp%14#0: uint64 = (txn ApplicationID)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%16#0: bytes = (txna ApplicationArgs 1)
let tmp%17#0: bytes = ((extract 2 0) tmp%16#0)
let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0)
diff --git a/test_cases/compile/out/HelloOtherConstants.ssa.ir b/test_cases/compile/out/HelloOtherConstants.ssa.ir
index e5c48eeb4e..d9f1652a6b 100644
--- a/test_cases/compile/out/HelloOtherConstants.ssa.ir
+++ b/test_cases/compile/out/HelloOtherConstants.ssa.ir
@@ -30,10 +30,10 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@2: // create_route_L89
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -42,19 +42,19 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@3: // delete_route_L93
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.apps.HelloOtherConstants.delete()
return 1u
block@4: // greet_route_L97
let tmp%12#0: uint64 = (txn OnCompletion)
let tmp%13#0: bool = (== tmp%12#0 NoOp)
- (assert tmp%13#0) // OnCompletion is NoOp
+ (assert tmp%13#0) // OnCompletion is not NoOp
let tmp%14#0: uint64 = (txn ApplicationID)
let tmp%15#0: bool = (!= tmp%14#0 0u)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%16#0: bytes = (txna ApplicationArgs 1)
let tmp%17#0: bytes = ((extract 2 0) tmp%16#0)
let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0)
diff --git a/test_cases/compile/out/HelloOtherConstants.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloOtherConstants.ssa.opt_pass_1.ir
index 4265c3d047..660d3dcfbe 100644
--- a/test_cases/compile/out/HelloOtherConstants.ssa.opt_pass_1.ir
+++ b/test_cases/compile/out/HelloOtherConstants.ssa.opt_pass_1.ir
@@ -29,10 +29,10 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@2: // create_route_L89
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -41,16 +41,16 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@3: // delete_route_L93
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
return 1u
block@4: // greet_route_L97
let tmp%12#0: uint64 = (txn OnCompletion)
let tmp%13#0: bool = (! tmp%12#0)
- (assert tmp%13#0) // OnCompletion is NoOp
+ (assert tmp%13#0) // OnCompletion is not NoOp
let tmp%14#0: uint64 = (txn ApplicationID)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%16#0: bytes = (txna ApplicationArgs 1)
let tmp%17#0: bytes = ((extract 2 0) tmp%16#0)
let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0)
diff --git a/test_cases/compile/out/HelloPrfx.approval.mir b/test_cases/compile/out/HelloPrfx.approval.mir
index 504caa2ab4..50328d1f2a 100644
--- a/test_cases/compile/out/HelloPrfx.approval.mir
+++ b/test_cases/compile/out/HelloPrfx.approval.mir
@@ -59,10 +59,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
@@ -72,9 +72,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion tmp%7#0
int DeleteApplication tmp%7#0,DeleteApplication
== tmp%8#0
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID tmp%9#0
- assert // is not creating
+ assert // can only call when not creating
int 1 1
retsub 1
@@ -83,9 +83,9 @@ __puya_arc4_router___greet_route@4:
// @arc4.abimethod()
txn OnCompletion tmp%11#0
! tmp%12#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%13#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:71
// class HelloPrfx(HelloBase):
txna ApplicationArgs 1 tmp%15#0
@@ -120,7 +120,7 @@ __puya_arc4_router___update@8:
// compile/apps.py:29
// @arc4.baremethod(allow_actions=["UpdateApplication"])
txn ApplicationID tmp%19#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out/HelloPrfx.approval.teal b/test_cases/compile/out/HelloPrfx.approval.teal
index c8d63ffddc..b7e64c5bb4 100644
--- a/test_cases/compile/out/HelloPrfx.approval.teal
+++ b/test_cases/compile/out/HelloPrfx.approval.teal
@@ -43,10 +43,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
@@ -56,9 +56,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
@@ -67,9 +67,9 @@ __puya_arc4_router___greet_route@4:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:71
// class HelloPrfx(HelloBase):
txna ApplicationArgs 1
@@ -103,7 +103,7 @@ __puya_arc4_router___update@8:
// compile/apps.py:29
// @arc4.baremethod(allow_actions=["UpdateApplication"])
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out/HelloPrfx.arc32.json b/test_cases/compile/out/HelloPrfx.arc32.json
index 9c3778c10a..253d107d74 100644
--- a/test_cases/compile/out/HelloPrfx.arc32.json
+++ b/test_cases/compile/out/HelloPrfx.arc32.json
@@ -17,7 +17,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBQUkZYX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvUHJmeC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjczCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojc0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciLCBwcmVmaXg9IlBSRlhfIikKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYnl0ZWNfMSAvLyBQUkZYX0dSRUVUSU5HCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9QcmZ4Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo3MQogICAgLy8gY2xhc3MgSGVsbG9QcmZ4KEhlbGxvQmFzZSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4MjQzNzhkM2MgMHhkMGEyODIwMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NzEKICAgIC8vIGNsYXNzIEhlbGxvUHJmeChIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjcxCiAgICAvLyBjbGFzcyBIZWxsb1ByZngoSGVsbG9CYXNlKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDg6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBQUkZYX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvUHJmeC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjczCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojc0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciLCBwcmVmaXg9IlBSRlhfIikKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYnl0ZWNfMSAvLyBQUkZYX0dSRUVUSU5HCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9QcmZ4Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo3MQogICAgLy8gY2xhc3MgSGVsbG9QcmZ4KEhlbGxvQmFzZSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4MjQzNzhkM2MgMHhkMGEyODIwMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NzEKICAgIC8vIGNsYXNzIEhlbGxvUHJmeChIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjcxCiAgICAvLyBjbGFzcyBIZWxsb1ByZngoSGVsbG9CYXNlKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDg6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM1CiAgICAvLyByZXR1cm4gc2VsZi5ncmVldGluZyArICIgIiArIG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ncmVldGluZyBleGlzdHMKICAgIHB1c2hieXRlcyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
diff --git a/test_cases/compile/out/HelloPrfx.arc56.json b/test_cases/compile/out/HelloPrfx.arc56.json
new file mode 100644
index 0000000000..219fc7340e
--- /dev/null
+++ b/test_cases/compile/out/HelloPrfx.arc56.json
@@ -0,0 +1,165 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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"
+ ]
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 93
+ ],
+ "errorMessage": "OnCompletion is not DeleteApplication"
+ },
+ {
+ "pc": [
+ 81,
+ 102
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 85
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 96,
+ 105,
+ 146
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 155
+ ],
+ "errorMessage": "check self.greeting exists"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBQUkZYX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvUHJmeC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjczCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojc0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciLCBwcmVmaXg9IlBSRlhfIikKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYnl0ZWNfMSAvLyBQUkZYX0dSRUVUSU5HCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9QcmZ4Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo3MQogICAgLy8gY2xhc3MgSGVsbG9QcmZ4KEhlbGxvQmFzZSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4MjQzNzhkM2MgMHhkMGEyODIwMCAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIiwgbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBEZWxldGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6NzEKICAgIC8vIGNsYXNzIEhlbGxvUHJmeChIZWxsb0Jhc2UpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjcxCiAgICAvLyBjbGFzcyBIZWxsb1ByZngoSGVsbG9CYXNlKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDg6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM1CiAgICAvLyByZXR1cm4gc2VsZi5ncmVldGluZyArICIgIiArIG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ncmVldGluZyBleGlzdHMKICAgIHB1c2hieXRlcyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
+ },
+ "byteCode": {
+ "approval": "CiACAQAmAghncmVldGluZwRwcmZ4MRhAAAOIAASIAAhDigAAKClniYoAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UIk=",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {
+ "PRFX_GREETING": {
+ "type": "AVMString",
+ "value": "cHJmeA=="
+ }
+ }
+}
\ No newline at end of file
diff --git a/test_cases/compile/out/HelloPrfx.destructured.ir b/test_cases/compile/out/HelloPrfx.destructured.ir
index b5988a21d9..f8cac45570 100644
--- a/test_cases/compile/out/HelloPrfx.destructured.ir
+++ b/test_cases/compile/out/HelloPrfx.destructured.ir
@@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloPrfx:
block@2: // create_route_L76
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloPrfx:
switch tmp%18#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out/HelloPrfx.ssa.ir b/test_cases/compile/out/HelloPrfx.ssa.ir
index 8b8582d29b..889fb34c0b 100644
--- a/test_cases/compile/out/HelloPrfx.ssa.ir
+++ b/test_cases/compile/out/HelloPrfx.ssa.ir
@@ -27,28 +27,28 @@ contract test_cases.compile.apps.HelloPrfx:
block@2: // create_route_L76
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.compile.apps.HelloPrfx.create()
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
test_cases.compile.apps.HelloBase.delete()
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -69,7 +69,7 @@ contract test_cases.compile.apps.HelloPrfx:
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
let tmp%20#0: bool = (!= tmp%19#0 0u)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
test_cases.compile.apps.HelloBase.update()
return 1u
block@9: // switch_case_default_L71
diff --git a/test_cases/compile/out/HelloPrfx.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloPrfx.ssa.opt_pass_1.ir
index b5988a21d9..f8cac45570 100644
--- a/test_cases/compile/out/HelloPrfx.ssa.opt_pass_1.ir
+++ b/test_cases/compile/out/HelloPrfx.ssa.opt_pass_1.ir
@@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloPrfx:
block@2: // create_route_L76
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloPrfx:
switch tmp%18#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out/HelloTmpl.approval.mir b/test_cases/compile/out/HelloTmpl.approval.mir
index 734d292304..9788ac6ea2 100644
--- a/test_cases/compile/out/HelloTmpl.approval.mir
+++ b/test_cases/compile/out/HelloTmpl.approval.mir
@@ -59,10 +59,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
@@ -72,9 +72,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion tmp%7#0
int DeleteApplication tmp%7#0,DeleteApplication
== tmp%8#0
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID tmp%9#0
- assert // is not creating
+ assert // can only call when not creating
int 1 1
retsub 1
@@ -83,9 +83,9 @@ __puya_arc4_router___greet_route@4:
// @arc4.abimethod()
txn OnCompletion tmp%11#0
! tmp%12#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%13#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:61
// class HelloTmpl(HelloBase):
txna ApplicationArgs 1 tmp%15#0
@@ -120,7 +120,7 @@ __puya_arc4_router___update@8:
// compile/apps.py:29
// @arc4.baremethod(allow_actions=["UpdateApplication"])
txn ApplicationID tmp%19#0
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out/HelloTmpl.approval.teal b/test_cases/compile/out/HelloTmpl.approval.teal
index 08cdb5fb3c..84c0aae583 100644
--- a/test_cases/compile/out/HelloTmpl.approval.teal
+++ b/test_cases/compile/out/HelloTmpl.approval.teal
@@ -43,10 +43,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
@@ -56,9 +56,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
@@ -67,9 +67,9 @@ __puya_arc4_router___greet_route@4:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:61
// class HelloTmpl(HelloBase):
txna ApplicationArgs 1
@@ -103,7 +103,7 @@ __puya_arc4_router___update@8:
// compile/apps.py:29
// @arc4.baremethod(allow_actions=["UpdateApplication"])
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out/HelloTmpl.arc32.json b/test_cases/compile/out/HelloTmpl.arc32.json
index 20efd2d7f6..f9bf718ac4 100644
--- a/test_cases/compile/out/HelloTmpl.arc32.json
+++ b/test_cases/compile/out/HelloTmpl.arc32.json
@@ -17,7 +17,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBUTVBMX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvVG1wbC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjY0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBieXRlY18xIC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYxCiAgICAvLyBjbGFzcyBIZWxsb1RtcGwoSGVsbG9CYXNlKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3CiAgICBwdXNoYnl0ZXNzIDB4NGM1YzYxYmEgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJkZWxldGUoKXZvaWQiLCBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2MQogICAgLy8gY2xhc3MgSGVsbG9UbXBsKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NjEKICAgIC8vIGNsYXNzIEhlbGxvVG1wbChIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBjb21waWxlL2FwcHMucHk6MjktMzAKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMtMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozNQogICAgLy8gcmV0dXJuIHNlbGYuZ3JlZXRpbmcgKyAiICIgKyBuYW1lCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ3JlZXRpbmcgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIiAiCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBUTVBMX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvVG1wbC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjY0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBieXRlY18xIC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYxCiAgICAvLyBjbGFzcyBIZWxsb1RtcGwoSGVsbG9CYXNlKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3CiAgICBwdXNoYnl0ZXNzIDB4NGM1YzYxYmEgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJkZWxldGUoKXZvaWQiLCBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2MQogICAgLy8gY2xhc3MgSGVsbG9UbXBsKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NjEKICAgIC8vIGNsYXNzIEhlbGxvVG1wbChIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
diff --git a/test_cases/compile/out/HelloTmpl.arc56.json b/test_cases/compile/out/HelloTmpl.arc56.json
new file mode 100644
index 0000000000..72a3f5052e
--- /dev/null
+++ b/test_cases/compile/out/HelloTmpl.arc56.json
@@ -0,0 +1,165 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "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"
+ ]
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 93
+ ],
+ "errorMessage": "OnCompletion is not DeleteApplication"
+ },
+ {
+ "pc": [
+ 81,
+ 102
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 85
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 96,
+ 105,
+ 146
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 155
+ ],
+ "errorMessage": "check self.greeting exists"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBUTVBMX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvVG1wbC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjY0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBieXRlY18xIC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYxCiAgICAvLyBjbGFzcyBIZWxsb1RtcGwoSGVsbG9CYXNlKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3CiAgICBwdXNoYnl0ZXNzIDB4NGM1YzYxYmEgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJkZWxldGUoKXZvaWQiLCBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2MQogICAgLy8gY2xhc3MgSGVsbG9UbXBsKEhlbGxvQmFzZSk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NjEKICAgIC8vIGNsYXNzIEhlbGxvVG1wbChIZWxsb0Jhc2UpOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAODoKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
+ },
+ "byteCode": {
+ "approval": "CiACAQAmAghncmVldGluZwR0bXBsMRhAAAOIAASIAAhDigAAKClniYoAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UIk=",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {
+ "TMPL_GREETING": {
+ "type": "AVMString",
+ "value": "dG1wbA=="
+ }
+ }
+}
\ No newline at end of file
diff --git a/test_cases/compile/out/HelloTmpl.destructured.ir b/test_cases/compile/out/HelloTmpl.destructured.ir
index 73382d3b3c..76ebecb6b3 100644
--- a/test_cases/compile/out/HelloTmpl.destructured.ir
+++ b/test_cases/compile/out/HelloTmpl.destructured.ir
@@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloTmpl:
block@2: // create_route_L66
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloTmpl:
switch tmp%18#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out/HelloTmpl.ssa.ir b/test_cases/compile/out/HelloTmpl.ssa.ir
index 882b085ace..103ecf55a5 100644
--- a/test_cases/compile/out/HelloTmpl.ssa.ir
+++ b/test_cases/compile/out/HelloTmpl.ssa.ir
@@ -27,28 +27,28 @@ contract test_cases.compile.apps.HelloTmpl:
block@2: // create_route_L66
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.compile.apps.HelloTmpl.create()
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
test_cases.compile.apps.HelloBase.delete()
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -69,7 +69,7 @@ contract test_cases.compile.apps.HelloTmpl:
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
let tmp%20#0: bool = (!= tmp%19#0 0u)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
test_cases.compile.apps.HelloBase.update()
return 1u
block@9: // switch_case_default_L61
diff --git a/test_cases/compile/out/HelloTmpl.ssa.opt_pass_1.ir b/test_cases/compile/out/HelloTmpl.ssa.opt_pass_1.ir
index 73382d3b3c..76ebecb6b3 100644
--- a/test_cases/compile/out/HelloTmpl.ssa.opt_pass_1.ir
+++ b/test_cases/compile/out/HelloTmpl.ssa.opt_pass_1.ir
@@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloTmpl:
block@2: // create_route_L66
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloTmpl:
switch tmp%18#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out/LargeProgram.approval.mir b/test_cases/compile/out/LargeProgram.approval.mir
index bfbfa19b4b..135fccd361 100644
--- a/test_cases/compile/out/LargeProgram.approval.mir
+++ b/test_cases/compile/out/LargeProgram.approval.mir
@@ -34,9 +34,9 @@ __puya_arc4_router___get_big_bytes_length_route@2:
// @arc4.abimethod()
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
callsub get_big_bytes_length to_encode%0#0
itob val_as_bytes%0#0
byte 0x151f7c75 val_as_bytes%0#0,0x151f7c75
@@ -52,9 +52,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion tmp%8#0
int DeleteApplication tmp%8#0,DeleteApplication
== tmp%9#0
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID tmp%10#0
- assert // is not creating
+ assert // can only call when not creating
int 1 1
retsub 1
@@ -68,7 +68,7 @@ __puya_arc4_router___bare_routing@6:
__puya_arc4_router_____algopy_default_create@7:
txn ApplicationID tmp%13#0
! tmp%14#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/compile/out/LargeProgram.approval.teal b/test_cases/compile/out/LargeProgram.approval.teal
index a802f369b5..f63d239db7 100644
--- a/test_cases/compile/out/LargeProgram.approval.teal
+++ b/test_cases/compile/out/LargeProgram.approval.teal
@@ -24,9 +24,9 @@ __puya_arc4_router___get_big_bytes_length_route@2:
// @arc4.abimethod()
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_big_bytes_length
itob
pushbytes 0x151f7c75
@@ -42,9 +42,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
@@ -55,7 +55,7 @@ __puya_arc4_router___bare_routing@6:
bnz __puya_arc4_router___after_if_else@10
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/test_cases/compile/out/LargeProgram.arc32.json b/test_cases/compile/out/LargeProgram.arc32.json
index eb519861d7..1cfa9cd164 100644
--- a/test_cases/compile/out/LargeProgram.arc32.json
+++ b/test_cases/compile/out/LargeProgram.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkxhcmdlUHJvZ3JhbS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhmNWU0ZmQ0ZCAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2JpZ19ieXRlc19sZW5ndGgKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozOAogICAgLy8gY2xhc3MgTGFyZ2VQcm9ncmFtKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozOAogICAgLy8gY2xhc3MgTGFyZ2VQcm9ncmFtKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuTGFyZ2VQcm9ncmFtLmdldF9iaWdfYnl0ZXNfbGVuZ3RoKCkgLT4gdWludDY0OgpnZXRfYmlnX2J5dGVzX2xlbmd0aDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfYmlnX2J5dGVzX2xlbmd0aChzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MgogICAgLy8gcmV0dXJuIGdldF9iaWdfYnl0ZXMoKS5sZW5ndGgKICAgIGNhbGxzdWIgZ2V0X2JpZ19ieXRlcwogICAgbGVuCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5nZXRfYmlnX2J5dGVzKCkgLT4gYnl0ZXM6CmdldF9iaWdfYnl0ZXM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NDktNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2JpZ19ieXRlcygpIC0+IEJ5dGVzOgogICAgcHJvdG8gMCAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6NTEKICAgIC8vIHJldHVybiBCeXRlcy5mcm9tX2hleCgiMDAiICogNDA5NikKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkxhcmdlUHJvZ3JhbS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhmNWU0ZmQ0ZCAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYmlnX2J5dGVzX2xlbmd0aAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM4CiAgICAvLyBjbGFzcyBMYXJnZVByb2dyYW0oQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uZ2V0X2JpZ19ieXRlc19sZW5ndGgoKSAtPiB1aW50NjQ6CmdldF9iaWdfYnl0ZXNfbGVuZ3RoOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF9iaWdfYnl0ZXNfbGVuZ3RoKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjQyCiAgICAvLyByZXR1cm4gZ2V0X2JpZ19ieXRlcygpLmxlbmd0aAogICAgY2FsbHN1YiBnZXRfYmlnX2J5dGVzCiAgICBsZW4KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLmdldF9iaWdfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2JpZ19ieXRlczoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0OS01MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmlnX2J5dGVzKCkgLT4gQnl0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1MQogICAgLy8gcmV0dXJuIEJ5dGVzLmZyb21faGV4KCIwMCIgKiA0MDk2KQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
diff --git a/test_cases/compile/out/LargeProgram.arc56.json b/test_cases/compile/out/LargeProgram.arc56.json
new file mode 100644
index 0000000000..1848b468bf
--- /dev/null
+++ b/test_cases/compile/out/LargeProgram.arc56.json
@@ -0,0 +1,125 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 67
+ ],
+ "errorMessage": "OnCompletion is not DeleteApplication"
+ },
+ {
+ "pc": [
+ 43
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 81
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 46,
+ 70
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkxhcmdlUHJvZ3JhbS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhmNWU0ZmQ0ZCAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYmlnX2J5dGVzX2xlbmd0aAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM4CiAgICAvLyBjbGFzcyBMYXJnZVByb2dyYW0oQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uZ2V0X2JpZ19ieXRlc19sZW5ndGgoKSAtPiB1aW50NjQ6CmdldF9iaWdfYnl0ZXNfbGVuZ3RoOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF9iaWdfYnl0ZXNfbGVuZ3RoKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjQyCiAgICAvLyByZXR1cm4gZ2V0X2JpZ19ieXRlcygpLmxlbmd0aAogICAgY2FsbHN1YiBnZXRfYmlnX2J5dGVzCiAgICBsZW4KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLmdldF9iaWdfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2JpZ19ieXRlczoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0OS01MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmlnX2J5dGVzKCkgLT4gQnl0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1MQogICAgLy8gcmV0dXJuIEJ5dGVzLmZyb21faGV4KCIwMCIgKiA0MDk2KQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
+ },
+ "byteCode": {
+ "approval": "CiACAQCIAAFDigABMRtBADiCAgT15P1NBCQ3jTw2GgCOAgACABgjiTEZFEQxGESIACQWgAQVH3x1TFCwIokxGYEFEkQxGEQiiTEZQAAGMRgURCKJI4mKAAGIAAIViYoAAYCAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/compile/out/LargeProgram.destructured.ir b/test_cases/compile/out/LargeProgram.destructured.ir
index 0cb21207b9..53ca46a088 100644
--- a/test_cases/compile/out/LargeProgram.destructured.ir
+++ b/test_cases/compile/out/LargeProgram.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.apps.LargeProgram:
block@2: // get_big_bytes_length_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -26,9 +26,9 @@ contract test_cases.compile.apps.LargeProgram:
block@3: // delete_route_L44
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
return 1u
block@6: // bare_routing_L38
let tmp%12#0: uint64 = (txn OnCompletion)
@@ -36,7 +36,7 @@ contract test_cases.compile.apps.LargeProgram:
block@7: // __algopy_default_create_L1
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // is creating
+ (assert tmp%14#0) // can only call when creating
return 1u
block@10: // after_if_else_L38
return 0u
diff --git a/test_cases/compile/out/LargeProgram.ssa.ir b/test_cases/compile/out/LargeProgram.ssa.ir
index 1b474dae96..cd30333b79 100644
--- a/test_cases/compile/out/LargeProgram.ssa.ir
+++ b/test_cases/compile/out/LargeProgram.ssa.ir
@@ -16,10 +16,10 @@ contract test_cases.compile.apps.LargeProgram:
block@2: // get_big_bytes_length_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -28,10 +28,10 @@ contract test_cases.compile.apps.LargeProgram:
block@3: // delete_route_L44
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.apps.LargeProgram.delete()
return 1u
block@4: // switch_case_default_L38
@@ -44,7 +44,7 @@ contract test_cases.compile.apps.LargeProgram:
block@7: // __algopy_default_create_L1
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (== tmp%13#0 0u)
- (assert tmp%14#0) // is creating
+ (assert tmp%14#0) // can only call when creating
test_cases.compile.apps.LargeProgram.__algopy_default_create()
return 1u
block@8: // switch_case_default_L38
diff --git a/test_cases/compile/out/LargeProgram.ssa.opt_pass_1.ir b/test_cases/compile/out/LargeProgram.ssa.opt_pass_1.ir
index 0cb21207b9..53ca46a088 100644
--- a/test_cases/compile/out/LargeProgram.ssa.opt_pass_1.ir
+++ b/test_cases/compile/out/LargeProgram.ssa.opt_pass_1.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.apps.LargeProgram:
block@2: // get_big_bytes_length_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -26,9 +26,9 @@ contract test_cases.compile.apps.LargeProgram:
block@3: // delete_route_L44
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
return 1u
block@6: // bare_routing_L38
let tmp%12#0: uint64 = (txn OnCompletion)
@@ -36,7 +36,7 @@ contract test_cases.compile.apps.LargeProgram:
block@7: // __algopy_default_create_L1
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // is creating
+ (assert tmp%14#0) // can only call when creating
return 1u
block@10: // after_if_else_L38
return 0u
diff --git a/test_cases/compile/out_O2/Hello.approval.teal b/test_cases/compile/out_O2/Hello.approval.teal
index 0e72b6a0f5..317bece2a3 100644
--- a/test_cases/compile/out_O2/Hello.approval.teal
+++ b/test_cases/compile/out_O2/Hello.approval.teal
@@ -35,10 +35,10 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
txna ApplicationArgs 1
extract 2 0
callsub create
@@ -49,18 +49,18 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
__puya_arc4_router___greet_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
extract 2 0
callsub greet
@@ -86,7 +86,7 @@ __puya_arc4_router___bare_routing@7:
__puya_arc4_router___update@8:
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
diff --git a/test_cases/compile/out_O2/Hello.destructured.ir b/test_cases/compile/out_O2/Hello.destructured.ir
index 5f55bf1037..9860a08388 100644
--- a/test_cases/compile/out_O2/Hello.destructured.ir
+++ b/test_cases/compile/out_O2/Hello.destructured.ir
@@ -26,10 +26,10 @@ contract test_cases.compile.apps.Hello:
block@2: // create_route_L56
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
test_cases.compile.apps.Hello.create(tmp%8#0)
@@ -37,16 +37,16 @@ contract test_cases.compile.apps.Hello:
block@3: // delete_route_L25
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 DeleteApplication)
- (assert tmp%10#0) // OnCompletion is DeleteApplication
+ (assert tmp%10#0) // OnCompletion is not DeleteApplication
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = (txna ApplicationArgs 1)
let tmp%18#0: bytes = ((extract 2 0) tmp%17#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0)
@@ -62,7 +62,7 @@ contract test_cases.compile.apps.Hello:
switch tmp%20#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.Hello.create(greeting: bytes) -> void:
diff --git a/test_cases/compile/out_O2/HelloBase.approval.teal b/test_cases/compile/out_O2/HelloBase.approval.teal
index 207f7f5424..983c0a8b57 100644
--- a/test_cases/compile/out_O2/HelloBase.approval.teal
+++ b/test_cases/compile/out_O2/HelloBase.approval.teal
@@ -36,18 +36,18 @@ __puya_arc4_router___delete_route@2:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_1 // 1
retsub
__puya_arc4_router___greet_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
extract 2 0
callsub greet
@@ -74,14 +74,14 @@ __puya_arc4_router___bare_routing@6:
__puya_arc4_router___update@7:
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_1 // 1
retsub
__puya_arc4_router_____algopy_default_create@8:
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/compile/out_O2/HelloBase.destructured.ir b/test_cases/compile/out_O2/HelloBase.destructured.ir
index c6ab9544b2..43b6feff2d 100644
--- a/test_cases/compile/out_O2/HelloBase.destructured.ir
+++ b/test_cases/compile/out_O2/HelloBase.destructured.ir
@@ -26,16 +26,16 @@ contract test_cases.compile.apps.HelloBase:
block@2: // delete_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 DeleteApplication)
- (assert tmp%4#0) // OnCompletion is DeleteApplication
+ (assert tmp%4#0) // OnCompletion is not DeleteApplication
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
return 1u
block@3: // greet_route_L33
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
let tmp%11#0: bytes = (txna ApplicationArgs 1)
let tmp%12#0: bytes = ((extract 2 0) tmp%11#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0)
@@ -51,12 +51,12 @@ contract test_cases.compile.apps.HelloBase:
switch tmp%14#0 {4u => block@7, 0u => block@8, * => return 0u}
block@7: // update_L29
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
return 1u
block@8: // __algopy_default_create_L1
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // is creating
+ (assert tmp%18#0) // can only call when creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out_O2/HelloFactory.approval.teal b/test_cases/compile/out_O2/HelloFactory.approval.teal
index 05de31658f..b0ecfd9cb5 100644
--- a/test_cases/compile/out_O2/HelloFactory.approval.teal
+++ b/test_cases/compile/out_O2/HelloFactory.approval.teal
@@ -21,9 +21,9 @@ __puya_arc4_router__:
__puya_arc4_router___test_logicsig_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_logicsig
bytec_0 // 0x151f7c75
swap
@@ -35,9 +35,9 @@ __puya_arc4_router___test_logicsig_route@2:
__puya_arc4_router___test_compile_contract_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract
intc_2 // 1
retsub
@@ -45,9 +45,9 @@ __puya_arc4_router___test_compile_contract_route@3:
__puya_arc4_router___test_compile_contract_tmpl_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_tmpl
intc_2 // 1
retsub
@@ -55,9 +55,9 @@ __puya_arc4_router___test_compile_contract_tmpl_route@4:
__puya_arc4_router___test_compile_contract_prfx_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_prfx
intc_2 // 1
retsub
@@ -65,9 +65,9 @@ __puya_arc4_router___test_compile_contract_prfx_route@5:
__puya_arc4_router___test_compile_contract_large_route@6:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_large
intc_2 // 1
retsub
@@ -75,9 +75,9 @@ __puya_arc4_router___test_compile_contract_large_route@6:
__puya_arc4_router___test_arc4_create_route@7:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create
intc_2 // 1
retsub
@@ -85,9 +85,9 @@ __puya_arc4_router___test_arc4_create_route@7:
__puya_arc4_router___test_arc4_create_tmpl_route@8:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_tmpl
intc_2 // 1
retsub
@@ -95,9 +95,9 @@ __puya_arc4_router___test_arc4_create_tmpl_route@8:
__puya_arc4_router___test_arc4_create_prfx_route@9:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_prfx
intc_2 // 1
retsub
@@ -105,9 +105,9 @@ __puya_arc4_router___test_arc4_create_prfx_route@9:
__puya_arc4_router___test_arc4_create_large_route@10:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_large
intc_2 // 1
retsub
@@ -115,9 +115,9 @@ __puya_arc4_router___test_arc4_create_large_route@10:
__puya_arc4_router___test_arc4_create_modified_compiled_route@11:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_modified_compiled
intc_2 // 1
retsub
@@ -125,9 +125,9 @@ __puya_arc4_router___test_arc4_create_modified_compiled_route@11:
__puya_arc4_router___test_arc4_update_route@12:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_update
intc_2 // 1
retsub
@@ -135,9 +135,9 @@ __puya_arc4_router___test_arc4_update_route@12:
__puya_arc4_router___test_other_constants_route@13:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_other_constants
intc_2 // 1
retsub
@@ -145,9 +145,9 @@ __puya_arc4_router___test_other_constants_route@13:
__puya_arc4_router___test_abi_call_create_params_route@14:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub test_abi_call_create_params
intc_2 // 1
retsub
@@ -157,7 +157,7 @@ __puya_arc4_router___bare_routing@17:
bnz __puya_arc4_router___after_if_else@21
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_2 // 1
retsub
diff --git a/test_cases/compile/out_O2/HelloFactory.destructured.ir b/test_cases/compile/out_O2/HelloFactory.destructured.ir
index 6202c8048f..f54ebe9083 100644
--- a/test_cases/compile/out_O2/HelloFactory.destructured.ir
+++ b/test_cases/compile/out_O2/HelloFactory.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.factory.HelloFactory:
block@2: // test_logicsig_route_L27
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -25,97 +25,97 @@ contract test_cases.compile.factory.HelloFactory:
block@3: // test_compile_contract_route_L31
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract()
return 1u
block@4: // test_compile_contract_tmpl_route_L62
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl()
return 1u
block@5: // test_compile_contract_prfx_route_L97
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (! tmp%17#0)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_prfx()
return 1u
block@6: // test_compile_contract_large_route_L130
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (! tmp%21#0)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
- (assert tmp%23#0) // is not creating
+ (assert tmp%23#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_large()
return 1u
block@7: // test_arc4_create_route_L161
let tmp%25#0: uint64 = (txn OnCompletion)
let tmp%26#0: bool = (! tmp%25#0)
- (assert tmp%26#0) // OnCompletion is NoOp
+ (assert tmp%26#0) // OnCompletion is not NoOp
let tmp%27#0: uint64 = (txn ApplicationID)
- (assert tmp%27#0) // is not creating
+ (assert tmp%27#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create()
return 1u
block@8: // test_arc4_create_tmpl_route_L178
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (! tmp%29#0)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
- (assert tmp%31#0) // is not creating
+ (assert tmp%31#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl()
return 1u
block@9: // test_arc4_create_prfx_route_L199
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (! tmp%33#0)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
- (assert tmp%35#0) // is not creating
+ (assert tmp%35#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_prfx()
return 1u
block@10: // test_arc4_create_large_route_L222
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (! tmp%37#0)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
- (assert tmp%39#0) // is not creating
+ (assert tmp%39#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_large()
return 1u
block@11: // test_arc4_create_modified_compiled_route_L237
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (! tmp%41#0)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
- (assert tmp%43#0) // is not creating
+ (assert tmp%43#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled()
return 1u
block@12: // test_arc4_update_route_L264
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (! tmp%45#0)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
- (assert tmp%47#0) // is not creating
+ (assert tmp%47#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_update()
return 1u
block@13: // test_other_constants_route_L298
let tmp%49#0: uint64 = (txn OnCompletion)
let tmp%50#0: bool = (! tmp%49#0)
- (assert tmp%50#0) // OnCompletion is NoOp
+ (assert tmp%50#0) // OnCompletion is not NoOp
let tmp%51#0: uint64 = (txn ApplicationID)
- (assert tmp%51#0) // is not creating
+ (assert tmp%51#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_other_constants()
return 1u
block@14: // test_abi_call_create_params_route_L324
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (! tmp%53#0)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
- (assert tmp%55#0) // is not creating
+ (assert tmp%55#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_abi_call_create_params()
return 1u
block@17: // bare_routing_L25
@@ -124,7 +124,7 @@ contract test_cases.compile.factory.HelloFactory:
block@18: // __algopy_default_create_L1
let tmp%58#0: uint64 = (txn ApplicationID)
let tmp%59#0: bool = (! tmp%58#0)
- (assert tmp%59#0) // is creating
+ (assert tmp%59#0) // can only call when creating
return 1u
block@21: // after_if_else_L25
return 0u
diff --git a/test_cases/compile/out_O2/HelloOtherConstants.approval.teal b/test_cases/compile/out_O2/HelloOtherConstants.approval.teal
index 4823a3fd91..52c8932ab7 100644
--- a/test_cases/compile/out_O2/HelloOtherConstants.approval.teal
+++ b/test_cases/compile/out_O2/HelloOtherConstants.approval.teal
@@ -44,10 +44,10 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
callsub create
itob
bytec 4 // 0x151f7c75
@@ -61,18 +61,18 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_1 // 1
retsub
__puya_arc4_router___greet_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
extract 2 0
callsub greet
diff --git a/test_cases/compile/out_O2/HelloOtherConstants.destructured.ir b/test_cases/compile/out_O2/HelloOtherConstants.destructured.ir
index 4265c3d047..660d3dcfbe 100644
--- a/test_cases/compile/out_O2/HelloOtherConstants.destructured.ir
+++ b/test_cases/compile/out_O2/HelloOtherConstants.destructured.ir
@@ -29,10 +29,10 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@2: // create_route_L89
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -41,16 +41,16 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@3: // delete_route_L93
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
return 1u
block@4: // greet_route_L97
let tmp%12#0: uint64 = (txn OnCompletion)
let tmp%13#0: bool = (! tmp%12#0)
- (assert tmp%13#0) // OnCompletion is NoOp
+ (assert tmp%13#0) // OnCompletion is not NoOp
let tmp%14#0: uint64 = (txn ApplicationID)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%16#0: bytes = (txna ApplicationArgs 1)
let tmp%17#0: bytes = ((extract 2 0) tmp%16#0)
let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0)
diff --git a/test_cases/compile/out_O2/HelloPrfx.approval.teal b/test_cases/compile/out_O2/HelloPrfx.approval.teal
index 202a4a8c4e..c7394c76c1 100644
--- a/test_cases/compile/out_O2/HelloPrfx.approval.teal
+++ b/test_cases/compile/out_O2/HelloPrfx.approval.teal
@@ -35,10 +35,10 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
@@ -46,18 +46,18 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
__puya_arc4_router___greet_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
extract 2 0
callsub greet
@@ -83,7 +83,7 @@ __puya_arc4_router___bare_routing@7:
__puya_arc4_router___update@8:
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
diff --git a/test_cases/compile/out_O2/HelloPrfx.destructured.ir b/test_cases/compile/out_O2/HelloPrfx.destructured.ir
index b5988a21d9..f8cac45570 100644
--- a/test_cases/compile/out_O2/HelloPrfx.destructured.ir
+++ b/test_cases/compile/out_O2/HelloPrfx.destructured.ir
@@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloPrfx:
block@2: // create_route_L76
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloPrfx:
switch tmp%18#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out_O2/HelloTmpl.approval.teal b/test_cases/compile/out_O2/HelloTmpl.approval.teal
index e260bfb32e..3443505d46 100644
--- a/test_cases/compile/out_O2/HelloTmpl.approval.teal
+++ b/test_cases/compile/out_O2/HelloTmpl.approval.teal
@@ -35,10 +35,10 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
@@ -46,18 +46,18 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
__puya_arc4_router___greet_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
extract 2 0
callsub greet
@@ -83,7 +83,7 @@ __puya_arc4_router___bare_routing@7:
__puya_arc4_router___update@8:
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
diff --git a/test_cases/compile/out_O2/HelloTmpl.destructured.ir b/test_cases/compile/out_O2/HelloTmpl.destructured.ir
index 73382d3b3c..76ebecb6b3 100644
--- a/test_cases/compile/out_O2/HelloTmpl.destructured.ir
+++ b/test_cases/compile/out_O2/HelloTmpl.destructured.ir
@@ -26,24 +26,24 @@ contract test_cases.compile.apps.HelloTmpl:
block@2: // create_route_L66
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (! tmp%11#0)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
- (assert tmp%13#0) // is not creating
+ (assert tmp%13#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -59,7 +59,7 @@ contract test_cases.compile.apps.HelloTmpl:
switch tmp%18#0 {4u => block@8, * => return 0u}
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
- (assert tmp%19#0) // is not creating
+ (assert tmp%19#0) // can only call when not creating
return 1u
subroutine test_cases.compile.apps.HelloBase.greet(name: bytes) -> bytes:
diff --git a/test_cases/compile/out_O2/LargeProgram.approval.teal b/test_cases/compile/out_O2/LargeProgram.approval.teal
index 32c84f42a1..6a4dd877b1 100644
--- a/test_cases/compile/out_O2/LargeProgram.approval.teal
+++ b/test_cases/compile/out_O2/LargeProgram.approval.teal
@@ -20,9 +20,9 @@ __puya_arc4_router__:
__puya_arc4_router___get_big_bytes_length_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub get_big_bytes_length
itob
pushbytes 0x151f7c75
@@ -36,9 +36,9 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
intc_0 // 1
retsub
@@ -47,7 +47,7 @@ __puya_arc4_router___bare_routing@6:
bnz __puya_arc4_router___after_if_else@10
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/test_cases/compile/out_O2/LargeProgram.destructured.ir b/test_cases/compile/out_O2/LargeProgram.destructured.ir
index 0cb21207b9..53ca46a088 100644
--- a/test_cases/compile/out_O2/LargeProgram.destructured.ir
+++ b/test_cases/compile/out_O2/LargeProgram.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.compile.apps.LargeProgram:
block@2: // get_big_bytes_length_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -26,9 +26,9 @@ contract test_cases.compile.apps.LargeProgram:
block@3: // delete_route_L44
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
return 1u
block@6: // bare_routing_L38
let tmp%12#0: uint64 = (txn OnCompletion)
@@ -36,7 +36,7 @@ contract test_cases.compile.apps.LargeProgram:
block@7: // __algopy_default_create_L1
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // is creating
+ (assert tmp%14#0) // can only call when creating
return 1u
block@10: // after_if_else_L38
return 0u
diff --git a/test_cases/compile/out_unoptimized/Hello.approval.teal b/test_cases/compile/out_unoptimized/Hello.approval.teal
index 5e8eb1925f..8d90f102dd 100644
--- a/test_cases/compile/out_unoptimized/Hello.approval.teal
+++ b/test_cases/compile/out_unoptimized/Hello.approval.teal
@@ -48,11 +48,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
// compile/apps.py:54
// class Hello(HelloBase):
txna ApplicationArgs 1
@@ -69,11 +69,11 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub delete
intc_1 // 1
retsub
@@ -84,11 +84,11 @@ __puya_arc4_router___greet_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:54
// class Hello(HelloBase):
txna ApplicationArgs 1
@@ -127,7 +127,7 @@ __puya_arc4_router___update@8:
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out_unoptimized/Hello.destructured.ir b/test_cases/compile/out_unoptimized/Hello.destructured.ir
index bad043f9b0..18d057532c 100644
--- a/test_cases/compile/out_unoptimized/Hello.destructured.ir
+++ b/test_cases/compile/out_unoptimized/Hello.destructured.ir
@@ -27,10 +27,10 @@ contract test_cases.compile.apps.Hello:
block@2: // create_route_L56
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: bytes = ((extract 2 0) tmp%7#0)
test_cases.compile.apps.Hello.create(tmp%8#0)
@@ -38,19 +38,19 @@ contract test_cases.compile.apps.Hello:
block@3: // delete_route_L25
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 DeleteApplication)
- (assert tmp%10#0) // OnCompletion is DeleteApplication
+ (assert tmp%10#0) // OnCompletion is not DeleteApplication
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (!= tmp%11#0 0u)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
test_cases.compile.apps.HelloBase.delete()
return 1u
block@4: // greet_route_L33
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (== tmp%13#0 NoOp)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (!= tmp%15#0 0u)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%17#0: bytes = (txna ApplicationArgs 1)
let tmp%18#0: bytes = ((extract 2 0) tmp%17#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%18#0)
@@ -71,7 +71,7 @@ contract test_cases.compile.apps.Hello:
block@8: // update_L29
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
test_cases.compile.apps.HelloBase.update()
return 1u
block@9: // switch_case_default_L54
diff --git a/test_cases/compile/out_unoptimized/HelloBase.approval.teal b/test_cases/compile/out_unoptimized/HelloBase.approval.teal
index 7330a4e035..9495fb95be 100644
--- a/test_cases/compile/out_unoptimized/HelloBase.approval.teal
+++ b/test_cases/compile/out_unoptimized/HelloBase.approval.teal
@@ -47,11 +47,11 @@ __puya_arc4_router___delete_route@2:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub delete
intc_1 // 1
retsub
@@ -62,11 +62,11 @@ __puya_arc4_router___greet_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:20
// class HelloBase(ARC4Contract):
txna ApplicationArgs 1
@@ -106,7 +106,7 @@ __puya_arc4_router___update@7:
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
@@ -118,7 +118,7 @@ __puya_arc4_router_____algopy_default_create@8:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/test_cases/compile/out_unoptimized/HelloBase.destructured.ir b/test_cases/compile/out_unoptimized/HelloBase.destructured.ir
index 7659e2ca5a..1fb683af6a 100644
--- a/test_cases/compile/out_unoptimized/HelloBase.destructured.ir
+++ b/test_cases/compile/out_unoptimized/HelloBase.destructured.ir
@@ -27,19 +27,19 @@ contract test_cases.compile.apps.HelloBase:
block@2: // delete_route_L25
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 DeleteApplication)
- (assert tmp%4#0) // OnCompletion is DeleteApplication
+ (assert tmp%4#0) // OnCompletion is not DeleteApplication
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.compile.apps.HelloBase.delete()
return 1u
block@3: // greet_route_L33
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%11#0: bytes = (txna ApplicationArgs 1)
let tmp%12#0: bytes = ((extract 2 0) tmp%11#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%12#0)
@@ -60,13 +60,13 @@ contract test_cases.compile.apps.HelloBase:
block@7: // update_L29
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (!= tmp%15#0 0u)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
test_cases.compile.apps.HelloBase.update()
return 1u
block@8: // __algopy_default_create_L1
let tmp%17#0: uint64 = (txn ApplicationID)
let tmp%18#0: bool = (== tmp%17#0 0u)
- (assert tmp%18#0) // is creating
+ (assert tmp%18#0) // can only call when creating
test_cases.compile.apps.HelloBase.__algopy_default_create()
return 1u
block@9: // switch_case_default_L20
diff --git a/test_cases/compile/out_unoptimized/HelloFactory.approval.teal b/test_cases/compile/out_unoptimized/HelloFactory.approval.teal
index 8aefcf6e52..9ac55281a9 100644
--- a/test_cases/compile/out_unoptimized/HelloFactory.approval.teal
+++ b/test_cases/compile/out_unoptimized/HelloFactory.approval.teal
@@ -40,11 +40,11 @@ __puya_arc4_router___test_logicsig_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_logicsig
bytec_1 // 0x151f7c75
swap
@@ -59,11 +59,11 @@ __puya_arc4_router___test_compile_contract_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract
intc_2 // 1
retsub
@@ -74,11 +74,11 @@ __puya_arc4_router___test_compile_contract_tmpl_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_tmpl
intc_2 // 1
retsub
@@ -89,11 +89,11 @@ __puya_arc4_router___test_compile_contract_prfx_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_prfx
intc_2 // 1
retsub
@@ -104,11 +104,11 @@ __puya_arc4_router___test_compile_contract_large_route@6:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_compile_contract_large
intc_2 // 1
retsub
@@ -119,11 +119,11 @@ __puya_arc4_router___test_arc4_create_route@7:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create
intc_2 // 1
retsub
@@ -134,11 +134,11 @@ __puya_arc4_router___test_arc4_create_tmpl_route@8:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_tmpl
intc_2 // 1
retsub
@@ -149,11 +149,11 @@ __puya_arc4_router___test_arc4_create_prfx_route@9:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_prfx
intc_2 // 1
retsub
@@ -164,11 +164,11 @@ __puya_arc4_router___test_arc4_create_large_route@10:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_large
intc_2 // 1
retsub
@@ -179,11 +179,11 @@ __puya_arc4_router___test_arc4_create_modified_compiled_route@11:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_create_modified_compiled
intc_2 // 1
retsub
@@ -194,11 +194,11 @@ __puya_arc4_router___test_arc4_update_route@12:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_arc4_update
intc_2 // 1
retsub
@@ -209,11 +209,11 @@ __puya_arc4_router___test_other_constants_route@13:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_other_constants
intc_2 // 1
retsub
@@ -224,11 +224,11 @@ __puya_arc4_router___test_abi_call_create_params_route@14:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub test_abi_call_create_params
intc_2 // 1
retsub
@@ -249,7 +249,7 @@ __puya_arc4_router_____algopy_default_create@18:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_2 // 1
retsub
diff --git a/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir b/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir
index 466b50c9d6..15ded10310 100644
--- a/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir
+++ b/test_cases/compile/out_unoptimized/HelloFactory.destructured.ir
@@ -16,10 +16,10 @@ contract test_cases.compile.factory.HelloFactory:
block@2: // test_logicsig_route_L27
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = test_cases.compile.factory.HelloFactory.test_logicsig()
let tmp%8#0: bytes = (concat 0x151f7c75 tmp%7#0)
(log tmp%8#0)
@@ -27,109 +27,109 @@ contract test_cases.compile.factory.HelloFactory:
block@3: // test_compile_contract_route_L31
let tmp%9#0: uint64 = (txn OnCompletion)
let tmp%10#0: bool = (== tmp%9#0 NoOp)
- (assert tmp%10#0) // OnCompletion is NoOp
+ (assert tmp%10#0) // OnCompletion is not NoOp
let tmp%11#0: uint64 = (txn ApplicationID)
let tmp%12#0: bool = (!= tmp%11#0 0u)
- (assert tmp%12#0) // is not creating
+ (assert tmp%12#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract()
return 1u
block@4: // test_compile_contract_tmpl_route_L62
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (== tmp%13#0 NoOp)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (!= tmp%15#0 0u)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_tmpl()
return 1u
block@5: // test_compile_contract_prfx_route_L97
let tmp%17#0: uint64 = (txn OnCompletion)
let tmp%18#0: bool = (== tmp%17#0 NoOp)
- (assert tmp%18#0) // OnCompletion is NoOp
+ (assert tmp%18#0) // OnCompletion is not NoOp
let tmp%19#0: uint64 = (txn ApplicationID)
let tmp%20#0: bool = (!= tmp%19#0 0u)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_prfx()
return 1u
block@6: // test_compile_contract_large_route_L130
let tmp%21#0: uint64 = (txn OnCompletion)
let tmp%22#0: bool = (== tmp%21#0 NoOp)
- (assert tmp%22#0) // OnCompletion is NoOp
+ (assert tmp%22#0) // OnCompletion is not NoOp
let tmp%23#0: uint64 = (txn ApplicationID)
let tmp%24#0: bool = (!= tmp%23#0 0u)
- (assert tmp%24#0) // is not creating
+ (assert tmp%24#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_compile_contract_large()
return 1u
block@7: // test_arc4_create_route_L161
let tmp%25#0: uint64 = (txn OnCompletion)
let tmp%26#0: bool = (== tmp%25#0 NoOp)
- (assert tmp%26#0) // OnCompletion is NoOp
+ (assert tmp%26#0) // OnCompletion is not NoOp
let tmp%27#0: uint64 = (txn ApplicationID)
let tmp%28#0: bool = (!= tmp%27#0 0u)
- (assert tmp%28#0) // is not creating
+ (assert tmp%28#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create()
return 1u
block@8: // test_arc4_create_tmpl_route_L178
let tmp%29#0: uint64 = (txn OnCompletion)
let tmp%30#0: bool = (== tmp%29#0 NoOp)
- (assert tmp%30#0) // OnCompletion is NoOp
+ (assert tmp%30#0) // OnCompletion is not NoOp
let tmp%31#0: uint64 = (txn ApplicationID)
let tmp%32#0: bool = (!= tmp%31#0 0u)
- (assert tmp%32#0) // is not creating
+ (assert tmp%32#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_tmpl()
return 1u
block@9: // test_arc4_create_prfx_route_L199
let tmp%33#0: uint64 = (txn OnCompletion)
let tmp%34#0: bool = (== tmp%33#0 NoOp)
- (assert tmp%34#0) // OnCompletion is NoOp
+ (assert tmp%34#0) // OnCompletion is not NoOp
let tmp%35#0: uint64 = (txn ApplicationID)
let tmp%36#0: bool = (!= tmp%35#0 0u)
- (assert tmp%36#0) // is not creating
+ (assert tmp%36#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_prfx()
return 1u
block@10: // test_arc4_create_large_route_L222
let tmp%37#0: uint64 = (txn OnCompletion)
let tmp%38#0: bool = (== tmp%37#0 NoOp)
- (assert tmp%38#0) // OnCompletion is NoOp
+ (assert tmp%38#0) // OnCompletion is not NoOp
let tmp%39#0: uint64 = (txn ApplicationID)
let tmp%40#0: bool = (!= tmp%39#0 0u)
- (assert tmp%40#0) // is not creating
+ (assert tmp%40#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_large()
return 1u
block@11: // test_arc4_create_modified_compiled_route_L237
let tmp%41#0: uint64 = (txn OnCompletion)
let tmp%42#0: bool = (== tmp%41#0 NoOp)
- (assert tmp%42#0) // OnCompletion is NoOp
+ (assert tmp%42#0) // OnCompletion is not NoOp
let tmp%43#0: uint64 = (txn ApplicationID)
let tmp%44#0: bool = (!= tmp%43#0 0u)
- (assert tmp%44#0) // is not creating
+ (assert tmp%44#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_create_modified_compiled()
return 1u
block@12: // test_arc4_update_route_L264
let tmp%45#0: uint64 = (txn OnCompletion)
let tmp%46#0: bool = (== tmp%45#0 NoOp)
- (assert tmp%46#0) // OnCompletion is NoOp
+ (assert tmp%46#0) // OnCompletion is not NoOp
let tmp%47#0: uint64 = (txn ApplicationID)
let tmp%48#0: bool = (!= tmp%47#0 0u)
- (assert tmp%48#0) // is not creating
+ (assert tmp%48#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_arc4_update()
return 1u
block@13: // test_other_constants_route_L298
let tmp%49#0: uint64 = (txn OnCompletion)
let tmp%50#0: bool = (== tmp%49#0 NoOp)
- (assert tmp%50#0) // OnCompletion is NoOp
+ (assert tmp%50#0) // OnCompletion is not NoOp
let tmp%51#0: uint64 = (txn ApplicationID)
let tmp%52#0: bool = (!= tmp%51#0 0u)
- (assert tmp%52#0) // is not creating
+ (assert tmp%52#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_other_constants()
return 1u
block@14: // test_abi_call_create_params_route_L324
let tmp%53#0: uint64 = (txn OnCompletion)
let tmp%54#0: bool = (== tmp%53#0 NoOp)
- (assert tmp%54#0) // OnCompletion is NoOp
+ (assert tmp%54#0) // OnCompletion is not NoOp
let tmp%55#0: uint64 = (txn ApplicationID)
let tmp%56#0: bool = (!= tmp%55#0 0u)
- (assert tmp%56#0) // is not creating
+ (assert tmp%56#0) // can only call when not creating
test_cases.compile.factory.HelloFactory.test_abi_call_create_params()
return 1u
block@15: // switch_case_default_L25
@@ -142,7 +142,7 @@ contract test_cases.compile.factory.HelloFactory:
block@18: // __algopy_default_create_L1
let tmp%58#0: uint64 = (txn ApplicationID)
let tmp%59#0: bool = (== tmp%58#0 0u)
- (assert tmp%59#0) // is creating
+ (assert tmp%59#0) // can only call when creating
test_cases.compile.factory.HelloFactory.__algopy_default_create()
return 1u
block@19: // switch_case_default_L25
diff --git a/test_cases/compile/out_unoptimized/HelloOtherConstants.approval.teal b/test_cases/compile/out_unoptimized/HelloOtherConstants.approval.teal
index 194aa330b9..d982f5e747 100644
--- a/test_cases/compile/out_unoptimized/HelloOtherConstants.approval.teal
+++ b/test_cases/compile/out_unoptimized/HelloOtherConstants.approval.teal
@@ -63,11 +63,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub create
itob
bytec 4 // 0x151f7c75
@@ -83,11 +83,11 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub delete
intc_1 // 1
retsub
@@ -98,11 +98,11 @@ __puya_arc4_router___greet_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:81
// class HelloOtherConstants(ARC4Contract):
txna ApplicationArgs 1
diff --git a/test_cases/compile/out_unoptimized/HelloOtherConstants.destructured.ir b/test_cases/compile/out_unoptimized/HelloOtherConstants.destructured.ir
index e5c48eeb4e..d9f1652a6b 100644
--- a/test_cases/compile/out_unoptimized/HelloOtherConstants.destructured.ir
+++ b/test_cases/compile/out_unoptimized/HelloOtherConstants.destructured.ir
@@ -30,10 +30,10 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@2: // create_route_L89
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
let to_encode%0#0: uint64 = test_cases.compile.apps.HelloOtherConstants.create()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -42,19 +42,19 @@ contract test_cases.compile.apps.HelloOtherConstants:
block@3: // delete_route_L93
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.apps.HelloOtherConstants.delete()
return 1u
block@4: // greet_route_L97
let tmp%12#0: uint64 = (txn OnCompletion)
let tmp%13#0: bool = (== tmp%12#0 NoOp)
- (assert tmp%13#0) // OnCompletion is NoOp
+ (assert tmp%13#0) // OnCompletion is not NoOp
let tmp%14#0: uint64 = (txn ApplicationID)
let tmp%15#0: bool = (!= tmp%14#0 0u)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%16#0: bytes = (txna ApplicationArgs 1)
let tmp%17#0: bytes = ((extract 2 0) tmp%16#0)
let to_encode%1#0: bytes = test_cases.compile.apps.HelloOtherConstants.greet(tmp%17#0)
diff --git a/test_cases/compile/out_unoptimized/HelloPrfx.approval.teal b/test_cases/compile/out_unoptimized/HelloPrfx.approval.teal
index f37d53e352..553c8e3487 100644
--- a/test_cases/compile/out_unoptimized/HelloPrfx.approval.teal
+++ b/test_cases/compile/out_unoptimized/HelloPrfx.approval.teal
@@ -48,11 +48,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub create
intc_1 // 1
retsub
@@ -63,11 +63,11 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub delete
intc_1 // 1
retsub
@@ -78,11 +78,11 @@ __puya_arc4_router___greet_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:71
// class HelloPrfx(HelloBase):
txna ApplicationArgs 1
@@ -121,7 +121,7 @@ __puya_arc4_router___update@8:
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out_unoptimized/HelloPrfx.destructured.ir b/test_cases/compile/out_unoptimized/HelloPrfx.destructured.ir
index 8b8582d29b..889fb34c0b 100644
--- a/test_cases/compile/out_unoptimized/HelloPrfx.destructured.ir
+++ b/test_cases/compile/out_unoptimized/HelloPrfx.destructured.ir
@@ -27,28 +27,28 @@ contract test_cases.compile.apps.HelloPrfx:
block@2: // create_route_L76
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.compile.apps.HelloPrfx.create()
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
test_cases.compile.apps.HelloBase.delete()
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -69,7 +69,7 @@ contract test_cases.compile.apps.HelloPrfx:
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
let tmp%20#0: bool = (!= tmp%19#0 0u)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
test_cases.compile.apps.HelloBase.update()
return 1u
block@9: // switch_case_default_L71
diff --git a/test_cases/compile/out_unoptimized/HelloTmpl.approval.teal b/test_cases/compile/out_unoptimized/HelloTmpl.approval.teal
index 8da7e7cb7f..ac1220e468 100644
--- a/test_cases/compile/out_unoptimized/HelloTmpl.approval.teal
+++ b/test_cases/compile/out_unoptimized/HelloTmpl.approval.teal
@@ -48,11 +48,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub create
intc_1 // 1
retsub
@@ -63,11 +63,11 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub delete
intc_1 // 1
retsub
@@ -78,11 +78,11 @@ __puya_arc4_router___greet_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:61
// class HelloTmpl(HelloBase):
txna ApplicationArgs 1
@@ -121,7 +121,7 @@ __puya_arc4_router___update@8:
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// compile/apps.py:29-30
// @arc4.baremethod(allow_actions=["UpdateApplication"])
// def update(self) -> None:
diff --git a/test_cases/compile/out_unoptimized/HelloTmpl.destructured.ir b/test_cases/compile/out_unoptimized/HelloTmpl.destructured.ir
index 882b085ace..103ecf55a5 100644
--- a/test_cases/compile/out_unoptimized/HelloTmpl.destructured.ir
+++ b/test_cases/compile/out_unoptimized/HelloTmpl.destructured.ir
@@ -27,28 +27,28 @@ contract test_cases.compile.apps.HelloTmpl:
block@2: // create_route_L66
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.compile.apps.HelloTmpl.create()
return 1u
block@3: // delete_route_L25
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 DeleteApplication)
- (assert tmp%8#0) // OnCompletion is DeleteApplication
+ (assert tmp%8#0) // OnCompletion is not DeleteApplication
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
test_cases.compile.apps.HelloBase.delete()
return 1u
block@4: // greet_route_L33
let tmp%11#0: uint64 = (txn OnCompletion)
let tmp%12#0: bool = (== tmp%11#0 NoOp)
- (assert tmp%12#0) // OnCompletion is NoOp
+ (assert tmp%12#0) // OnCompletion is not NoOp
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (!= tmp%13#0 0u)
- (assert tmp%14#0) // is not creating
+ (assert tmp%14#0) // can only call when not creating
let tmp%15#0: bytes = (txna ApplicationArgs 1)
let tmp%16#0: bytes = ((extract 2 0) tmp%15#0)
let to_encode%0#0: bytes = test_cases.compile.apps.HelloBase.greet(tmp%16#0)
@@ -69,7 +69,7 @@ contract test_cases.compile.apps.HelloTmpl:
block@8: // update_L29
let tmp%19#0: uint64 = (txn ApplicationID)
let tmp%20#0: bool = (!= tmp%19#0 0u)
- (assert tmp%20#0) // is not creating
+ (assert tmp%20#0) // can only call when not creating
test_cases.compile.apps.HelloBase.update()
return 1u
block@9: // switch_case_default_L61
diff --git a/test_cases/compile/out_unoptimized/LargeProgram.approval.teal b/test_cases/compile/out_unoptimized/LargeProgram.approval.teal
index 1806224012..9b76e4a152 100644
--- a/test_cases/compile/out_unoptimized/LargeProgram.approval.teal
+++ b/test_cases/compile/out_unoptimized/LargeProgram.approval.teal
@@ -28,11 +28,11 @@ __puya_arc4_router___get_big_bytes_length_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub get_big_bytes_length
itob
pushbytes 0x151f7c75
@@ -48,11 +48,11 @@ __puya_arc4_router___delete_route@3:
txn OnCompletion
pushint 5 // DeleteApplication
==
- assert // OnCompletion is DeleteApplication
+ assert // OnCompletion is not DeleteApplication
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub delete
intc_1 // 1
retsub
@@ -73,7 +73,7 @@ __puya_arc4_router_____algopy_default_create@7:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/test_cases/compile/out_unoptimized/LargeProgram.destructured.ir b/test_cases/compile/out_unoptimized/LargeProgram.destructured.ir
index 1b474dae96..cd30333b79 100644
--- a/test_cases/compile/out_unoptimized/LargeProgram.destructured.ir
+++ b/test_cases/compile/out_unoptimized/LargeProgram.destructured.ir
@@ -16,10 +16,10 @@ contract test_cases.compile.apps.LargeProgram:
block@2: // get_big_bytes_length_route_L40
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let to_encode%0#0: uint64 = test_cases.compile.apps.LargeProgram.get_big_bytes_length()
let val_as_bytes%0#0: bytes = (itob to_encode%0#0)
let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0)
@@ -28,10 +28,10 @@ contract test_cases.compile.apps.LargeProgram:
block@3: // delete_route_L44
let tmp%8#0: uint64 = (txn OnCompletion)
let tmp%9#0: bool = (== tmp%8#0 DeleteApplication)
- (assert tmp%9#0) // OnCompletion is DeleteApplication
+ (assert tmp%9#0) // OnCompletion is not DeleteApplication
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
test_cases.compile.apps.LargeProgram.delete()
return 1u
block@4: // switch_case_default_L38
@@ -44,7 +44,7 @@ contract test_cases.compile.apps.LargeProgram:
block@7: // __algopy_default_create_L1
let tmp%13#0: uint64 = (txn ApplicationID)
let tmp%14#0: bool = (== tmp%13#0 0u)
- (assert tmp%14#0) // is creating
+ (assert tmp%14#0) // can only call when creating
test_cases.compile.apps.LargeProgram.__algopy_default_create()
return 1u
block@8: // switch_case_default_L38
diff --git a/test_cases/compile/puya.log b/test_cases/compile/puya.log
index e180214ee7..4d87bdeb43 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
@@ -7508,6 +7508,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
@@ -7515,6 +7516,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
@@ -7522,6 +7524,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
@@ -7529,6 +7532,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
@@ -7536,6 +7540,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
@@ -7543,6 +7548,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
@@ -7550,6 +7556,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 28e6c99fe7..0620d09b9b 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.approval.mir b/test_cases/debug/out/DebugContract.approval.mir
index d0cdab281e..ea6c2ec461 100644
--- a/test_cases/debug/out/DebugContract.approval.mir
+++ b/test_cases/debug/out/DebugContract.approval.mir
@@ -33,9 +33,9 @@ __puya_arc4_router___test_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
// debug/contract.py:4
// class DebugContract(arc4.ARC4Contract):
txna ApplicationArgs 1 tmp%7#0
@@ -68,7 +68,7 @@ __puya_arc4_router___bare_routing@5:
__puya_arc4_router_____algopy_default_create@6:
txn ApplicationID tmp%15#0
! tmp%16#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/debug/out/DebugContract.approval.teal b/test_cases/debug/out/DebugContract.approval.teal
index 6e64ad9866..4301b0cbde 100644
--- a/test_cases/debug/out/DebugContract.approval.teal
+++ b/test_cases/debug/out/DebugContract.approval.teal
@@ -25,9 +25,9 @@ __puya_arc4_router___test_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// debug/contract.py:4
// class DebugContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -54,7 +54,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/test_cases/debug/out/DebugContract.arc32.json b/test_cases/debug/out/DebugContract.arc32.json
index b9e76a407a..3a7d8f7f58 100644
--- a/test_cases/debug/out/DebugContract.arc32.json
+++ b/test_cases/debug/out/DebugContract.arc32.json
@@ -7,7 +7,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMTAgVE1QTF9BX01VTFQKICAgIGJ5dGVjYmxvY2sgIiAiIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg1MzU3NGJmZiAvLyBtZXRob2QgInRlc3QodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yb3V0ZUAyCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JvdXRlQDI6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHRlc3QKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC50ZXN0KHg6IHVpbnQ2NCwgeTogdWludDY0LCB6OiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdDoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdChzZWxmLCB4OiBVSW50NjQsIHk6IFVJbnQ2NCwgejogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo4CiAgICAvLyBhID0geCAqIFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkFfTVVMVCIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMyAvLyBUTVBMX0FfTVVMVAogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6OQogICAgLy8gYiA9IHggKyB5CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwbiAyCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxMAogICAgLy8gYyA9IGIgKiB6CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTEKICAgIC8vIGlmIGIgPCBjOgogICAgPAogICAgYnogdGVzdF9lbHNlX2JvZHlAMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTIKICAgIC8vIGEgPSBhICsgeQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMQoKdGVzdF9lbHNlX2JvZHlAMjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBlbGlmIGEgPCBjOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxNAogICAgLy8gYSA9IGEgKyB6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDEwCgp0ZXN0X2Vsc2VfYm9keUA0OgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTUKICAgIC8vIGVsaWYgYiA8IGE6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfZWxzZV9ib2R5QDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhID0gYSAqIDMKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgKgogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMAoKdGVzdF9lbHNlX2JvZHlANjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBlbGlmIGIgPiBhOgogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMwogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBiID0gYiArIGEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgZnJhbWVfYnVyeSAzCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDUKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMDoKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBhICsgYiA8IGM6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUAxMwogICAgLy8gZGVidWcvY29udHJhY3QucHk6MjEKICAgIC8vIGEgKj0gc29tZV9mdW5jKGEsIHkpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgc29tZV9mdW5jCiAgICAqCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDE0Cgp0ZXN0X2Vsc2VfYm9keUAxMzoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBiICo9IHNvbWVfZnVuYyhiLCB6KQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHNvbWVfZnVuYwogICAgKgogICAgZnJhbWVfYnVyeSA1Cgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyNQogICAgLy8gYmVlID0gaXRvYShiKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBjID0gYSArIGIKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjZWEgPSBpdG9hKGMpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyOQogICAgLy8gaWYgYSA8IGM6CiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhICs9IGMKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgNgogICAgKwogICAgZnJhbWVfYnVyeSAyCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBpZiBhIDwgYjoKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMgogICAgLy8gYSArPSBiCiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDE4OgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMwogICAgLy8gaWYgYSA8IGIgKyBjOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICArCiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhID0gYSAqIHoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDIwOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBheWUgPSBpdG9hKGEpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gZGVidWcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhheWUsIGJlZSwgY2VhLCBzZXA9IiAiKQogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozOQogICAgLy8gcmV0dXJuIGEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kZWJ1Zy5jb250cmFjdC5zb21lX2Z1bmMoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKc29tZV9mdW5jOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDItNDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc29tZV9mdW5jKGE6IFVJbnQ2NCwgYjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhICs9IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0NQogICAgLy8gYiAqPSBhCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDYKICAgIC8vIGEgKz0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDcKICAgIC8vIGEgKj0gMgogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDgKICAgIC8vIHggPSBhICsgYgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0OQogICAgLy8geSA9IGEgKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTAKICAgIC8vIHJldHVybiB4IGlmIHggPCB5IGVsc2UgeQogICAgZHVwMgogICAgPAogICAgc3dhcAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0Lml0b2EoaTogdWludDY0KSAtPiBieXRlczoKaXRvYToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUzLTU0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTcKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gZGlnaXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjXzEgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTgKICAgIC8vIHJldHVybiBkaWdpdHNbaV0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU2CiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgICUKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWNfMSAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMTAgVE1QTF9BX01VTFQKICAgIGJ5dGVjYmxvY2sgIiAiIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg1MzU3NGJmZiAvLyBtZXRob2QgInRlc3QodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yb3V0ZUAyCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JvdXRlQDI6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gZGVidWcvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgRGVidWdDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC50ZXN0KHg6IHVpbnQ2NCwgeTogdWludDY0LCB6OiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdDoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdChzZWxmLCB4OiBVSW50NjQsIHk6IFVJbnQ2NCwgejogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo4CiAgICAvLyBhID0geCAqIFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkFfTVVMVCIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMyAvLyBUTVBMX0FfTVVMVAogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6OQogICAgLy8gYiA9IHggKyB5CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwbiAyCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxMAogICAgLy8gYyA9IGIgKiB6CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTEKICAgIC8vIGlmIGIgPCBjOgogICAgPAogICAgYnogdGVzdF9lbHNlX2JvZHlAMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTIKICAgIC8vIGEgPSBhICsgeQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMQoKdGVzdF9lbHNlX2JvZHlAMjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBlbGlmIGEgPCBjOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxNAogICAgLy8gYSA9IGEgKyB6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDEwCgp0ZXN0X2Vsc2VfYm9keUA0OgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTUKICAgIC8vIGVsaWYgYiA8IGE6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfZWxzZV9ib2R5QDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhID0gYSAqIDMKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgKgogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMAoKdGVzdF9lbHNlX2JvZHlANjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBlbGlmIGIgPiBhOgogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMwogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBiID0gYiArIGEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgZnJhbWVfYnVyeSAzCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDUKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMDoKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBhICsgYiA8IGM6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUAxMwogICAgLy8gZGVidWcvY29udHJhY3QucHk6MjEKICAgIC8vIGEgKj0gc29tZV9mdW5jKGEsIHkpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgc29tZV9mdW5jCiAgICAqCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDE0Cgp0ZXN0X2Vsc2VfYm9keUAxMzoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBiICo9IHNvbWVfZnVuYyhiLCB6KQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHNvbWVfZnVuYwogICAgKgogICAgZnJhbWVfYnVyeSA1Cgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyNQogICAgLy8gYmVlID0gaXRvYShiKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBjID0gYSArIGIKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjZWEgPSBpdG9hKGMpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyOQogICAgLy8gaWYgYSA8IGM6CiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhICs9IGMKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgNgogICAgKwogICAgZnJhbWVfYnVyeSAyCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBpZiBhIDwgYjoKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMgogICAgLy8gYSArPSBiCiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDE4OgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMwogICAgLy8gaWYgYSA8IGIgKyBjOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICArCiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhID0gYSAqIHoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDIwOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBheWUgPSBpdG9hKGEpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gZGVidWcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhheWUsIGJlZSwgY2VhLCBzZXA9IiAiKQogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozOQogICAgLy8gcmV0dXJuIGEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kZWJ1Zy5jb250cmFjdC5zb21lX2Z1bmMoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKc29tZV9mdW5jOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDItNDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc29tZV9mdW5jKGE6IFVJbnQ2NCwgYjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhICs9IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0NQogICAgLy8gYiAqPSBhCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDYKICAgIC8vIGEgKz0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDcKICAgIC8vIGEgKj0gMgogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDgKICAgIC8vIHggPSBhICsgYgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0OQogICAgLy8geSA9IGEgKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTAKICAgIC8vIHJldHVybiB4IGlmIHggPCB5IGVsc2UgeQogICAgZHVwMgogICAgPAogICAgc3dhcAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0Lml0b2EoaTogdWludDY0KSAtPiBieXRlczoKaXRvYToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUzLTU0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTcKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gZGlnaXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjXzEgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTgKICAgIC8vIHJldHVybiBkaWdpdHNbaV0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU2CiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgICUKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWNfMSAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIK",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
diff --git a/test_cases/debug/out/DebugContract.arc56.json b/test_cases/debug/out/DebugContract.arc56.json
new file mode 100644
index 0000000000..9a23342132
--- /dev/null
+++ b/test_cases/debug/out/DebugContract.arc56.json
@@ -0,0 +1,120 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [
+ "NoOp"
+ ],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 52
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 91
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 55
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMTAgVE1QTF9BX01VTFQKICAgIGJ5dGVjYmxvY2sgIiAiIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg1MzU3NGJmZiAvLyBtZXRob2QgInRlc3QodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yb3V0ZUAyCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JvdXRlQDI6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gZGVidWcvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgRGVidWdDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC50ZXN0KHg6IHVpbnQ2NCwgeTogdWludDY0LCB6OiB1aW50NjQpIC0+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": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {
+ "A_MULT": {
+ "type": "AVMUint64",
+ "value": "AAAAAAAAAAE="
+ }
+ }
+}
\ No newline at end of file
diff --git a/test_cases/debug/out/DebugContract.destructured.ir b/test_cases/debug/out/DebugContract.destructured.ir
index 800b9fa49d..602356ca50 100644
--- a/test_cases/debug/out/DebugContract.destructured.ir
+++ b/test_cases/debug/out/DebugContract.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.debug.contract.DebugContract:
block@2: // test_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -35,7 +35,7 @@ contract test_cases.debug.contract.DebugContract:
block@6: // __algopy_default_create_L1
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // is creating
+ (assert tmp%16#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/debug/out/DebugContract.ssa.ir b/test_cases/debug/out/DebugContract.ssa.ir
index 3d2fe4a7ba..26f16f2bc6 100644
--- a/test_cases/debug/out/DebugContract.ssa.ir
+++ b/test_cases/debug/out/DebugContract.ssa.ir
@@ -16,10 +16,10 @@ contract test_cases.debug.contract.DebugContract:
block@2: // test_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -41,7 +41,7 @@ contract test_cases.debug.contract.DebugContract:
block@6: // __algopy_default_create_L1
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (== tmp%15#0 0u)
- (assert tmp%16#0) // is creating
+ (assert tmp%16#0) // can only call when creating
test_cases.debug.contract.DebugContract.__algopy_default_create()
return 1u
block@7: // switch_case_default_L4
diff --git a/test_cases/debug/out/DebugContract.ssa.opt_pass_1.ir b/test_cases/debug/out/DebugContract.ssa.opt_pass_1.ir
index 345c6768be..19627244cd 100644
--- a/test_cases/debug/out/DebugContract.ssa.opt_pass_1.ir
+++ b/test_cases/debug/out/DebugContract.ssa.opt_pass_1.ir
@@ -15,9 +15,9 @@ contract test_cases.debug.contract.DebugContract:
block@2: // test_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -35,7 +35,7 @@ contract test_cases.debug.contract.DebugContract:
block@6: // __algopy_default_create_L1
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // is creating
+ (assert tmp%16#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/debug/out/DebugContract.ssa.opt_pass_2.ir b/test_cases/debug/out/DebugContract.ssa.opt_pass_2.ir
index e0ae55e317..055e31cf32 100644
--- a/test_cases/debug/out/DebugContract.ssa.opt_pass_2.ir
+++ b/test_cases/debug/out/DebugContract.ssa.opt_pass_2.ir
@@ -15,9 +15,9 @@ contract test_cases.debug.contract.DebugContract:
block@2: // test_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -35,7 +35,7 @@ contract test_cases.debug.contract.DebugContract:
block@6: // __algopy_default_create_L1
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // is creating
+ (assert tmp%16#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/debug/out_O2/DebugContract.approval.teal b/test_cases/debug/out_O2/DebugContract.approval.teal
index 4aaf780f92..835c35dc81 100644
--- a/test_cases/debug/out_O2/DebugContract.approval.teal
+++ b/test_cases/debug/out_O2/DebugContract.approval.teal
@@ -21,9 +21,9 @@ __puya_arc4_router__:
__puya_arc4_router___test_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
btoi
txna ApplicationArgs 2
@@ -44,7 +44,7 @@ __puya_arc4_router___bare_routing@5:
bnz __puya_arc4_router___after_if_else@9
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_0 // 1
retsub
diff --git a/test_cases/debug/out_O2/DebugContract.destructured.ir b/test_cases/debug/out_O2/DebugContract.destructured.ir
index 800b9fa49d..602356ca50 100644
--- a/test_cases/debug/out_O2/DebugContract.destructured.ir
+++ b/test_cases/debug/out_O2/DebugContract.destructured.ir
@@ -15,9 +15,9 @@ contract test_cases.debug.contract.DebugContract:
block@2: // test_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -35,7 +35,7 @@ contract test_cases.debug.contract.DebugContract:
block@6: // __algopy_default_create_L1
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (! tmp%15#0)
- (assert tmp%16#0) // is creating
+ (assert tmp%16#0) // can only call when creating
return 1u
block@9: // after_if_else_L4
return 0u
diff --git a/test_cases/debug/out_unoptimized/DebugContract.approval.teal b/test_cases/debug/out_unoptimized/DebugContract.approval.teal
index 7ad1b52db5..1e837243a8 100644
--- a/test_cases/debug/out_unoptimized/DebugContract.approval.teal
+++ b/test_cases/debug/out_unoptimized/DebugContract.approval.teal
@@ -28,11 +28,11 @@ __puya_arc4_router___test_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// debug/contract.py:4
// class DebugContract(arc4.ARC4Contract):
txna ApplicationArgs 1
@@ -71,7 +71,7 @@ __puya_arc4_router_____algopy_default_create@6:
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub __algopy_default_create
intc_1 // 1
retsub
diff --git a/test_cases/debug/out_unoptimized/DebugContract.destructured.ir b/test_cases/debug/out_unoptimized/DebugContract.destructured.ir
index bb01709e19..c40e35cc6d 100644
--- a/test_cases/debug/out_unoptimized/DebugContract.destructured.ir
+++ b/test_cases/debug/out_unoptimized/DebugContract.destructured.ir
@@ -16,10 +16,10 @@ contract test_cases.debug.contract.DebugContract:
block@2: // test_route_L5
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
let tmp%7#0: bytes = (txna ApplicationArgs 1)
let tmp%8#0: uint64 = (btoi tmp%7#0)
let tmp%9#0: bytes = (txna ApplicationArgs 2)
@@ -41,7 +41,7 @@ contract test_cases.debug.contract.DebugContract:
block@6: // __algopy_default_create_L1
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (== tmp%15#0 0u)
- (assert tmp%16#0) // is creating
+ (assert tmp%16#0) // can only call when creating
test_cases.debug.contract.DebugContract.__algopy_default_create()
return 1u
block@7: // switch_case_default_L4
diff --git a/test_cases/debug/puya.log b/test_cases/debug/puya.log
index 0507b1f982..e5ad141896 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.approval.mir b/test_cases/diamond_mro/out/Base1.approval.mir
index e71ef5fdf1..87f95f93ae 100644
--- a/test_cases/diamond_mro/out/Base1.approval.mir
+++ b/test_cases/diamond_mro/out/Base1.approval.mir
@@ -74,9 +74,9 @@ __puya_arc4_router___method_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
callsub method
int 1 1
retsub 1
@@ -86,10 +86,10 @@ __puya_arc4_router___create_route@3:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%7#0
! tmp%8#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%9#0
! tmp%10#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/diamond_mro/out/Base1.approval.teal b/test_cases/diamond_mro/out/Base1.approval.teal
index cdf8ff4c41..6e8036115c 100644
--- a/test_cases/diamond_mro/out/Base1.approval.teal
+++ b/test_cases/diamond_mro/out/Base1.approval.teal
@@ -56,9 +56,9 @@ __puya_arc4_router___method_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -68,10 +68,10 @@ __puya_arc4_router___create_route@3:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out/Base1.arc32.json b/test_cases/diamond_mro/out/Base1.arc32.json
index 3e4dd828e1..11c30c3c7b 100644
--- a/test_cases/diamond_mro/out/Base1.arc32.json
+++ b/test_cases/diamond_mro/out/Base1.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo4CiAgICAvLyBsb2coImJhc2UxLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTEuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo2CiAgICAvLyBjbGFzcyBCYXNlMShHUCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMS0xMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjEzCiAgICAvLyBsb2coImJhc2UxLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTQKICAgIC8vIHN1cGVyKCkubWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo4CiAgICAvLyBsb2coImJhc2UxLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTEuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMwogICAgLy8gbG9nKCJiYXNlMS5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMS5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
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..be6aaebf20
--- /dev/null
+++ b/test_cases/diamond_mro/out/Base1.arc56.json
@@ -0,0 +1,117 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 93,
+ 105
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 109
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 96
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo4CiAgICAvLyBsb2coImJhc2UxLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTEuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMwogICAgLy8gbG9nKCJiYXNlMS5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMS5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiACAAExGEAAA4gABIgAK0OKAACADmJhc2UxLl9faW5pdF9fsIgAAYmKAACAC2dwLl9faW5pdF9fsImKAAExG0EALYICBE8EXYQETFxhujYaAI4CAAIADiKJMRkURDEYRIgADiOJMRkURDEYFEQjiSKJigAAgAxiYXNlMS5tZXRob2SwiAABiYoAAIAJZ3AubWV0aG9ksIk=",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/diamond_mro/out/Base1.destructured.ir b/test_cases/diamond_mro/out/Base1.destructured.ir
index 9042c06be3..473e2532c6 100644
--- a/test_cases/diamond_mro/out/Base1.destructured.ir
+++ b/test_cases/diamond_mro/out/Base1.destructured.ir
@@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base1.Base1:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.base1.Base1.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L6
return 0u
diff --git a/test_cases/diamond_mro/out/Base1.ssa.ir b/test_cases/diamond_mro/out/Base1.ssa.ir
index fc8e3515e3..67eeb749c2 100644
--- a/test_cases/diamond_mro/out/Base1.ssa.ir
+++ b/test_cases/diamond_mro/out/Base1.ssa.ir
@@ -33,19 +33,19 @@ contract test_cases.diamond_mro.base1.Base1:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.diamond_mro.base1.Base1.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (== tmp%9#0 0u)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
test_cases.diamond_mro.gp.GP.create()
return 1u
block@4: // switch_case_default_L6
diff --git a/test_cases/diamond_mro/out/Base1.ssa.opt_pass_1.ir b/test_cases/diamond_mro/out/Base1.ssa.opt_pass_1.ir
index 9042c06be3..473e2532c6 100644
--- a/test_cases/diamond_mro/out/Base1.ssa.opt_pass_1.ir
+++ b/test_cases/diamond_mro/out/Base1.ssa.opt_pass_1.ir
@@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base1.Base1:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.base1.Base1.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L6
return 0u
diff --git a/test_cases/diamond_mro/out/Base2.approval.mir b/test_cases/diamond_mro/out/Base2.approval.mir
index 781d9edaa6..1e829cd818 100644
--- a/test_cases/diamond_mro/out/Base2.approval.mir
+++ b/test_cases/diamond_mro/out/Base2.approval.mir
@@ -74,9 +74,9 @@ __puya_arc4_router___method_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
callsub method
int 1 1
retsub 1
@@ -86,10 +86,10 @@ __puya_arc4_router___create_route@3:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%7#0
! tmp%8#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%9#0
! tmp%10#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/diamond_mro/out/Base2.approval.teal b/test_cases/diamond_mro/out/Base2.approval.teal
index 196242ff45..2f89e50aec 100644
--- a/test_cases/diamond_mro/out/Base2.approval.teal
+++ b/test_cases/diamond_mro/out/Base2.approval.teal
@@ -56,9 +56,9 @@ __puya_arc4_router___method_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -68,10 +68,10 @@ __puya_arc4_router___create_route@3:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out/Base2.arc32.json b/test_cases/diamond_mro/out/Base2.arc32.json
index 512d1d6433..a05838b738 100644
--- a/test_cases/diamond_mro/out/Base2.arc32.json
+++ b/test_cases/diamond_mro/out/Base2.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo4CiAgICAvLyBsb2coImJhc2UyLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTIuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo2CiAgICAvLyBjbGFzcyBCYXNlMihHUCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMS0xMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjEzCiAgICAvLyBsb2coImJhc2UyLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTQKICAgIC8vIHN1cGVyKCkubWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCg==",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo4CiAgICAvLyBsb2coImJhc2UyLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTIuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMwogICAgLy8gbG9nKCJiYXNlMi5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMi5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
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..4769f922b2
--- /dev/null
+++ b/test_cases/diamond_mro/out/Base2.arc56.json
@@ -0,0 +1,117 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 93,
+ 105
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 109
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 96
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo4CiAgICAvLyBsb2coImJhc2UyLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTIuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMwogICAgLy8gbG9nKCJiYXNlMi5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMi5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiACAAExGEAAA4gABIgAK0OKAACADmJhc2UyLl9faW5pdF9fsIgAAYmKAACAC2dwLl9faW5pdF9fsImKAAExG0EALYICBE8EXYQETFxhujYaAI4CAAIADiKJMRkURDEYRIgADiOJMRkURDEYFEQjiSKJigAAgAxiYXNlMi5tZXRob2SwiAABiYoAAIAJZ3AubWV0aG9ksIk=",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/diamond_mro/out/Base2.destructured.ir b/test_cases/diamond_mro/out/Base2.destructured.ir
index acf34b3d6f..9ceb153949 100644
--- a/test_cases/diamond_mro/out/Base2.destructured.ir
+++ b/test_cases/diamond_mro/out/Base2.destructured.ir
@@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base2.Base2:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.base2.Base2.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L6
return 0u
diff --git a/test_cases/diamond_mro/out/Base2.ssa.ir b/test_cases/diamond_mro/out/Base2.ssa.ir
index 452537667c..65c9bc78e7 100644
--- a/test_cases/diamond_mro/out/Base2.ssa.ir
+++ b/test_cases/diamond_mro/out/Base2.ssa.ir
@@ -33,19 +33,19 @@ contract test_cases.diamond_mro.base2.Base2:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.diamond_mro.base2.Base2.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (== tmp%9#0 0u)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
test_cases.diamond_mro.gp.GP.create()
return 1u
block@4: // switch_case_default_L6
diff --git a/test_cases/diamond_mro/out/Base2.ssa.opt_pass_1.ir b/test_cases/diamond_mro/out/Base2.ssa.opt_pass_1.ir
index acf34b3d6f..9ceb153949 100644
--- a/test_cases/diamond_mro/out/Base2.ssa.opt_pass_1.ir
+++ b/test_cases/diamond_mro/out/Base2.ssa.opt_pass_1.ir
@@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base2.Base2:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.base2.Base2.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L6
return 0u
diff --git a/test_cases/diamond_mro/out/Derived.approval.mir b/test_cases/diamond_mro/out/Derived.approval.mir
index 624c35182a..7734b5bb64 100644
--- a/test_cases/diamond_mro/out/Derived.approval.mir
+++ b/test_cases/diamond_mro/out/Derived.approval.mir
@@ -108,9 +108,9 @@ __puya_arc4_router___method_route@2:
// @arc4.abimethod
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
- assert // is not creating
+ assert // can only call when not creating
callsub method
int 1 1
retsub 1
@@ -120,10 +120,10 @@ __puya_arc4_router___create_route@3:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%7#0
! tmp%8#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%9#0
! tmp%10#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
diff --git a/test_cases/diamond_mro/out/Derived.approval.teal b/test_cases/diamond_mro/out/Derived.approval.teal
index 98b12e5c88..aab6bf569b 100644
--- a/test_cases/diamond_mro/out/Derived.approval.teal
+++ b/test_cases/diamond_mro/out/Derived.approval.teal
@@ -86,9 +86,9 @@ __puya_arc4_router___method_route@2:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -98,10 +98,10 @@ __puya_arc4_router___create_route@3:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out/Derived.arc32.json b/test_cases/diamond_mro/out/Derived.arc32.json
index 187fd54c23..3e06a976de 100644
--- a/test_cases/diamond_mro/out/Derived.arc32.json
+++ b/test_cases/diamond_mro/out/Derived.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo5CiAgICAvLyBsb2coImRlcml2ZWQuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEwCiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6OAogICAgLy8gbG9nKCJiYXNlMS5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6OAogICAgLy8gbG9nKCJiYXNlMi5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9ncC5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6OAogICAgLy8gbG9nKCJncC5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImdwLl9faW5pdF9fIgogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRmMDQ1ZDg0IDB4NGM1YzYxYmEgLy8gbWV0aG9kICJtZXRob2QoKXZvaWQiLCBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEyLTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxNAogICAgLy8gbG9nKCJkZXJpdmVkLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImRlcml2ZWQubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjE1CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMwogICAgLy8gbG9nKCJiYXNlMS5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMS5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMwogICAgLy8gbG9nKCJiYXNlMi5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMi5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1Ygo=",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo5CiAgICAvLyBsb2coImRlcml2ZWQuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEwCiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6OAogICAgLy8gbG9nKCJiYXNlMS5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6OAogICAgLy8gbG9nKCJiYXNlMi5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9ncC5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6OAogICAgLy8gbG9nKCJncC5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImdwLl9faW5pdF9fIgogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRmMDQ1ZDg0IDB4NGM1YzYxYmEgLy8gbWV0aG9kICJtZXRob2QoKXZvaWQiLCBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo3CiAgICAvLyBjbGFzcyBEZXJpdmVkKEJhc2UxLCBCYXNlMik6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5kZXJpdmVkLkRlcml2ZWQubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTQKICAgIC8vIGxvZygiZGVyaXZlZC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxNQogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTMKICAgIC8vIGxvZygiYmFzZTEubWV0aG9kIikKICAgIHB1c2hieXRlcyAiYmFzZTEubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxNAogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTMKICAgIC8vIGxvZygiYmFzZTIubWV0aG9kIikKICAgIHB1c2hieXRlcyAiYmFzZTIubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxNAogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTcKICAgIC8vIGxvZygiZ3AubWV0aG9kIikKICAgIHB1c2hieXRlcyAiZ3AubWV0aG9kIgogICAgbG9nCiAgICByZXRzdWIK",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
},
"state": {
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..37e4451bf7
--- /dev/null
+++ b/test_cases/diamond_mro/out/Derived.arc56.json
@@ -0,0 +1,117 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 143,
+ 155
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 159
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 146
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo4CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo5CiAgICAvLyBsb2coImRlcml2ZWQuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEwCiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6OAogICAgLy8gbG9nKCJiYXNlMS5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6OAogICAgLy8gbG9nKCJiYXNlMi5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLl9faW5pdF9fIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo5CiAgICAvLyBzdXBlcigpLl9faW5pdF9fKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXygpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9ncC5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6OAogICAgLy8gbG9nKCJncC5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImdwLl9faW5pdF9fIgogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRmMDQ1ZDg0IDB4NGM1YzYxYmEgLy8gbWV0aG9kICJtZXRob2QoKXZvaWQiLCBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weTo3CiAgICAvLyBjbGFzcyBEZXJpdmVkKEJhc2UxLCBCYXNlMik6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5kZXJpdmVkLkRlcml2ZWQubWV0aG9kKCkgLT4gdm9pZDoKbWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTQKICAgIC8vIGxvZygiZGVyaXZlZC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJkZXJpdmVkLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxNQogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTMKICAgIC8vIGxvZygiYmFzZTEubWV0aG9kIikKICAgIHB1c2hieXRlcyAiYmFzZTEubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxNAogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTMKICAgIC8vIGxvZygiYmFzZTIubWV0aG9kIikKICAgIHB1c2hieXRlcyAiYmFzZTIubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxNAogICAgLy8gc3VwZXIoKS5tZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QoKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTcKICAgIC8vIGxvZygiZ3AubWV0aG9kIikKICAgIHB1c2hieXRlcyAiZ3AubWV0aG9kIgogICAgbG9nCiAgICByZXRzdWIK",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo="
+ },
+ "byteCode": {
+ "approval": "CiACAAExGEAAA4gABIgAXUOKAACAEGRlcml2ZWQuX19pbml0X1+wiAABiYoAAIAOYmFzZTEuX19pbml0X1+wiAABiYoAAIAOYmFzZTIuX19pbml0X1+wiAABiYoAAIALZ3AuX19pbml0X1+wiYoAATEbQQAtggIETwRdhARMXGG6NhoAjgIAAgAOIokxGRREMRhEiAAOI4kxGRREMRgURCOJIomKAACADmRlcml2ZWQubWV0aG9ksIgAAYmKAACADGJhc2UxLm1ldGhvZLCIAAGJigAAgAxiYXNlMi5tZXRob2SwiAABiYoAAIAJZ3AubWV0aG9ksIk=",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/diamond_mro/out/Derived.destructured.ir b/test_cases/diamond_mro/out/Derived.destructured.ir
index 1efa515380..5912dd70ba 100644
--- a/test_cases/diamond_mro/out/Derived.destructured.ir
+++ b/test_cases/diamond_mro/out/Derived.destructured.ir
@@ -44,18 +44,18 @@ contract test_cases.diamond_mro.derived.Derived:
block@2: // method_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.derived.Derived.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L7
return 0u
diff --git a/test_cases/diamond_mro/out/Derived.ssa.ir b/test_cases/diamond_mro/out/Derived.ssa.ir
index 8340184170..e22d99d880 100644
--- a/test_cases/diamond_mro/out/Derived.ssa.ir
+++ b/test_cases/diamond_mro/out/Derived.ssa.ir
@@ -45,19 +45,19 @@ contract test_cases.diamond_mro.derived.Derived:
block@2: // method_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.diamond_mro.derived.Derived.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (== tmp%9#0 0u)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
test_cases.diamond_mro.gp.GP.create()
return 1u
block@4: // switch_case_default_L7
diff --git a/test_cases/diamond_mro/out/Derived.ssa.opt_pass_1.ir b/test_cases/diamond_mro/out/Derived.ssa.opt_pass_1.ir
index 1efa515380..5912dd70ba 100644
--- a/test_cases/diamond_mro/out/Derived.ssa.opt_pass_1.ir
+++ b/test_cases/diamond_mro/out/Derived.ssa.opt_pass_1.ir
@@ -44,18 +44,18 @@ contract test_cases.diamond_mro.derived.Derived:
block@2: // method_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.derived.Derived.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L7
return 0u
diff --git a/test_cases/diamond_mro/out/GP.approval.mir b/test_cases/diamond_mro/out/GP.approval.mir
index d081f9d3fa..eafc2ff03e 100644
--- a/test_cases/diamond_mro/out/GP.approval.mir
+++ b/test_cases/diamond_mro/out/GP.approval.mir
@@ -57,10 +57,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
int 1 1
retsub 1
@@ -69,9 +69,9 @@ __puya_arc4_router___method_route@3:
// @arc4.abimethod
txn OnCompletion tmp%7#0
! tmp%8#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%9#0
- assert // is not creating
+ assert // can only call when not creating
callsub method
int 1 1
retsub 1
diff --git a/test_cases/diamond_mro/out/GP.approval.teal b/test_cases/diamond_mro/out/GP.approval.teal
index 7565ed4864..b9cb21c656 100644
--- a/test_cases/diamond_mro/out/GP.approval.teal
+++ b/test_cases/diamond_mro/out/GP.approval.teal
@@ -41,10 +41,10 @@ __puya_arc4_router___create_route@2:
// @arc4.abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
@@ -53,9 +53,9 @@ __puya_arc4_router___method_route@3:
// @arc4.abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out/GP.arc32.json b/test_cases/diamond_mro/out/GP.arc32.json
index b952054122..609ded0382 100644
--- a/test_cases/diamond_mro/out/GP.arc32.json
+++ b/test_cases/diamond_mro/out/GP.arc32.json
@@ -12,7 +12,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NGYwNDVkODQgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgIm1ldGhvZCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6Cm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTcKICAgIC8vIGxvZygiZ3AubWV0aG9kIikKICAgIHB1c2hieXRlcyAiZ3AubWV0aG9kIgogICAgbG9nCiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NGYwNDVkODQgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgIm1ldGhvZCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjYKICAgIC8vIGNsYXNzIEdQKEFSQzRDb250cmFjdCwgYWJjLkFCQyk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
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..0068486f7e
--- /dev/null
+++ b/test_cases/diamond_mro/out/GP.arc56.json
@@ -0,0 +1,117 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 0,
+ "bytes": 0
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 0
+ }
+ },
+ "keys": {
+ "global": {},
+ "local": {},
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 69,
+ 79
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 73
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 82
+ ],
+ "errorMessage": "can only call when not creating"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NGYwNDVkODQgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgIm1ldGhvZCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjYKICAgIC8vIGNsYXNzIEdQKEFSQzRDb250cmFjdCwgYWJjLkFCQyk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCg==",
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
+ },
+ "byteCode": {
+ "approval": "CiACAAExGEAAA4gABIgAE0OKAACAC2dwLl9faW5pdF9fsImKAAExG0EALYICBExcYboETwRdhDYaAI4CAAIADCKJMRkURDEYFEQjiTEZFEQxGESIAAQjiSKJigAAgAlncC5tZXRob2SwiQ==",
+ "clear": "CoEBQw=="
+ },
+ "compilerInfo": {
+ "compiler": "puya",
+ "compilerVersion": {
+ "major": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/diamond_mro/out/GP.destructured.ir b/test_cases/diamond_mro/out/GP.destructured.ir
index 4a1a224d07..fc9379597d 100644
--- a/test_cases/diamond_mro/out/GP.destructured.ir
+++ b/test_cases/diamond_mro/out/GP.destructured.ir
@@ -26,17 +26,17 @@ contract test_cases.diamond_mro.gp.GP:
block@2: // create_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // method_route_L15
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.diamond_mro.gp.GP.method()
return 1u
block@7: // after_if_else_L6
diff --git a/test_cases/diamond_mro/out/GP.ssa.ir b/test_cases/diamond_mro/out/GP.ssa.ir
index c2169fe6ce..44b803fbf5 100644
--- a/test_cases/diamond_mro/out/GP.ssa.ir
+++ b/test_cases/diamond_mro/out/GP.ssa.ir
@@ -27,19 +27,19 @@ contract test_cases.diamond_mro.gp.GP:
block@2: // create_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.diamond_mro.gp.GP.create()
return 1u
block@3: // method_route_L15
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
test_cases.diamond_mro.gp.GP.method()
return 1u
block@4: // switch_case_default_L6
diff --git a/test_cases/diamond_mro/out/GP.ssa.opt_pass_1.ir b/test_cases/diamond_mro/out/GP.ssa.opt_pass_1.ir
index 4a1a224d07..fc9379597d 100644
--- a/test_cases/diamond_mro/out/GP.ssa.opt_pass_1.ir
+++ b/test_cases/diamond_mro/out/GP.ssa.opt_pass_1.ir
@@ -26,17 +26,17 @@ contract test_cases.diamond_mro.gp.GP:
block@2: // create_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // method_route_L15
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.diamond_mro.gp.GP.method()
return 1u
block@7: // after_if_else_L6
diff --git a/test_cases/diamond_mro/out_O2/Base1.approval.teal b/test_cases/diamond_mro/out_O2/Base1.approval.teal
index 501a96fc20..2473d2b8ac 100644
--- a/test_cases/diamond_mro/out_O2/Base1.approval.teal
+++ b/test_cases/diamond_mro/out_O2/Base1.approval.teal
@@ -42,9 +42,9 @@ __puya_arc4_router__:
__puya_arc4_router___method_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -52,10 +52,10 @@ __puya_arc4_router___method_route@2:
__puya_arc4_router___create_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out_O2/Base1.destructured.ir b/test_cases/diamond_mro/out_O2/Base1.destructured.ir
index 9042c06be3..473e2532c6 100644
--- a/test_cases/diamond_mro/out_O2/Base1.destructured.ir
+++ b/test_cases/diamond_mro/out_O2/Base1.destructured.ir
@@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base1.Base1:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.base1.Base1.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L6
return 0u
diff --git a/test_cases/diamond_mro/out_O2/Base2.approval.teal b/test_cases/diamond_mro/out_O2/Base2.approval.teal
index 3ad3448656..d6dbd059e0 100644
--- a/test_cases/diamond_mro/out_O2/Base2.approval.teal
+++ b/test_cases/diamond_mro/out_O2/Base2.approval.teal
@@ -42,9 +42,9 @@ __puya_arc4_router__:
__puya_arc4_router___method_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -52,10 +52,10 @@ __puya_arc4_router___method_route@2:
__puya_arc4_router___create_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out_O2/Base2.destructured.ir b/test_cases/diamond_mro/out_O2/Base2.destructured.ir
index acf34b3d6f..9ceb153949 100644
--- a/test_cases/diamond_mro/out_O2/Base2.destructured.ir
+++ b/test_cases/diamond_mro/out_O2/Base2.destructured.ir
@@ -32,18 +32,18 @@ contract test_cases.diamond_mro.base2.Base2:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.base2.Base2.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L6
return 0u
diff --git a/test_cases/diamond_mro/out_O2/Derived.approval.teal b/test_cases/diamond_mro/out_O2/Derived.approval.teal
index 2763d855ae..c5ae4d6a2e 100644
--- a/test_cases/diamond_mro/out_O2/Derived.approval.teal
+++ b/test_cases/diamond_mro/out_O2/Derived.approval.teal
@@ -60,9 +60,9 @@ __puya_arc4_router__:
__puya_arc4_router___method_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -70,10 +70,10 @@ __puya_arc4_router___method_route@2:
__puya_arc4_router___create_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out_O2/Derived.destructured.ir b/test_cases/diamond_mro/out_O2/Derived.destructured.ir
index 1efa515380..5912dd70ba 100644
--- a/test_cases/diamond_mro/out_O2/Derived.destructured.ir
+++ b/test_cases/diamond_mro/out_O2/Derived.destructured.ir
@@ -44,18 +44,18 @@ contract test_cases.diamond_mro.derived.Derived:
block@2: // method_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
- (assert tmp%5#0) // is not creating
+ (assert tmp%5#0) // can only call when not creating
test_cases.diamond_mro.derived.Derived.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (! tmp%9#0)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
return 1u
block@7: // after_if_else_L7
return 0u
diff --git a/test_cases/diamond_mro/out_O2/GP.approval.teal b/test_cases/diamond_mro/out_O2/GP.approval.teal
index 21fbd12dd5..bd90921d65 100644
--- a/test_cases/diamond_mro/out_O2/GP.approval.teal
+++ b/test_cases/diamond_mro/out_O2/GP.approval.teal
@@ -33,19 +33,19 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
intc_1 // 1
retsub
__puya_arc4_router___method_route@3:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out_O2/GP.destructured.ir b/test_cases/diamond_mro/out_O2/GP.destructured.ir
index 4a1a224d07..fc9379597d 100644
--- a/test_cases/diamond_mro/out_O2/GP.destructured.ir
+++ b/test_cases/diamond_mro/out_O2/GP.destructured.ir
@@ -26,17 +26,17 @@ contract test_cases.diamond_mro.gp.GP:
block@2: // create_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
return 1u
block@3: // method_route_L15
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (! tmp%7#0)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
- (assert tmp%9#0) // is not creating
+ (assert tmp%9#0) // can only call when not creating
test_cases.diamond_mro.gp.GP.method()
return 1u
block@7: // after_if_else_L6
diff --git a/test_cases/diamond_mro/out_unoptimized/Base1.approval.teal b/test_cases/diamond_mro/out_unoptimized/Base1.approval.teal
index 8e95be3294..3b35d4c598 100644
--- a/test_cases/diamond_mro/out_unoptimized/Base1.approval.teal
+++ b/test_cases/diamond_mro/out_unoptimized/Base1.approval.teal
@@ -60,11 +60,11 @@ __puya_arc4_router___method_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -75,11 +75,11 @@ __puya_arc4_router___create_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub create
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out_unoptimized/Base1.destructured.ir b/test_cases/diamond_mro/out_unoptimized/Base1.destructured.ir
index fc8e3515e3..67eeb749c2 100644
--- a/test_cases/diamond_mro/out_unoptimized/Base1.destructured.ir
+++ b/test_cases/diamond_mro/out_unoptimized/Base1.destructured.ir
@@ -33,19 +33,19 @@ contract test_cases.diamond_mro.base1.Base1:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.diamond_mro.base1.Base1.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (== tmp%9#0 0u)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
test_cases.diamond_mro.gp.GP.create()
return 1u
block@4: // switch_case_default_L6
diff --git a/test_cases/diamond_mro/out_unoptimized/Base2.approval.teal b/test_cases/diamond_mro/out_unoptimized/Base2.approval.teal
index df6f607c1f..8021aeb3b4 100644
--- a/test_cases/diamond_mro/out_unoptimized/Base2.approval.teal
+++ b/test_cases/diamond_mro/out_unoptimized/Base2.approval.teal
@@ -60,11 +60,11 @@ __puya_arc4_router___method_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -75,11 +75,11 @@ __puya_arc4_router___create_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub create
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out_unoptimized/Base2.destructured.ir b/test_cases/diamond_mro/out_unoptimized/Base2.destructured.ir
index 452537667c..65c9bc78e7 100644
--- a/test_cases/diamond_mro/out_unoptimized/Base2.destructured.ir
+++ b/test_cases/diamond_mro/out_unoptimized/Base2.destructured.ir
@@ -33,19 +33,19 @@ contract test_cases.diamond_mro.base2.Base2:
block@2: // method_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.diamond_mro.base2.Base2.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (== tmp%9#0 0u)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
test_cases.diamond_mro.gp.GP.create()
return 1u
block@4: // switch_case_default_L6
diff --git a/test_cases/diamond_mro/out_unoptimized/Derived.approval.teal b/test_cases/diamond_mro/out_unoptimized/Derived.approval.teal
index 95fd09df4d..3abde1f3c3 100644
--- a/test_cases/diamond_mro/out_unoptimized/Derived.approval.teal
+++ b/test_cases/diamond_mro/out_unoptimized/Derived.approval.teal
@@ -90,11 +90,11 @@ __puya_arc4_router___method_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
@@ -105,11 +105,11 @@ __puya_arc4_router___create_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub create
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out_unoptimized/Derived.destructured.ir b/test_cases/diamond_mro/out_unoptimized/Derived.destructured.ir
index 8340184170..e22d99d880 100644
--- a/test_cases/diamond_mro/out_unoptimized/Derived.destructured.ir
+++ b/test_cases/diamond_mro/out_unoptimized/Derived.destructured.ir
@@ -45,19 +45,19 @@ contract test_cases.diamond_mro.derived.Derived:
block@2: // method_route_L12
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (!= tmp%5#0 0u)
- (assert tmp%6#0) // is not creating
+ (assert tmp%6#0) // can only call when not creating
test_cases.diamond_mro.derived.Derived.method()
return 1u
block@3: // create_route_L11
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (== tmp%9#0 0u)
- (assert tmp%10#0) // is creating
+ (assert tmp%10#0) // can only call when creating
test_cases.diamond_mro.gp.GP.create()
return 1u
block@4: // switch_case_default_L7
diff --git a/test_cases/diamond_mro/out_unoptimized/GP.approval.teal b/test_cases/diamond_mro/out_unoptimized/GP.approval.teal
index 649323868f..cec5b99cb1 100644
--- a/test_cases/diamond_mro/out_unoptimized/GP.approval.teal
+++ b/test_cases/diamond_mro/out_unoptimized/GP.approval.teal
@@ -45,11 +45,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub create
intc_1 // 1
retsub
@@ -60,11 +60,11 @@ __puya_arc4_router___method_route@3:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub method
intc_1 // 1
retsub
diff --git a/test_cases/diamond_mro/out_unoptimized/GP.destructured.ir b/test_cases/diamond_mro/out_unoptimized/GP.destructured.ir
index c2169fe6ce..44b803fbf5 100644
--- a/test_cases/diamond_mro/out_unoptimized/GP.destructured.ir
+++ b/test_cases/diamond_mro/out_unoptimized/GP.destructured.ir
@@ -27,19 +27,19 @@ contract test_cases.diamond_mro.gp.GP:
block@2: // create_route_L11
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.diamond_mro.gp.GP.create()
return 1u
block@3: // method_route_L15
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: bool = (== tmp%7#0 NoOp)
- (assert tmp%8#0) // OnCompletion is NoOp
+ (assert tmp%8#0) // OnCompletion is not NoOp
let tmp%9#0: uint64 = (txn ApplicationID)
let tmp%10#0: bool = (!= tmp%9#0 0u)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
test_cases.diamond_mro.gp.GP.method()
return 1u
block@4: // switch_case_default_L6
diff --git a/test_cases/diamond_mro/puya.log b/test_cases/diamond_mro/puya.log
index 451f36eb76..9e0374d2ef 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.approval.mir b/test_cases/everything/out/MyContract.approval.mir
index 95324ce211..9ac183e74d 100644
--- a/test_cases/everything/out/MyContract.approval.mir
+++ b/test_cases/everything/out/MyContract.approval.mir
@@ -37,10 +37,10 @@ __puya_arc4_router___create_route@2:
// @abimethod(create="require")
txn OnCompletion tmp%3#0
! tmp%4#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%5#0
! tmp%6#0
- assert // is creating
+ assert // can only call when creating
callsub create
int 1 1
retsub 1
@@ -54,9 +54,9 @@ __puya_arc4_router___register_route@3:
shl tmp%8#0
int 3 tmp%8#0,3
& tmp%9#0
- assert // OnCompletion is one of NoOp, OptIn
+ assert // OnCompletion is not one of NoOp, OptIn
txn ApplicationID tmp%10#0
- assert // is not creating
+ assert // can only call when not creating
// everything/contract.py:37
// class Everything(ARC4Contract, MyMiddleBase, name="MyContract"):
txna ApplicationArgs 1 tmp%12#0
@@ -71,9 +71,9 @@ __puya_arc4_router___say_hello_route@4:
// @abimethod
txn OnCompletion tmp%13#0
! tmp%14#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%15#0
- assert // is not creating
+ assert // can only call when not creating
callsub say_hello tmp%17#0
byte 0x151f7c75 tmp%17#0,0x151f7c75
l-load tmp%17#0 1 0x151f7c75,tmp%17#0
@@ -87,9 +87,9 @@ __puya_arc4_router___calculate_route@5:
// @abimethod
txn OnCompletion tmp%19#0
! tmp%20#0
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID tmp%21#0
- assert // is not creating
+ assert // can only call when not creating
// everything/contract.py:37
// class Everything(ARC4Contract, MyMiddleBase, name="MyContract"):
txna ApplicationArgs 1 tmp%23#0
@@ -112,9 +112,9 @@ __puya_arc4_router___close_out_route@6:
txn OnCompletion tmp%27#0
int CloseOut tmp%27#0,CloseOut
== tmp%28#0
- assert // OnCompletion is CloseOut
+ assert // OnCompletion is not CloseOut
txn ApplicationID tmp%29#0
- assert // is not creating
+ assert // can only call when not creating
callsub close_out
int 1 1
retsub 1
diff --git a/test_cases/everything/out/MyContract.approval.teal b/test_cases/everything/out/MyContract.approval.teal
index a0319495eb..1e88676cde 100644
--- a/test_cases/everything/out/MyContract.approval.teal
+++ b/test_cases/everything/out/MyContract.approval.teal
@@ -25,10 +25,10 @@ __puya_arc4_router___create_route@2:
// @abimethod(create="require")
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
callsub create
intc_0 // 1
retsub
@@ -41,9 +41,9 @@ __puya_arc4_router___register_route@3:
shl
pushint 3 // 3
&
- assert // OnCompletion is one of NoOp, OptIn
+ assert // OnCompletion is not one of NoOp, OptIn
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// everything/contract.py:37
// class Everything(ARC4Contract, MyMiddleBase, name="MyContract"):
txna ApplicationArgs 1
@@ -58,9 +58,9 @@ __puya_arc4_router___say_hello_route@4:
// @abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub say_hello
bytec_2 // 0x151f7c75
swap
@@ -74,9 +74,9 @@ __puya_arc4_router___calculate_route@5:
// @abimethod
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
// everything/contract.py:37
// class Everything(ARC4Contract, MyMiddleBase, name="MyContract"):
txna ApplicationArgs 1
@@ -97,9 +97,9 @@ __puya_arc4_router___close_out_route@6:
txn OnCompletion
pushint 2 // CloseOut
==
- assert // OnCompletion is CloseOut
+ assert // OnCompletion is not CloseOut
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub close_out
intc_0 // 1
retsub
diff --git a/test_cases/everything/out/MyContract.arc32.json b/test_cases/everything/out/MyContract.arc32.json
index 2fcea66446..d91c867dd5 100644
--- a/test_cases/everything/out/MyContract.arc32.json
+++ b/test_cases/everything/out/MyContract.arc32.json
@@ -28,7 +28,7 @@
}
},
"source": {
- "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiY291bnRlciIgIm5hbWUiIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweGJkNjA5OWU1IDB4NWQ1Yzg0YzcgMHhmZDA3MjY0ZSAweDE2NThhYTJmIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJyZWdpc3RlcihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2F5X2hlbGxvKClzdHJpbmciLCBtZXRob2QgImNhbGN1bGF0ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2Vfb3V0KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fcmVnaXN0ZXJfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zYXlfaGVsbG9fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxjdWxhdGVfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWdpc3Rlcl9yb3V0ZUAzOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0NwogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiTm9PcCIsICJPcHRJbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCAzIC8vIDMKICAgICYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgb25lIG9mIE5vT3AsIE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTozNwogICAgLy8gY2xhc3MgRXZlcnl0aGluZyhBUkM0Q29udHJhY3QsIE15TWlkZGxlQmFzZSwgbmFtZT0iTXlDb250cmFjdCIpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0NwogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiTm9PcCIsICJPcHRJbiJdKQogICAgY2FsbHN1YiByZWdpc3RlcgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2F5X2hlbGxvX3JvdXRlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsY3VsYXRlX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBjbGFzcyBFdmVyeXRoaW5nKEFSQzRDb250cmFjdCwgTXlNaWRkbGVCYXNlLCBuYW1lPSJNeUNvbnRyYWN0Iik6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNhbGN1bGF0ZQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xvc2Vfb3V0X3JvdXRlQDY6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCAyIC8vIENsb3NlT3V0CiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xvc2Vfb3V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTozNwogICAgLy8gY2xhc3MgRXZlcnl0aGluZyhBUkM0Q29udHJhY3QsIE15TWlkZGxlQmFzZSwgbmFtZT0iTXlDb250cmFjdCIpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNyZWF0ZSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDEtNDIKICAgIC8vIEBhYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5fY2hlY2tfYmFuX2xpc3QoKQogICAgY2FsbHN1YiBfY2hlY2tfYmFuX2xpc3QKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDQKICAgIC8vIHNlbGYucmVtZW1iZXJfY3JlYXRvcigpCiAgICBjYWxsc3ViIHJlbWVtYmVyX2NyZWF0b3IKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDUKICAgIC8vIHNlbGYuY291bnRlciA9IFVJbnQ2NChaRVJPKQogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX2NoZWNrX2Jhbl9saXN0KCkgLT4gdm9pZDoKX2NoZWNrX2Jhbl9saXN0OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfYmFuX2xpc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3OQogICAgLy8gYXNzZXJ0IG9wLlR4bi5zZW5kZXIgIT0gZ2V0X2Jhbm5lZCgpLCAiWW91IGFyZSBiYW5uZWQsIGdvb2RieWUiCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldF9iYW5uZWQKICAgICE9CiAgICBhc3NlcnQgLy8gWW91IGFyZSBiYW5uZWQsIGdvb2RieWUKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5nZXRfYmFubmVkKCkgLT4gYnl0ZXM6CmdldF9iYW5uZWQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjIzLTI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9iYW5uZWQoKSAtPiBBY2NvdW50OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhZGRyID0gQWNjb3VudChCQU5ORUQpCiAgICBwdXNoYnl0ZXMgYmFzZTMyKFZDTUpLV09ZNVA1UDdTS01aRkZPQ0VST1BKQ1pPVElKTU5JWU5VQ0tIN0xSTzQ1Sk1KUFEpIC8vIGFkZHIgVkNNSktXT1k1UDVQN1NLTVpGRk9DRVJPUEpDWk9USUpNTklZTlVDS0g3TFJPNDVKTUpQNlVZQklKQQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNgogICAgLy8gcmV0dXJuIGFkZHIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5teV9iYXNlLk15QmFzZS5yZW1lbWJlcl9jcmVhdG9yKCkgLT4gdm9pZDoKcmVtZW1iZXJfY3JlYXRvcjoKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weTo3LTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcmVtZW1iZXJfY3JlYXRvcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6OQogICAgLy8gc2VsZi5jcmVhdG9yID0gb3AuVHhuLnNlbmRlcgogICAgcHVzaGJ5dGVzICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnJlZ2lzdGVyKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDctNDgKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIC8vIGRlZiByZWdpc3RlcihzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDkKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBpZiBvcC5UeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk9wdEluOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgYnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBzZW5kZXJfbmFtZSwgc2VuZGVyX25hbWVfZXhpc3RlZCA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnRjXzEgLy8gMAogICAgZHVwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBpZiBub3Qgc2VuZGVyX25hbWVfZXhpc3RlZDoKICAgIGJueiByZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIHNlbGYuY291bnRlciArPSBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpICAjIGhhcyBmdWxsIEZ1bmNEZWYKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5CiAgICArCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIHNlbGYubmFtZVswXSA9IG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5tdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpIC0+IHVpbnQ2NDoKbXVsdGlwbGljYXRpdmVfaWRlbnRpdHk6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTgtMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToyMAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnNheV9oZWxsbygpIC0+IGJ5dGVzOgpzYXlfaGVsbG86CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgc2F5X2hlbGxvKHNlbGYpIC0+IFN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5fY2hlY2tfYmFuX2xpc3QoKQogICAgY2FsbHN1YiBfY2hlY2tfYmFuX2xpc3QKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTkKICAgIC8vIG5hbWUsIGV4aXN0cyA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnRjXzEgLy8gMAogICAgZHVwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MAogICAgLy8gaWYgbm90IGV4aXN0czoKICAgIGJueiBzYXlfaGVsbG9fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gU3RyaW5nKCJIb3dkeSBzdHJhbmdlciEiKQogICAgcHVzaGJ5dGVzIDB4MDAwZjQ4NmY3NzY0NzkyMDczNzQ3MjYxNmU2NzY1NzIyMQogICAgc3dhcAogICAgcmV0c3ViCgpzYXlfaGVsbG9fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MgogICAgLy8gcmV0dXJuICJIZWxsbywgIiArIG5hbWUgKyAiISIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4NDg2NTZjNmM2ZjJjMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgyMQogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuY2FsY3VsYXRlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CmNhbGN1bGF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQtNjUKICAgIC8vIEBhYmltZXRob2QKICAgIC8vIGRlZiBjYWxjdWxhdGUoc2VsZiwgYTogYXJjNF9VSW50NjQsIGI6IGFyYzRfVUludDY0KSAtPiBhcmM0X1VJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NgogICAgLy8gYyA9IHN1cGVyKCkuY2FsY3VsYXRlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeU1pZGRsZUJhc2UuY2FsY3VsYXRlCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyByZXR1cm4gYXJjNF9VSW50NjQoYy5uYXRpdmUgKiBiLm5hdGl2ZSkKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgKgogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeU1pZGRsZUJhc2UuY2FsY3VsYXRlOgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjEzLTE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNhbGN1bGF0ZShzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhLm5hdGl2ZSArIGIubmF0aXZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICsKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNsb3NlX291dCgpIC0+IHZvaWQ6CmNsb3NlX291dDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICAvLyBkZWYgY2xvc2Vfb3V0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX3JlbW92ZV9zZW5kZXIoKSAtPiB2b2lkOgpfcmVtb3ZlX3NlbmRlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3JlbW92ZV9zZW5kZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5jb3VudGVyIC09IHBvc2l0aXZlX29uZSgpCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudGVyIGV4aXN0cwogICAgY2FsbHN1YiBwb3NpdGl2ZV9vbmUKICAgIC0KICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LnBvc2l0aXZlX29uZSgpIC0+IHVpbnQ2NDoKcG9zaXRpdmVfb25lOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4Ni04NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwb3NpdGl2ZV9vbmUoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODgKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIK",
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiY291bnRlciIgIm5hbWUiIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweGJkNjA5OWU1IDB4NWQ1Yzg0YzcgMHhmZDA3MjY0ZSAweDE2NThhYTJmIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJyZWdpc3RlcihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2F5X2hlbGxvKClzdHJpbmciLCBtZXRob2QgImNhbGN1bGF0ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2Vfb3V0KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fcmVnaXN0ZXJfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zYXlfaGVsbG9fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxjdWxhdGVfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlZ2lzdGVyX3JvdXRlQDM6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc2hsCiAgICBwdXNoaW50IDMgLy8gMwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3Qgb25lIG9mIE5vT3AsIE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGNhbGxzdWIgcmVnaXN0ZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NheV9oZWxsb19yb3V0ZUA0OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1NgogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsY3VsYXRlX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgY2FsY3VsYXRlCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlX291dAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jcmVhdGUoKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnJlbWVtYmVyX2NyZWF0b3IoKQogICAgY2FsbHN1YiByZW1lbWJlcl9jcmVhdG9yCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzZWxmLmNvdW50ZXIgPSBVSW50NjQoWkVSTykKICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9jaGVja19iYW5fbGlzdCgpIC0+IHZvaWQ6Cl9jaGVja19iYW5fbGlzdDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jhbl9saXN0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGFzc2VydCBvcC5UeG4uc2VuZGVyICE9IGdldF9iYW5uZWQoKSwgIllvdSBhcmUgYmFubmVkLCBnb29kYnllIgogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRfYmFubmVkCiAgICAhPQogICAgYXNzZXJ0IC8vIFlvdSBhcmUgYmFubmVkLCBnb29kYnllCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuZ2V0X2Jhbm5lZCgpIC0+IGJ5dGVzOgpnZXRfYmFubmVkOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyMy0yNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmFubmVkKCkgLT4gQWNjb3VudDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNQogICAgLy8gYWRkciA9IEFjY291bnQoQkFOTkVEKQogICAgcHVzaGJ5dGVzIGJhc2UzMihWQ01KS1dPWTVQNVA3U0tNWkZGT0NFUk9QSkNaT1RJSk1OSVlOVUNLSDdMUk80NUpNSlBRKSAvLyBhZGRyIFZDTUpLV09ZNVA1UDdTS01aRkZPQ0VST1BKQ1pPVElKTU5JWU5VQ0tIN0xSTzQ1Sk1KUDZVWUJJSkEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBhZGRyCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeUJhc2UucmVtZW1iZXJfY3JlYXRvcigpIC0+IHZvaWQ6CnJlbWVtYmVyX2NyZWF0b3I6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6Ny04CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHJlbWVtYmVyX2NyZWF0b3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjkKICAgIC8vIHNlbGYuY3JlYXRvciA9IG9wLlR4bi5zZW5kZXIKICAgIHB1c2hieXRlcyAiY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5yZWdpc3RlcihuYW1lOiBieXRlcykgLT4gdm9pZDoKcmVnaXN0ZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3LTQ4CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgcmVnaXN0ZXIoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBzZWxmLl9jaGVja19iYW5fbGlzdCgpCiAgICBjYWxsc3ViIF9jaGVja19iYW5fbGlzdAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MAogICAgLy8gaWYgb3AuVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5PcHRJbjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIGJ6IHJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MQogICAgLy8gc2VuZGVyX25hbWUsIHNlbmRlcl9uYW1lX2V4aXN0ZWQgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MgogICAgLy8gaWYgbm90IHNlbmRlcl9uYW1lX2V4aXN0ZWQ6CiAgICBibnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmNvdW50ZXIgKz0gbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAgIyBoYXMgZnVsbCBGdW5jRGVmCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudGVyIGV4aXN0cwogICAgY2FsbHN1YiBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eQogICAgKwogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBzZWxmLm5hbWVbMF0gPSBuYW1lCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UubXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiB1aW50NjQ6Cm11bHRpcGxpY2F0aXZlX2lkZW50aXR5OgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MjAKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5zYXlfaGVsbG8oKSAtPiBieXRlczoKc2F5X2hlbGxvOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIHNheV9oZWxsbyhzZWxmKSAtPiBTdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBuYW1lLCBleGlzdHMgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGlmIG5vdCBleGlzdHM6CiAgICBibnogc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MQogICAgLy8gcmV0dXJuIFN0cmluZygiSG93ZHkgc3RyYW5nZXIhIikKICAgIHB1c2hieXRlcyAweDAwMGY0ODZmNzc2NDc5MjA3Mzc0NzI2MTZlNjc2NTcyMjEKICAgIHN3YXAKICAgIHJldHN1YgoKc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lICsgIiEiCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MjEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpjYWxjdWxhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0LTY1CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsY3VsYXRlKHNlbGYsIGE6IGFyYzRfVUludDY0LCBiOiBhcmM0X1VJbnQ2NCkgLT4gYXJjNF9VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGMgPSBzdXBlcigpLmNhbGN1bGF0ZShhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NwogICAgLy8gcmV0dXJuIGFyYzRfVUludDY0KGMubmF0aXZlICogYi5uYXRpdmUpCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICoKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5teV9iYXNlLk15TWlkZGxlQmFzZS5jYWxjdWxhdGUoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToxMy0xNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjYWxjdWxhdGUoc2VsZiwgYTogYXJjNC5VSW50NjQsIGI6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYS5uYXRpdmUgKyBiLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICArCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbG9zZV9vdXQoKSAtPiB2b2lkOgpjbG9zZV9vdXQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5LTcwCiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgLy8gZGVmIGNsb3NlX291dChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBzZWxmLl9yZW1vdmVfc2VuZGVyKCkKICAgIGNhbGxzdWIgX3JlbW92ZV9zZW5kZXIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnRlciBleGlzdHMKICAgIGNhbGxzdWIgcG9zaXRpdmVfb25lCiAgICAtCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5wb3NpdGl2ZV9vbmUoKSAtPiB1aW50NjQ6CnBvc2l0aXZlX29uZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODYtODcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcG9zaXRpdmVfb25lKCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgYnl0ZWNibG9jayAiY291bnRlciIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3NQogICAgLy8gcmV0dXJuIFRydWUKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5fcmVtb3ZlX3NlbmRlcigpIC0+IHZvaWQ6Cl9yZW1vdmVfc2VuZGVyOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MS04MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfcmVtb3ZlX3NlbmRlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBzZWxmLmNvdW50ZXIgLT0gcG9zaXRpdmVfb25lKCkKICAgIHB1c2hpbnQgMCAvLyAwCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIHBvc2l0aXZlX29uZQogICAgLQogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QucG9zaXRpdmVfb25lKCkgLT4gdWludDY0Ogpwb3NpdGl2ZV9vbmU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHBvc2l0aXZlX29uZSgpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHN1Ygo="
},
"state": {
diff --git a/test_cases/everything/out/MyContract.arc56.json b/test_cases/everything/out/MyContract.arc56.json
new file mode 100644
index 0000000000..1426a3fce2
--- /dev/null
+++ b/test_cases/everything/out/MyContract.arc56.json
@@ -0,0 +1,233 @@
+{
+ "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": {}
+ }
+ ],
+ "arcs": [
+ 22,
+ 28
+ ],
+ "networks": {},
+ "state": {
+ "schema": {
+ "global": {
+ "ints": 1,
+ "bytes": 1
+ },
+ "local": {
+ "ints": 0,
+ "bytes": 1
+ }
+ },
+ "keys": {
+ "global": {
+ "creator": {
+ "keyType": "AVMString",
+ "valueType": "AVMBytes",
+ "key": "Y3JlYXRvcg=="
+ },
+ "counter": {
+ "keyType": "AVMString",
+ "valueType": "AVMUint64",
+ "key": "Y291bnRlcg=="
+ }
+ },
+ "local": {
+ "name": {
+ "keyType": "AVMString",
+ "valueType": "string",
+ "key": "bmFtZQ=="
+ }
+ },
+ "box": {}
+ },
+ "maps": {
+ "global": {},
+ "local": {},
+ "box": {}
+ }
+ },
+ "bareActions": {
+ "create": [],
+ "call": []
+ },
+ "sourceInfo": {
+ "approval": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 156
+ ],
+ "errorMessage": "OnCompletion is not CloseOut"
+ },
+ {
+ "pc": [
+ 84,
+ 116,
+ 132
+ ],
+ "errorMessage": "OnCompletion is not NoOp"
+ },
+ {
+ "pc": [
+ 101
+ ],
+ "errorMessage": "OnCompletion is not one of NoOp, OptIn"
+ },
+ {
+ "pc": [
+ 189
+ ],
+ "errorMessage": "You are banned, goodbye"
+ },
+ {
+ "pc": [
+ 88
+ ],
+ "errorMessage": "can only call when creating"
+ },
+ {
+ "pc": [
+ 104,
+ 119,
+ 135,
+ 159
+ ],
+ "errorMessage": "can only call when not creating"
+ },
+ {
+ "pc": [
+ 270,
+ 406
+ ],
+ "errorMessage": "check self.counter exists"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ },
+ "clear": {
+ "sourceInfo": [
+ {
+ "pc": [
+ 24
+ ],
+ "errorMessage": "check self.counter exists"
+ }
+ ],
+ "pcOffsetMethod": "none"
+ }
+ },
+ "source": {
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiY291bnRlciIgIm5hbWUiIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweGJkNjA5OWU1IDB4NWQ1Yzg0YzcgMHhmZDA3MjY0ZSAweDE2NThhYTJmIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJyZWdpc3RlcihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2F5X2hlbGxvKClzdHJpbmciLCBtZXRob2QgImNhbGN1bGF0ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2Vfb3V0KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fcmVnaXN0ZXJfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zYXlfaGVsbG9fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxjdWxhdGVfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlZ2lzdGVyX3JvdXRlQDM6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICBpbnRjXzAgLy8gMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc2hsCiAgICBwdXNoaW50IDMgLy8gMwogICAgJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3Qgb25lIG9mIE5vT3AsIE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDcKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIGNhbGxzdWIgcmVnaXN0ZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NheV9oZWxsb19yb3V0ZUA0OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1NgogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsY3VsYXRlX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgY2FsY3VsYXRlCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjkKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlX291dAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jcmVhdGUoKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDMKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnJlbWVtYmVyX2NyZWF0b3IoKQogICAgY2FsbHN1YiByZW1lbWJlcl9jcmVhdG9yCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzZWxmLmNvdW50ZXIgPSBVSW50NjQoWkVSTykKICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9jaGVja19iYW5fbGlzdCgpIC0+IHZvaWQ6Cl9jaGVja19iYW5fbGlzdDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NoZWNrX2Jhbl9saXN0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzkKICAgIC8vIGFzc2VydCBvcC5UeG4uc2VuZGVyICE9IGdldF9iYW5uZWQoKSwgIllvdSBhcmUgYmFubmVkLCBnb29kYnllIgogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBnZXRfYmFubmVkCiAgICAhPQogICAgYXNzZXJ0IC8vIFlvdSBhcmUgYmFubmVkLCBnb29kYnllCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuZ2V0X2Jhbm5lZCgpIC0+IGJ5dGVzOgpnZXRfYmFubmVkOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyMy0yNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYmFubmVkKCkgLT4gQWNjb3VudDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNQogICAgLy8gYWRkciA9IEFjY291bnQoQkFOTkVEKQogICAgcHVzaGJ5dGVzIGJhc2UzMihWQ01KS1dPWTVQNVA3U0tNWkZGT0NFUk9QSkNaT1RJSk1OSVlOVUNLSDdMUk80NUpNSlBRKSAvLyBhZGRyIFZDTUpLV09ZNVA1UDdTS01aRkZPQ0VST1BKQ1pPVElKTU5JWU5VQ0tIN0xSTzQ1Sk1KUDZVWUJJSkEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MjYKICAgIC8vIHJldHVybiBhZGRyCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeUJhc2UucmVtZW1iZXJfY3JlYXRvcigpIC0+IHZvaWQ6CnJlbWVtYmVyX2NyZWF0b3I6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6Ny04CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHJlbWVtYmVyX2NyZWF0b3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjkKICAgIC8vIHNlbGYuY3JlYXRvciA9IG9wLlR4bi5zZW5kZXIKICAgIHB1c2hieXRlcyAiY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5yZWdpc3RlcihuYW1lOiBieXRlcykgLT4gdm9pZDoKcmVnaXN0ZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ3LTQ4CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIiwgIk9wdEluIl0pCiAgICAvLyBkZWYgcmVnaXN0ZXIoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBzZWxmLl9jaGVja19iYW5fbGlzdCgpCiAgICBjYWxsc3ViIF9jaGVja19iYW5fbGlzdAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MAogICAgLy8gaWYgb3AuVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5PcHRJbjoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIGJ6IHJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MQogICAgLy8gc2VuZGVyX25hbWUsIHNlbmRlcl9uYW1lX2V4aXN0ZWQgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1MgogICAgLy8gaWYgbm90IHNlbmRlcl9uYW1lX2V4aXN0ZWQ6CiAgICBibnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBzZWxmLmNvdW50ZXIgKz0gbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAgIyBoYXMgZnVsbCBGdW5jRGVmCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudGVyIGV4aXN0cwogICAgY2FsbHN1YiBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eQogICAgKwogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBzZWxmLm5hbWVbMF0gPSBuYW1lCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UubXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiB1aW50NjQ6Cm11bHRpcGxpY2F0aXZlX2lkZW50aXR5OgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5KCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MjAKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5zYXlfaGVsbG8oKSAtPiBieXRlczoKc2F5X2hlbGxvOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1Ni01NwogICAgLy8gQGFiaW1ldGhvZAogICAgLy8gZGVmIHNheV9oZWxsbyhzZWxmKSAtPiBTdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTgKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBuYW1lLCBleGlzdHMgPSBzZWxmLm5hbWUubWF5YmUoYWNjb3VudD0wKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAibmFtZSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjAKICAgIC8vIGlmIG5vdCBleGlzdHM6CiAgICBibnogc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MQogICAgLy8gcmV0dXJuIFN0cmluZygiSG93ZHkgc3RyYW5nZXIhIikKICAgIHB1c2hieXRlcyAweDAwMGY0ODZmNzc2NDc5MjA3Mzc0NzI2MTZlNjc2NTcyMjEKICAgIHN3YXAKICAgIHJldHN1YgoKc2F5X2hlbGxvX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lICsgIiEiCiAgICBmcmFtZV9kaWcgMAogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYyYzIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MjEKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpjYWxjdWxhdGU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0LTY1CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsY3VsYXRlKHNlbGYsIGE6IGFyYzRfVUludDY0LCBiOiBhcmM0X1VJbnQ2NCkgLT4gYXJjNF9VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjYKICAgIC8vIGMgPSBzdXBlcigpLmNhbGN1bGF0ZShhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NwogICAgLy8gcmV0dXJuIGFyYzRfVUludDY0KGMubmF0aXZlICogYi5uYXRpdmUpCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICoKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5teV9iYXNlLk15TWlkZGxlQmFzZS5jYWxjdWxhdGUoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToxMy0xNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjYWxjdWxhdGUoc2VsZiwgYTogYXJjNC5VSW50NjQsIGI6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjE1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoYS5uYXRpdmUgKyBiLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICArCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbG9zZV9vdXQoKSAtPiB2b2lkOgpjbG9zZV9vdXQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5LTcwCiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgLy8gZGVmIGNsb3NlX291dChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBzZWxmLl9yZW1vdmVfc2VuZGVyKCkKICAgIGNhbGxzdWIgX3JlbW92ZV9zZW5kZXIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9yZW1vdmVfc2VuZGVyKCkgLT4gdm9pZDoKX3JlbW92ZV9zZW5kZXI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9yZW1vdmVfc2VuZGVyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYuY291bnRlciAtPSBwb3NpdGl2ZV9vbmUoKQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291bnRlciBleGlzdHMKICAgIGNhbGxzdWIgcG9zaXRpdmVfb25lCiAgICAtCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5wb3NpdGl2ZV9vbmUoKSAtPiB1aW50NjQ6CnBvc2l0aXZlX29uZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODYtODcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcG9zaXRpdmVfb25lKCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCg==",
+ "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": 99,
+ "minor": 99,
+ "patch": 99
+ }
+ },
+ "events": [],
+ "templateVariables": {}
+}
\ No newline at end of file
diff --git a/test_cases/everything/out/MyContract.destructured.ir b/test_cases/everything/out/MyContract.destructured.ir
index af8d6e417b..11c36cfe9a 100644
--- a/test_cases/everything/out/MyContract.destructured.ir
+++ b/test_cases/everything/out/MyContract.destructured.ir
@@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@10: // after_if_else_L37
diff --git a/test_cases/everything/out/MyContract.ssa.ir b/test_cases/everything/out/MyContract.ssa.ir
index 8c404d05f9..0f6e016c13 100644
--- a/test_cases/everything/out/MyContract.ssa.ir
+++ b/test_cases/everything/out/MyContract.ssa.ir
@@ -26,30 +26,30 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (== tmp%13#0 NoOp)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (!= tmp%15#0 0u)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -57,10 +57,10 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (== tmp%19#0 NoOp)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -70,10 +70,10 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
let tmp%30#0: bool = (!= tmp%29#0 0u)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@7: // switch_case_default_L37
diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir
index 797bc1da4f..dd76e871cb 100644
--- a/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir
+++ b/test_cases/everything/out/MyContract.ssa.opt_pass_1.ir
@@ -20,28 +20,28 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -49,9 +49,9 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -61,9 +61,9 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@10: // after_if_else_L37
diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_2.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_2.ir
index 633b04deba..1d2eb504a6 100644
--- a/test_cases/everything/out/MyContract.ssa.opt_pass_2.ir
+++ b/test_cases/everything/out/MyContract.ssa.opt_pass_2.ir
@@ -18,28 +18,28 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -47,9 +47,9 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -59,9 +59,9 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@10: // after_if_else_L37
diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_3.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_3.ir
index 224148d76b..8acb28f39c 100644
--- a/test_cases/everything/out/MyContract.ssa.opt_pass_3.ir
+++ b/test_cases/everything/out/MyContract.ssa.opt_pass_3.ir
@@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@10: // after_if_else_L37
diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_4.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_4.ir
index 4278e4715a..355f97e7d4 100644
--- a/test_cases/everything/out/MyContract.ssa.opt_pass_4.ir
+++ b/test_cases/everything/out/MyContract.ssa.opt_pass_4.ir
@@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@10: // after_if_else_L37
diff --git a/test_cases/everything/out/MyContract.ssa.opt_pass_5.ir b/test_cases/everything/out/MyContract.ssa.opt_pass_5.ir
index af8d6e417b..11c36cfe9a 100644
--- a/test_cases/everything/out/MyContract.ssa.opt_pass_5.ir
+++ b/test_cases/everything/out/MyContract.ssa.opt_pass_5.ir
@@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@10: // after_if_else_L37
diff --git a/test_cases/everything/out_O2/MyContract.approval.teal b/test_cases/everything/out_O2/MyContract.approval.teal
index 414ffc36e9..9288254fad 100644
--- a/test_cases/everything/out_O2/MyContract.approval.teal
+++ b/test_cases/everything/out_O2/MyContract.approval.teal
@@ -21,10 +21,10 @@ __puya_arc4_router__:
__puya_arc4_router___create_route@2:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
!
- assert // is creating
+ assert // can only call when creating
callsub create
intc_0 // 1
retsub
@@ -35,9 +35,9 @@ __puya_arc4_router___register_route@3:
shl
pushint 3 // 3
&
- assert // OnCompletion is one of NoOp, OptIn
+ assert // OnCompletion is not one of NoOp, OptIn
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
callsub register
intc_0 // 1
@@ -46,9 +46,9 @@ __puya_arc4_router___register_route@3:
__puya_arc4_router___say_hello_route@4:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub say_hello
bytec_2 // 0x151f7c75
swap
@@ -60,9 +60,9 @@ __puya_arc4_router___say_hello_route@4:
__puya_arc4_router___calculate_route@5:
txn OnCompletion
!
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
txna ApplicationArgs 1
txna ApplicationArgs 2
callsub calculate
@@ -77,9 +77,9 @@ __puya_arc4_router___close_out_route@6:
txn OnCompletion
pushint 2 // CloseOut
==
- assert // OnCompletion is CloseOut
+ assert // OnCompletion is not CloseOut
txn ApplicationID
- assert // is not creating
+ assert // can only call when not creating
callsub close_out
intc_0 // 1
retsub
diff --git a/test_cases/everything/out_O2/MyContract.destructured.ir b/test_cases/everything/out_O2/MyContract.destructured.ir
index af8d6e417b..11c36cfe9a 100644
--- a/test_cases/everything/out_O2/MyContract.destructured.ir
+++ b/test_cases/everything/out_O2/MyContract.destructured.ir
@@ -15,28 +15,28 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (! tmp%3#0)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (! tmp%5#0)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
- (assert tmp%10#0) // is not creating
+ (assert tmp%10#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (! tmp%13#0)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
- (assert tmp%15#0) // is not creating
+ (assert tmp%15#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -44,9 +44,9 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (! tmp%19#0)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
- (assert tmp%21#0) // is not creating
+ (assert tmp%21#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -56,9 +56,9 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
- (assert tmp%29#0) // is not creating
+ (assert tmp%29#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@10: // after_if_else_L37
diff --git a/test_cases/everything/out_unoptimized/MyContract.approval.teal b/test_cases/everything/out_unoptimized/MyContract.approval.teal
index 049f65ccb6..98e6331599 100644
--- a/test_cases/everything/out_unoptimized/MyContract.approval.teal
+++ b/test_cases/everything/out_unoptimized/MyContract.approval.teal
@@ -45,11 +45,11 @@ __puya_arc4_router___create_route@2:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
==
- assert // is creating
+ assert // can only call when creating
callsub create
intc_1 // 1
retsub
@@ -63,11 +63,11 @@ __puya_arc4_router___register_route@3:
shl
pushint 3 // 3
&
- assert // OnCompletion is one of NoOp, OptIn
+ assert // OnCompletion is not one of NoOp, OptIn
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// everything/contract.py:37
// class Everything(ARC4Contract, MyMiddleBase, name="MyContract"):
txna ApplicationArgs 1
@@ -83,11 +83,11 @@ __puya_arc4_router___say_hello_route@4:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub say_hello
bytec_2 // 0x151f7c75
swap
@@ -102,11 +102,11 @@ __puya_arc4_router___calculate_route@5:
txn OnCompletion
intc_0 // NoOp
==
- assert // OnCompletion is NoOp
+ assert // OnCompletion is not NoOp
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
// everything/contract.py:37
// class Everything(ARC4Contract, MyMiddleBase, name="MyContract"):
txna ApplicationArgs 1
@@ -127,11 +127,11 @@ __puya_arc4_router___close_out_route@6:
txn OnCompletion
pushint 2 // CloseOut
==
- assert // OnCompletion is CloseOut
+ assert // OnCompletion is not CloseOut
txn ApplicationID
intc_0 // 0
!=
- assert // is not creating
+ assert // can only call when not creating
callsub close_out
intc_1 // 1
retsub
diff --git a/test_cases/everything/out_unoptimized/MyContract.destructured.ir b/test_cases/everything/out_unoptimized/MyContract.destructured.ir
index b567999e45..7375a1e33d 100644
--- a/test_cases/everything/out_unoptimized/MyContract.destructured.ir
+++ b/test_cases/everything/out_unoptimized/MyContract.destructured.ir
@@ -26,30 +26,30 @@ contract test_cases.everything.contract.Everything:
block@2: // create_route_L41
let tmp%3#0: uint64 = (txn OnCompletion)
let tmp%4#0: bool = (== tmp%3#0 NoOp)
- (assert tmp%4#0) // OnCompletion is NoOp
+ (assert tmp%4#0) // OnCompletion is not NoOp
let tmp%5#0: uint64 = (txn ApplicationID)
let tmp%6#0: bool = (== tmp%5#0 0u)
- (assert tmp%6#0) // is creating
+ (assert tmp%6#0) // can only call when creating
test_cases.everything.contract.Everything.create()
return 1u
block@3: // register_route_L47
let tmp%7#0: uint64 = (txn OnCompletion)
let tmp%8#0: uint64 = (shl 1u tmp%7#0)
let tmp%9#0: uint64 = (& tmp%8#0 3u)
- (assert tmp%9#0) // OnCompletion is one of NoOp, OptIn
+ (assert tmp%9#0) // OnCompletion is not one of NoOp, OptIn
let tmp%10#0: uint64 = (txn ApplicationID)
let tmp%11#0: bool = (!= tmp%10#0 0u)
- (assert tmp%11#0) // is not creating
+ (assert tmp%11#0) // can only call when not creating
let tmp%12#0: bytes = (txna ApplicationArgs 1)
test_cases.everything.contract.Everything.register(tmp%12#0)
return 1u
block@4: // say_hello_route_L56
let tmp%13#0: uint64 = (txn OnCompletion)
let tmp%14#0: bool = (== tmp%13#0 NoOp)
- (assert tmp%14#0) // OnCompletion is NoOp
+ (assert tmp%14#0) // OnCompletion is not NoOp
let tmp%15#0: uint64 = (txn ApplicationID)
let tmp%16#0: bool = (!= tmp%15#0 0u)
- (assert tmp%16#0) // is not creating
+ (assert tmp%16#0) // can only call when not creating
let tmp%17#0: bytes = test_cases.everything.contract.Everything.say_hello()
let tmp%18#0: bytes = (concat 0x151f7c75 tmp%17#0)
(log tmp%18#0)
@@ -57,10 +57,10 @@ contract test_cases.everything.contract.Everything:
block@5: // calculate_route_L64
let tmp%19#0: uint64 = (txn OnCompletion)
let tmp%20#0: bool = (== tmp%19#0 NoOp)
- (assert tmp%20#0) // OnCompletion is NoOp
+ (assert tmp%20#0) // OnCompletion is not NoOp
let tmp%21#0: uint64 = (txn ApplicationID)
let tmp%22#0: bool = (!= tmp%21#0 0u)
- (assert tmp%22#0) // is not creating
+ (assert tmp%22#0) // can only call when not creating
let tmp%23#0: bytes = (txna ApplicationArgs 1)
let tmp%24#0: bytes = (txna ApplicationArgs 2)
let tmp%25#0: bytes = test_cases.everything.contract.Everything.calculate(tmp%23#0, tmp%24#0)
@@ -70,10 +70,10 @@ contract test_cases.everything.contract.Everything:
block@6: // close_out_route_L69
let tmp%27#0: uint64 = (txn OnCompletion)
let tmp%28#0: bool = (== tmp%27#0 CloseOut)
- (assert tmp%28#0) // OnCompletion is CloseOut
+ (assert tmp%28#0) // OnCompletion is not CloseOut
let tmp%29#0: uint64 = (txn ApplicationID)
let tmp%30#0: bool = (!= tmp%29#0 0u)
- (assert tmp%30#0) // is not creating
+ (assert tmp%30#0) // can only call when not creating
test_cases.everything.contract.Everything.close_out()
return 1u
block@7: // switch_case_default_L37
diff --git a/test_cases/everything/puya.log b/test_cases/everything/puya.log
index 71d5ec425f..6773a19a36 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=