{ "name": "AugurionMarketV4", "structs": {}, "methods": [ { "name": "create", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "configure_market", "args": [ { "type": "byte[]", "name": "outcomeRef" }, { "type": "uint64", "name": "expiryRound" }, { "type": "uint64", "name": "feeBps" } ], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Configure the market metadata before opening.\nCan be called multiple times while PENDING to fix wording/refs.\nConfiguration fields are immutable after configure_market.", "events": [], "recommendations": {} }, { "name": "open_market", "args": [], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "freeze_market", "args": [], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "cancel_market", "args": [], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "bet_yes", "args": [ { "type": "uint64", "name": "amount" } ], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "bet_no", "args": [ { "type": "uint64", "name": "amount" } ], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "resolve_market", "args": [ { "type": "uint64", "name": "winningSide" } ], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin-as-oracle resolves the market.\nPrefer: freeze first, then resolve.", "events": [], "recommendations": {} }, { "name": "claim_payout", "args": [], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "claim_refund", "args": [], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "If market is cancelled, users can refund their YES+NO bets (one-time).", "events": [], "recommendations": {} }, { "name": "get_market_meta", "args": [], "returns": { "type": "string" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "AugurionMarketV2_1 (single-market, ALGO collateral, parimutuel pool)\n\nLifecycle (status):\n0 = PENDING (configured but not open)\n1 = OPEN (accept bets)\n2 = FROZEN (no more bets; awaiting resolution)\n3 = RESOLVED (winner set; claims allowed)\n4 = CANCELLED (refunds allowed)\n\nwinningSide:\n0 = NONE\n1 = YES\n2 = NO", "networks": {}, "state": { "schema": { "global": { "ints": 8, "bytes": 2 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "status": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3RhdHVz" }, "admin": { "keyType": "AVMString", "valueType": "address", "key": "YWRtaW4=" }, "outcomeRef": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "b3V0Y29tZVJlZg==" }, "expiryRound": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZXhwaXJ5Um91bmQ=" }, "yesTotal": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "eWVzVG90YWw=" }, "noTotal": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bm9Ub3RhbA==" }, "totalBets": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxCZXRz" }, "feeBps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZmVlQnBz" }, "winningSide": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "d2lubmluZ1NpZGU=" }, "claimVersion": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y2xhaW1WZXJzaW9u" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "yesBet": { "keyType": "address", "valueType": "uint64", "prefix": "eWVzOg==" }, "noBet": { "keyType": "address", "valueType": "uint64", "prefix": "bm86" }, "claimed": { "keyType": "address", "valueType": "uint64", "prefix": "Y2xhaW1lZDo=" }, "refunded": { "keyType": "address", "valueType": "uint64", "prefix": "cmVmdW5kZWQ6" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1866 ], "errorMessage": "App call must be second transaction in group" }, { "pc": [ 462 ], "errorMessage": "Expiry must be in the future" }, { "pc": [ 1921 ], "errorMessage": "Market expired" }, { "pc": [ 608 ], "errorMessage": "Market expired before open" }, { "pc": [ 1904 ], "errorMessage": "Market is not open" }, { "pc": [ 182 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 278 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 1857 ], "errorMessage": "Only admin" }, { "pc": [ 1886 ], "errorMessage": "Payment amount mismatch" }, { "pc": [ 1893 ], "errorMessage": "Payment must go to app address" }, { "pc": [ 1879 ], "errorMessage": "Payment sender mismatch" }, { "pc": [ 400, 506, 560, 599, 636, 714, 798, 810, 902, 914, 1000, 1009, 1168, 1217, 1228, 1239, 1250, 1519, 1752, 1787, 1809, 1830, 1855, 1901, 1912 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 365 ], "errorMessage": "invalid array length header" }, { "pc": [ 372 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 383, 392, 785, 889, 992 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1872 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMgogICAgYnl0ZWNibG9jayAic3RhdHVzIiAweDE1MWY3Yzc1ICIiICJleHBpcnlSb3VuZCIgInRvdGFsQmV0cyIgIm91dGNvbWVSZWYiICJ5ZXNUb3RhbCIgIm5vVG90YWwiICJmZWVCcHMiICJ3aW5uaW5nU2lkZSIgImFkbWluIiAieWVzOiIgIm5vOiIgImNsYWltVmVyc2lvbiIgMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjM1CiAgICAvLyBzdGF0dXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkgLy8gUEVORElORwogICAgYnl0ZWNfMCAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzgKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IFR4bi5zZW5kZXIgfSkgLy8gc2V0IGR1cmluZyBjcmVhdGUKICAgIGJ5dGVjIDEwIC8vICJhZG1pbiIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDEKICAgIC8vIG91dGNvbWVSZWYgPSBHbG9iYWxTdGF0ZTxieXRlcz4oeyBpbml0aWFsVmFsdWU6IEJ5dGVzKCcnKSB9KQogICAgYnl0ZWMgNSAvLyAib3V0Y29tZVJlZiIKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDQKICAgIC8vIGV4cGlyeVJvdW5kID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJleHBpcnlSb3VuZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ3CiAgICAvLyB5ZXNUb3RhbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgNiAvLyAieWVzVG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo0OAogICAgLy8gbm9Ub3RhbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgNyAvLyAibm9Ub3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ5CiAgICAvLyB0b3RhbEJldHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDQgLy8gInRvdGFsQmV0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjUyCiAgICAvLyBmZWVCcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDggLy8gImZlZUJwcyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjU0CiAgICAvLyB3aW5uaW5nU2lkZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgOSAvLyAid2lubmluZ1NpZGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo1NwogICAgLy8gY2xhaW1WZXJzaW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDIpIH0pCiAgICBieXRlYyAxMyAvLyAiY2xhaW1WZXJzaW9uIgogICAgaW50Y18zIC8vIDIKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozMAogICAgLy8gZXhwb3J0IGNsYXNzIEF1Z3VyaW9uTWFya2V0VjQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMjAKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NGM1YzYxYmEgMHg1Mjk3NWQ5YiAweDgwZDdkMGExIDB4MjJiOTczNzIgMHg4OTkwOTViOCAweGE0MjE2YzA5IDB4NzIxODBjZTAgMHhmMTNjNTVjNyAweDQxYWQyMGUwIDB4NzY1ODBkY2MgMHhmNzAwNWRkMiAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIsIG1ldGhvZCAiY29uZmlndXJlX21hcmtldChieXRlW10sdWludDY0LHVpbnQ2NClzdHJpbmciLCBtZXRob2QgIm9wZW5fbWFya2V0KClzdHJpbmciLCBtZXRob2QgImZyZWV6ZV9tYXJrZXQoKXN0cmluZyIsIG1ldGhvZCAiY2FuY2VsX21hcmtldCgpc3RyaW5nIiwgbWV0aG9kICJiZXRfeWVzKHVpbnQ2NClzdHJpbmciLCBtZXRob2QgImJldF9ubyh1aW50NjQpc3RyaW5nIiwgbWV0aG9kICJyZXNvbHZlX21hcmtldCh1aW50NjQpc3RyaW5nIiwgbWV0aG9kICJjbGFpbV9wYXlvdXQoKXN0cmluZyIsIG1ldGhvZCAiY2xhaW1fcmVmdW5kKClzdHJpbmciLCBtZXRob2QgImdldF9tYXJrZXRfbWV0YSgpc3RyaW5nIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlIGNvbmZpZ3VyZV9tYXJrZXQgb3Blbl9tYXJrZXQgZnJlZXplX21hcmtldCBjYW5jZWxfbWFya2V0IGJldF95ZXMgYmV0X25vIHJlc29sdmVfbWFya2V0IGNsYWltX3BheW91dCBjbGFpbV9yZWZ1bmQgZ2V0X21hcmtldF9tZXRhCiAgICBlcnIKCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMwCiAgICAvLyBleHBvcnQgY2xhc3MgQXVndXJpb25NYXJrZXRWNCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gcHV5YS10czo6aXRvYShpOiB1aW50NjQpIC0+IGJ5dGVzOgppdG9hOgogICAgcHJvdG8gMSAxCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIDwKICAgIGJ6IGl0b2FfZWxzZV9ib2R5QDIKICAgIGJ5dGVjIDE0IC8vIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzCiAgICByZXRzdWIKCml0b2FfZWxzZV9ib2R5QDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIC8KICAgIGNhbGxzdWIgaXRvYQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICAlCiAgICBieXRlYyAxNCAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozNQogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pIC8vIFBFTkRJTkcKICAgIGJ5dGVjXzAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMjUKICAgIC8vIHRoaXMuc3RhdHVzLnZhbHVlID0gVWludDY0KDApIC8vIFBFTkRJTkcKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjM4CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBUeG4uc2VuZGVyIH0pIC8vIHNldCBkdXJpbmcgY3JlYXRlCiAgICBieXRlYyAxMCAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTI2CiAgICAvLyB0aGlzLmFkbWluLnZhbHVlID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo0MQogICAgLy8gb3V0Y29tZVJlZiA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlYyA1IC8vICJvdXRjb21lUmVmIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjEyOAogICAgLy8gdGhpcy5vdXRjb21lUmVmLnZhbHVlID0gQnl0ZXMoJycpCiAgICBieXRlY18yIC8vICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ0CiAgICAvLyBleHBpcnlSb3VuZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWNfMyAvLyAiZXhwaXJ5Um91bmQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTI5CiAgICAvLyB0aGlzLmV4cGlyeVJvdW5kLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo0NwogICAgLy8geWVzVG90YWwgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDYgLy8gInllc1RvdGFsIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjEzMQogICAgLy8gdGhpcy55ZXNUb3RhbC52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDgKICAgIC8vIG5vVG90YWwgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDcgLy8gIm5vVG90YWwiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTMyCiAgICAvLyB0aGlzLm5vVG90YWwudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ5CiAgICAvLyB0b3RhbEJldHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDQgLy8gInRvdGFsQmV0cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMzMKICAgIC8vIHRoaXMudG90YWxCZXRzLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo1MgogICAgLy8gZmVlQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA4IC8vICJmZWVCcHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTM1CiAgICAvLyB0aGlzLmZlZUJwcy52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NTQKICAgIC8vIHdpbm5pbmdTaWRlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA5IC8vICJ3aW5uaW5nU2lkZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMzYKICAgIC8vIHRoaXMud2lubmluZ1NpZGUudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjU3CiAgICAvLyBjbGFpbVZlcnNpb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMikgfSkKICAgIGJ5dGVjIDEzIC8vICJjbGFpbVZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTM3CiAgICAvLyB0aGlzLmNsYWltVmVyc2lvbi52YWx1ZSA9IFVpbnQ2NCgyKQogICAgaW50Y18zIC8vIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTI0CiAgICAvLyBjcmVhdGUoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LmNvbmZpZ3VyZV9tYXJrZXRbcm91dGluZ10oKSAtPiB2b2lkOgpjb25maWd1cmVfbWFya2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE0NQogICAgLy8gY29uZmlndXJlX21hcmtldChvdXRjb21lUmVmOiBieXRlcywgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwgZmVlQnBzOiB1aW50NjQpOiBzdHJpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNDYKICAgIC8vIHRoaXMub25seUFkbWluKCkKICAgIGNhbGxzdWIgb25seUFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTQ3CiAgICAvLyBpZiAodGhpcy5zdGF0dXMudmFsdWUgIT09IFVpbnQ2NCgwKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozNQogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pIC8vIFBFTkRJTkcKICAgIGJ5dGVjXzAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNDcKICAgIC8vIGlmICh0aGlzLnN0YXR1cy52YWx1ZSAhPT0gVWludDY0KDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogY29uZmlndXJlX21hcmtldF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNDgKICAgIC8vIHJldHVybiAnQ2FuIG9ubHkgY29uZmlndXJlIHdoaWxlIFBFTkRJTkcnCiAgICBwdXNoYnl0ZXMgIkNhbiBvbmx5IGNvbmZpZ3VyZSB3aGlsZSBQRU5ESU5HIgoKY29uZmlndXJlX21hcmtldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5jb25maWd1cmVfbWFya2V0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTQ1CiAgICAvLyBjb25maWd1cmVfbWFya2V0KG91dGNvbWVSZWY6IGJ5dGVzLCBleHBpcnlSb3VuZDogdWludDY0LCBmZWVCcHM6IHVpbnQ2NCk6IHN0cmluZyB7CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29uZmlndXJlX21hcmtldF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTUxCiAgICAvLyBpZiAoZXhwaXJ5Um91bmQgIT09IFVpbnQ2NCgwKSkgewogICAgZGlnIDEKICAgIGJ6IGNvbmZpZ3VyZV9tYXJrZXRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTUyCiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDwgZXhwaXJ5Um91bmQsICdFeHBpcnkgbXVzdCBiZSBpbiB0aGUgZnV0dXJlJykKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDIKICAgIDwKICAgIGFzc2VydCAvLyBFeHBpcnkgbXVzdCBiZSBpbiB0aGUgZnV0dXJlCgpjb25maWd1cmVfbWFya2V0X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo0MQogICAgLy8gb3V0Y29tZVJlZiA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlYyA1IC8vICJvdXRjb21lUmVmIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE1NQogICAgLy8gdGhpcy5vdXRjb21lUmVmLnZhbHVlID0gb3V0Y29tZVJlZgogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDQKICAgIC8vIGV4cGlyeVJvdW5kID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJleHBpcnlSb3VuZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNTYKICAgIC8vIHRoaXMuZXhwaXJ5Um91bmQudmFsdWUgPSBleHBpcnlSb3VuZAogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NTIKICAgIC8vIGZlZUJwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgOCAvLyAiZmVlQnBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE1NwogICAgLy8gdGhpcy5mZWVCcHMudmFsdWUgPSBmZWVCcHMKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE1OQogICAgLy8gcmV0dXJuICdNYXJrZXQgY29uZmlndXJlZCcKICAgIHB1c2hieXRlcyAiTWFya2V0IGNvbmZpZ3VyZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTQ1CiAgICAvLyBjb25maWd1cmVfbWFya2V0KG91dGNvbWVSZWY6IGJ5dGVzLCBleHBpcnlSb3VuZDogdWludDY0LCBmZWVCcHM6IHVpbnQ2NCk6IHN0cmluZyB7CiAgICBiIGNvbmZpZ3VyZV9tYXJrZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY29uZmlndXJlX21hcmtldEA2CgoKLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0Lm9wZW5fbWFya2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3Blbl9tYXJrZXQ6CiAgICBieXRlY18yIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTYzCiAgICAvLyB0aGlzLm9ubHlBZG1pbigpCiAgICBjYWxsc3ViIG9ubHlBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE2NAogICAgLy8gaWYgKHRoaXMuc3RhdHVzLnZhbHVlICE9PSBVaW50NjQoMCkpIHJldHVybiAnTWFya2V0IG11c3QgYmUgUEVORElORyB0byBvcGVuJwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozNQogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pIC8vIFBFTkRJTkcKICAgIGJ5dGVjXzAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNjQKICAgIC8vIGlmICh0aGlzLnN0YXR1cy52YWx1ZSAhPT0gVWludDY0KDApKSByZXR1cm4gJ01hcmtldCBtdXN0IGJlIFBFTkRJTkcgdG8gb3BlbicKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBvcGVuX21hcmtldF9hZnRlcl9pZl9lbHNlQDMKICAgIHB1c2hieXRlcyAiTWFya2V0IG11c3QgYmUgUEVORElORyB0byBvcGVuIgoKb3Blbl9tYXJrZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQub3Blbl9tYXJrZXRAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNjIKICAgIC8vIG9wZW5fbWFya2V0KCk6IHN0cmluZyB7CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKb3Blbl9tYXJrZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE2NQogICAgLy8gaWYgKHRoaXMub3V0Y29tZVJlZi52YWx1ZSA9PT0gQnl0ZXMoJycpKSByZXR1cm4gJ091dGNvbWVSZWYgcmVxdWlyZWQnCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQxCiAgICAvLyBvdXRjb21lUmVmID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjIDUgLy8gIm91dGNvbWVSZWYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTY1CiAgICAvLyBpZiAodGhpcy5vdXRjb21lUmVmLnZhbHVlID09PSBCeXRlcygnJykpIHJldHVybiAnT3V0Y29tZVJlZiByZXF1aXJlZCcKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18yIC8vICIiCiAgICA9PQogICAgYnogb3Blbl9tYXJrZXRfYWZ0ZXJfaWZfZWxzZUA1CiAgICBwdXNoYnl0ZXMgIk91dGNvbWVSZWYgcmVxdWlyZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTYyCiAgICAvLyBvcGVuX21hcmtldCgpOiBzdHJpbmcgewogICAgYiBvcGVuX21hcmtldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5vcGVuX21hcmtldEA4CgpvcGVuX21hcmtldF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTY4CiAgICAvLyBjb25zdCBleHAgPSB0aGlzLmV4cGlyeVJvdW5kLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ0CiAgICAvLyBleHBpcnlSb3VuZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWNfMyAvLyAiZXhwaXJ5Um91bmQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTY4CiAgICAvLyBjb25zdCBleHAgPSB0aGlzLmV4cGlyeVJvdW5kLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDMKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNjkKICAgIC8vIGlmIChleHAgIT09IFVpbnQ2NCgwKSkgewogICAgYnogb3Blbl9tYXJrZXRfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTcwCiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDwgZXhwLCAnTWFya2V0IGV4cGlyZWQgYmVmb3JlIG9wZW4nKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIE1hcmtldCBleHBpcmVkIGJlZm9yZSBvcGVuCgpvcGVuX21hcmtldF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzUKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KSAvLyBQRU5ESU5HCiAgICBieXRlY18wIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTczCiAgICAvLyB0aGlzLnN0YXR1cy52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTc0CiAgICAvLyByZXR1cm4gJ01hcmtldCBvcGVuZWQnCiAgICBwdXNoYnl0ZXMgIk1hcmtldCBvcGVuZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTYyCiAgICAvLyBvcGVuX21hcmtldCgpOiBzdHJpbmcgewogICAgYiBvcGVuX21hcmtldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5vcGVuX21hcmtldEA4CgoKLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LmZyZWV6ZV9tYXJrZXRbcm91dGluZ10oKSAtPiB2b2lkOgpmcmVlemVfbWFya2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE3OAogICAgLy8gdGhpcy5vbmx5QWRtaW4oKQogICAgY2FsbHN1YiBvbmx5QWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNzkKICAgIC8vIGlmICh0aGlzLnN0YXR1cy52YWx1ZSAhPT0gVWludDY0KDEpKSByZXR1cm4gJ01hcmtldCBtdXN0IGJlIE9QRU4gdG8gZnJlZXplJwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozNQogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pIC8vIFBFTkRJTkcKICAgIGJ5dGVjXzAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNzkKICAgIC8vIGlmICh0aGlzLnN0YXR1cy52YWx1ZSAhPT0gVWludDY0KDEpKSByZXR1cm4gJ01hcmtldCBtdXN0IGJlIE9QRU4gdG8gZnJlZXplJwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAhPQogICAgYnogZnJlZXplX21hcmtldF9hZnRlcl9pZl9lbHNlQDMKICAgIHB1c2hieXRlcyAiTWFya2V0IG11c3QgYmUgT1BFTiB0byBmcmVlemUiCgpmcmVlemVfbWFya2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LmZyZWV6ZV9tYXJrZXRANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNzcKICAgIC8vIGZyZWV6ZV9tYXJrZXQoKTogc3RyaW5nIHsKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmcmVlemVfbWFya2V0X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozNQogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pIC8vIFBFTkRJTkcKICAgIGJ5dGVjXzAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxODAKICAgIC8vIHRoaXMuc3RhdHVzLnZhbHVlID0gVWludDY0KDIpCiAgICBpbnRjXzMgLy8gMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxODEKICAgIC8vIHJldHVybiAnTWFya2V0IGZyb3plbicKICAgIHB1c2hieXRlcyAiTWFya2V0IGZyb3plbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxNzcKICAgIC8vIGZyZWV6ZV9tYXJrZXQoKTogc3RyaW5nIHsKICAgIGIgZnJlZXplX21hcmtldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5mcmVlemVfbWFya2V0QDQKCgovLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY2FuY2VsX21hcmtldFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNhbmNlbF9tYXJrZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTg1CiAgICAvLyB0aGlzLm9ubHlBZG1pbigpCiAgICBjYWxsc3ViIG9ubHlBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE4NgogICAgLy8gaWYgKHRoaXMuc3RhdHVzLnZhbHVlID09PSBVaW50NjQoMykpIHJldHVybiAnQWxyZWFkeSByZXNvbHZlZCcKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzUKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KSAvLyBQRU5ESU5HCiAgICBieXRlY18wIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTg2CiAgICAvLyBpZiAodGhpcy5zdGF0dXMudmFsdWUgPT09IFVpbnQ2NCgzKSkgcmV0dXJuICdBbHJlYWR5IHJlc29sdmVkJwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogY2FuY2VsX21hcmtldF9hZnRlcl9pZl9lbHNlQDMKICAgIHB1c2hieXRlcyAiQWxyZWFkeSByZXNvbHZlZCIKCmNhbmNlbF9tYXJrZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY2FuY2VsX21hcmtldEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE4NAogICAgLy8gY2FuY2VsX21hcmtldCgpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNhbmNlbF9tYXJrZXRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjM1CiAgICAvLyBzdGF0dXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkgLy8gUEVORElORwogICAgYnl0ZWNfMCAvLyAic3RhdHVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE4NwogICAgLy8gdGhpcy5zdGF0dXMudmFsdWUgPSBVaW50NjQoNCkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE4OAogICAgLy8gcmV0dXJuICdNYXJrZXQgY2FuY2VsbGVkJwogICAgcHVzaGJ5dGVzICJNYXJrZXQgY2FuY2VsbGVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE4NAogICAgLy8gY2FuY2VsX21hcmtldCgpOiBzdHJpbmcgewogICAgYiBjYW5jZWxfbWFya2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LmNhbmNlbF9tYXJrZXRANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5iZXRfeWVzW3JvdXRpbmddKCkgLT4gdm9pZDoKYmV0X3llczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxOTUKICAgIC8vIGJldF95ZXMoYW1vdW50OiB1aW50NjQpOiBzdHJpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE5NgogICAgLy8gdGhpcy5hc3NlcnRPcGVuQW5kTm90RXhwaXJlZCgpCiAgICBjYWxsc3ViIGFzc2VydE9wZW5BbmROb3RFeHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTk3CiAgICAvLyB0aGlzLmFzc2VydEdyb3VwZWRBbGdvUGF5bWVudChhbW91bnQpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0R3JvdXBlZEFsZ29QYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTk5CiAgICAvLyB0aGlzLnllc1RvdGFsLnZhbHVlID0gdGhpcy55ZXNUb3RhbC52YWx1ZSArIGFtb3VudAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo0NwogICAgLy8geWVzVG90YWwgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDYgLy8gInllc1RvdGFsIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE5OQogICAgLy8gdGhpcy55ZXNUb3RhbC52YWx1ZSA9IHRoaXMueWVzVG90YWwudmFsdWUgKyBhbW91bnQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ3CiAgICAvLyB5ZXNUb3RhbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgNiAvLyAieWVzVG90YWwiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTk5CiAgICAvLyB0aGlzLnllc1RvdGFsLnZhbHVlID0gdGhpcy55ZXNUb3RhbC52YWx1ZSArIGFtb3VudAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMDAKICAgIC8vIHRoaXMudG90YWxCZXRzLnZhbHVlID0gdGhpcy50b3RhbEJldHMudmFsdWUgKyBhbW91bnQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDkKICAgIC8vIHRvdGFsQmV0cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgNCAvLyAidG90YWxCZXRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIwMAogICAgLy8gdGhpcy50b3RhbEJldHMudmFsdWUgPSB0aGlzLnRvdGFsQmV0cy52YWx1ZSArIGFtb3VudAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDkKICAgIC8vIHRvdGFsQmV0cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgNCAvLyAidG90YWxCZXRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIwMAogICAgLy8gdGhpcy50b3RhbEJldHMudmFsdWUgPSB0aGlzLnRvdGFsQmV0cy52YWx1ZSArIGFtb3VudAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo2MwogICAgLy8geWVzQmV0ID0gQm94TWFwPEFjY291bnQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IEJ5dGVzKCd5ZXM6JykgfSkKICAgIGJ5dGVjIDExIC8vICJ5ZXM6IgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIwMgogICAgLy8gY29uc3Qgc2VuZGVyS2V5ID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjYzCiAgICAvLyB5ZXNCZXQgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogQnl0ZXMoJ3llczonKSB9KQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjA0CiAgICAvLyB1c2VyWWVzQm94LmNyZWF0ZSh7IHNpemU6IFVpbnQ2NCg4KSB9KQogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjA1CiAgICAvLyBjb25zdCBjdXJyZW50WWVzOiB1aW50NjQgPSB1c2VyWWVzQm94LmdldCh7IGRlZmF1bHQ6IFVpbnQ2NCgwKSB9KQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMDYKICAgIC8vIHVzZXJZZXNCb3gudmFsdWUgPSBjdXJyZW50WWVzICsgYW1vdW50CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIwOAogICAgLy8gcmV0dXJuIGBZRVMgYmV0IHJlZ2lzdGVyZWQ6ICR7YW1vdW50fWAKICAgIGNhbGxzdWIgaXRvYQogICAgcHVzaGJ5dGVzICJZRVMgYmV0IHJlZ2lzdGVyZWQ6ICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjE5NQogICAgLy8gYmV0X3llcyhhbW91bnQ6IHVpbnQ2NCk6IHN0cmluZyB7CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5iZXRfbm9bcm91dGluZ10oKSAtPiB2b2lkOgpiZXRfbm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjExCiAgICAvLyBiZXRfbm8oYW1vdW50OiB1aW50NjQpOiBzdHJpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIxMgogICAgLy8gdGhpcy5hc3NlcnRPcGVuQW5kTm90RXhwaXJlZCgpCiAgICBjYWxsc3ViIGFzc2VydE9wZW5BbmROb3RFeHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjEzCiAgICAvLyB0aGlzLmFzc2VydEdyb3VwZWRBbGdvUGF5bWVudChhbW91bnQpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0R3JvdXBlZEFsZ29QYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjE1CiAgICAvLyB0aGlzLm5vVG90YWwudmFsdWUgPSB0aGlzLm5vVG90YWwudmFsdWUgKyBhbW91bnQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDgKICAgIC8vIG5vVG90YWwgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDcgLy8gIm5vVG90YWwiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjE1CiAgICAvLyB0aGlzLm5vVG90YWwudmFsdWUgPSB0aGlzLm5vVG90YWwudmFsdWUgKyBhbW91bnQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ4CiAgICAvLyBub1RvdGFsID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA3IC8vICJub1RvdGFsIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIxNQogICAgLy8gdGhpcy5ub1RvdGFsLnZhbHVlID0gdGhpcy5ub1RvdGFsLnZhbHVlICsgYW1vdW50CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIxNgogICAgLy8gdGhpcy50b3RhbEJldHMudmFsdWUgPSB0aGlzLnRvdGFsQmV0cy52YWx1ZSArIGFtb3VudAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo0OQogICAgLy8gdG90YWxCZXRzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA0IC8vICJ0b3RhbEJldHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjE2CiAgICAvLyB0aGlzLnRvdGFsQmV0cy52YWx1ZSA9IHRoaXMudG90YWxCZXRzLnZhbHVlICsgYW1vdW50CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo0OQogICAgLy8gdG90YWxCZXRzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA0IC8vICJ0b3RhbEJldHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjE2CiAgICAvLyB0aGlzLnRvdGFsQmV0cy52YWx1ZSA9IHRoaXMudG90YWxCZXRzLnZhbHVlICsgYW1vdW50CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjY0CiAgICAvLyBub0JldCA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBCeXRlcygnbm86JykgfSkKICAgIGJ5dGVjIDEyIC8vICJubzoiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjE4CiAgICAvLyBjb25zdCBzZW5kZXJLZXkgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NjQKICAgIC8vIG5vQmV0ID0gQm94TWFwPEFjY291bnQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IEJ5dGVzKCdubzonKSB9KQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjIwCiAgICAvLyB1c2VyTm9Cb3guY3JlYXRlKHsgc2l6ZTogVWludDY0KDgpIH0pCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMjEKICAgIC8vIGNvbnN0IGN1cnJlbnRObzogdWludDY0ID0gdXNlck5vQm94LmdldCh7IGRlZmF1bHQ6IFVpbnQ2NCgwKSB9KQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMjIKICAgIC8vIHVzZXJOb0JveC52YWx1ZSA9IGN1cnJlbnRObyArIGFtb3VudAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMjQKICAgIC8vIHJldHVybiBgTk8gYmV0IHJlZ2lzdGVyZWQ6ICR7YW1vdW50fWAKICAgIGNhbGxzdWIgaXRvYQogICAgcHVzaGJ5dGVzICJOTyBiZXQgcmVnaXN0ZXJlZDogIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjExCiAgICAvLyBiZXRfbm8oYW1vdW50OiB1aW50NjQpOiBzdHJpbmcgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQucmVzb2x2ZV9tYXJrZXRbcm91dGluZ10oKSAtPiB2b2lkOgpyZXNvbHZlX21hcmtldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMzUKICAgIC8vIHJlc29sdmVfbWFya2V0KHdpbm5pbmdTaWRlOiB1aW50NjQpOiBzdHJpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIzNgogICAgLy8gdGhpcy5vbmx5QWRtaW4oKQogICAgY2FsbHN1YiBvbmx5QWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMzgKICAgIC8vIGlmICh0aGlzLnN0YXR1cy52YWx1ZSAhPT0gVWludDY0KDIpICYmIHRoaXMuc3RhdHVzLnZhbHVlICE9PSBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzUKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KSAvLyBQRU5ESU5HCiAgICBieXRlY18wIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjM4CiAgICAvLyBpZiAodGhpcy5zdGF0dXMudmFsdWUgIT09IFVpbnQ2NCgyKSAmJiB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gVWludDY0KDEpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDIKICAgICE9CiAgICBieiByZXNvbHZlX21hcmtldF9hZnRlcl9pZl9lbHNlQDQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzUKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KSAvLyBQRU5ESU5HCiAgICBieXRlY18wIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjM4CiAgICAvLyBpZiAodGhpcy5zdGF0dXMudmFsdWUgIT09IFVpbnQ2NCgyKSAmJiB0aGlzLnN0YXR1cy52YWx1ZSAhPT0gVWludDY0KDEpKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiByZXNvbHZlX21hcmtldF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMzkKICAgIC8vIHJldHVybiAnTWFya2V0IG11c3QgYmUgT1BFTiBvciBGUk9aRU4gdG8gcmVzb2x2ZScKICAgIHB1c2hieXRlcyAiTWFya2V0IG11c3QgYmUgT1BFTiBvciBGUk9aRU4gdG8gcmVzb2x2ZSIKCnJlc29sdmVfbWFya2V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LnJlc29sdmVfbWFya2V0QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjIzNQogICAgLy8gcmVzb2x2ZV9tYXJrZXQod2lubmluZ1NpZGU6IHVpbnQ2NCk6IHN0cmluZyB7CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmVzb2x2ZV9tYXJrZXRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI0MgogICAgLy8gaWYgKHdpbm5pbmdTaWRlICE9PSBVaW50NjQoMSkgJiYgd2lubmluZ1NpZGUgIT09IFVpbnQ2NCgyKSkgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IHJlc29sdmVfbWFya2V0X2FmdGVyX2lmX2Vsc2VANwogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgIT0KICAgIGJ6IHJlc29sdmVfbWFya2V0X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI0MwogICAgLy8gcmV0dXJuICdJbnZhbGlkIHdpbm5pbmcgc2lkZScKICAgIHB1c2hieXRlcyAiSW52YWxpZCB3aW5uaW5nIHNpZGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjM1CiAgICAvLyByZXNvbHZlX21hcmtldCh3aW5uaW5nU2lkZTogdWludDY0KTogc3RyaW5nIHsKICAgIGIgcmVzb2x2ZV9tYXJrZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQucmVzb2x2ZV9tYXJrZXRAMTEKCnJlc29sdmVfbWFya2V0X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozNQogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pIC8vIFBFTkRJTkcKICAgIGJ5dGVjXzAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyNDYKICAgIC8vIHRoaXMuc3RhdHVzLnZhbHVlID0gVWludDY0KDMpCiAgICBwdXNoaW50IDMgLy8gMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo1NAogICAgLy8gd2lubmluZ1NpZGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDkgLy8gIndpbm5pbmdTaWRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI0NwogICAgLy8gdGhpcy53aW5uaW5nU2lkZS52YWx1ZSA9IHdpbm5pbmdTaWRlCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI0OQogICAgLy8gcmV0dXJuIHdpbm5pbmdTaWRlID09PSBVaW50NjQoMSkgPyAnUmVzb2x2ZWQ6IFlFUycgOiAnUmVzb2x2ZWQ6IE5PJwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiByZXNvbHZlX21hcmtldF90ZXJuYXJ5X2ZhbHNlQDkKICAgIHB1c2hieXRlcyAiUmVzb2x2ZWQ6IFlFUyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyMzUKICAgIC8vIHJlc29sdmVfbWFya2V0KHdpbm5pbmdTaWRlOiB1aW50NjQpOiBzdHJpbmcgewogICAgYiByZXNvbHZlX21hcmtldF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5yZXNvbHZlX21hcmtldEAxMQoKcmVzb2x2ZV9tYXJrZXRfdGVybmFyeV9mYWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI0OQogICAgLy8gcmV0dXJuIHdpbm5pbmdTaWRlID09PSBVaW50NjQoMSkgPyAnUmVzb2x2ZWQ6IFlFUycgOiAnUmVzb2x2ZWQ6IE5PJwogICAgcHVzaGJ5dGVzICJSZXNvbHZlZDogTk8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjM1CiAgICAvLyByZXNvbHZlX21hcmtldCh3aW5uaW5nU2lkZTogdWludDY0KTogc3RyaW5nIHsKICAgIGIgcmVzb2x2ZV9tYXJrZXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQucmVzb2x2ZV9tYXJrZXRAMTEKCgovLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY2xhaW1fcGF5b3V0W3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fcGF5b3V0OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjUzCiAgICAvLyBpZiAodGhpcy5zdGF0dXMudmFsdWUgIT09IFVpbnQ2NCgzKSkgcmV0dXJuICdNYXJrZXQgbm90IHJlc29sdmVkJwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozNQogICAgLy8gc3RhdHVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pIC8vIFBFTkRJTkcKICAgIGJ5dGVjXzAgLy8gInN0YXR1cyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyNTMKICAgIC8vIGlmICh0aGlzLnN0YXR1cy52YWx1ZSAhPT0gVWludDY0KDMpKSByZXR1cm4gJ01hcmtldCBub3QgcmVzb2x2ZWQnCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgICE9CiAgICBieiBjbGFpbV9wYXlvdXRfYWZ0ZXJfaWZfZWxzZUAzCiAgICBwdXNoYnl0ZXMgIk1hcmtldCBub3QgcmVzb2x2ZWQiCgpjbGFpbV9wYXlvdXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY2xhaW1fcGF5b3V0QDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI1MgogICAgLy8gY2xhaW1fcGF5b3V0KCk6IHN0cmluZyB7CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fcGF5b3V0X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyNTUKICAgIC8vIGNvbnN0IHdpbm5pbmc6IHVpbnQ2NCA9IHRoaXMud2lubmluZ1NpZGUudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NTQKICAgIC8vIHdpbm5pbmdTaWRlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA5IC8vICJ3aW5uaW5nU2lkZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyNTUKICAgIC8vIGNvbnN0IHdpbm5pbmc6IHVpbnQ2NCA9IHRoaXMud2lubmluZ1NpZGUudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBidXJ5IDMKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyNTYKICAgIC8vIGNvbnN0IHllc1RvdGFsVmFsOiB1aW50NjQgPSB0aGlzLnllc1RvdGFsLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ3CiAgICAvLyB5ZXNUb3RhbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgNiAvLyAieWVzVG90YWwiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjU2CiAgICAvLyBjb25zdCB5ZXNUb3RhbFZhbDogdWludDY0ID0gdGhpcy55ZXNUb3RhbC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjU3CiAgICAvLyBjb25zdCBub1RvdGFsVmFsOiB1aW50NjQgPSB0aGlzLm5vVG90YWwudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDgKICAgIC8vIG5vVG90YWwgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDcgLy8gIm5vVG90YWwiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjU3CiAgICAvLyBjb25zdCBub1RvdGFsVmFsOiB1aW50NjQgPSB0aGlzLm5vVG90YWwudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI1OAogICAgLy8gY29uc3QgdG90YWxQb29sOiB1aW50NjQgPSB5ZXNUb3RhbFZhbCArIG5vVG90YWxWYWwKICAgICsKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI1OQogICAgLy8gY29uc3QgZmVlQnBzVmFsOiB1aW50NjQgPSB0aGlzLmZlZUJwcy52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo1MgogICAgLy8gZmVlQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA4IC8vICJmZWVCcHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjU5CiAgICAvLyBjb25zdCBmZWVCcHNWYWw6IHVpbnQ2NCA9IHRoaXMuZmVlQnBzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI2MQogICAgLy8gY29uc3Qgc2VuZGVyS2V5ID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NjUKICAgIC8vIGNsYWltZWQgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogQnl0ZXMoJ2NsYWltZWQ6JykgfSkKICAgIHB1c2hieXRlcyAiY2xhaW1lZDoiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI2NQogICAgLy8gY29uc3QgY2xhaW1lZE1heWJlID0gY2xhaW1lZEJveC5tYXliZSgpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBidXJ5IDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjY2CiAgICAvLyBjb25zdCBoYXNDbGFpbWVkID0gY2xhaW1lZE1heWJlWzFdID8gKGNsYWltZWRNYXliZVswXSBhcyB1aW50NjQpIDogVWludDY0KDApCiAgICBieiBjbGFpbV9wYXlvdXRfdGVybmFyeV9mYWxzZUA1CiAgICBkaWcgOQoKY2xhaW1fcGF5b3V0X3Rlcm5hcnlfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyNjcKICAgIC8vIGlmIChoYXNDbGFpbWVkID09PSBVaW50NjQoMSkpIHJldHVybiAnQWxyZWFkeSBjbGFpbWVkJwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBjbGFpbV9wYXlvdXRfYWZ0ZXJfaWZfZWxzZUA4CiAgICBwdXNoYnl0ZXMgIkFscmVhZHkgY2xhaW1lZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyNTIKICAgIC8vIGNsYWltX3BheW91dCgpOiBzdHJpbmcgewogICAgYiBjbGFpbV9wYXlvdXRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY2xhaW1fcGF5b3V0QDI2CgpjbGFpbV9wYXlvdXRfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI3MwogICAgLy8gaWYgKHdpbm5pbmcgPT09IFVpbnQ2NCgxKSkgewogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogY2xhaW1fcGF5b3V0X2Vsc2VfYm9keUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjYzCiAgICAvLyB5ZXNCZXQgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogQnl0ZXMoJ3llczonKSB9KQogICAgYnl0ZWMgMTEgLy8gInllczoiCiAgICBkaWcgMTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI3NQogICAgLy8gY29uc3QgbWF5YmUgPSBiLm1heWJlKCkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI3NgogICAgLy8gdXNlcldpbm5pbmdCZXQgPSBtYXliZVsxXSA/IChtYXliZVswXSBhcyB1aW50NjQpIDogVWludDY0KDApCiAgICBieiBjbGFpbV9wYXlvdXRfdGVybmFyeV9mYWxzZUAxMQogICAgZGlnIDcKICAgIGJ1cnkgMwoKY2xhaW1fcGF5b3V0X3Rlcm5hcnlfbWVyZ2VAMTI6CiAgICBkdXAKICAgIGJ1cnkgNAoKY2xhaW1fcGF5b3V0X2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6Mjg3CiAgICAvLyBpZiAodXNlcldpbm5pbmdCZXQgPT09IFVpbnQ2NCgwKSkgcmV0dXJuICdOb3RoaW5nIHRvIGNsYWltJwogICAgZGlnIDIKICAgIGJueiBjbGFpbV9wYXlvdXRfYWZ0ZXJfaWZfZWxzZUAyMgogICAgcHVzaGJ5dGVzICJOb3RoaW5nIHRvIGNsYWltIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI1MgogICAgLy8gY2xhaW1fcGF5b3V0KCk6IHN0cmluZyB7CiAgICBiIGNsYWltX3BheW91dF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5jbGFpbV9wYXlvdXRAMjYKCmNsYWltX3BheW91dF9hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI4OAogICAgLy8gaWYgKHRvdGFsV2lubmluZ1NpZGUgPT09IFVpbnQ2NCgwKSkgcmV0dXJuICdJbnZhbGlkIHRvdGFscycKICAgIGRpZyAzCiAgICBibnogY2xhaW1fcGF5b3V0X2FmdGVyX2lmX2Vsc2VAMjQKICAgIHB1c2hieXRlcyAiSW52YWxpZCB0b3RhbHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjUyCiAgICAvLyBjbGFpbV9wYXlvdXQoKTogc3RyaW5nIHsKICAgIGIgY2xhaW1fcGF5b3V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LmNsYWltX3BheW91dEAyNgoKY2xhaW1fcGF5b3V0X2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjkxCiAgICAvLyBjb25zdCBmZWVBbW91bnQ6IHVpbnQ2NCA9ICh0b3RhbFBvb2wgKiBmZWVCcHNWYWwpIC8gVWludDY0KDEwXzAwMCkKICAgIGRpZyA0CiAgICBkdXAKICAgIGRpZyAxMAogICAgKgogICAgcHVzaGludCAxMDAwMCAvLyAxMDAwMAogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI5MgogICAgLy8gY29uc3QgcGF5b3V0UG9vbDogdWludDY0ID0gdG90YWxQb29sIC0gZmVlQW1vdW50CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6Mjk1CiAgICAvLyBjb25zdCBudW1lcmF0b3I6IHVpbnQ2NCA9IHBheW91dFBvb2wgKiB1c2VyV2lubmluZ0JldAogICAgZGlnIDMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyOTYKICAgIC8vIGNvbnN0IHVzZXJTaGFyZTogdWludDY0ID0gbnVtZXJhdG9yIC8gdG90YWxXaW5uaW5nU2lkZQogICAgZGlnIDQKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyOTkKICAgIC8vIGNsYWltZWRCb3guY3JlYXRlKHsgc2l6ZTogVWludDY0KDgpIH0pCiAgICBkaWcgMTIKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMwMAogICAgLy8gY2xhaW1lZEJveC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozMDIKICAgIC8vIGl0eG4ucGF5bWVudCh7IHJlY2VpdmVyOiBUeG4uc2VuZGVyLCBhbW91bnQ6IHVzZXJTaGFyZSB9KS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMwNAogICAgLy8gcmV0dXJuIGBQYWlkICR7dXNlclNoYXJlfWAKICAgIGNhbGxzdWIgaXRvYQogICAgcHVzaGJ5dGVzICJQYWlkICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI1MgogICAgLy8gY2xhaW1fcGF5b3V0KCk6IHN0cmluZyB7CiAgICBiIGNsYWltX3BheW91dF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5jbGFpbV9wYXlvdXRAMjYKCmNsYWltX3BheW91dF90ZXJuYXJ5X2ZhbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI3NgogICAgLy8gdXNlcldpbm5pbmdCZXQgPSBtYXliZVsxXSA/IChtYXliZVswXSBhcyB1aW50NjQpIDogVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAzCiAgICBiIGNsYWltX3BheW91dF90ZXJuYXJ5X21lcmdlQDEyCgpjbGFpbV9wYXlvdXRfZWxzZV9ib2R5QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjI3OAogICAgLy8gfSBlbHNlIGlmICh3aW5uaW5nID09PSBVaW50NjQoMikpIHsKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IGNsYWltX3BheW91dF9lbHNlX2JvZHlAMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo2NAogICAgLy8gbm9CZXQgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogQnl0ZXMoJ25vOicpIH0pCiAgICBieXRlYyAxMiAvLyAibm86IgogICAgZGlnIDExCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyODAKICAgIC8vIGNvbnN0IG1heWJlID0gYi5tYXliZSgpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyODEKICAgIC8vIHVzZXJXaW5uaW5nQmV0ID0gbWF5YmVbMV0gPyAobWF5YmVbMF0gYXMgdWludDY0KSA6IFVpbnQ2NCgwKQogICAgYnogY2xhaW1fcGF5b3V0X3Rlcm5hcnlfZmFsc2VAMTYKICAgIGRpZyA2CiAgICBidXJ5IDMKCmNsYWltX3BheW91dF90ZXJuYXJ5X21lcmdlQDE3OgogICAgZGlnIDUKICAgIGJ1cnkgNAogICAgYiBjbGFpbV9wYXlvdXRfYWZ0ZXJfaWZfZWxzZUAyMAoKY2xhaW1fcGF5b3V0X3Rlcm5hcnlfZmFsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjgxCiAgICAvLyB1c2VyV2lubmluZ0JldCA9IG1heWJlWzFdID8gKG1heWJlWzBdIGFzIHVpbnQ2NCkgOiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDMKICAgIGIgY2xhaW1fcGF5b3V0X3Rlcm5hcnlfbWVyZ2VAMTcKCmNsYWltX3BheW91dF9lbHNlX2JvZHlAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6Mjg0CiAgICAvLyByZXR1cm4gJ05vIHdpbm5pbmcgc2lkZSBzZXQnCiAgICBwdXNoYnl0ZXMgIk5vIHdpbm5pbmcgc2lkZSBzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MjUyCiAgICAvLyBjbGFpbV9wYXlvdXQoKTogc3RyaW5nIHsKICAgIGIgY2xhaW1fcGF5b3V0X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LmNsYWltX3BheW91dEAyNgoKY2xhaW1fcGF5b3V0X3Rlcm5hcnlfZmFsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoyNjYKICAgIC8vIGNvbnN0IGhhc0NsYWltZWQgPSBjbGFpbWVkTWF5YmVbMV0gPyAoY2xhaW1lZE1heWJlWzBdIGFzIHVpbnQ2NCkgOiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX3BheW91dF90ZXJuYXJ5X21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY2xhaW1fcmVmdW5kW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fcmVmdW5kOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzExCiAgICAvLyBpZiAodGhpcy5zdGF0dXMudmFsdWUgIT09IFVpbnQ2NCg0KSkgcmV0dXJuICdNYXJrZXQgbm90IGNhbmNlbGxlZCcKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzUKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KSAvLyBQRU5ESU5HCiAgICBieXRlY18wIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzExCiAgICAvLyBpZiAodGhpcy5zdGF0dXMudmFsdWUgIT09IFVpbnQ2NCg0KSkgcmV0dXJuICdNYXJrZXQgbm90IGNhbmNlbGxlZCcKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgIT0KICAgIGJ6IGNsYWltX3JlZnVuZF9hZnRlcl9pZl9lbHNlQDMKICAgIHB1c2hieXRlcyAiTWFya2V0IG5vdCBjYW5jZWxsZWQiCgpjbGFpbV9yZWZ1bmRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY2xhaW1fcmVmdW5kQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMxMAogICAgLy8gY2xhaW1fcmVmdW5kKCk6IHN0cmluZyB7CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2xhaW1fcmVmdW5kX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozMTMKICAgIC8vIGNvbnN0IHNlbmRlcktleSA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NjYKICAgIC8vIHJlZnVuZGVkID0gQm94TWFwPEFjY291bnQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6IEJ5dGVzKCdyZWZ1bmRlZDonKSB9KQogICAgcHVzaGJ5dGVzICJyZWZ1bmRlZDoiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzE3CiAgICAvLyBjb25zdCBybSA9IHIubWF5YmUoKQogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzE4CiAgICAvLyBjb25zdCBhbHJlYWR5ID0gcm1bMV0gPyAocm1bMF0gYXMgdWludDY0KSA6IFVpbnQ2NCgwKQogICAgYnogY2xhaW1fcmVmdW5kX3Rlcm5hcnlfZmFsc2VANQogICAgZGlnIDIKCmNsYWltX3JlZnVuZF90ZXJuYXJ5X21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzE5CiAgICAvLyBpZiAoYWxyZWFkeSA9PT0gVWludDY0KDEpKSByZXR1cm4gJ0FscmVhZHkgcmVmdW5kZWQnCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IGNsYWltX3JlZnVuZF9hZnRlcl9pZl9lbHNlQDgKICAgIHB1c2hieXRlcyAiQWxyZWFkeSByZWZ1bmRlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozMTAKICAgIC8vIGNsYWltX3JlZnVuZCgpOiBzdHJpbmcgewogICAgYiBjbGFpbV9yZWZ1bmRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuY2xhaW1fcmVmdW5kQDE4CgpjbGFpbV9yZWZ1bmRfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjYzCiAgICAvLyB5ZXNCZXQgPSBCb3hNYXA8QWNjb3VudCwgdWludDY0Pih7IGtleVByZWZpeDogQnl0ZXMoJ3llczonKSB9KQogICAgYnl0ZWMgMTEgLy8gInllczoiCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozMjEKICAgIC8vIGNvbnN0IHkgPSB0aGlzLnllc0JldChzZW5kZXJLZXkpLm1heWJlKCkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjY0CiAgICAvLyBub0JldCA9IEJveE1hcDxBY2NvdW50LCB1aW50NjQ+KHsga2V5UHJlZml4OiBCeXRlcygnbm86JykgfSkKICAgIGJ5dGVjIDEyIC8vICJubzoiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMyMgogICAgLy8gY29uc3QgbiA9IHRoaXMubm9CZXQoc2VuZGVyS2V5KS5tYXliZSgpCiAgICBib3hfZ2V0CiAgICBidXJ5IDcKICAgIGJ0b2kKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMyMwogICAgLy8gY29uc3QgeWVzQW10OiB1aW50NjQgPSB5WzFdID8gKHlbMF0gYXMgdWludDY0KSA6IFVpbnQ2NCgwKQogICAgYnogY2xhaW1fcmVmdW5kX3Rlcm5hcnlfZmFsc2VAMTAKICAgIGRpZyAxCiAgICBidXJ5IDEKCmNsYWltX3JlZnVuZF90ZXJuYXJ5X21lcmdlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMyNAogICAgLy8gY29uc3Qgbm9BbXQ6IHVpbnQ2NCA9IG5bMV0gPyAoblswXSBhcyB1aW50NjQpIDogVWludDY0KDApCiAgICBkaWcgNAogICAgYnogY2xhaW1fcmVmdW5kX3Rlcm5hcnlfZmFsc2VAMTMKICAgIGRpZyA1CgpjbGFpbV9yZWZ1bmRfdGVybmFyeV9tZXJnZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozMjYKICAgIC8vIGNvbnN0IHJlZnVuZEFtdDogdWludDY0ID0geWVzQW10ICsgbm9BbXQKICAgIGRpZyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMyNwogICAgLy8gaWYgKHJlZnVuZEFtdCA9PT0gVWludDY0KDApKSByZXR1cm4gJ05vdGhpbmcgdG8gcmVmdW5kJwogICAgYm56IGNsYWltX3JlZnVuZF9hZnRlcl9pZl9lbHNlQDE2CiAgICBwdXNoYnl0ZXMgIk5vdGhpbmcgdG8gcmVmdW5kIgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMxMAogICAgLy8gY2xhaW1fcmVmdW5kKCk6IHN0cmluZyB7CiAgICBiIGNsYWltX3JlZnVuZF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5jbGFpbV9yZWZ1bmRAMTgKCmNsYWltX3JlZnVuZF9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMyOQogICAgLy8gci5jcmVhdGUoeyBzaXplOiBVaW50NjQoOCkgfSkKICAgIGRpZyA3CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozMzAKICAgIC8vIHIudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzMyCiAgICAvLyBpdHhuLnBheW1lbnQoeyByZWNlaXZlcjogVHhuLnNlbmRlciwgYW1vdW50OiByZWZ1bmRBbXQgfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjMzNAogICAgLy8gcmV0dXJuIGBSZWZ1bmRlZCAke3JlZnVuZEFtdH1gCiAgICBjYWxsc3ViIGl0b2EKICAgIHB1c2hieXRlcyAiUmVmdW5kZWQgIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzEwCiAgICAvLyBjbGFpbV9yZWZ1bmQoKTogc3RyaW5nIHsKICAgIGIgY2xhaW1fcmVmdW5kX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjpBdWd1cmlvbk1hcmtldFY0LmNsYWltX3JlZnVuZEAxOAoKY2xhaW1fcmVmdW5kX3Rlcm5hcnlfZmFsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzI0CiAgICAvLyBjb25zdCBub0FtdDogdWludDY0ID0gblsxXSA/IChuWzBdIGFzIHVpbnQ2NCkgOiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX3JlZnVuZF90ZXJuYXJ5X21lcmdlQDE0CgpjbGFpbV9yZWZ1bmRfdGVybmFyeV9mYWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozMjMKICAgIC8vIGNvbnN0IHllc0FtdDogdWludDY0ID0geVsxXSA/ICh5WzBdIGFzIHVpbnQ2NCkgOiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgY2xhaW1fcmVmdW5kX3Rlcm5hcnlfbWVyZ2VAMTEKCmNsYWltX3JlZnVuZF90ZXJuYXJ5X2ZhbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzE4CiAgICAvLyBjb25zdCBhbHJlYWR5ID0gcm1bMV0gPyAocm1bMF0gYXMgdWludDY0KSA6IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fcmVmdW5kX3Rlcm5hcnlfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5nZXRfbWFya2V0X21ldGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfbWFya2V0X21ldGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzQyCiAgICAvLyByZXR1cm4gYHN0YXR1cz0ke3RoaXMuc3RhdHVzLnZhbHVlfSwgb3V0Y29tZVJlZj0ke3RoaXMub3V0Y29tZVJlZi52YWx1ZX0sIGV4cGlyeVJvdW5kPSR7dGhpcy5leHBpcnlSb3VuZC52YWx1ZX0sIGZlZUJwcz0ke3RoaXMuZmVlQnBzLnZhbHVlfWAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzUKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KSAvLyBQRU5ESU5HCiAgICBieXRlY18wIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzQyCiAgICAvLyByZXR1cm4gYHN0YXR1cz0ke3RoaXMuc3RhdHVzLnZhbHVlfSwgb3V0Y29tZVJlZj0ke3RoaXMub3V0Y29tZVJlZi52YWx1ZX0sIGV4cGlyeVJvdW5kPSR7dGhpcy5leHBpcnlSb3VuZC52YWx1ZX0sIGZlZUJwcz0ke3RoaXMuZmVlQnBzLnZhbHVlfWAKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIHB1c2hieXRlcyAic3RhdHVzPSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICIsIG91dGNvbWVSZWY9IgogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQxCiAgICAvLyBvdXRjb21lUmVmID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjIDUgLy8gIm91dGNvbWVSZWYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzQyCiAgICAvLyByZXR1cm4gYHN0YXR1cz0ke3RoaXMuc3RhdHVzLnZhbHVlfSwgb3V0Y29tZVJlZj0ke3RoaXMub3V0Y29tZVJlZi52YWx1ZX0sIGV4cGlyeVJvdW5kPSR7dGhpcy5leHBpcnlSb3VuZC52YWx1ZX0sIGZlZUJwcz0ke3RoaXMuZmVlQnBzLnZhbHVlfWAKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAiLCBleHBpcnlSb3VuZD0iCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NDQKICAgIC8vIGV4cGlyeVJvdW5kID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJleHBpcnlSb3VuZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czozNDIKICAgIC8vIHJldHVybiBgc3RhdHVzPSR7dGhpcy5zdGF0dXMudmFsdWV9LCBvdXRjb21lUmVmPSR7dGhpcy5vdXRjb21lUmVmLnZhbHVlfSwgZXhwaXJ5Um91bmQ9JHt0aGlzLmV4cGlyeVJvdW5kLnZhbHVlfSwgZmVlQnBzPSR7dGhpcy5mZWVCcHMudmFsdWV9YAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGNhbGxzdWIgaXRvYQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgIiwgZmVlQnBzPSIKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo1MgogICAgLy8gZmVlQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA4IC8vICJmZWVCcHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzQyCiAgICAvLyByZXR1cm4gYHN0YXR1cz0ke3RoaXMuc3RhdHVzLnZhbHVlfSwgb3V0Y29tZVJlZj0ke3RoaXMub3V0Y29tZVJlZi52YWx1ZX0sIGV4cGlyeVJvdW5kPSR7dGhpcy5leHBpcnlSb3VuZC52YWx1ZX0sIGZlZUJwcz0ke3RoaXMuZmVlQnBzLnZhbHVlfWAKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjM0MQogICAgLy8gZ2V0X21hcmtldF9tZXRhKCk6IHN0cmluZyB7CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czo6QXVndXJpb25NYXJrZXRWNC5vbmx5QWRtaW4oKSAtPiB2b2lkOgpvbmx5QWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnT25seSBhZG1pbicpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjM4CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBUeG4uc2VuZGVyIH0pIC8vIHNldCBkdXJpbmcgY3JlYXRlCiAgICBieXRlYyAxMCAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6NzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnT25seSBhZG1pbicpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGFkbWluCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuYXNzZXJ0R3JvdXBlZEFsZ29QYXltZW50KGFtb3VudDogdWludDY0KSAtPiB2b2lkOgphc3NlcnRHcm91cGVkQWxnb1BheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OTcKICAgIC8vIHByaXZhdGUgYXNzZXJ0R3JvdXBlZEFsZ29QYXltZW50KGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMDEKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA9PT0gVWludDY0KDEpLCAnQXBwIGNhbGwgbXVzdCBiZSBzZWNvbmQgdHJhbnNhY3Rpb24gaW4gZ3JvdXAnKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEFwcCBjYWxsIG11c3QgYmUgc2Vjb25kIHRyYW5zYWN0aW9uIGluIGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTAzCiAgICAvLyBjb25zdCBwYXlUeG4gPSBndHhuLlBheW1lbnRUeG4oMCkKICAgIGludGNfMCAvLyAwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMDUKICAgIC8vIGFzc2VydChwYXlUeG4uc2VuZGVyID09PSBUeG4uc2VuZGVyLCAnUGF5bWVudCBzZW5kZXIgbWlzbWF0Y2gnKQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgc2VuZGVyIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTAzCiAgICAvLyBjb25zdCBwYXlUeG4gPSBndHhuLlBheW1lbnRUeG4oMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTA2CiAgICAvLyBhc3NlcnQocGF5VHhuLmFtb3VudCA9PT0gYW1vdW50LCAnUGF5bWVudCBhbW91bnQgbWlzbWF0Y2gnKQogICAgZ3R4bnMgQW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBhbW91bnQgbWlzbWF0Y2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMDMKICAgIC8vIGNvbnN0IHBheVR4biA9IGd0eG4uUGF5bWVudFR4bigwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMDcKICAgIC8vIGFzc2VydChwYXlUeG4ucmVjZWl2ZXIgPT09IHRoaXMuZ2V0QXBwQWRkcmVzcygpLCAnUGF5bWVudCBtdXN0IGdvIHRvIGFwcCBhZGRyZXNzJykKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6ODcKICAgIC8vIHJldHVybiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMDcKICAgIC8vIGFzc2VydChwYXlUeG4ucmVjZWl2ZXIgPT09IHRoaXMuZ2V0QXBwQWRkcmVzcygpLCAnUGF5bWVudCBtdXN0IGdvIHRvIGFwcCBhZGRyZXNzJykKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGdvIHRvIGFwcCBhZGRyZXNzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6OkF1Z3VyaW9uTWFya2V0VjQuYXNzZXJ0T3BlbkFuZE5vdEV4cGlyZWQoKSAtPiB2b2lkOgphc3NlcnRPcGVuQW5kTm90RXhwaXJlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMTAKICAgIC8vIHByaXZhdGUgYXNzZXJ0T3BlbkFuZE5vdEV4cGlyZWQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMTEKICAgIC8vIGFzc2VydCh0aGlzLnN0YXR1cy52YWx1ZSA9PT0gVWludDY0KDEpLCAnTWFya2V0IGlzIG5vdCBvcGVuJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MzUKICAgIC8vIHN0YXR1cyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KSAvLyBQRU5ESU5HCiAgICBieXRlY18wIC8vICJzdGF0dXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTExCiAgICAvLyBhc3NlcnQodGhpcy5zdGF0dXMudmFsdWUgPT09IFVpbnQ2NCgxKSwgJ01hcmtldCBpcyBub3Qgb3BlbicpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gTWFya2V0IGlzIG5vdCBvcGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTEzCiAgICAvLyBjb25zdCBleHAgPSB0aGlzLmV4cGlyeVJvdW5kLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2F1Z3VyaW9uX3YyL2NvbnRyYWN0cy5hbGdvLnRzOjQ0CiAgICAvLyBleHBpcnlSb3VuZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWNfMyAvLyAiZXhwaXJ5Um91bmQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTEzCiAgICAvLyBjb25zdCBleHAgPSB0aGlzLmV4cGlyeVJvdW5kLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdWd1cmlvbl92Mi9jb250cmFjdHMuYWxnby50czoxMTQKICAgIC8vIGlmIChleHAgIT09IFVpbnQ2NCgwKSkgewogICAgYnogYXNzZXJ0T3BlbkFuZE5vdEV4cGlyZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXVndXJpb25fdjIvY29udHJhY3RzLmFsZ28udHM6MTE1CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDwgZXhwLCAnTWFya2V0IGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYXNzZXJ0IC8vIE1hcmtldCBleHBpcmVkCgphc3NlcnRPcGVuQW5kTm90RXhwaXJlZF9hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAAEIAiYPBnN0YXR1cwQVH3x1AAtleHBpcnlSb3VuZAl0b3RhbEJldHMKb3V0Y29tZVJlZgh5ZXNUb3RhbAdub1RvdGFsBmZlZUJwcwt3aW5uaW5nU2lkZQVhZG1pbgR5ZXM6A25vOgxjbGFpbVZlcnNpb24KMDEyMzQ1Njc4OTEYQAAnKCJnJwoxAGcnBSpnKyJnJwYiZycHImcnBCJnJwgiZycJImcnDSVnMRtBAFwxGRREMRhEggsETFxhugRSl12bBIDX0KEEIrlzcgSJkJW4BKQhbAkEchgM4ATxPFXHBEGtIOAEdlgNzAT3AF3SNhoAjgsAMQBaAOUBaAG2AfwCZALLA3oE2QXHADEZFDEYFBBEI0OKAQGL/4EKDEEABycOi/8jWImL/4EKCoj/5ov/gQoYJw5MI1hQiSgiZycKMQBnJwUqZysiZycGImcnByJnJwQiZycIImcnCSJnJw0lZyNDNhoBSSJZJQhLARUSRFcCADYaAkkVJBJEFzYaA0kVJBJEF4gFrCIoZURBADCAIENhbiBvbmx5IGNvbmZpZ3VyZSB3aGlsZSBQRU5ESU5HSRUWVwYCTFApTFCwI0NLAUEABjIGSwIMRCcFSwNnK0sCZycISwFngBFNYXJrZXQgY29uZmlndXJlZEL/wyqIBUIiKGVEQQAugB5NYXJrZXQgbXVzdCBiZSBQRU5ESU5HIHRvIG9wZW5JFRZXBgJMUClMULAjQyInBWVEKhJBABiAE091dGNvbWVSZWYgcmVxdWlyZWRC/9AiK2VMSU4CRQNEQQAGMgZLAQxEKCNngA1NYXJrZXQgb3BlbmVkQv+oiATAIihlRCMTQQAtgB1NYXJrZXQgbXVzdCBiZSBPUEVOIHRvIGZyZWV6ZUkVFlcGAkxQKUxQsCNDKCVngA1NYXJrZXQgZnJvemVuQv/diARyIihlRIEDEkEAIIAQQWxyZWFkeSByZXNvbHZlZEkVFlcGAkxQKUxQsCNDKIEEZ4AQTWFya2V0IGNhbmNlbGxlZEL/2TYaAUkVJBJEF4gEUUmIBCkiJwZlREsBCCcGTGciJwRlREsBCCcETGcnCzEAUEkkuUhJvkwXIkxPAk1LAggWv4j9zYAUWUVTIGJldCByZWdpc3RlcmVkOiBMUEkVFlcGAkxQKUxQsCNDNhoBSRUkEkQXiAPpSYgDwSInB2VESwEIJwdMZyInBGVESwEIJwRMZycMMQBQSSS5SEm+TBciTE8CTUsCCBa/iP1lgBNOTyBiZXQgcmVnaXN0ZXJlZDogTFBJFRZXBgJMUClMULAjQzYaAUkVJBJEF4gDVCIoZUQlE0EAQSIoZUQjE0EAOIAoTWFya2V0IG11c3QgYmUgT1BFTiBvciBGUk9aRU4gdG8gcmVzb2x2ZUkVFlcGAkxQKUxQsCNDSSMTQQAfSSUTQQAZgBRJbnZhbGlkIHdpbm5pbmcgc2lkZUL/zSiBA2cnCUsBSU4CZyMSQQASgA1SZXNvbHZlZDogWUVTQv+qgAxSZXNvbHZlZDogTk9C/5kiSSpHCSIoZUSBAxNBACOAE01hcmtldCBub3QgcmVzb2x2ZWRJFRZXBgJMUClMULAjQyInCWVMRQNEIicGZUxJTgJFA0QiJwdlTElOAkUJRAhFBSInCGVMRQpEMQBJRQyACGNsYWltZWQ6TFBJRQ2+TBdFC0EA5EsJIxJBABSAD0FscmVhZHkgY2xhaW1lZEL/kksBIxJBAIUnC0sLUL5MF0UJQQBySwdFA0lFBEsCQAAVgBBOb3RoaW5nIHRvIGNsYWltQv9dSwNAABOADkludmFsaWQgdG90YWxzQv9FSwRJSwoLgZBOCglLAwtLBApLDEkkuUgjFr+xMQBLAbIIsgcjshAisgGziPuFgAVQYWlkIExQQv8MIkUDQv+MSwElEkEAHicMSwtQvkwXRQhBAAtLBkUDSwVFBEL/cCJFA0L/84ATTm8gd2lubmluZyBzaWRlIHNldEL+ySJC/xoiSSpHBSIoZUSBBBNBACSAFE1hcmtldCBub3QgY2FuY2VsbGVkSRUWVwYCTFApTFCwI0MxAElFCIAJcmVmdW5kZWQ6TFBJRQm+TBdFBEEAmksCIxJBABWAEEFscmVhZHkgcmVmdW5kZWRC/7knC0sHSU4CUL5MF0UEJwxPAlC+RQcXRQdBAF1LAUUBSwRBAFBLBUsBCElFBUAAFoARTm90aGluZyB0byByZWZ1bmRC/3RLB0kkuUgjFr+xMQBLBElOArIIsgcjshAisgGziPpigAlSZWZ1bmRlZCBMUEL/RSJC/64iRQFC/6EiQv9kIihlRIj6PYAHc3RhdHVzPUxQgA0sIG91dGNvbWVSZWY9UCInBWVEUIAOLCBleHBpcnlSb3VuZD1QIitlRIj6BFCACSwgZmVlQnBzPVAiJwhlRIj571BJFRZXBgJMUClMULAjQzEAIicKZUQSRImKAQAxFiMSRCI4ECMSRCI4ADEAEkQiOAiL/xJEIjgHMgoSRImKAAAiKGVEIxJEIitlTElPAkRBAAYyBosADESJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }