{ "name": "EscrowContract", "structs": {}, "methods": [ { "name": "createApplication", "args": [ { "type": "address", "name": "seller", "desc": "- Address of seller/freelancer" }, { "type": "byte[]", "name": "itemName", "desc": "- Human-readable description of the deal" }, { "type": "uint64", "name": "escrowType", "desc": "- 0=MARKETPLACE, 1=P2P, 2=FREELANCE" }, { "type": "uint64", "name": "deadlineRound", "desc": "- Algorand round after which escrow expires" }, { "type": "byte[]", "name": "requirementsHash", "desc": "- SHA256 of requirements text (freelance only, else empty)" }, { "type": "uint64", "name": "feeBps", "desc": "- Platform fee in basis points (e.g. 50 = 0.5%)" }, { "type": "address", "name": "treasury", "desc": "- Platform treasury address that receives fees" }, { "type": "address", "name": "arbiterAddr", "desc": "- Address authorized to resolve disputes" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Called by EscrowFactory via inner application create transaction.\r\nSets up all initial escrow metadata.", "events": [], "recommendations": {} }, { "name": "fund", "args": [ { "type": "pay", "name": "payment" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "confirmDelivery", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "requestRefund", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "raiseDispute", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "arbitrate", "args": [ { "type": "bool", "name": "releaseToSeller" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "submitDeliverables", "args": [ { "type": "byte[]", "name": "deliverablesHash" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "aiVerdict", "args": [ { "type": "bool", "name": "approved" }, { "type": "uint64", "name": "score" }, { "type": "byte[]", "name": "verdictNote" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "getDetails", "args": [], "returns": { "type": "(address,address,uint64,uint64,uint64,byte[],uint64,uint64,uint64,uint64,byte[],byte[],address)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 7, "bytes": 10 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "buyer": { "keyType": "AVMString", "valueType": "address", "key": "YnV5ZXI=" }, "seller": { "keyType": "AVMString", "valueType": "address", "key": "c2VsbGVy" }, "item_name": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "aXRlbV9uYW1l" }, "escrow_type": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZXNjcm93X3R5cGU=" }, "amount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YW1vdW50" }, "state": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3RhdGU=" }, "created_round": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y3JlYXRlZF9yb3VuZA==" }, "deadline_round": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVhZGxpbmVfcm91bmQ=" }, "platform_fee_bps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGxhdGZvcm1fZmVlX2Jwcw==" }, "platform_treasury": { "keyType": "AVMString", "valueType": "address", "key": "cGxhdGZvcm1fdHJlYXN1cnk=" }, "requirements_hash": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cmVxdWlyZW1lbnRzX2hhc2g=" }, "deliverables_hash": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "ZGVsaXZlcmFibGVzX2hhc2g=" }, "ai_score": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWlfc2NvcmU=" }, "ai_verdict_note": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "YWlfdmVyZGljdF9ub3Rl" }, "arbiter": { "keyType": "AVMString", "valueType": "address", "key": "YXJiaXRlcg==" }, "dispute_raised_by": { "keyType": "AVMString", "valueType": "address", "key": "ZGlzcHV0ZV9yYWlzZWRfYnk=" }, "last_txn_note": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "bGFzdF90eG5fbm90ZQ==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 801 ], "errorMessage": "Cannot dispute after deadline" }, { "pc": [ 755 ], "errorMessage": "Deadline has not passed yet" }, { "pc": [ 1048 ], "errorMessage": "Deliverables must be submitted before AI verdict" }, { "pc": [ 569 ], "errorMessage": "Escrow has expired" }, { "pc": [ 560 ], "errorMessage": "Escrow must be in CREATED/COMPLETED/REFUNDED state" }, { "pc": [ 831 ], "errorMessage": "Escrow must be in DISPUTED state" }, { "pc": [ 634, 735, 784, 960, 1032 ], "errorMessage": "Escrow must be in FUNDED state" }, { "pc": [ 303 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 792 ], "errorMessage": "Only buyer can raise a dispute" }, { "pc": [ 746 ], "errorMessage": "Only buyer can request a refund" }, { "pc": [ 654 ], "errorMessage": "Only buyer or oracle can confirm delivery" }, { "pc": [ 977 ], "errorMessage": "Only freelance escrows accept deliverables" }, { "pc": [ 1040 ], "errorMessage": "Only freelance escrows support AI verdict" }, { "pc": [ 840 ], "errorMessage": "Only the arbiter can resolve a dispute" }, { "pc": [ 1025 ], "errorMessage": "Only the backend oracle can submit AI verdicts" }, { "pc": [ 969 ], "errorMessage": "Only the seller can submit deliverables" }, { "pc": [ 588 ], "errorMessage": "Payment amount must be greater than 0" }, { "pc": [ 577 ], "errorMessage": "Payment receiver must be the escrow contract address" }, { "pc": [ 584 ], "errorMessage": "Payment sender must match app call sender" }, { "pc": [ 535, 542, 552, 567, 631, 640, 661, 666, 685, 705, 732, 741, 753, 760, 781, 790, 799, 827, 838, 847, 852, 871, 891, 915, 919, 957, 967, 974, 1029, 1037, 1045, 1064, 1069, 1088, 1108, 1138, 1143, 1147, 1151, 1156, 1161, 1166, 1173, 1178, 1183, 1188, 1193 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 401, 435, 943, 1009 ], "errorMessage": "invalid array length header" }, { "pc": [ 821, 992 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 408, 442, 950, 1016 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 395, 463, 472 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 419, 428, 453, 1002 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 531 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgOCAxMDAwMAogICAgYnl0ZWNibG9jayAic3RhdGUiICIiICJhbW91bnQiICJidXllciIgInNlbGxlciIgImRlYWRsaW5lX3JvdW5kIiAicGxhdGZvcm1fZmVlX2JwcyIgImVzY3Jvd190eXBlIiAicGxhdGZvcm1fdHJlYXN1cnkiICJkZWxpdmVyYWJsZXNfaGFzaCIgImFpX3Njb3JlIiAiYWlfdmVyZGljdF9ub3RlIiAiYXJiaXRlciIgIml0ZW1fbmFtZSIgImNyZWF0ZWRfcm91bmQiICJkaXNwdXRlX3JhaXNlZF9ieSIgInJlcXVpcmVtZW50c19oYXNoIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQ3CiAgICAvLyBidXllciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBBY2NvdW50KCkgfSkKICAgIGJ5dGVjXzMgLy8gImJ1eWVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGluaXRpYWxWYWx1ZTogQWNjb3VudCgpIH0pCiAgICBieXRlYyA0IC8vICJzZWxsZXIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIGl0ZW1fbmFtZSA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlYyAxMyAvLyAiaXRlbV9uYW1lIgogICAgYnl0ZWNfMSAvLyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MgogICAgLy8gZXNjcm93X3R5cGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIGFzIHVpbnQ2NCB9KQogICAgYnl0ZWMgNyAvLyAiZXNjcm93X3R5cGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MwogICAgLy8gYW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjXzIgLy8gImFtb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIGNyZWF0ZWRfcm91bmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIGFzIHVpbnQ2NCB9KQogICAgYnl0ZWMgMTQgLy8gImNyZWF0ZWRfcm91bmQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1OAogICAgLy8gZGVhZGxpbmVfcm91bmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIGFzIHVpbnQ2NCB9KQogICAgYnl0ZWMgNSAvLyAiZGVhZGxpbmVfcm91bmQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2MQogICAgLy8gcGxhdGZvcm1fZmVlX2JwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDUwIGFzIHVpbnQ2NCB9KSAvLyAwLjUlCiAgICBieXRlYyA2IC8vICJwbGF0Zm9ybV9mZWVfYnBzIgogICAgcHVzaGludCA1MCAvLyA1MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2MgogICAgLy8gcGxhdGZvcm1fdHJlYXN1cnkgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGluaXRpYWxWYWx1ZTogQWNjb3VudCgpIH0pCiAgICBieXRlYyA4IC8vICJwbGF0Zm9ybV90cmVhc3VyeSIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2NQogICAgLy8gcmVxdWlyZW1lbnRzX2hhc2ggPSBHbG9iYWxTdGF0ZTxieXRlcz4oeyBpbml0aWFsVmFsdWU6IEJ5dGVzKCcnKSB9KQogICAgYnl0ZWMgMTYgLy8gInJlcXVpcmVtZW50c19oYXNoIgogICAgYnl0ZWNfMSAvLyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2NgogICAgLy8gZGVsaXZlcmFibGVzX2hhc2ggPSBHbG9iYWxTdGF0ZTxieXRlcz4oeyBpbml0aWFsVmFsdWU6IEJ5dGVzKCcnKSB9KQogICAgYnl0ZWMgOSAvLyAiZGVsaXZlcmFibGVzX2hhc2giCiAgICBieXRlY18xIC8vICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjY3CiAgICAvLyBhaV9zY29yZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgYXMgdWludDY0IH0pCiAgICBieXRlYyAxMCAvLyAiYWlfc2NvcmUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2OAogICAgLy8gYWlfdmVyZGljdF9ub3RlID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjIDExIC8vICJhaV92ZXJkaWN0X25vdGUiCiAgICBieXRlY18xIC8vICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBhcmJpdGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgMTIgLy8gImFyYml0ZXIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIGRpc3B1dGVfcmFpc2VkX2J5ID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgMTUgLy8gImRpc3B1dGVfcmFpc2VkX2J5IgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBsYXN0X3R4bl9ub3RlID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIHB1c2hieXRlcyAibGFzdF90eG5fbm90ZSIKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0NQogICAgLy8gZXhwb3J0IGNsYXNzIEVzY3Jvd0NvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDE0CiAgICBwdXNoYnl0ZXNzIDB4NTE1MzFiNzUgMHgzN2MxZTM2ZSAweGMxNTEyZGMzIDB4ZTA1ZTBkNWUgMHgzMzdkODE1MCAweDFkNmZjNTUwIDB4ZmU5MGI3Y2QgMHgwZTQ0MmRmNiAvLyBtZXRob2QgImZ1bmQocGF5KXZvaWQiLCBtZXRob2QgImNvbmZpcm1EZWxpdmVyeSgpdm9pZCIsIG1ldGhvZCAicmVxdWVzdFJlZnVuZCgpdm9pZCIsIG1ldGhvZCAicmFpc2VEaXNwdXRlKCl2b2lkIiwgbWV0aG9kICJhcmJpdHJhdGUoYm9vbCl2b2lkIiwgbWV0aG9kICJzdWJtaXREZWxpdmVyYWJsZXMoYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFpVmVyZGljdChib29sLHVpbnQ2NCxieXRlW10pdm9pZCIsIG1ldGhvZCAiZ2V0RGV0YWlscygpKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSxieXRlW10sYWRkcmVzcykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kIGNvbmZpcm1EZWxpdmVyeSByZXF1ZXN0UmVmdW5kIHJhaXNlRGlzcHV0ZSBhcmJpdHJhdGUgc3VibWl0RGVsaXZlcmFibGVzIGFpVmVyZGljdCBnZXREZXRhaWxzCiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMTQ6CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDUKICAgIC8vIGV4cG9ydCBjbGFzcyBFc2Nyb3dDb250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweDcyZWUyMjcwIC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxieXRlW10sdWludDY0LHVpbnQ2NCxieXRlW10sdWludDY0LGFkZHJlc3MsYWRkcmVzcyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlQXBwbGljYXRpb24KICAgIGVycgoKCi8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo6RXNjcm93Q29udHJhY3QuY3JlYXRlQXBwbGljYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVBcHBsaWNhdGlvbjoKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo5NAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ05vT3AnLCBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0OAogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgNCAvLyAic2VsbGVyIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjEwNQogICAgLy8gdGhpcy5zZWxsZXIudmFsdWUgPSBzZWxsZXIKICAgIHVuY292ZXIgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MQogICAgLy8gaXRlbV9uYW1lID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjIDEzIC8vICJpdGVtX25hbWUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTA2CiAgICAvLyB0aGlzLml0ZW1fbmFtZS52YWx1ZSA9IGl0ZW1OYW1lCiAgICB1bmNvdmVyIDcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGVzY3Jvd190eXBlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjIDcgLy8gImVzY3Jvd190eXBlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjEwNwogICAgLy8gdGhpcy5lc2Nyb3dfdHlwZS52YWx1ZSA9IGVzY3Jvd1R5cGUKICAgIHVuY292ZXIgNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1OAogICAgLy8gZGVhZGxpbmVfcm91bmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIGFzIHVpbnQ2NCB9KQogICAgYnl0ZWMgNSAvLyAiZGVhZGxpbmVfcm91bmQiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTA4CiAgICAvLyB0aGlzLmRlYWRsaW5lX3JvdW5kLnZhbHVlID0gZGVhZGxpbmVSb3VuZAogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjY1CiAgICAvLyByZXF1aXJlbWVudHNfaGFzaCA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlYyAxNiAvLyAicmVxdWlyZW1lbnRzX2hhc2giCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTA5CiAgICAvLyB0aGlzLnJlcXVpcmVtZW50c19oYXNoLnZhbHVlID0gcmVxdWlyZW1lbnRzSGFzaAogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjYxCiAgICAvLyBwbGF0Zm9ybV9mZWVfYnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogNTAgYXMgdWludDY0IH0pIC8vIDAuNSUKICAgIGJ5dGVjIDYgLy8gInBsYXRmb3JtX2ZlZV9icHMiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTEwCiAgICAvLyB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUgPSBmZWVCcHMKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2MgogICAgLy8gcGxhdGZvcm1fdHJlYXN1cnkgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGluaXRpYWxWYWx1ZTogQWNjb3VudCgpIH0pCiAgICBieXRlYyA4IC8vICJwbGF0Zm9ybV90cmVhc3VyeSIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIHRoaXMucGxhdGZvcm1fdHJlYXN1cnkudmFsdWUgPSB0cmVhc3VyeQogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBhcmJpdGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgMTIgLy8gImFyYml0ZXIiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTEyCiAgICAvLyB0aGlzLmFyYml0ZXIudmFsdWUgPSBhcmJpdGVyQWRkcgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1NwogICAgLy8gY3JlYXRlZF9yb3VuZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgYXMgdWludDY0IH0pCiAgICBieXRlYyAxNCAvLyAiY3JlYXRlZF9yb3VuZCIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIHRoaXMuY3JlYXRlZF9yb3VuZC52YWx1ZSA9IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gdGhpcy5zdGF0ZS52YWx1ZSA9IFNUQVRFX0NSRUFURUQKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjk0CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnTm9PcCcsIG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd0NvbnRyYWN0LmZ1bmRbcm91dGluZ10oKSAtPiB2b2lkOgpmdW5kOgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjEyMwogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ05vT3AnIH0pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0NSRUFURUQgfHwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHN0YXRlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogU1RBVEVfQ1JFQVRFRCB9KQogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyB0aGlzLnN0YXRlLnZhbHVlID09PSBTVEFURV9DUkVBVEVEIHx8CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjEyNy0xMjgKICAgIC8vIHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0NSRUFURUQgfHwKICAgIC8vICAgdGhpcy5zdGF0ZS52YWx1ZSA9PT0gU1RBVEVfQ09NUExFVEVEIHx8CiAgICBieiBmdW5kX2Jvb2xfdHJ1ZUA0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyB0aGlzLnN0YXRlLnZhbHVlID09PSBTVEFURV9DT01QTEVURUQgfHwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHN0YXRlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogU1RBVEVfQ1JFQVRFRCB9KQogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyB0aGlzLnN0YXRlLnZhbHVlID09PSBTVEFURV9DT01QTEVURUQgfHwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMjctMTI4CiAgICAvLyB0aGlzLnN0YXRlLnZhbHVlID09PSBTVEFURV9DUkVBVEVEIHx8CiAgICAvLyAgIHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0NPTVBMRVRFRCB8fAogICAgYm56IGZ1bmRfYm9vbF90cnVlQDQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX1JFRlVOREVELAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1NgogICAgLy8gc3RhdGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBTVEFURV9DUkVBVEVEIH0pCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX1JFRlVOREVELAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjEyNy0xMjkKICAgIC8vIHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0NSRUFURUQgfHwKICAgIC8vICAgdGhpcy5zdGF0ZS52YWx1ZSA9PT0gU1RBVEVfQ09NUExFVEVEIHx8CiAgICAvLyAgIHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX1JFRlVOREVELAogICAgYnogZnVuZF9ib29sX2ZhbHNlQDUKCmZ1bmRfYm9vbF90cnVlQDQ6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9ib29sX21lcmdlQDY6CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTI2LTEzMQogICAgLy8gYXNzZXJ0KAogICAgLy8gICB0aGlzLnN0YXRlLnZhbHVlID09PSBTVEFURV9DUkVBVEVEIHx8CiAgICAvLyAgICAgdGhpcy5zdGF0ZS52YWx1ZSA9PT0gU1RBVEVfQ09NUExFVEVEIHx8CiAgICAvLyAgICAgdGhpcy5zdGF0ZS52YWx1ZSA9PT0gU1RBVEVfUkVGVU5ERUQsCiAgICAvLyAgICdFc2Nyb3cgbXVzdCBiZSBpbiBDUkVBVEVEL0NPTVBMRVRFRC9SRUZVTkRFRCBzdGF0ZScsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gRXNjcm93IG11c3QgYmUgaW4gQ1JFQVRFRC9DT01QTEVURUQvUkVGVU5ERUQgc3RhdGUKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMzQKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPD0gdGhpcy5kZWFkbGluZV9yb3VuZC52YWx1ZSwgJ0VzY3JvdyBoYXMgZXhwaXJlZCcpCiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIGRlYWRsaW5lX3JvdW5kID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjIDUgLy8gImRlYWRsaW5lX3JvdW5kIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjEzNAogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSB0aGlzLmRlYWRsaW5lX3JvdW5kLnZhbHVlLCAnRXNjcm93IGhhcyBleHBpcmVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA8PQogICAgYXNzZXJ0IC8vIEVzY3JvdyBoYXMgZXhwaXJlZAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjEzOAogICAgLy8gcGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBkdXBuIDIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMzctMTQwCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAnUGF5bWVudCByZWNlaXZlciBtdXN0IGJlIHRoZSBlc2Nyb3cgY29udHJhY3QgYWRkcmVzcycsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gUGF5bWVudCByZWNlaXZlciBtdXN0IGJlIHRoZSBlc2Nyb3cgY29udHJhY3QgYWRkcmVzcwogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gYXNzZXJ0KHBheW1lbnQuc2VuZGVyID09PSBUeG4uc2VuZGVyLCAnUGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCBhcHAgY2FsbCBzZW5kZXInKQogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCBhcHAgY2FsbCBzZW5kZXIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIGFzc2VydChwYXltZW50LmFtb3VudCA+ICgwIGFzIHVpbnQ2NCksICdQYXltZW50IGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJykKICAgIGd0eG5zIEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gUGF5bWVudCBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQ3CiAgICAvLyBidXllciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBBY2NvdW50KCkgfSkKICAgIGJ5dGVjXzMgLy8gImJ1eWVyIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gdGhpcy5idXllci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTMKICAgIC8vIGFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgYXMgdWludDY0IH0pCiAgICBieXRlY18yIC8vICJhbW91bnQiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTUwCiAgICAvLyB0aGlzLmFtb3VudC52YWx1ZSA9IHBheW1lbnQuYW1vdW50CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBjcmVhdGVkX3JvdW5kID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjIDE0IC8vICJjcmVhdGVkX3JvdW5kIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE1MQogICAgLy8gdGhpcy5jcmVhdGVkX3JvdW5kLnZhbHVlID0gR2xvYmFsLnJvdW5kCiAgICBnbG9iYWwgUm91bmQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIGRpc3B1dGVfcmFpc2VkX2J5ID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgMTUgLy8gImRpc3B1dGVfcmFpc2VkX2J5IgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE1MgogICAgLy8gdGhpcy5kaXNwdXRlX3JhaXNlZF9ieS52YWx1ZSA9IEFjY291bnQoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBkZWxpdmVyYWJsZXNfaGFzaCA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlYyA5IC8vICJkZWxpdmVyYWJsZXNfaGFzaCIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIHRoaXMuZGVsaXZlcmFibGVzX2hhc2gudmFsdWUgPSBCeXRlcygnJykKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NjcKICAgIC8vIGFpX3Njb3JlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjIDEwIC8vICJhaV9zY29yZSIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxNTQKICAgIC8vIHRoaXMuYWlfc2NvcmUudmFsdWUgPSAwIGFzIHVpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIGFpX3ZlcmRpY3Rfbm90ZSA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlYyAxMSAvLyAiYWlfdmVyZGljdF9ub3RlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE1NQogICAgLy8gdGhpcy5haV92ZXJkaWN0X25vdGUudmFsdWUgPSBCeXRlcygnJykKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHN0YXRlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogU1RBVEVfQ1JFQVRFRCB9KQogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyB0aGlzLnN0YXRlLnZhbHVlID0gU1RBVEVfRlVOREVECiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxMjMKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdOb09wJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZnVuZF9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBmdW5kX2Jvb2xfbWVyZ2VANgoKCi8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo6RXNjcm93Q29udHJhY3QuY29uZmlybURlbGl2ZXJ5W3JvdXRpbmddKCkgLT4gdm9pZDoKY29uZmlybURlbGl2ZXJ5OgogICAgYnl0ZWNfMSAvLyAiIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0ZVTkRFRCwgJ0VzY3JvdyBtdXN0IGJlIGluIEZVTkRFRCBzdGF0ZScpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0ZVTkRFRCwgJ0VzY3JvdyBtdXN0IGJlIGluIEZVTkRFRCBzdGF0ZScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gRXNjcm93IG11c3QgYmUgaW4gRlVOREVEIHN0YXRlCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLmJ1eWVyLnZhbHVlIHx8IFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDcKICAgIC8vIGJ1eWVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWNfMyAvLyAiYnV5ZXIiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLmJ1eWVyLnZhbHVlIHx8IFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYm56IGNvbmZpcm1EZWxpdmVyeV9ib29sX3RydWVAMwogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYnogY29uZmlybURlbGl2ZXJ5X2Jvb2xfZmFsc2VANAoKY29uZmlybURlbGl2ZXJ5X2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmNvbmZpcm1EZWxpdmVyeV9ib29sX21lcmdlQDU6CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTcxLTE3NAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSB0aGlzLmJ1eWVyLnZhbHVlIHx8IFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywKICAgIC8vICAgJ09ubHkgYnV5ZXIgb3Igb3JhY2xlIGNhbiBjb25maXJtIGRlbGl2ZXJ5JywKICAgIC8vICkKICAgIGFzc2VydCAvLyBPbmx5IGJ1eWVyIG9yIG9yYWNsZSBjYW4gY29uZmlybSBkZWxpdmVyeQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gdGhpcy5zdGF0ZS52YWx1ZSA9IFNUQVRFX0RFTElWRVJFRAogICAgaW50Y18yIC8vIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTc5CiAgICAvLyBjb25zdCBmZWVBbW91bnQ6IHVpbnQ2NCA9ICh0aGlzLmFtb3VudC52YWx1ZSAqIHRoaXMucGxhdGZvcm1fZmVlX2Jwcy52YWx1ZSkgLyAoMTAwMDAgYXMgdWludDY0KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MwogICAgLy8gYW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjXzIgLy8gImFtb3VudCIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxNzkKICAgIC8vIGNvbnN0IGZlZUFtb3VudDogdWludDY0ID0gKHRoaXMuYW1vdW50LnZhbHVlICogdGhpcy5wbGF0Zm9ybV9mZWVfYnBzLnZhbHVlKSAvICgxMDAwMCBhcyB1aW50NjQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2MQogICAgLy8gcGxhdGZvcm1fZmVlX2JwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDUwIGFzIHVpbnQ2NCB9KSAvLyAwLjUlCiAgICBieXRlYyA2IC8vICJwbGF0Zm9ybV9mZWVfYnBzIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE3OQogICAgLy8gY29uc3QgZmVlQW1vdW50OiB1aW50NjQgPSAodGhpcy5hbW91bnQudmFsdWUgKiB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUpIC8gKDEwMDAwIGFzIHVpbnQ2NCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgKgogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvCiAgICBkdXAKICAgIGJ1cnkgMwogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gY29uc3Qgc2VsbGVyQW1vdW50OiB1aW50NjQgPSB0aGlzLmFtb3VudC52YWx1ZSAtIGZlZUFtb3VudAogICAgc3dhcAogICAgZGlnIDEKICAgIC0KICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxODMtMTg5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBzZWxsZXJBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGluaXRpYWxWYWx1ZTogQWNjb3VudCgpIH0pCiAgICBieXRlYyA0IC8vICJzZWxsZXIiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxODMtMTg4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBzZWxsZXJBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTg3CiAgICAvLyBmZWU6IDAgYXMgdWludDY0LAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTgzLTE4OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogc2VsbGVyQW1vdW50LAogICAgLy8gICAgIGZlZTogMCBhcyB1aW50NjQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxOTIKICAgIC8vIGlmIChmZWVBbW91bnQgPiAoMCBhcyB1aW50NjQpKSB7CiAgICBieiBjb25maXJtRGVsaXZlcnlfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTkzLTE5OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMucGxhdGZvcm1fdHJlYXN1cnkudmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBmZWVBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyByZWNlaXZlcjogdGhpcy5wbGF0Zm9ybV90cmVhc3VyeS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NjIKICAgIC8vIHBsYXRmb3JtX3RyZWFzdXJ5ID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgOCAvLyAicGxhdGZvcm1fdHJlYXN1cnkiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyByZWNlaXZlcjogdGhpcy5wbGF0Zm9ybV90cmVhc3VyeS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxOTMtMTk4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5wbGF0Zm9ybV90cmVhc3VyeS52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IGZlZUFtb3VudCwKICAgIC8vICAgICBmZWU6IDAgYXMgdWludDY0LAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxOTcKICAgIC8vIGZlZTogMCBhcyB1aW50NjQsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoxOTMtMTk5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5wbGF0Zm9ybV90cmVhc3VyeS52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IGZlZUFtb3VudCwKICAgIC8vICAgICBmZWU6IDAgYXMgdWludDY0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0Cgpjb25maXJtRGVsaXZlcnlfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gdGhpcy5zdGF0ZS52YWx1ZSA9IFNUQVRFX0NPTVBMRVRFRAogICAgcHVzaGludCAzIC8vIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MTY1CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnTm9PcCcgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbmZpcm1EZWxpdmVyeV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb25maXJtRGVsaXZlcnlfYm9vbF9tZXJnZUA1CgoKLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dDb250cmFjdC5yZXF1ZXN0UmVmdW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVxdWVzdFJlZnVuZDoKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIGFzc2VydCh0aGlzLnN0YXRlLnZhbHVlID09PSBTVEFURV9GVU5ERUQsICdFc2Nyb3cgbXVzdCBiZSBpbiBGVU5ERUQgc3RhdGUnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1NgogICAgLy8gc3RhdGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBTVEFURV9DUkVBVEVEIH0pCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIGFzc2VydCh0aGlzLnN0YXRlLnZhbHVlID09PSBTVEFURV9GVU5ERUQsICdFc2Nyb3cgbXVzdCBiZSBpbiBGVU5ERUQgc3RhdGUnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEVzY3JvdyBtdXN0IGJlIGluIEZVTkRFRCBzdGF0ZQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuYnV5ZXIudmFsdWUsICdPbmx5IGJ1eWVyIGNhbiByZXF1ZXN0IGEgcmVmdW5kJykKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDcKICAgIC8vIGJ1eWVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWNfMyAvLyAiYnV5ZXIiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5idXllci52YWx1ZSwgJ09ubHkgYnV5ZXIgY2FuIHJlcXVlc3QgYSByZWZ1bmQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgYnV5ZXIgY2FuIHJlcXVlc3QgYSByZWZ1bmQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPiB0aGlzLmRlYWRsaW5lX3JvdW5kLnZhbHVlLCAnRGVhZGxpbmUgaGFzIG5vdCBwYXNzZWQgeWV0JykKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1OAogICAgLy8gZGVhZGxpbmVfcm91bmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIGFzIHVpbnQ2NCB9KQogICAgYnl0ZWMgNSAvLyAiZGVhZGxpbmVfcm91bmQiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjIwCiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kID4gdGhpcy5kZWFkbGluZV9yb3VuZC52YWx1ZSwgJ0RlYWRsaW5lIGhhcyBub3QgcGFzc2VkIHlldCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPgogICAgYXNzZXJ0IC8vIERlYWRsaW5lIGhhcyBub3QgcGFzc2VkIHlldAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjIyMy0yMjkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmJ1eWVyLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5hbW91bnQudmFsdWUsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjI2CiAgICAvLyBhbW91bnQ6IHRoaXMuYW1vdW50LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MwogICAgLy8gYW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjXzIgLy8gImFtb3VudCIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyMjYKICAgIC8vIGFtb3VudDogdGhpcy5hbW91bnQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyMjMtMjI4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5idXllci52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IHRoaXMuYW1vdW50LnZhbHVlLAogICAgLy8gICAgIGZlZTogMCBhcyB1aW50NjQsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjIyNwogICAgLy8gZmVlOiAwIGFzIHVpbnQ2NCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjIyMy0yMjkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmJ1eWVyLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5hbW91bnQudmFsdWUsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gdGhpcy5zdGF0ZS52YWx1ZSA9IFNUQVRFX1JFRlVOREVECiAgICBwdXNoaW50IDUgLy8gNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyMTEKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdOb09wJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo6RXNjcm93Q29udHJhY3QucmFpc2VEaXNwdXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmFpc2VEaXNwdXRlOgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI0MwogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0ZVTkRFRCwgJ0VzY3JvdyBtdXN0IGJlIGluIEZVTkRFRCBzdGF0ZScpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI0MwogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0ZVTkRFRCwgJ0VzY3JvdyBtdXN0IGJlIGluIEZVTkRFRCBzdGF0ZScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gRXNjcm93IG11c3QgYmUgaW4gRlVOREVEIHN0YXRlCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5idXllci52YWx1ZSwgJ09ubHkgYnV5ZXIgY2FuIHJhaXNlIGEgZGlzcHV0ZScpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQ3CiAgICAvLyBidXllciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBBY2NvdW50KCkgfSkKICAgIGJ5dGVjXzMgLy8gImJ1eWVyIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI0NgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuYnV5ZXIudmFsdWUsICdPbmx5IGJ1eWVyIGNhbiByYWlzZSBhIGRpc3B1dGUnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBidXllciBjYW4gcmFpc2UgYSBkaXNwdXRlCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjQ5CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDw9IHRoaXMuZGVhZGxpbmVfcm91bmQudmFsdWUsICdDYW5ub3QgZGlzcHV0ZSBhZnRlciBkZWFkbGluZScpCiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIGRlYWRsaW5lX3JvdW5kID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjIDUgLy8gImRlYWRsaW5lX3JvdW5kIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSB0aGlzLmRlYWRsaW5lX3JvdW5kLnZhbHVlLCAnQ2Fubm90IGRpc3B1dGUgYWZ0ZXIgZGVhZGxpbmUnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDw9CiAgICBhc3NlcnQgLy8gQ2Fubm90IGRpc3B1dGUgYWZ0ZXIgZGVhZGxpbmUKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1NgogICAgLy8gc3RhdGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBTVEFURV9DUkVBVEVEIH0pCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIHRoaXMuc3RhdGUudmFsdWUgPSBTVEFURV9ESVNQVVRFRAogICAgcHVzaGludCA0IC8vIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIGRpc3B1dGVfcmFpc2VkX2J5ID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgMTUgLy8gImRpc3B1dGVfcmFpc2VkX2J5IgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI1MgogICAgLy8gdGhpcy5kaXNwdXRlX3JhaXNlZF9ieS52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjQwCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnTm9PcCcgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd0NvbnRyYWN0LmFyYml0cmF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYml0cmF0ZToKICAgIGJ5dGVjXzEgLy8gIiIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdOb09wJyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyNjUKICAgIC8vIGFzc2VydCh0aGlzLnN0YXRlLnZhbHVlID09PSBTVEFURV9ESVNQVVRFRCwgJ0VzY3JvdyBtdXN0IGJlIGluIERJU1BVVEVEIHN0YXRlJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHN0YXRlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogU1RBVEVfQ1JFQVRFRCB9KQogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjY1CiAgICAvLyBhc3NlcnQodGhpcy5zdGF0ZS52YWx1ZSA9PT0gU1RBVEVfRElTUFVURUQsICdFc2Nyb3cgbXVzdCBiZSBpbiBESVNQVVRFRCBzdGF0ZScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gRXNjcm93IG11c3QgYmUgaW4gRElTUFVURUQgc3RhdGUKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyNjgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFyYml0ZXIudmFsdWUsICdPbmx5IHRoZSBhcmJpdGVyIGNhbiByZXNvbHZlIGEgZGlzcHV0ZScpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBhcmJpdGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgMTIgLy8gImFyYml0ZXIiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjY4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hcmJpdGVyLnZhbHVlLCAnT25seSB0aGUgYXJiaXRlciBjYW4gcmVzb2x2ZSBhIGRpc3B1dGUnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgYXJiaXRlciBjYW4gcmVzb2x2ZSBhIGRpc3B1dGUKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIGlmIChyZWxlYXNlVG9TZWxsZXIpIHsKICAgIGJ6IGFyYml0cmF0ZV9lbHNlX2JvZHlANwogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gY29uc3QgZmVlQW1vdW50OiB1aW50NjQgPSAodGhpcy5hbW91bnQudmFsdWUgKiB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUpIC8gKDEwMDAwIGFzIHVpbnQ2NCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTMKICAgIC8vIGFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgYXMgdWludDY0IH0pCiAgICBieXRlY18yIC8vICJhbW91bnQiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyBjb25zdCBmZWVBbW91bnQ6IHVpbnQ2NCA9ICh0aGlzLmFtb3VudC52YWx1ZSAqIHRoaXMucGxhdGZvcm1fZmVlX2Jwcy52YWx1ZSkgLyAoMTAwMDAgYXMgdWludDY0KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NjEKICAgIC8vIHBsYXRmb3JtX2ZlZV9icHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiA1MCBhcyB1aW50NjQgfSkgLy8gMC41JQogICAgYnl0ZWMgNiAvLyAicGxhdGZvcm1fZmVlX2JwcyIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIGNvbnN0IGZlZUFtb3VudDogdWludDY0ID0gKHRoaXMuYW1vdW50LnZhbHVlICogdGhpcy5wbGF0Zm9ybV9mZWVfYnBzLnZhbHVlKSAvICgxMDAwMCBhcyB1aW50NjQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDEKICAgICoKICAgIGludGMgNCAvLyAxMDAwMAogICAgLwogICAgZHVwCiAgICBidXJ5IDMKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyNzMKICAgIC8vIGNvbnN0IHNlbGxlckFtb3VudDogdWludDY0ID0gdGhpcy5hbW91bnQudmFsdWUgLSBmZWVBbW91bnQKICAgIHN3YXAKICAgIGRpZyAxCiAgICAtCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6Mjc1LTI4MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogc2VsbGVyQW1vdW50LAogICAgLy8gICAgIGZlZTogMCBhcyB1aW50NjQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI3NwogICAgLy8gcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0OAogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgNCAvLyAic2VsbGVyIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI3NwogICAgLy8gcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6Mjc1LTI4MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogc2VsbGVyQW1vdW50LAogICAgLy8gICAgIGZlZTogMCBhcyB1aW50NjQsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gZmVlOiAwIGFzIHVpbnQ2NCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI3NS0yODEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnNlbGxlci52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IHNlbGxlckFtb3VudCwKICAgIC8vICAgICBmZWU6IDAgYXMgdWludDY0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MjgzCiAgICAvLyBpZiAoZmVlQW1vdW50ID4gKDAgYXMgdWludDY0KSkgewogICAgYnogYXJiaXRyYXRlX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI4NC0yOTAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLnBsYXRmb3JtX3RyZWFzdXJ5LnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogZmVlQW1vdW50LAogICAgLy8gICAgIGZlZTogMCBhcyB1aW50NjQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI4NgogICAgLy8gcmVjZWl2ZXI6IHRoaXMucGxhdGZvcm1fdHJlYXN1cnkudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjYyCiAgICAvLyBwbGF0Zm9ybV90cmVhc3VyeSA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBBY2NvdW50KCkgfSkKICAgIGJ5dGVjIDggLy8gInBsYXRmb3JtX3RyZWFzdXJ5IgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI4NgogICAgLy8gcmVjZWl2ZXI6IHRoaXMucGxhdGZvcm1fdHJlYXN1cnkudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6Mjg0LTI4OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMucGxhdGZvcm1fdHJlYXN1cnkudmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBmZWVBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6Mjg4CiAgICAvLyBmZWU6IDAgYXMgdWludDY0LAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6Mjg0LTI5MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMucGxhdGZvcm1fdHJlYXN1cnkudmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBmZWVBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKYXJiaXRyYXRlX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1NgogICAgLy8gc3RhdGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBTVEFURV9DUkVBVEVEIH0pCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyOTMKICAgIC8vIHRoaXMuc3RhdGUudmFsdWUgPSBTVEFURV9DT01QTEVURUQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXJiaXRyYXRlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdOb09wJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXJiaXRyYXRlX2Vsc2VfYm9keUA3OgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI5Ni0zMDIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmJ1eWVyLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5hbW91bnQudmFsdWUsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6Mjk4CiAgICAvLyByZWNlaXZlcjogdGhpcy5idXllci52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDcKICAgIC8vIGJ1eWVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWNfMyAvLyAiYnV5ZXIiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6Mjk4CiAgICAvLyByZWNlaXZlcjogdGhpcy5idXllci52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6Mjk5CiAgICAvLyBhbW91bnQ6IHRoaXMuYW1vdW50LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MwogICAgLy8gYW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjXzIgLy8gImFtb3VudCIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIGFtb3VudDogdGhpcy5hbW91bnQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czoyOTYtMzAxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5idXllci52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IHRoaXMuYW1vdW50LnZhbHVlLAogICAgLy8gICAgIGZlZTogMCBhcyB1aW50NjQsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMwMAogICAgLy8gZmVlOiAwIGFzIHVpbnQ2NCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjI5Ni0zMDIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiB0aGlzLmJ1eWVyLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5hbW91bnQudmFsdWUsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMwNAogICAgLy8gdGhpcy5zdGF0ZS52YWx1ZSA9IFNUQVRFX1JFRlVOREVECiAgICBwdXNoaW50IDUgLy8gNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgYXJiaXRyYXRlX2FmdGVyX2lmX2Vsc2VAOQoKCi8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo6RXNjcm93Q29udHJhY3Quc3VibWl0RGVsaXZlcmFibGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VibWl0RGVsaXZlcmFibGVzOgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ05vT3AnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0ZVTkRFRCwgJ0VzY3JvdyBtdXN0IGJlIGluIEZVTkRFRCBzdGF0ZScpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYXNzZXJ0KHRoaXMuc3RhdGUudmFsdWUgPT09IFNUQVRFX0ZVTkRFRCwgJ0VzY3JvdyBtdXN0IGJlIGluIEZVTkRFRCBzdGF0ZScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gRXNjcm93IG11c3QgYmUgaW4gRlVOREVEIHN0YXRlCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5zZWxsZXIudmFsdWUsICdPbmx5IHRoZSBzZWxsZXIgY2FuIHN1Ym1pdCBkZWxpdmVyYWJsZXMnKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0OAogICAgLy8gc2VsbGVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgNCAvLyAic2VsbGVyIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuc2VsbGVyLnZhbHVlLCAnT25seSB0aGUgc2VsbGVyIGNhbiBzdWJtaXQgZGVsaXZlcmFibGVzJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIHNlbGxlciBjYW4gc3VibWl0IGRlbGl2ZXJhYmxlcwogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMyMwogICAgLy8gYXNzZXJ0KHRoaXMuZXNjcm93X3R5cGUudmFsdWUgPT09IFRZUEVfRlJFRUxBTkNFLCAnT25seSBmcmVlbGFuY2UgZXNjcm93cyBhY2NlcHQgZGVsaXZlcmFibGVzJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGVzY3Jvd190eXBlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjIDcgLy8gImVzY3Jvd190eXBlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMyMwogICAgLy8gYXNzZXJ0KHRoaXMuZXNjcm93X3R5cGUudmFsdWUgPT09IFRZUEVfRlJFRUxBTkNFLCAnT25seSBmcmVlbGFuY2UgZXNjcm93cyBhY2NlcHQgZGVsaXZlcmFibGVzJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGZyZWVsYW5jZSBlc2Nyb3dzIGFjY2VwdCBkZWxpdmVyYWJsZXMKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2NgogICAgLy8gZGVsaXZlcmFibGVzX2hhc2ggPSBHbG9iYWxTdGF0ZTxieXRlcz4oeyBpbml0aWFsVmFsdWU6IEJ5dGVzKCcnKSB9KQogICAgYnl0ZWMgOSAvLyAiZGVsaXZlcmFibGVzX2hhc2giCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyB0aGlzLmRlbGl2ZXJhYmxlc19oYXNoLnZhbHVlID0gZGVsaXZlcmFibGVzSGFzaAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdOb09wJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo6RXNjcm93Q29udHJhY3QuYWlWZXJkaWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKYWlWZXJkaWN0OgogICAgYnl0ZWNfMSAvLyAiIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ05vT3AnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNDAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsICdPbmx5IHRoZSBiYWNrZW5kIG9yYWNsZSBjYW4gc3VibWl0IEFJIHZlcmRpY3RzJykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBiYWNrZW5kIG9yYWNsZSBjYW4gc3VibWl0IEFJIHZlcmRpY3RzCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhc3NlcnQodGhpcy5zdGF0ZS52YWx1ZSA9PT0gU1RBVEVfRlVOREVELCAnRXNjcm93IG11c3QgYmUgaW4gRlVOREVEIHN0YXRlJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHN0YXRlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogU1RBVEVfQ1JFQVRFRCB9KQogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhc3NlcnQodGhpcy5zdGF0ZS52YWx1ZSA9PT0gU1RBVEVfRlVOREVELCAnRXNjcm93IG11c3QgYmUgaW4gRlVOREVEIHN0YXRlJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBFc2Nyb3cgbXVzdCBiZSBpbiBGVU5ERUQgc3RhdGUKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNDYKICAgIC8vIGFzc2VydCh0aGlzLmVzY3Jvd190eXBlLnZhbHVlID09PSBUWVBFX0ZSRUVMQU5DRSwgJ09ubHkgZnJlZWxhbmNlIGVzY3Jvd3Mgc3VwcG9ydCBBSSB2ZXJkaWN0JykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGVzY3Jvd190eXBlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjIDcgLy8gImVzY3Jvd190eXBlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gYXNzZXJ0KHRoaXMuZXNjcm93X3R5cGUudmFsdWUgPT09IFRZUEVfRlJFRUxBTkNFLCAnT25seSBmcmVlbGFuY2UgZXNjcm93cyBzdXBwb3J0IEFJIHZlcmRpY3QnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgZnJlZWxhbmNlIGVzY3Jvd3Mgc3VwcG9ydCBBSSB2ZXJkaWN0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzQ5CiAgICAvLyBhc3NlcnQodGhpcy5kZWxpdmVyYWJsZXNfaGFzaC52YWx1ZSAhPT0gQnl0ZXMoJycpLCAnRGVsaXZlcmFibGVzIG11c3QgYmUgc3VibWl0dGVkIGJlZm9yZSBBSSB2ZXJkaWN0JykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIGRlbGl2ZXJhYmxlc19oYXNoID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjIDkgLy8gImRlbGl2ZXJhYmxlc19oYXNoIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gYXNzZXJ0KHRoaXMuZGVsaXZlcmFibGVzX2hhc2gudmFsdWUgIT09IEJ5dGVzKCcnKSwgJ0RlbGl2ZXJhYmxlcyBtdXN0IGJlIHN1Ym1pdHRlZCBiZWZvcmUgQUkgdmVyZGljdCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGFzc2VydCAvLyBEZWxpdmVyYWJsZXMgbXVzdCBiZSBzdWJtaXR0ZWQgYmVmb3JlIEFJIHZlcmRpY3QKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2NwogICAgLy8gYWlfc2NvcmUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIGFzIHVpbnQ2NCB9KQogICAgYnl0ZWMgMTAgLy8gImFpX3Njb3JlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjM1MgogICAgLy8gdGhpcy5haV9zY29yZS52YWx1ZSA9IHNjb3JlCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIGFpX3ZlcmRpY3Rfbm90ZSA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlYyAxMSAvLyAiYWlfdmVyZGljdF9ub3RlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjM1MwogICAgLy8gdGhpcy5haV92ZXJkaWN0X25vdGUudmFsdWUgPSB2ZXJkaWN0Tm90ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIGlmIChhcHByb3ZlZCkgewogICAgYnogYWlWZXJkaWN0X2Vsc2VfYm9keUA3CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBjb25zdCBmZWVBbW91bnQ6IHVpbnQ2NCA9ICh0aGlzLmFtb3VudC52YWx1ZSAqIHRoaXMucGxhdGZvcm1fZmVlX2Jwcy52YWx1ZSkgLyAoMTAwMDAgYXMgdWludDY0KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MwogICAgLy8gYW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjXzIgLy8gImFtb3VudCIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIGNvbnN0IGZlZUFtb3VudDogdWludDY0ID0gKHRoaXMuYW1vdW50LnZhbHVlICogdGhpcy5wbGF0Zm9ybV9mZWVfYnBzLnZhbHVlKSAvICgxMDAwMCBhcyB1aW50NjQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2MQogICAgLy8gcGxhdGZvcm1fZmVlX2JwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDUwIGFzIHVpbnQ2NCB9KSAvLyAwLjUlCiAgICBieXRlYyA2IC8vICJwbGF0Zm9ybV9mZWVfYnBzIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gY29uc3QgZmVlQW1vdW50OiB1aW50NjQgPSAodGhpcy5hbW91bnQudmFsdWUgKiB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUpIC8gKDEwMDAwIGFzIHVpbnQ2NCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgKgogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvCiAgICBkdXAKICAgIGJ1cnkgMwogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gY29uc3Qgc2VsbGVyQW1vdW50OiB1aW50NjQgPSB0aGlzLmFtb3VudC52YWx1ZSAtIGZlZUFtb3VudAogICAgc3dhcAogICAgZGlnIDEKICAgIC0KICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNjAtMzY2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBzZWxsZXJBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzYyCiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBzZWxsZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGluaXRpYWxWYWx1ZTogQWNjb3VudCgpIH0pCiAgICBieXRlYyA0IC8vICJzZWxsZXIiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzYyCiAgICAvLyByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNjAtMzY1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5zZWxsZXIudmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBzZWxsZXJBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzY0CiAgICAvLyBmZWU6IDAgYXMgdWludDY0LAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzYwLTM2NgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuc2VsbGVyLnZhbHVlLAogICAgLy8gICAgIGFtb3VudDogc2VsbGVyQW1vdW50LAogICAgLy8gICAgIGZlZTogMCBhcyB1aW50NjQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGlmIChmZWVBbW91bnQgPiAoMCBhcyB1aW50NjQpKSB7CiAgICBieiBhaVZlcmRpY3RfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzY5LTM3NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMucGxhdGZvcm1fdHJlYXN1cnkudmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBmZWVBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwIGFzIHVpbnQ2NCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyByZWNlaXZlcjogdGhpcy5wbGF0Zm9ybV90cmVhc3VyeS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NjIKICAgIC8vIHBsYXRmb3JtX3RyZWFzdXJ5ID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEFjY291bnQoKSB9KQogICAgYnl0ZWMgOCAvLyAicGxhdGZvcm1fdHJlYXN1cnkiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyByZWNlaXZlcjogdGhpcy5wbGF0Zm9ybV90cmVhc3VyeS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNjktMzc0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5wbGF0Zm9ybV90cmVhc3VyeS52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IGZlZUFtb3VudCwKICAgIC8vICAgICBmZWU6IDAgYXMgdWludDY0LAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIGZlZTogMCBhcyB1aW50NjQsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czozNjktMzc1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5wbGF0Zm9ybV90cmVhc3VyeS52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IGZlZUFtb3VudCwKICAgIC8vICAgICBmZWU6IDAgYXMgdWludDY0LAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgphaVZlcmRpY3RfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjM3OAogICAgLy8gdGhpcy5zdGF0ZS52YWx1ZSA9IFNUQVRFX0NPTVBMRVRFRAogICAgcHVzaGludCAzIC8vIDMKICAgIGFwcF9nbG9iYWxfcHV0CgphaVZlcmRpY3RfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ05vT3AnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphaVZlcmRpY3RfZWxzZV9ib2R5QDc6CiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHN0YXRlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogU1RBVEVfQ1JFQVRFRCB9KQogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyB0aGlzLnN0YXRlLnZhbHVlID0gU1RBVEVfRElTUFVURUQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhaVZlcmRpY3RfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dDb250cmFjdC5nZXREZXRhaWxzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0RGV0YWlsczoKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MDgKICAgIC8vIHRoaXMuYnV5ZXIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQ3CiAgICAvLyBidXllciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBBY2NvdW50KCkgfSkKICAgIGJ5dGVjXzMgLy8gImJ1eWVyIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gdGhpcy5idXllci52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyB0aGlzLnNlbGxlci52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDgKICAgIC8vIHNlbGxlciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBBY2NvdW50KCkgfSkKICAgIGJ5dGVjIDQgLy8gInNlbGxlciIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIHRoaXMuc2VsbGVyLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIHRoaXMuYW1vdW50LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MwogICAgLy8gYW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjXzIgLy8gImFtb3VudCIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIHRoaXMuYW1vdW50LnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTEKICAgIC8vIHRoaXMuc3RhdGUudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzdGF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFNUQVRFX0NSRUFURUQgfSkKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQxMQogICAgLy8gdGhpcy5zdGF0ZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDEyCiAgICAvLyB0aGlzLmVzY3Jvd190eXBlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MgogICAgLy8gZXNjcm93X3R5cGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIGFzIHVpbnQ2NCB9KQogICAgYnl0ZWMgNyAvLyAiZXNjcm93X3R5cGUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDEyCiAgICAvLyB0aGlzLmVzY3Jvd190eXBlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIHRoaXMuaXRlbV9uYW1lLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1MQogICAgLy8gaXRlbV9uYW1lID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjIDEzIC8vICJpdGVtX25hbWUiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyB0aGlzLml0ZW1fbmFtZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDE0CiAgICAvLyB0aGlzLmRlYWRsaW5lX3JvdW5kLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo1OAogICAgLy8gZGVhZGxpbmVfcm91bmQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIGFzIHVpbnQ2NCB9KQogICAgYnl0ZWMgNSAvLyAiZGVhZGxpbmVfcm91bmQiCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NDE0CiAgICAvLyB0aGlzLmRlYWRsaW5lX3JvdW5kLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIEdsb2JhbC5yb3VuZCwKICAgIGdsb2JhbCBSb3VuZAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQxNgogICAgLy8gdGhpcy5haV9zY29yZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NjcKICAgIC8vIGFpX3Njb3JlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCBhcyB1aW50NjQgfSkKICAgIGJ5dGVjIDEwIC8vICJhaV9zY29yZSIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTYKICAgIC8vIHRoaXMuYWlfc2NvcmUudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gdGhpcy5wbGF0Zm9ybV9mZWVfYnBzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo2MQogICAgLy8gcGxhdGZvcm1fZmVlX2JwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDUwIGFzIHVpbnQ2NCB9KSAvLyAwLjUlCiAgICBieXRlYyA2IC8vICJwbGF0Zm9ybV9mZWVfYnBzIgogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gdGhpcy5wbGF0Zm9ybV9mZWVfYnBzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTgKICAgIC8vIHRoaXMuZGVsaXZlcmFibGVzX2hhc2gudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBkZWxpdmVyYWJsZXNfaGFzaCA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlYyA5IC8vICJkZWxpdmVyYWJsZXNfaGFzaCIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTgKICAgIC8vIHRoaXMuZGVsaXZlcmFibGVzX2hhc2gudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gdGhpcy5haV92ZXJkaWN0X25vdGUudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2VzY3Jvd19jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBhaV92ZXJkaWN0X25vdGUgPSBHbG9iYWxTdGF0ZTxieXRlcz4oeyBpbml0aWFsVmFsdWU6IEJ5dGVzKCcnKSB9KQogICAgYnl0ZWMgMTEgLy8gImFpX3ZlcmRpY3Rfbm90ZSIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIHRoaXMuYWlfdmVyZGljdF9ub3RlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MjAKICAgIC8vIHRoaXMuYXJiaXRlci52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6NzEKICAgIC8vIGFyYml0ZXIgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGluaXRpYWxWYWx1ZTogQWNjb3VudCgpIH0pCiAgICBieXRlYyAxMiAvLyAiYXJiaXRlciIKICAgIC8vIHNyYy9lc2Nyb3dfY29udHJhY3QuYWxnby50czo0MjAKICAgIC8vIHRoaXMuYXJiaXRlci52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvZXNjcm93X2NvbnRyYWN0LmFsZ28udHM6MzkxCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnTm9PcCcsIHJlYWRvbmx5OiB0cnVlIH0pCiAgICB1bmNvdmVyIDEyCiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDgKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDllCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMTU4IC8vIDE1OAogICAgKwogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBkaWcgMgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGRpZyA1CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAECCJBOJhEFc3RhdGUABmFtb3VudAVidXllcgZzZWxsZXIOZGVhZGxpbmVfcm91bmQQcGxhdGZvcm1fZmVlX2Jwcwtlc2Nyb3dfdHlwZRFwbGF0Zm9ybV90cmVhc3VyeRFkZWxpdmVyYWJsZXNfaGFzaAhhaV9zY29yZQ9haV92ZXJkaWN0X25vdGUHYXJiaXRlcglpdGVtX25hbWUNY3JlYXRlZF9yb3VuZBFkaXNwdXRlX3JhaXNlZF9ieRFyZXF1aXJlbWVudHNfaGFzaDEYQABUKzIDZycEMgNnJw0pZycHImcqImcoImcnDiJnJwUiZycGgTJnJwgyA2cnEClnJwkpZycKImcnCylnJwwyA2cnDzIDZ4ANbGFzdF90eG5fbm90ZSlnMRkURDEYQQBAgggEUVMbdQQ3weNuBMFRLcME4F4NXgQzfYFQBB1vxVAE/pC3zQQORC32NhoAjggAlgD/AWUBlgG5AjYCZAL7AIAEcu4icDYaAI4BAAEANhoBSRWBIBJENhoCSSJZJAhLARUSRFcCADYaA0kVJRJEFzYaBEkVJRJEFzYaBUkiWSQISwEVEkRXAgA2GgZJFSUSRBc2GgdJFYEgEkQ2GghJFYEgEkQnBE8IZycNTwdnJwdPBmcnBU8FZycQTwRnJwZPA2cnCE8CZycMTGcnDjIGZygiZyNDMRYjCUk4ECMSRCIoZURBABQiKGVEgQMSQAAKIihlRIEFEkEAQCNEMgYiJwVlRA5ERwI4BzIKEkRJOAAxABJEOAhJRCsxAGcqTGcnDjIGZycPMgNnJwkpZycKImcnCylnKCNnI0MiQv+9KSIoZUQjEkQxACIrZUQSQAAIMQAyCRJBAEgjRCgkZyIqZUQiJwZlREsBCyEECklFA0xLAQmxIicEZUSyB7III7IQIrIBs0EAE7EiJwhlREsBsgiyByOyECKyAbMogQNnI0MiQv+1IihlRCMSRDEAIitlRExLARJEMgYiJwVlRA1EsSIqZUSyCLIHI7IQIrIBsyiBBWcjQyIoZUQjEkQxACIrZUQSRDIGIicFZUQORCiBBGcnDzEAZyNDKTYaAUkVIxJEIlMiKGVEgQQSRDEAIicMZUQSREEAQyIqZUQiJwZlREsBCyEECklFA0xLAQmxIicEZUSyB7III7IQIrIBs0EAE7EiJwhlREsBsgiyByOyECKyAbMogQNnI0OxIitlRCIqZUSyCLIHI7IQIrIBsyiBBWdC/+M2GgFJIlkkCEsBFRJEVwIAIihlRCMSRDEAIicEZUQSRCInB2VEJBJEJwlMZyNDKTYaAUkVIxJEIlM2GgJJFSUSRBc2GgNJIlkkCEsBFRJEVwIAMQAyCRJEIihlRCMSRCInB2VEJBJEIicJZUQpE0QnCk8CZycLTGdBAEMiKmVEIicGZURLAQshBApJRQNMSwEJsSInBGVEsgeyCCOyECKyAbNBABOxIicIZURLAbIIsgcjshAisgGzKIEDZyNDKIEEZ0L/9yIrZUQiJwRlRCIqZUQiKGVEIicHZUQiJw1lRCInBWVEMgYiJwplRCInBmVEIicJZUQiJwtlRCInDGVETwxPDFBPCxZQTwoWUE8JFlBLCBUWVwYCTwlQTIACAJ5QSwEVgZ4BCE8JFk8CTFBPCBZQTwcWUE8GFlBLBRUWVwYCTwZQSwIWVwYCTwJMUEsBFU8DCEsFFRZXBgJPBlBMFlcGAk8CTFBPBFBPA1BPAlBMUIAEFR98dUxQsCND", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }