{ "name": "TrelyanInscription", "structs": { "InscriptionRecord": [ { "name": "version", "type": "uint8" }, { "name": "cell_id", "type": "uint64" }, { "name": "artifact_hash", "type": "byte[32]" }, { "name": "inscribed_round", "type": "uint64" }, { "name": "inscriber", "type": "address" }, { "name": "payload_uri", "type": "byte[]" } ] }, "methods": [ { "name": "create", "args": [], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Deploy. Sets the admin (mint authority). The network is pinned via the NATIVE\nGlobal.genesis_hash read in _build_message (A2 resolved) \u2014 there is no deploy-time genesis argument, so a wrong value can never silently scope signatures to the wrong network.", "events": [], "recommendations": {} }, { "name": "register_cell", "args": [ { "type": "uint64", "name": "cell" }, { "type": "address", "name": "controlling_owner" }, { "type": "byte[]", "name": "committed_pubkey" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Mint record for a Cell. Sets the immutable committed Falcon-1024 public key and the\ncontrolling owner ATOMICALLY (spec C5/I4/[Hermes#4]).\nOnly the admin (Foundation) may register; only ONCE per cell; only up to 1,024 cells. The registration is BOUND to a real Cell ASA \u2014 a pure NFT created by the admin \u2014 so a commitment cannot be registered under an arbitrary or nonexistent integer id. This closes the I4/M1 gap found in pre-audit review: `cid` derives from a real `Asset` (cell.id), exactly as inscribe() does, so the two can never key off different id spaces.\nThe FULL public key is stored (not a hash): inscribe READS it from state, so the 1,793-byte key never has to travel as a call argument \u2014 the AVM caps total ApplicationArgs at 2,048 B, which pubkey + signature would overflow (AUDIT-NOTE A9). The exact key length is enforced HERE, at the only point a key ever enters state, so a malformed key can never be committed [council: validate-at-register]. After this call committed_pubkey[cell.id] is immutable (no method rewrites it) \u2014 the controlling key is bound to the cell by construction.", "events": [], "recommendations": {} }, { "name": "inscribe", "args": [ { "type": "uint64", "name": "cell" }, { "type": "byte[32]", "name": "artifact_hash" }, { "type": "byte[]", "name": "falcon_sig" }, { "type": "byte[]", "name": "payload_uri" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Inscribe `cell` with `artifact_hash`, authorized by a Falcon-1024 signature over the\ndomain-separated message M.\nThe controlling public key is NOT a parameter \u2014 it was committed in full at register_cell and is READ from state here (AUDIT-NOTE A9). That (1) keeps the 1,793 B key out of the 2,048 B ApplicationArgs budget \u2014 only the signature (<=1423 B) rides in the args \u2014 and (2) binds the key to the cell by construction: a caller cannot substitute a key.\nBudget note [Hermes#5]: falcon_verify is opcode-heavy (~1700). ensure_budget pools the extra budget via OpUp inner txns funded from the group's fee surplus (GroupCredit) \u2014 the caller attaches surplus fee, so inscribe is self-budgeting (no hand-assembled OpUp group needed).", "events": [], "recommendations": {} }, { "name": "update_owner", "args": [ { "type": "uint64", "name": "cell" }, { "type": "address", "name": "new_owner" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Reassign the controlling owner. Only the CURRENT controlling owner may do this, and\nonly if the cell is NOT yet inscribed. This is the authorized way ownership moves for inscription purposes \u2014 distinct from raw ASA transfer, so flash-custody of the ASA does not confer inscription rights. [Hermes#2]", "events": [], "recommendations": {} }, { "name": "get_inscription", "args": [ { "type": "uint64", "name": "cell_id" } ], "returns": { "type": "(uint8,uint64,byte[32],uint64,address,byte[])", "struct": "InscriptionRecord" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the inscription record so anyone can re-verify off-chain. Spec I3.\nNOTE: subscripts the box directly; for a not-yet-inscribed cell this RAISES (per A3 a missing box read fails \u2014 it never returns a zero record). Callers treat a failed read as 'not inscribed'. The controlling public key for re-verification is read separately from committed_pubkey[cell_id] (A9). This is the only unguarded box read in the contract.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n TRELYAN post-quantum inscription application.\n\n Storage:\n - committed_pubkey : BoxMap[cell_id -> 1793B] immutable, written ONLY at register_cell (the\n Cell mint record). The FULL Falcon-1024 public\n key, NOT a hash: inscribe reads it from here so\n the key never travels as a call arg (A9). I4/C5.\n - inscriptions : BoxMap[cell_id -> InscriptionRecord] write-once. Spec I1/C2.\n - controlling_owner : BoxMap[cell_id -> 32B] address allowed to inscribe. Spec C1.\n - (network pin) : the native Global.genesis_hash is read in _build_message \u2014 no stored\n genesis value, no deploy-time arg, so the chain can never be mis-pinned (A2).\n - admin : the Foundation/Stiftung address permitted to register cells\n ONLY (mint). It has NO power over inscriptions. Spec governance.\n ", "networks": {}, "state": { "schema": { "global": { "ints": 1, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "admin": { "keyType": "AVMString", "valueType": "address", "key": "YWRtaW4=" }, "cells_registered": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y2VsbHNfcmVnaXN0ZXJlZA==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "committed_pubkey": { "keyType": "uint64", "valueType": "AVMBytes", "prefix": "a18=" }, "inscriptions": { "keyType": "uint64", "valueType": "InscriptionRecord", "prefix": "aV8=" }, "controlling_owner": { "keyType": "uint64", "valueType": "AVMBytes", "prefix": "b18=" } } } }, "bareActions": { "create": [], "call": [ "DeleteApplication", "UpdateApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 274 ], "errorMessage": "all 1024 cells registered" }, { "pc": [ 644 ], "errorMessage": "already inscribed; owner frozen" }, { "pc": [ 194, 204, 215, 225, 233, 241 ], "errorMessage": "asset exists" }, { "pc": [ 264 ], "errorMessage": "bad committed pubkey header (logn=10)" }, { "pc": [ 257 ], "errorMessage": "bad committed pubkey length" }, { "pc": [ 660 ], "errorMessage": "caller does not hold the cell" }, { "pc": [ 221 ], "errorMessage": "cell ASA not created by admin" }, { "pc": [ 470 ], "errorMessage": "cell already inscribed" }, { "pc": [ 297 ], "errorMessage": "cell already registered" }, { "pc": [ 307 ], "errorMessage": "cell already registered (owner)" }, { "pc": [ 245 ], "errorMessage": "cell manager must be cleared (immutable config)" }, { "pc": [ 209 ], "errorMessage": "cell must be a pure NFT" }, { "pc": [ 229 ], "errorMessage": "cell must have no clawback" }, { "pc": [ 237 ], "errorMessage": "cell must have no freeze" }, { "pc": [ 402, 630 ], "errorMessage": "cell not registered" }, { "pc": [ 189, 219 ], "errorMessage": "check self.admin exists" }, { "pc": [ 268 ], "errorMessage": "check self.cells_registered exists" }, { "pc": [ 477 ], "errorMessage": "check self.committed_pubkey entry exists" }, { "pc": [ 697 ], "errorMessage": "check self.inscriptions entry exists" }, { "pc": [ 137 ], "errorMessage": "contract is non-deletable (I1/I5)" }, { "pc": [ 141 ], "errorMessage": "contract is non-upgradable (I5)" }, { "pc": [ 283 ], "errorMessage": "controlling owner cannot be the zero address" }, { "pc": [ 415 ], "errorMessage": "falcon sig too large" }, { "pc": [ 557 ], "errorMessage": "falcon signature invalid" }, { "pc": [ 176, 360, 377 ], "errorMessage": "invalid array length header" }, { "pc": [ 183, 368, 385 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 167, 354, 616 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 155, 343, 605, 690 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 669 ], "errorMessage": "new owner cannot be the zero address" }, { "pc": [ 452 ], "errorMessage": "no controlling owner set" }, { "pc": [ 191 ], "errorMessage": "only admin may register cells" }, { "pc": [ 636 ], "errorMessage": "only controlling owner" }, { "pc": [ 424 ], "errorMessage": "payload_uri too long" }, { "pc": [ 440 ], "errorMessage": "sender does not hold the cell" }, { "pc": [ 458 ], "errorMessage": "sender not controlling owner" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAiYWRtaW4iICJjZWxsc19yZWdpc3RlcmVkIiAweDZmNWYgMHg2OTVmIDB4NmI1ZiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gaW5zY3JpcHRpb24ucHk6MTY3LTE2OAogICAgLy8gIyBnb3Zlcm5hbmNlIChuZXR3b3JrIGlzIHBpbm5lZCB2aWEgbmF0aXZlIEdsb2JhbC5nZW5lc2lzX2hhc2ggaW4gX2J1aWxkX21lc3NhZ2Ug4oCUIEEyKQogICAgLy8gc2VsZi5hZG1pbiA9IEFjY291bnQoKQogICAgYnl0ZWNfMCAvLyAiYWRtaW4iCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBpbnNjcmlwdGlvbi5weToxNjkKICAgIC8vIHNlbGYuY2VsbHNfcmVnaXN0ZXJlZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAiY2VsbHNfcmVnaXN0ZXJlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBpbnNjcmlwdGlvbi5weToxNDAKICAgIC8vIGNsYXNzIFRyZWx5YW5JbnNjcmlwdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDE1CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDExCiAgICBwdXNoYnl0ZXNzIDB4OWI0NDdkZmQgMHg5ZDMwMGNmMiAweGFkZjk3NWFiIDB4YWFkZmRmZDMgLy8gbWV0aG9kICJyZWdpc3Rlcl9jZWxsKHVpbnQ2NCxhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJpbnNjcmliZSh1aW50NjQsYnl0ZVszMl0sYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ1cGRhdGVfb3duZXIodWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiZ2V0X2luc2NyaXB0aW9uKHVpbnQ2NCkodWludDgsdWludDY0LGJ5dGVbMzJdLHVpbnQ2NCxhZGRyZXNzLGJ5dGVbXSkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByZWdpc3Rlcl9jZWxsIGluc2NyaWJlIHVwZGF0ZV9vd25lciBnZXRfaW5zY3JpcHRpb24KICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAxMToKICAgIC8vIGluc2NyaXB0aW9uLnB5OjE0MAogICAgLy8gY2xhc3MgVHJlbHlhbkluc2NyaXB0aW9uKEFSQzRDb250cmFjdCk6CiAgICBwdXNoYnl0ZXMgMHg0YzVjNjFiYSAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxNToKICAgIC8vIGluc2NyaXB0aW9uLnB5OjE0MAogICAgLy8gY2xhc3MgVHJlbHlhbkluc2NyaXB0aW9uKEFSQzRDb250cmFjdCk6CiAgICBwdXNoaW50cyA0IDUgLy8gVXBkYXRlQXBwbGljYXRpb24sIERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBtYWluX29uX3VwZGF0ZUAxNiBtYWluX29uX2RlbGV0ZUAxNwogICAgZXJyCgptYWluX29uX2RlbGV0ZUAxNzoKICAgIC8vIGluc2NyaXB0aW9uLnB5OjQwOQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIC8vIGluc2NyaXB0aW9uLnB5OjQxMgogICAgLy8gYXNzZXJ0IEZhbHNlLCAiY29udHJhY3QgaXMgbm9uLWRlbGV0YWJsZSAoSTEvSTUpIiAgIyBub3FhOiBCMDExCiAgICBlcnIgLy8gY29udHJhY3QgaXMgbm9uLWRlbGV0YWJsZSAoSTEvSTUpCgptYWluX29uX3VwZGF0ZUAxNjoKICAgIC8vIGluc2NyaXB0aW9uLnB5OjQwNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIC8vIGluc2NyaXB0aW9uLnB5OjQwNwogICAgLy8gYXNzZXJ0IEZhbHNlLCAiY29udHJhY3QgaXMgbm9uLXVwZ3JhZGFibGUgKEk1KSIgICMgbm9xYTogQjAxMQogICAgZXJyIC8vIGNvbnRyYWN0IGlzIG5vbi11cGdyYWRhYmxlIChJNSkKCgovLyBpbnNjcmlwdGlvbi5UcmVseWFuSW5zY3JpcHRpb24uY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gaW5zY3JpcHRpb24ucHk6MTgwCiAgICAvLyBzZWxmLmFkbWluID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMCAvLyAiYWRtaW4iCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gaW5zY3JpcHRpb24ucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBpbnNjcmlwdGlvbi5UcmVseWFuSW5zY3JpcHRpb24ucmVnaXN0ZXJfY2VsbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlZ2lzdGVyX2NlbGw6CiAgICAvLyBpbnNjcmlwdGlvbi5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgLy8gaW5zY3JpcHRpb24ucHk6MjA3LTIwOAogICAgLy8gIyBhZG1pbi1vbmx5IG1pbnQgYXV0aG9yaXR5CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFkbWluLCAib25seSBhZG1pbiBtYXkgcmVnaXN0ZXIgY2VsbHMiCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgYWRtaW4gbWF5IHJlZ2lzdGVyIGNlbGxzCiAgICAvLyBpbnNjcmlwdGlvbi5weToyMDktMjEwCiAgICAvLyAjIGJpbmQgdG8gYSBSRUFMIENlbGwgQVNBOiBwdXJlIE5GVCAodG90YWwgMSAvIGRlY2ltYWxzIDApIGNyZWF0ZWQgYnkgdGhlIGFkbWluIChJNC9NMSkKICAgIC8vIGFzc2VydCBjZWxsLnRvdGFsID09IFVJbnQ2NCgxKSBhbmQgY2VsbC5kZWNpbWFscyA9PSBVSW50NjQoMCksICJjZWxsIG11c3QgYmUgYSBwdXJlIE5GVCIKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRUb3RhbAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiByZWdpc3Rlcl9jZWxsX2Jvb2xfZmFsc2VANAogICAgZGlnIDIKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgYm56IHJlZ2lzdGVyX2NlbGxfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKcmVnaXN0ZXJfY2VsbF9ib29sX21lcmdlQDU6CiAgICAvLyBpbnNjcmlwdGlvbi5weToyMDktMjEwCiAgICAvLyAjIGJpbmQgdG8gYSBSRUFMIENlbGwgQVNBOiBwdXJlIE5GVCAodG90YWwgMSAvIGRlY2ltYWxzIDApIGNyZWF0ZWQgYnkgdGhlIGFkbWluIChJNC9NMSkKICAgIC8vIGFzc2VydCBjZWxsLnRvdGFsID09IFVJbnQ2NCgxKSBhbmQgY2VsbC5kZWNpbWFscyA9PSBVSW50NjQoMCksICJjZWxsIG11c3QgYmUgYSBwdXJlIE5GVCIKICAgIGFzc2VydCAvLyBjZWxsIG11c3QgYmUgYSBwdXJlIE5GVAogICAgLy8gaW5zY3JpcHRpb24ucHk6MjExCiAgICAvLyBhc3NlcnQgY2VsbC5jcmVhdG9yID09IHNlbGYuYWRtaW4sICJjZWxsIEFTQSBub3QgY3JlYXRlZCBieSBhZG1pbiIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYWRtaW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW4gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGNlbGwgQVNBIG5vdCBjcmVhdGVkIGJ5IGFkbWluCiAgICAvLyBpbnNjcmlwdGlvbi5weToyMTItMjE2CiAgICAvLyAjIENlbGxzIG11c3QgYmUgaW1tdXRhYmxlLCBvd25lci1jb250cm9sbGVkIE5GVHM6IG5vIGNsYXdiYWNrIChjYW4ndCBiZSBzZWl6ZWQgb3IgYmFsYW5jZS1nYW1lZAogICAgLy8gIyB0byBmYWtlIHRoZSBDMSBob2xkaW5nIGNoZWNrKSwgbm8gZnJlZXplIChjYW4ndCBiZSBmcm96ZW4gdG8gYmxvY2sgaW5zY3JpcHRpb24pLCBubyBtYW5hZ2VyCiAgICAvLyAjIChzbyBjbGF3YmFjay9mcmVlemUgY2FuIG5ldmVyIGJlIHJlLWFkZGVkIGxhdGVyKS4gW2NvdW5jaWwvR3JvazogY2xvc2VzIHRoZSBBc3NldEhvbGRpbmdHZXQKICAgIC8vICMgY2xhd2JhY2sgLyBmcmVlemUgLyBjbG9zZS1vdXQgdGltaW5nIHZlY3RvciBhdCB0aGUgc291cmNlLl0KICAgIC8vIGFzc2VydCBjZWxsLmNsYXdiYWNrID09IEdsb2JhbC56ZXJvX2FkZHJlc3MsICJjZWxsIG11c3QgaGF2ZSBubyBjbGF3YmFjayIKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gY2VsbCBtdXN0IGhhdmUgbm8gY2xhd2JhY2sKICAgIC8vIGluc2NyaXB0aW9uLnB5OjIxNwogICAgLy8gYXNzZXJ0IGNlbGwuZnJlZXplID09IEdsb2JhbC56ZXJvX2FkZHJlc3MsICJjZWxsIG11c3QgaGF2ZSBubyBmcmVlemUiCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBjZWxsIG11c3QgaGF2ZSBubyBmcmVlemUKICAgIC8vIGluc2NyaXB0aW9uLnB5OjIxOAogICAgLy8gYXNzZXJ0IGNlbGwubWFuYWdlciA9PSBHbG9iYWwuemVyb19hZGRyZXNzLCAiY2VsbCBtYW5hZ2VyIG11c3QgYmUgY2xlYXJlZCAoaW1tdXRhYmxlIGNvbmZpZykiCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gY2VsbCBtYW5hZ2VyIG11c3QgYmUgY2xlYXJlZCAoaW1tdXRhYmxlIGNvbmZpZykKICAgIC8vIGluc2NyaXB0aW9uLnB5OjIxOS0yMjEKICAgIC8vICMgdmFsaWRhdGUgdGhlIGNvbW1pdHRlZCBrZXkgbGVuZ3RoIGF0IHRoZSBPTkxZIHBvaW50IGEga2V5IGVudGVycyBzdGF0ZSAoQzUvSTQvQTkpLgogICAgLy8gIyBBIG1hbGZvcm1lZCAod3JvbmctbGVuZ3RoKSBrZXkgd291bGQgYnJpY2sgdGhlIGNlbGwg4oCUIHJlamVjdCBpdCBhdCB0aGUgc291cmNlLgogICAgLy8gYXNzZXJ0IGNvbW1pdHRlZF9wdWJrZXkubmF0aXZlLmxlbmd0aCA9PSBQVUJLRVlfTEVOLCAiYmFkIGNvbW1pdHRlZCBwdWJrZXkgbGVuZ3RoIiAgIyAubmF0aXZlID0gcmF3IGJ5dGVzIChubyBBUkM0IGxlbiBwcmVmaXgpCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE3OTMKICAgID09CiAgICBhc3NlcnQgLy8gYmFkIGNvbW1pdHRlZCBwdWJrZXkgbGVuZ3RoCiAgICAvLyBpbnNjcmlwdGlvbi5weToyMjItMjI2CiAgICAvLyAjIFtUNC9RMTNdIGhlYWRlci1ieXRlIHdlbGwtZm9ybWVkbmVzczogYSBEZXRlcm1pbmlzdGljIEZhbGNvbi0xMDI0IChsb2duPTEwKSBwdWJsaWMga2V5CiAgICAvLyAjIGJlZ2lucyB3aXRoIDB4MEEgKEZBTENPTl9FTkNPRElOR18yMDI2LTA2LTAxLm1kOyBjb25maXJtZWQgYWdhaW5zdCB0aGUgYWxnb3JhbmQvZmFsY29uCiAgICAvLyAjIGtleWdlbikuIENoZWNrZWQgYXQgdGhlIE9OTFkgcG9pbnQgYSBrZXkgZW50ZXJzIHN0YXRlLCBzbyBhIHdyb25nLWN1cnZlL21hbGZvcm1lZCBrZXkgY2FuCiAgICAvLyAjIG5ldmVyIGJlIGNvbW1pdHRlZC4gQUJJLWNvbXBhdGlibGU6IGFkZGVkIGFzc2VydCBvbmx5LCBubyBzaWduYXR1cmUvc2VsZWN0b3IgY2hhbmdlLgogICAgLy8gYXNzZXJ0IG9wLmdldGJ5dGUoY29tbWl0dGVkX3B1YmtleS5uYXRpdmUsIFVJbnQ2NCgwKSkgPT0gVUludDY0KDB4MEEpLCAiYmFkIGNvbW1pdHRlZCBwdWJrZXkgaGVhZGVyIChsb2duPTEwKSIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGdldGJ5dGUKICAgIHB1c2hpbnQgMTAKICAgID09CiAgICBhc3NlcnQgLy8gYmFkIGNvbW1pdHRlZCBwdWJrZXkgaGVhZGVyIChsb2duPTEwKQogICAgLy8gaW5zY3JpcHRpb24ucHk6MjI3LTIyOAogICAgLy8gIyAxLDAyNCBjZWxsIGhhcmQgY2FwIChzcGVjIMKnMikKICAgIC8vIGFzc2VydCBzZWxmLmNlbGxzX3JlZ2lzdGVyZWQgPCBUT1RBTF9DRUxMUywgImFsbCAxMDI0IGNlbGxzIHJlZ2lzdGVyZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2VsbHNfcmVnaXN0ZXJlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jZWxsc19yZWdpc3RlcmVkIGV4aXN0cwogICAgZHVwCiAgICBwdXNoaW50IDEwMjQKICAgIDwKICAgIGFzc2VydCAvLyBhbGwgMTAyNCBjZWxscyByZWdpc3RlcmVkCiAgICAvLyBpbnNjcmlwdGlvbi5weToyMjktMjMzCiAgICAvLyAjIFNhbWUgYWJzb3JiaW5nLXN0YXRlIGd1YXJkIGFzIHVwZGF0ZV9vd25lciwgYXQgdGhlIE9USEVSIHBvaW50IGFuIG93bmVyIGVudGVycyBzdGF0ZS4KICAgIC8vICMgTWludGluZyBzdHJhaWdodCB0byB0aGUgemVybyBhZGRyZXNzIHdvdWxkIGJyaWNrIHRoZSBjZWxsIGF0IHJlZ2lzdHJhdGlvbiwgYmVmb3JlIGFueQogICAgLy8gIyBvd25lciBldmVyIGhvbGRzIGl0LiBCb3RoIHdyaXRlcnMgYXJlIGNvdmVyZWQgc28gdGhlIGludmFyaWFudCBpcyAibm8gY2VsbCBpcyBldmVyCiAgICAvLyAjIG93bmVkIGJ5IHRoZSB6ZXJvIGFkZHJlc3MiLCBub3QgIm9uZSBwYXRoIGhhcHBlbnMgdG8gY2hlY2siLgogICAgLy8gYXNzZXJ0IGNvbnRyb2xsaW5nX293bmVyLmJ5dGVzICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMsICJjb250cm9sbGluZyBvd25lciBjYW5ub3QgYmUgdGhlIHplcm8gYWRkcmVzcyIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgZGlnIDUKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIGNvbnRyb2xsaW5nIG93bmVyIGNhbm5vdCBiZSB0aGUgemVybyBhZGRyZXNzCiAgICAvLyBpbnNjcmlwdGlvbi5weToyMzQtMjM1CiAgICAvLyAjIHJlZ2lzdGVyLW9uY2U6IGNvbW1pdHRlZCBrZXkgYW5kIG93bmVyIG11c3Qgbm90IGFscmVhZHkgZXhpc3QKICAgIC8vIGFzc2VydCBjaWQgbm90IGluIHNlbGYuY29tbWl0dGVkX3B1YmtleSwgImNlbGwgYWxyZWFkeSByZWdpc3RlcmVkIgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBieXRlYyA0IC8vIDB4NmI1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBjZWxsIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgLy8gaW5zY3JpcHRpb24ucHk6MjM2CiAgICAvLyBhc3NlcnQgY2lkIG5vdCBpbiBzZWxmLmNvbnRyb2xsaW5nX293bmVyLCAiY2VsbCBhbHJlYWR5IHJlZ2lzdGVyZWQgKG93bmVyKSIKICAgIGJ5dGVjXzIgLy8gMHg2ZjVmCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBjZWxsIGFscmVhZHkgcmVnaXN0ZXJlZCAob3duZXIpCiAgICAvLyBpbnNjcmlwdGlvbi5weToyMzgtMjM5CiAgICAvLyAjIHdyaXRlIGltbXV0YWJsZSBjb21taXRtZW50cyBhdG9taWNhbGx5CiAgICAvLyBzZWxmLmNvbW1pdHRlZF9wdWJrZXlbY2lkXSA9IGNvbW1pdHRlZF9wdWJrZXkubmF0aXZlICAgIyBzdG9yZSB0aGUgcmF3IDE3OTMgQiBrZXksIE5PVCB0aGUgQVJDNC1wcmVmaXhlZCBlbmNvZGluZwogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgdW5jb3ZlciA0CiAgICBib3hfcHV0CiAgICAvLyBpbnNjcmlwdGlvbi5weToyNDAKICAgIC8vIHNlbGYuY29udHJvbGxpbmdfb3duZXJbY2lkXSA9IGNvbnRyb2xsaW5nX293bmVyLmJ5dGVzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gaW5zY3JpcHRpb24ucHk6MjQxCiAgICAvLyBzZWxmLmNlbGxzX3JlZ2lzdGVyZWQgKz0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2VsbHNfcmVnaXN0ZXJlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBpbnNjcmlwdGlvbi5weToxODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmVnaXN0ZXJfY2VsbF9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiByZWdpc3Rlcl9jZWxsX2Jvb2xfbWVyZ2VANQoKCi8vIGluc2NyaXB0aW9uLlRyZWx5YW5JbnNjcmlwdGlvbi5pbnNjcmliZVtyb3V0aW5nXSgpIC0+IHZvaWQ6Cmluc2NyaWJlOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgLy8gaW5zY3JpcHRpb24ucHk6MjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIC8vIGluc2NyaXB0aW9uLnB5OjI3MS0yNzIKICAgIC8vICMgLS0tIHN0cnVjdHVyYWwgcHJlY29uZGl0aW9ucyAtLS0KICAgIC8vIGFzc2VydCBjaWQgaW4gc2VsZi5jb21taXR0ZWRfcHVia2V5LCAiY2VsbCBub3QgcmVnaXN0ZXJlZCIgICAgICAgICAgICAgIyBtdXN0IGJlIG1pbnRlZAogICAgZGlnIDIKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgNAogICAgYnl0ZWMgNCAvLyAweDZiNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciA0CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBjZWxsIG5vdCByZWdpc3RlcmVkCiAgICAvLyBpbnNjcmlwdGlvbi5weToyNzMKICAgIC8vIGFzc2VydCBmYWxjb25fc2lnLm5hdGl2ZS5sZW5ndGggPD0gU0lHX0NPTVBSRVNTRURfTUFYTEVOLCAiZmFsY29uIHNpZyB0b28gbGFyZ2UiICAjIC5uYXRpdmUgKG5vIEFSQzQgcHJlZml4KTsgZGV0MTAyNCBjb21wcmVzc2VkIDw9MTQyM0I6IGNoZWFwIHByZS12ZXJpZnkgRG9TIGJvdW5kCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBsZW4KICAgIHB1c2hpbnQgMTQyMwogICAgPD0KICAgIGFzc2VydCAvLyBmYWxjb24gc2lnIHRvbyBsYXJnZQogICAgLy8gaW5zY3JpcHRpb24ucHk6Mjc1CiAgICAvLyBhc3NlcnQgcGF5bG9hZF91cmkubmF0aXZlLmxlbmd0aCA8PSBVUklfTUFYTEVOLCAicGF5bG9hZF91cmkgdG9vIGxvbmciICAjIC5uYXRpdmUgKG5vIEFSQzQgcHJlZml4KTsgc3BlYyDCpzMgPD0xMjhCOiBib3VuZHMgdGhlIHdyaXRlLW9uY2UgYm94IHNpemUgKE0zKQogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgcHVzaGludCAxMjgKICAgIDw9CiAgICBhc3NlcnQgLy8gcGF5bG9hZF91cmkgdG9vIGxvbmcKICAgIC8vIGluc2NyaXB0aW9uLnB5OjI3Ny0yODIKICAgIC8vICMgLS0tIEMxOiBvd25lcnNoaXAsIEhBUkRFTkVEIFtIZXJtZXMjMl0gLS0tCiAgICAvLyAjIFNlbmRlciBtdXN0IChhKSBjdXJyZW50bHkgaG9sZCBleGFjdGx5IHRoZSBDZWxsLCBBTkQgKGIpIGJlIHRoZSBjb250cm9sbGluZyBvd25lciByZWNvcmRlZAogICAgLy8gIyBhdCBtaW50LiAoYikgZGVmZWF0cyB0cmFuc2llbnQvZmxhc2gtY3VzdG9keTogYSB0ZW1wb3JhcnkgQVNBIGhvbGRlciBpcyBub3QgdGhlIHJlY29yZGVkCiAgICAvLyAjIGNvbnRyb2xsaW5nIG93bmVyLiBBbiBvd25lciB0cmFuc2ZlciBtdXN0IGdvIHRocm91Z2ggdXBkYXRlX293bmVyIChiZWxvdyksIHdoaWNoIHJlcXVpcmVzCiAgICAvLyAjIHRoZSBwcmlvciBvd25lcidzIGF1dGhvcml6YXRpb24g4oCUIG5vdCBhIGJhcmUgYmFsYW5jZSBmbGlwLgogICAgLy8gYmFsYW5jZSwgZXhpc3RzID0gb3AuQXNzZXRIb2xkaW5nR2V0LmFzc2V0X2JhbGFuY2UoVHhuLnNlbmRlciwgY2VsbCkKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgLy8gaW5zY3JpcHRpb24ucHk6MjgzCiAgICAvLyBhc3NlcnQgZXhpc3RzIGFuZCBiYWxhbmNlID09IFVJbnQ2NCgxKSwgInNlbmRlciBkb2VzIG5vdCBob2xkIHRoZSBjZWxsIgogICAgYnogaW5zY3JpYmVfYm9vbF9mYWxzZUA0CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogaW5zY3JpYmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKaW5zY3JpYmVfYm9vbF9tZXJnZUA1OgogICAgLy8gaW5zY3JpcHRpb24ucHk6MjgzCiAgICAvLyBhc3NlcnQgZXhpc3RzIGFuZCBiYWxhbmNlID09IFVJbnQ2NCgxKSwgInNlbmRlciBkb2VzIG5vdCBob2xkIHRoZSBjZWxsIgogICAgYXNzZXJ0IC8vIHNlbmRlciBkb2VzIG5vdCBob2xkIHRoZSBjZWxsCiAgICAvLyBpbnNjcmlwdGlvbi5weToyODQKICAgIC8vIGFzc2VydCBjaWQgaW4gc2VsZi5jb250cm9sbGluZ19vd25lciwgIm5vIGNvbnRyb2xsaW5nIG93bmVyIHNldCIKICAgIGJ5dGVjXzIgLy8gMHg2ZjVmCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm8gY29udHJvbGxpbmcgb3duZXIgc2V0CiAgICAvLyBpbnNjcmlwdGlvbi5weToyODUKICAgIC8vIGFzc2VydCBzZWxmLmNvbnRyb2xsaW5nX293bmVyW2NpZF0gPT0gVHhuLnNlbmRlci5ieXRlcywgInNlbmRlciBub3QgY29udHJvbGxpbmcgb3duZXIiCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIG5vdCBjb250cm9sbGluZyBvd25lcgogICAgLy8gaW5zY3JpcHRpb24ucHk6Mjg3LTI4OAogICAgLy8gIyAtLS0gQzI6IHNpbmdsZS11c2UgLyB3cml0ZS1vbmNlIChJMSkgLS0tCiAgICAvLyBhc3NlcnQgY2lkIG5vdCBpbiBzZWxmLmluc2NyaXB0aW9ucywgImNlbGwgYWxyZWFkeSBpbnNjcmliZWQiCiAgICBieXRlY18zIC8vIDB4Njk1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDExCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBjZWxsIGFscmVhZHkgaW5zY3JpYmVkCiAgICAvLyBpbnNjcmlwdGlvbi5weToyOTAtMjk0CiAgICAvLyAjIC0tLSBDNTogdGhlIGNvbnRyb2xsaW5nIGtleSBpcyB0aGUgb25lIGNvbW1pdHRlZCBhdCBtaW50LCByZWFkIGZyb20gdGhlIElNTVVUQUJMRSBtaW50CiAgICAvLyAjIHJlY29yZCBbSGVybWVzIzRdLiBUaGVyZSBpcyBubyBwdWJrZXkgYXJndW1lbnQgdG8gdmFsaWRhdGUgYWdhaW5zdCBhIGhhc2ggYW55bW9yZSAoQTkpOiB0aGUKICAgIC8vICMgY29udHJhY3QgdXNlcyB0aGUgY29tbWl0dGVkIGtleSBESVJFQ1RMWSwgc28ga2V5LXN1YnN0aXR1dGlvbiBpcyBpbXBvc3NpYmxlIGJ5IGNvbnN0cnVjdGlvbgogICAgLy8gIyDigJQgc3RyaWN0bHkgc3Ryb25nZXIgdGhhbiB0aGUgcHJpb3IgcmV2ZWFsLWFuZC1oYXNoLWNoZWNrLiAtLS0KICAgIC8vIHB1YmtleSA9IHNlbGYuY29tbWl0dGVkX3B1YmtleVtjaWRdCiAgICBkaWcgMwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29tbWl0dGVkX3B1YmtleSBlbnRyeSBleGlzdHMKICAgIC8vIGluc2NyaXB0aW9uLnB5OjMyMwogICAgLy8gKyBvcC5pdG9iKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkKSAgICMgW0hlcm1lcyMzXSBiaW5kIHRvIFRISVMgYXBwCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGl0b2IKICAgIC8vIGluc2NyaXB0aW9uLnB5OjMyMgogICAgLy8gRE9NQUlOX1RBRwogICAgcHVzaGJ5dGVzIDB4NTQ1MjQ1NGM1OTQxNGUyZDQ5NGU1MzQzNTI0OTUwNTQ0OTRmNGUyZDc2MzEKICAgIC8vIGluc2NyaXB0aW9uLnB5OjMyMi0zMjMKICAgIC8vIERPTUFJTl9UQUcKICAgIC8vICsgb3AuaXRvYihHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCkgICAjIFtIZXJtZXMjM10gYmluZCB0byBUSElTIGFwcAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBpbnNjcmlwdGlvbi5weTozMjItMzI0CiAgICAvLyBET01BSU5fVEFHCiAgICAvLyArIG9wLml0b2IoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQpICAgIyBbSGVybWVzIzNdIGJpbmQgdG8gVEhJUyBhcHAKICAgIC8vICsgb3AuaXRvYihjZWxsX2lkKQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBpbnNjcmlwdGlvbi5weTozMjItMzI1CiAgICAvLyBET01BSU5fVEFHCiAgICAvLyArIG9wLml0b2IoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQpICAgIyBbSGVybWVzIzNdIGJpbmQgdG8gVEhJUyBhcHAKICAgIC8vICsgb3AuaXRvYihjZWxsX2lkKQogICAgLy8gKyBhcnRpZmFjdF9oYXNoCiAgICBkaWcgNgogICAgY29uY2F0CiAgICAvLyBpbnNjcmlwdGlvbi5weTozMjYKICAgIC8vICsgR2xvYmFsLmdlbmVzaXNfaGFzaCAgICAgICAgICAjIEEyOiBuYXRpdmUgbmV0d29yayBnZW5lc2lzIChub3QgYSBkZXBsb3ktdGltZSBhcmcpCiAgICBnbG9iYWwgR2VuZXNpc0hhc2gKICAgIC8vIGluc2NyaXB0aW9uLnB5OjMyMi0zMjYKICAgIC8vIERPTUFJTl9UQUcKICAgIC8vICsgb3AuaXRvYihHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCkgICAjIFtIZXJtZXMjM10gYmluZCB0byBUSElTIGFwcAogICAgLy8gKyBvcC5pdG9iKGNlbGxfaWQpCiAgICAvLyArIGFydGlmYWN0X2hhc2gKICAgIC8vICsgR2xvYmFsLmdlbmVzaXNfaGFzaCAgICAgICAgICAjIEEyOiBuYXRpdmUgbmV0d29yayBnZW5lc2lzIChub3QgYSBkZXBsb3ktdGltZSBhcmcpCiAgICBjb25jYXQKICAgIGJ1cnkgMTAKCmluc2NyaWJlX3doaWxlX3RvcEA5OgogICAgcHVzaGludCAyMTEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBpbnNjcmliZV9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGluc2NyaWJlX3doaWxlX3RvcEA5CgppbnNjcmliZV9hZnRlcl93aGlsZUAxNDoKICAgIC8vIGluc2NyaXB0aW9uLnB5OjMwMy0zMDQKICAgIC8vICMgLS0tIEM0OiBGYWxjb24tMTAyNCBzaWduYXR1cmUgY2hlY2sgYWdhaW5zdCB0aGUgQ09NTUlUVEVEIGtleSAodGhlIGV4cGVuc2l2ZSBvcGNvZGUsIHJ1biBsYXN0KSAtLS0KICAgIC8vIGFzc2VydCBvcC5mYWxjb25fdmVyaWZ5KG0sIGZhbGNvbl9zaWcubmF0aXZlLCBwdWJrZXkpLCAiZmFsY29uIHNpZ25hdHVyZSBpbnZhbGlkIiAgIyAubmF0aXZlOiByYXcgY29tcHJlc3NlZCBzaWcsIG5vIEFSQzQgbGVuIHByZWZpeAogICAgZGlnIDkKICAgIGRpZyAyCiAgICBkaWcgOQogICAgZmFsY29uX3ZlcmlmeQogICAgYXNzZXJ0IC8vIGZhbGNvbiBzaWduYXR1cmUgaW52YWxpZAogICAgLy8gaW5zY3JpcHRpb24ucHk6MzEyCiAgICAvLyBpbnNjcmliZWRfcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgLy8gaW5zY3JpcHRpb24ucHk6MzEzCiAgICAvLyBpbnNjcmliZXI9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gaW5zY3JpcHRpb24ucHk6MzA5CiAgICAvLyB2ZXJzaW9uPWFyYzQuVUludDgoSU5TX1ZFUlNJT04pLAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIC8vIGluc2NyaXB0aW9uLnB5OjMwNi0zMTUKICAgIC8vICMgLS0tIGVmZmVjdDogd3JpdGUgdGhlIHdyaXRlLW9uY2UgcmVjb3JkLiBUaGUgY29tbWl0dGVkIHB1YmtleSBpcyBOT1QgZHVwbGljYXRlZCBoZXJlIOKAlCBpdAogICAgLy8gIyBhbHJlYWR5IGxpdmVzIHBlcm1hbmVudGx5IGluIGNvbW1pdHRlZF9wdWJrZXlbY2lkXTsgYW4gSTMgcmUtdmVyaWZpZXIgcmVhZHMgYm90aCBib3hlcy4gLS0tCiAgICAvLyByZWMgPSBJbnNjcmlwdGlvblJlY29yZCgKICAgIC8vICAgICB2ZXJzaW9uPWFyYzQuVUludDgoSU5TX1ZFUlNJT04pLAogICAgLy8gICAgIGNlbGxfaWQ9YXJjNC5VSW50NjQoY2lkKSwKICAgIC8vICAgICBhcnRpZmFjdF9oYXNoPWFydGlmYWN0X2hhc2guY29weSgpLAogICAgLy8gICAgIGluc2NyaWJlZF9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gICAgIGluc2NyaWJlcj1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgcGF5bG9hZF91cmk9cGF5bG9hZF91cmkuY29weSgpLAogICAgLy8gKQogICAgZGlnIDkKICAgIGNvbmNhdAogICAgZGlnIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA1MwogICAgY29uY2F0CiAgICBkaWcgNQogICAgY29uY2F0CiAgICAvLyBpbnNjcmlwdGlvbi5weTozMTYKICAgIC8vIHNlbGYuaW5zY3JpcHRpb25zW2NpZF0gPSByZWMuY29weSgpCiAgICBkaWcgOQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGluc2NyaXB0aW9uLnB5OjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgppbnNjcmliZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBpbnNjcmliZV9ib29sX21lcmdlQDUKCgovLyBpbnNjcmlwdGlvbi5UcmVseWFuSW5zY3JpcHRpb24udXBkYXRlX293bmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlX293bmVyOgogICAgLy8gaW5zY3JpcHRpb24ucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gaW5zY3JpcHRpb24ucHk6MzQyCiAgICAvLyBhc3NlcnQgY2lkIGluIHNlbGYuY29udHJvbGxpbmdfb3duZXIsICJjZWxsIG5vdCByZWdpc3RlcmVkIgogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4NmY1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIGNlbGwgbm90IHJlZ2lzdGVyZWQKICAgIC8vIGluc2NyaXB0aW9uLnB5OjM0MwogICAgLy8gYXNzZXJ0IHNlbGYuY29udHJvbGxpbmdfb3duZXJbY2lkXSA9PSBUeG4uc2VuZGVyLmJ5dGVzLCAib25seSBjb250cm9sbGluZyBvd25lciIKICAgIGJveF9nZXQKICAgIHBvcAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNvbnRyb2xsaW5nIG93bmVyCiAgICAvLyBpbnNjcmlwdGlvbi5weTozNDQKICAgIC8vIGFzc2VydCBjaWQgbm90IGluIHNlbGYuaW5zY3JpcHRpb25zLCAiYWxyZWFkeSBpbnNjcmliZWQ7IG93bmVyIGZyb3plbiIKICAgIGJ5dGVjXzMgLy8gMHg2OTVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgaW5zY3JpYmVkOyBvd25lciBmcm96ZW4KICAgIC8vIGluc2NyaXB0aW9uLnB5OjM0NS0zNjAKICAgIC8vICMgVENFLTc2OiB0aGUgQ0FMTEVSIG11c3Qgc3RpbGwgaG9sZCB0aGUgY2VsbCBBU0EuCiAgICAvLyAjCiAgICAvLyAjIFdpdGhvdXQgdGhpcywgYSBzZWxsZXIgd2hvIHRyYW5zZmVycmVkIHRoZSBDZWxsIEFTQSBidXQgcmVtYWluZWQgdGhlIHJlY29yZGVkCiAgICAvLyAjIGNvbnRyb2xsaW5nX293bmVyIGNvdWxkIHN0aWxsIHJlYXNzaWduIGNvbnRyb2wgb2YgYSBjZWxsIHNvbWVvbmUgZWxzZSBub3cgaG9sZHMgLS0KICAgIC8vICMgaW5jbHVkaW5nIHRvIGFuIGFkZHJlc3Mgd2l0aCBubyBrbm93biBrZXksIHBlcm1hbmVudGx5IGJyaWNraW5nIGl0LiBUaGUgemVyby1hZGRyZXNzCiAgICAvLyAjIGd1YXJkIGJlbG93IGNsb3NlcyBvbmx5IHRoZSBtZW1iZXIgb2YgdGhhdCBmYW1pbHkgcmVhY2hlZCBieSBhY2NpZGVudDsgdGhpcyBjbG9zZXMKICAgIC8vICMgdGhlIGRlbGliZXJhdGUgcGF0aCBhdCBpdHMgc291cmNlLCBieSByZXF1aXJpbmcgdGhlIG1vdmVyIHRvIGhhdmUgc29tZXRoaW5nIHRvIGxvc2UuCiAgICAvLyAjCiAgICAvLyAjIENob3NlbiBvdmVyIGEgY2hlY2sgb24gdGhlIERFU1RJTkFUSU9OIChiYWxhbmNlKG5ld19vd25lcikgPT0gMSkgZGVsaWJlcmF0ZWx5OiB0aGF0CiAgICAvLyAjIHdvdWxkIGNsb3NlIHRoZSB3aG9sZSB1bnNpZ25hYmxlIGZhbWlseSBidXQgcmVkZWZpbmUgY29udHJvbGxpbmdfb3duZXIgYXMgIm11c3QgYmUKICAgIC8vICMgdGhlIGN1cnJlbnQgaG9sZGVyIiwgZm9yYmlkZGluZyBhIGRlbGVnYXRlLCBhbiBlc2Nyb3csIG9yIGFzc2lnbmluZyBjb250cm9sIGJlZm9yZQogICAgLy8gIyB0aGUgTkZUIG1vdmVzLiBUaGlzIGNvbnN0cmFpbnMgV0hPIE1BWSBNT1ZFIGNvbnRyb2wsIG5vdCBXSEVSRSBpdCBtYXkgcG9pbnQuCiAgICAvLyAjCiAgICAvLyAjIFNhbWUgb3BlcmFuZCBvcmRlciBhbmQgaWRpb20gYXMgQzEgaW4gaW5zY3JpYmUgKHNlZSB0aGVyZSBmb3Igd2h5IGNsYXdiYWNrL2ZyZWV6ZQogICAgLy8gIyBiZWluZyBjbGVhcmVkIGF0IHJlZ2lzdGVyX2NlbGwgaXMgd2hhdCBtYWtlcyBhIGJhbGFuY2UgY2hlY2sgdHJ1c3R3b3J0aHkgYXQgYWxsKS4KICAgIC8vIF9iYWwsIF9oZWxkID0gb3AuQXNzZXRIb2xkaW5nR2V0LmFzc2V0X2JhbGFuY2UoVHhuLnNlbmRlciwgY2VsbCkKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgLy8gaW5zY3JpcHRpb24ucHk6MzYxCiAgICAvLyBhc3NlcnQgX2hlbGQgYW5kIF9iYWwgPT0gVUludDY0KDEpLCAiY2FsbGVyIGRvZXMgbm90IGhvbGQgdGhlIGNlbGwiCiAgICBieiB1cGRhdGVfb3duZXJfYm9vbF9mYWxzZUA0CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogdXBkYXRlX293bmVyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCnVwZGF0ZV9vd25lcl9ib29sX21lcmdlQDU6CiAgICAvLyBpbnNjcmlwdGlvbi5weTozNjEKICAgIC8vIGFzc2VydCBfaGVsZCBhbmQgX2JhbCA9PSBVSW50NjQoMSksICJjYWxsZXIgZG9lcyBub3QgaG9sZCB0aGUgY2VsbCIKICAgIGFzc2VydCAvLyBjYWxsZXIgZG9lcyBub3QgaG9sZCB0aGUgY2VsbAogICAgLy8gaW5zY3JpcHRpb24ucHk6MzYyLTM4NAogICAgLy8gIyBUaGUgREVTVElOQVRJT04gd2FzIHByZXZpb3VzbHkgdW52YWxpZGF0ZWQ6IGFueSAzMiBieXRlcyB3ZXJlIHdyaXR0ZW4uIFRoZSB6ZXJvCiAgICAvLyAjIGFkZHJlc3MgaXMgYW4gYWJzb3JiaW5nIHN0YXRlIOKAlCBib3RoIHJlbWFpbmluZyBtb3ZlcnMgKGluc2NyaWJlIEMxIGFuZCB0aGlzIG1ldGhvZCkKICAgIC8vICMgcmVxdWlyZSBjb250cm9sbGluZ19vd25lcltjaWRdID09IFR4bi5zZW5kZXIuYnl0ZXMsIHdoaWNoIG5vIGtleSBjYW4gZXZlciBzYXRpc2Z5IGZvcgogICAgLy8gIyBpdC4gUmUtcmVnaXN0cmF0aW9uIGlzIGJsb2NrZWQgYnkgdGhlIHJlZ2lzdGVyLW9uY2UgZ3VhcmRzIGFib3ZlLCBvbl91cGRhdGUvb25fZGVsZXRlCiAgICAvLyAjIGhhcmQtZmFpbCAoSTUpLCBhbmQgdGhlcmUgaXMgbm8gYWRtaW4gb3ZlcnJpZGUsIHNvIHRoZSBjZWxsIGJlY29tZXMgcGVybWFuZW50bHkKICAgIC8vICMgdW4taW5zY3JpYmFibGUg4oCUIG9uZSBvZiBvbmx5IDEsMDI0LCBkZWFkLCB3aXRoIG5vIHJlbWVkeSBzaG9ydCBvZiBtaW50aW5nIGEKICAgIC8vICMgcmVwbGFjZW1lbnQuIFRIUkVBVF9NT0RFTF9BTkRfVFJBQ0VBQklMSVRZLm1kIGxpc3RzICJjb21taXQgYSBtYWxmb3JtZWQga2V5IChicmljayBhCiAgICAvLyAjIGNlbGwpIiBhcyBhIGRlZmVuZGVkIGF0dGFjayBhbmQgcmVnaXN0ZXJfY2VsbCBhcHBsaWVzIGV4YWN0bHkgdGhpcyByZWFzb25pbmcgdG8gdGhlCiAgICAvLyAjIE9USEVSIGZpZWxkIGNvbW1pdHRlZCBhdCBtaW50OyB0aGUgb3duZXIgcG9pbnRlciB3YXMgc2ltcGx5IG1pc3NlZC4KICAgIC8vICMgUmVhY2hhYmxlIGJ5IGdyaWVmaW5nIEFORCBieSBhY2NpZGVudCDigJQgYWxnb3NkayBlbmNvZGVzIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZAogICAgLy8gIyBhcmM0LkFkZHJlc3MgYXMgMzIgemVybyBieXRlcywgd2hpY2ggc2F0aXNmaWVkIHRoZSBvbmx5IGNoZWNrIHByZXNlbnQgKEFSQy00IGxlbiA9PSAzMikuCiAgICAvLyAjIFNDT1BFLCBiZWNhdXNlIHRoaXMgZ3VhcmQgaXMgbmFycm93ZXIgdGhhbiBpdCBsb29rcyBhbmQgYW4gYXVkaXRvciB3aWxsIGFzay4KICAgIC8vICMgT24gQWxnb3JhbmQgdGhlIGFkZHJlc3MgSVMgdGhlIGVkMjU1MTkgcHVibGljIGtleSwgc28gd2hhdCBtYWtlcyBhIGRlc3RpbmF0aW9uCiAgICAvLyAjIGFic29yYmluZyBpcyAibm8ga25vd24gc2NhbGFyIiAtLSBub3QgdGhlIGJpdCBwYXR0ZXJuLiBBbnkgMzIgYnl0ZXMgd2l0aCBubyBrbm93bgogICAgLy8gIyBrZXkgaXMgZXF1YWxseSB0ZXJtaW5hbDogMHgwMC4uMDEsIGEgaGFzaC1kZXJpdmVkIGJ1cm4gYWRkcmVzcywgYW4gYWx3YXlzLXJlamVjdAogICAgLy8gIyBMb2dpY1NpZyBhZGRyZXNzLCBhbiBpbW11dGFibGUgYXBwIGFjY291bnQgdGhhdCBjYW5ub3QgaW5uZXItY2FsbCBoZXJlLiBUaGlzCiAgICAvLyAjIGd1YXJkIGNsb3NlcyBPTkUgbWVtYmVyIG9mIHRoYXQgZmFtaWx5LiBJdCBpcyB3b3J0aCBoYXZpbmcgYmVjYXVzZSB0aGF0IG1lbWJlciBpcwogICAgLy8gIyB0aGUgb25lIHJlYWNoZWQgQlkgQUNDSURFTlQgLS0gYWxnb3NkayBlbmNvZGVzIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBhcmM0LkFkZHJlc3MKICAgIC8vICMgYXMgMzIgemVybyBieXRlcyAtLSBidXQgaXQgZG9lcyBOT1QgZXN0YWJsaXNoICJ0aGUgb3duZXIgY2FuIGFsd2F5cyBzaWduIi4KICAgIC8vICMgQ2xvc2luZyB0aGUgZmFtaWx5IG5lZWRzIGEgaG9sZGVyIGNoZWNrIG9uIHRoZSBkZXN0aW5hdGlvbiAoYmFsYW5jZSA9PSAxKSwgd2hpY2gKICAgIC8vICMgY2hhbmdlcyB3aGF0IGNvbnRyb2xsaW5nX293bmVyIE1FQU5TIChubyBkZWxlZ2F0ZSB3aG8gZG9lcyBub3QgaG9sZCB0aGUgTkZUKSwgc28KICAgIC8vICMgaXQgaXMgYSBkZXNpZ24gZGVjaXNpb24sIG5vdCBhIGJ1ZyBmaXguIFRyYWNrZWQgc2VwYXJhdGVseSBpbiB0aGUgcmlzayByZWdpc3Rlci4KICAgIC8vIGFzc2VydCBuZXdfb3duZXIuYnl0ZXMgIT0gR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcywgIm5ldyBvd25lciBjYW5ub3QgYmUgdGhlIHplcm8gYWRkcmVzcyIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIG5ldyBvd25lciBjYW5ub3QgYmUgdGhlIHplcm8gYWRkcmVzcwogICAgLy8gaW5zY3JpcHRpb24ucHk6Mzg1CiAgICAvLyBzZWxmLmNvbnRyb2xsaW5nX293bmVyW2NpZF0gPSBuZXdfb3duZXIuYnl0ZXMKICAgIGRpZyAyCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gaW5zY3JpcHRpb24ucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnVwZGF0ZV9vd25lcl9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiB1cGRhdGVfb3duZXJfYm9vbF9tZXJnZUA1CgoKLy8gaW5zY3JpcHRpb24uVHJlbHlhbkluc2NyaXB0aW9uLmdldF9pbnNjcmlwdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9pbnNjcmlwdGlvbjoKICAgIC8vIGluc2NyaXB0aW9uLnB5OjM5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBpbnNjcmlwdGlvbi5weTozOTgKICAgIC8vIHJldHVybiBzZWxmLmluc2NyaXB0aW9uc1tjZWxsX2lkLm5hdGl2ZV0KICAgIGJ0b2kKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHg2OTVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluc2NyaXB0aW9ucyBlbnRyeSBleGlzdHMKICAgIC8vIGluc2NyaXB0aW9uLnB5OjM5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "DCAEAAEIICYGBWFkbWluEGNlbGxzX3JlZ2lzdGVyZWQCb18CaV8Ca18DBoEBMRhAAAcoMgNnKSJnMRtBADsxGRREMRhBACSCBASbRH39BJ0wDPIErfl1qwSq39/TNhoAjgQAKgDiAewCQQCABExcYbo2GgCOAQAWAIMCBAUxGY4CAAUAAQAxGEQAMRhEACgxAGcjQzYaAUkVJBJEF0k2GgJJTgIVJRJENhoDSU4CSSJZgQIITBUSRDEAIihlRBJEcQBEIxJBAIBLAnEBREAAeCNESwJJcQtEIihlRBJESXEKRDIDEkRJcQlEMgMSRElxB0QyAxJESwFXAgBJFYGBDhJESSJVgQoSRCIpZURJgYAIDEQyA0sFSU8CE0RPAxYnBEsBUEm9RQEURCpPAlBJvUUBFERLAbxITE8Ev0m8SEy/IwgpTGcjQyJC/4UiRwI2GgFHAhUkEkQXNhoCSU4CFSUSRDYaA0kiWYECCEsBFRJENhoESU4DSSJZgQIISwEVEkRLAhZJTgQnBExQSU4EvUUBRExXAgBJTgMVgY8LDkRXAgAVgYABDkQxAExwAEEAoUkjEkEAmyNEKksESU4CUEm9RQFEvkgxABJEK0sBUElFC71FARRESwO+TEUKRDIIFoAWVFJFTFlBTi1JTlNDUklQVElPTi12MUxQTFBLBlAyEVBFCoG+EDIMDUEAGLGBBrIQgQWyGScFsh4nBbIfIrIBs0L/30sJSwJLCYVEMgYWMQCAAQFLCVBLCFBPAlBMUIACAFNQSwVQSwlJvEhMvyNDIkL/YjYaAUkVJBJEFzYaAklOAhUlEkRJFipLAVBJTgNJvUUBRL5IMQASRCtMUL1FARREMQBMcABBABpJIxJBABQjRDIDSwNJTwITREsCSbxITL8jQyJC/+k2GgFJFSQSRBcWK0xQvkSABBUffHVMULAjQw==", "clear": "DIEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 8, "patch": 1 } }, "events": [], "templateVariables": {} }