{ "name": "Keeper", "structs": {}, "methods": [ { "name": "update", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "UpdateApplication" ] }, "readonly": false, "desc": "Replace the programs. Creator only, and only before `freeze`.\nThis exists because being unable to fix a bug is expensive while nobody depends on the deployment yet. Two earlier deployments were abandoned rather than repaired, which stranded box minimum balance and made every creator cancel and re-register by hand.\nIt is also a real power: while `frozen` is 0, the creator can change the rules after funds are escrowed, and no statement of intent removes that. So it is temporary by construction, readable on-chain, and given up before the network asks anyone to rely on it.", "events": [], "recommendations": {} }, { "name": "freeze", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Give up the ability to update, permanently. Creator only.\nOne way. Nothing sets `frozen` back to 0, and after this the only call that could add such a path is an update, which is now refused. From here the contract is exactly as immutable as one deployed with no update path at all, and `verify_build` proves which programs it is stuck with.", "events": [], "recommendations": {} }, { "name": "register", "args": [ { "type": "pay", "name": "mbr_payment" }, { "type": "pay", "name": "funding_payment" }, { "type": "uint64", "name": "target_app" }, { "type": "byte[][]", "name": "call_args" }, { "type": "uint64", "name": "interval_rounds" }, { "type": "uint64", "name": "fee_per_execution" }, { "type": "uint64", "name": "policy" }, { "type": "uint64", "name": "fee_cap" }, { "type": "uint64", "name": "fee_asset" }, { "type": "uint64", "name": "asset_fee" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Register an upkeep; returns its id.\n`call_args` is every app arg of the call, in order. `policy` is CATCH_UP or SKIP_AHEAD. `fee_cap` is the most this upkeep will ever pay for one execution in ALGO; zero means the fee never escalates. `fee_asset` and `asset_fee` add an ASA bonus on top of the ALGO fee; zero means ALGO only.", "events": [], "recommendations": {} }, { "name": "top_up", "args": [ { "type": "uint64", "name": "upkeep_id" }, { "type": "pay", "name": "funding_payment" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add ALGO to an upkeep's escrow; returns the new balance.", "events": [], "recommendations": {} }, { "name": "cancel", "args": [ { "type": "uint64", "name": "upkeep_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cancel an upkeep (creator only); refunds escrow and box MBR.\nDeleting the box releases its minimum balance, so the creator gets back the remaining escrow *and* the MBR it paid at registration \u2014 nothing is stranded in the app account. Returns the refunded amount.", "events": [], "recommendations": {} }, { "name": "execute", "args": [ { "type": "uint64", "name": "upkeep_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Execute a due upkeep (permissionless); pays the caller its fee.\nReturns the round the upkeep is next due.", "events": [], "recommendations": {} }, { "name": "opt_in_asset", "args": [ { "type": "pay", "name": "mbr_payment" }, { "type": "uint64", "name": "upkeep_id" }, { "type": "uint64", "name": "asset" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Let the app account hold `asset`, so an upkeep can escrow a bonus.\nPermissionless, but tied to an upkeep that actually names the asset: an app that anyone could opt in to anything would accrete junk holdings for good, since there is no opt-out. The deposit is not refundable \u2014 reference-counting it would cost a box per asset and more code than the 0.1 ALGO it would ever return.", "events": [], "recommendations": {} }, { "name": "top_up_asset", "args": [ { "type": "uint64", "name": "upkeep_id" }, { "type": "axfer", "name": "asset_funding" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add ASA to an upkeep's bonus escrow; returns the new asset balance.\nSeparate from `register` because an asset transfer cannot be an optional member of a transaction group: folding it in would make every ALGO-only registration carry a zero-amount transfer of an asset it does not use.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Permissionless keeper network.\n\n Anyone registers an upkeep: \"call this app with this data every N rounds,\n paying R \u00b5ALGO per execution\", escrowing ALGO in the contract. Any keeper\n may execute a due upkeep; the contract performs the registered inner app\n call and pays the keeper from the escrow. No owner, no protocol rake.\n ", "networks": {}, "state": { "schema": { "global": { "ints": 2, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "next_upkeep_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bmV4dF91cGtlZXBfaWQ=" }, "frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZnJvemVu" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 192 ], "errorMessage": "Already frozen" }, { "pc": [ 710 ], "errorMessage": "Amount must be positive" }, { "pc": [ 460 ], "errorMessage": "Argument count out of bounds" }, { "pc": [ 466 ], "errorMessage": "Argument list too large" }, { "pc": [ 445 ], "errorMessage": "Asset fee must be positive" }, { "pc": [ 2035 ], "errorMessage": "Asset funding must come from the caller" }, { "pc": [ 2027 ], "errorMessage": "Asset funding must go to the app account" }, { "pc": [ 2051 ], "errorMessage": "Asset funding must not close the asset" }, { "pc": [ 2043 ], "errorMessage": "Asset funding must not rekey" }, { "pc": [ 410 ], "errorMessage": "Fee above maximum" }, { "pc": [ 404 ], "errorMessage": "Fee below minimum" }, { "pc": [ 433 ], "errorMessage": "Fee cap above maximum" }, { "pc": [ 427 ], "errorMessage": "Fee cap below the fee" }, { "pc": [ 178 ], "errorMessage": "Frozen: the programs cannot be replaced" }, { "pc": [ 556 ], "errorMessage": "Funding must cover at least one execution" }, { "pc": [ 527, 685 ], "errorMessage": "Funding must go to the app account" }, { "pc": [ 540, 706 ], "errorMessage": "Funding must not close" }, { "pc": [ 534, 699 ], "errorMessage": "Funding must not rekey" }, { "pc": [ 500, 692 ], "errorMessage": "Funding payment must come from the caller" }, { "pc": [ 1181 ], "errorMessage": "Insufficient funding" }, { "pc": [ 397 ], "errorMessage": "Interval above maximum" }, { "pc": [ 391 ], "errorMessage": "Interval below minimum" }, { "pc": [ 489, 1924 ], "errorMessage": "MBR payment must come from the caller" }, { "pc": [ 482, 1916 ], "errorMessage": "MBR payment must fund the app account" }, { "pc": [ 514, 1940 ], "errorMessage": "MBR payment must not close" }, { "pc": [ 507, 1932 ], "errorMessage": "MBR payment must not rekey" }, { "pc": [ 520, 1949 ], "errorMessage": "MBR payment too small" }, { "pc": [ 1122 ], "errorMessage": "Not due" }, { "pc": [ 911 ], "errorMessage": "Only the creator can cancel" }, { "pc": [ 186 ], "errorMessage": "Only the creator can freeze" }, { "pc": [ 172 ], "errorMessage": "Only the creator can update" }, { "pc": [ 1908 ], "errorMessage": "That upkeep does not use this asset" }, { "pc": [ 414 ], "errorMessage": "Unknown catch-up policy" }, { "pc": [ 1634 ], "errorMessage": "Unsupported argument count" }, { "pc": [ 720, 898, 1104, 1899, 2014 ], "errorMessage": "Upkeep not found" }, { "pc": [ 2067 ], "errorMessage": "Wrong asset for this upkeep" }, { "pc": [ 962, 984, 994, 1296, 1309, 1319 ], "errorMessage": "account opted into asset" }, { "pc": [ 176, 190 ], "errorMessage": "check self.frozen exists" }, { "pc": [ 561 ], "errorMessage": "check self.next_upkeep_id exists" }, { "pc": [ 729, 739, 745, 764, 770, 776, 785, 791, 797, 803, 809, 815, 821, 907, 916, 923, 1006, 1114, 1127, 1138, 1151, 1173, 1192, 1232, 1242, 1256, 1266, 1339, 1345, 1447, 1547, 1579, 1645, 1677, 1710, 1775, 1849, 1903, 2061, 2073, 2085, 2091, 2110, 2116, 2122, 2128, 2134, 2140, 2146, 2152, 2158 ], "errorMessage": "index out of bounds" }, { "pc": [ 267 ], "errorMessage": "invalid array encoding" }, { "pc": [ 238, 281 ], "errorMessage": "invalid array length header" }, { "pc": [ 300 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array>" }, { "pc": [ 229, 311, 326, 341, 353, 368, 382, 667, 887, 1093, 1879, 1888, 1992 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 275 ], "errorMessage": "invalid tail pointer for (len+(len+uint8[])[])" }, { "pc": [ 2004 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 209, 219, 678, 1871 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayA4IDAgMSAyIDEzMiAxMzAgMTAwMDAwMDAwMCA1ODEwMAogICAgYnl0ZWNibG9jayAweDc1IDB4MTUxZjdjNzUgImZyb3plbiIgMHgwMDgyICJuZXh0X3Vwa2VlcF9pZCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTExCiAgICAvLyBzZWxmLm5leHRfdXBrZWVwX2lkID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgNCAvLyAibmV4dF91cGtlZXBfaWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTEyLTExNgogICAgLy8gIyAwIHdoaWxlIHRoZSBjcmVhdG9yIG1heSBzdGlsbCByZXBsYWNlIHRoZSBwcm9ncmFtcywgMSBvbmNlIHRoYXQgaXMKICAgIC8vICMgZ2l2ZW4gdXAgZm9yIGdvb2QuIEdsb2JhbCBzdGF0ZSwgc28gYW55b25lIGNhbiByZWFkIGl0IGJlZm9yZSB0aGV5CiAgICAvLyAjIGVzY3JvdyBhbnl0aGluZzogdGhlIHByb21pc2UgaXMgb25seSB3b3J0aCB3aGF0IGl0IGNhbiBiZSBjaGVja2VkCiAgICAvLyAjIGFnYWluc3QuIFNlZSBgZnJlZXplYC4KICAgIC8vIHNlbGYuZnJvemVuID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWNfMiAvLyAiZnJvemVuIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTAxCiAgICAvLyBjbGFzcyBLZWVwZXIoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE4CiAgICBwdXNoYnl0ZXMgMHhhMGU4MTg3MiAvLyBtZXRob2QgInVwZGF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdXBkYXRlX3JvdXRlQDUKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxMDEKICAgIC8vIGNsYXNzIEtlZXBlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MGUyYzZjMGYgMHgzNjM2Y2ZjNiAweGY5ZjYzODJkIDB4MzY5NjZiZjggMHg1YjQ5Y2M1YyAweDVjNjdlZDc2IDB4ZDQ0YWFjNmIgLy8gbWV0aG9kICJmcmVlemUoKXZvaWQiLCBtZXRob2QgInJlZ2lzdGVyKHBheSxwYXksdWludDY0LGJ5dGVbXVtdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidG9wX3VwKHVpbnQ2NCxwYXkpdWludDY0IiwgbWV0aG9kICJjYW5jZWwodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZXhlY3V0ZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJvcHRfaW5fYXNzZXQocGF5LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0b3BfdXBfYXNzZXQodWludDY0LGF4ZmVyKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGZyZWV6ZSByZWdpc3RlciB0b3BfdXAgY2FuY2VsIGV4ZWN1dGUgb3B0X2luX2Fzc2V0IHRvcF91cF9hc3NldAogICAgZXJyCgptYWluX3VwZGF0ZV9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxMTgKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiB1cGRhdGUKCm1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTg6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5rZWVwZXIuY29udHJhY3QuS2VlcGVyLnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTMyCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSB0aGUgY3JlYXRvciBjYW4gdXBkYXRlIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIGNyZWF0b3IgY2FuIHVwZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCBzZWxmLmZyb3plbi52YWx1ZSA9PSAwLCAiRnJvemVuOiB0aGUgcHJvZ3JhbXMgY2Fubm90IGJlIHJlcGxhY2VkIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gImZyb3plbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcm96ZW4gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRnJvemVuOiB0aGUgcHJvZ3JhbXMgY2Fubm90IGJlIHJlcGxhY2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjExOAogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMua2VlcGVyLmNvbnRyYWN0LktlZXBlci5mcmVlemVbcm91dGluZ10oKSAtPiB2b2lkOgpmcmVlemU6CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgdGhlIGNyZWF0b3IgY2FuIGZyZWV6ZSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHRoZSBjcmVhdG9yIGNhbiBmcmVlemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTQ2CiAgICAvLyBhc3NlcnQgc2VsZi5mcm96ZW4udmFsdWUgPT0gMCwgIkFscmVhZHkgZnJvemVuIgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gImZyb3plbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mcm96ZW4gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gQWxyZWFkeSBmcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTQ3CiAgICAvLyBzZWxmLmZyb3plbi52YWx1ZSA9IFVJbnQ2NCgxKQogICAgYnl0ZWNfMiAvLyAiZnJvemVuIgogICAgaW50Y18yIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmtlZXBlci5jb250cmFjdC5LZWVwZXIucmVnaXN0ZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA2CiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzEgLy8gMAoKcmVnaXN0ZXJfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxNDkKICAgIC8vIEBhYmltZXRob2QoKQogICAgZHVwCiAgICBkaWcgOQogICAgPAogICAgYnogcmVnaXN0ZXJfYWZ0ZXJfZm9yQDQKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgdW5jb3ZlciA2CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1aW50OFtdKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICBjb3ZlciAzCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgYiByZWdpc3Rlcl9mb3JfaGVhZGVyQDEKCnJlZ2lzdGVyX2FmdGVyX2ZvckA0OgogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgY292ZXIgOQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBjb3ZlciAxMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDExCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBjb3ZlciA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGNvdmVyIDExCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBidXJ5IDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGludGVydmFsX3JvdW5kcyA+PSBNSU5fSU5URVJWQUxfUk9VTkRTLCAiSW50ZXJ2YWwgYmVsb3cgbWluaW11bSIKICAgIGRpZyAzCiAgICBwdXNoaW50IDEwCiAgICA+PQogICAgYXNzZXJ0IC8vIEludGVydmFsIGJlbG93IG1pbmltdW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTcyCiAgICAvLyBhc3NlcnQgaW50ZXJ2YWxfcm91bmRzIDw9IE1BWF9JTlRFUlZBTF9ST1VORFMsICJJbnRlcnZhbCBhYm92ZSBtYXhpbXVtIgogICAgdW5jb3ZlciAzCiAgICBpbnRjIDYgLy8gMTAwMDAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnRlcnZhbCBhYm92ZSBtYXhpbXVtCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gYXNzZXJ0IGZlZV9wZXJfZXhlY3V0aW9uID49IE1JTl9VUEtFRVBfRkVFLCAiRmVlIGJlbG93IG1pbmltdW0iCiAgICBkaWcgMgogICAgcHVzaGludCA0MDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIEZlZSBiZWxvdyBtaW5pbXVtCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGZlZV9wZXJfZXhlY3V0aW9uIDw9IE1BWF9VUEtFRVBfRkVFLCAiRmVlIGFib3ZlIG1heGltdW0iCiAgICB1bmNvdmVyIDIKICAgIGludGMgNiAvLyAxMDAwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIEZlZSBhYm92ZSBtYXhpbXVtCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gYXNzZXJ0IHBvbGljeSA8PSBTS0lQX0FIRUFELCAiVW5rbm93biBjYXRjaC11cCBwb2xpY3kiCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMQogICAgPD0KICAgIGFzc2VydCAvLyBVbmtub3duIGNhdGNoLXVwIHBvbGljeQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxNzYtMTc5CiAgICAvLyAjIEEgY2FwIGJlbG93IHRoZSBiYXNlIGZlZSB3b3VsZCBtZWFuIHRoZSBlc2NhbGF0aW9uIGN1cnZlIHJ1bnMKICAgIC8vICMgYmFja3dhcmRzOyByZWplY3QgaXQgcmF0aGVyIHRoYW4gY2xhbXBpbmcgc29tZXRoaW5nIHRoZSBjcmVhdG9yIGRpZAogICAgLy8gIyBub3QgYXNrIGZvci4KICAgIC8vIGFzc2VydCBmZWVfY2FwID09IDAgb3IgZmVlX2NhcCA+PSBmZWVfcGVyX2V4ZWN1dGlvbiwgIkZlZSBjYXAgYmVsb3cgdGhlIGZlZSIKICAgIGJ6IHJlZ2lzdGVyX2Jvb2xfdHJ1ZUA3CiAgICBkaWcgMQogICAgZGlnIDQKICAgID49CiAgICBieiByZWdpc3Rlcl9ib29sX2ZhbHNlQDgKCnJlZ2lzdGVyX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18yIC8vIDEKCnJlZ2lzdGVyX2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTc2LTE3OQogICAgLy8gIyBBIGNhcCBiZWxvdyB0aGUgYmFzZSBmZWUgd291bGQgbWVhbiB0aGUgZXNjYWxhdGlvbiBjdXJ2ZSBydW5zCiAgICAvLyAjIGJhY2t3YXJkczsgcmVqZWN0IGl0IHJhdGhlciB0aGFuIGNsYW1waW5nIHNvbWV0aGluZyB0aGUgY3JlYXRvciBkaWQKICAgIC8vICMgbm90IGFzayBmb3IuCiAgICAvLyBhc3NlcnQgZmVlX2NhcCA9PSAwIG9yIGZlZV9jYXAgPj0gZmVlX3Blcl9leGVjdXRpb24sICJGZWUgY2FwIGJlbG93IHRoZSBmZWUiCiAgICBhc3NlcnQgLy8gRmVlIGNhcCBiZWxvdyB0aGUgZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gYXNzZXJ0IGZlZV9jYXAgPD0gTUFYX1VQS0VFUF9GRUUsICJGZWUgY2FwIGFib3ZlIG1heGltdW0iCiAgICBkaWcgMQogICAgaW50YyA2IC8vIDEwMDAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gRmVlIGNhcCBhYm92ZSBtYXhpbXVtCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE4MS0xODMKICAgIC8vICMgQSBib251cyBvZiBub3RoaW5nIGlzIGEgbm9uc2Vuc2Ugc3RhdGUgdGhhdCBwYXlzIDI0IGJ5dGVzIG9mIGJveCBNQlIKICAgIC8vICMgZm9yIGEgZmVhdHVyZSBpdCBkb2VzIG5vdCB1c2U7IHJlamVjdCBpdCByYXRoZXIgdGhhbiBzdG9yZSBpdC4KICAgIC8vIGFzc2VydCBmZWVfYXNzZXQgPT0gMCBvciBhc3NldF9mZWUgPiAwLCAiQXNzZXQgZmVlIG11c3QgYmUgcG9zaXRpdmUiCiAgICB1bmNvdmVyIDIKICAgIGJ6IHJlZ2lzdGVyX2Jvb2xfdHJ1ZUAxMQogICAgZGlnIDE1CiAgICBieiByZWdpc3Rlcl9ib29sX2ZhbHNlQDEyCgpyZWdpc3Rlcl9ib29sX3RydWVAMTE6CiAgICBpbnRjXzIgLy8gMQoKcmVnaXN0ZXJfYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTgxLTE4MwogICAgLy8gIyBBIGJvbnVzIG9mIG5vdGhpbmcgaXMgYSBub25zZW5zZSBzdGF0ZSB0aGF0IHBheXMgMjQgYnl0ZXMgb2YgYm94IE1CUgogICAgLy8gIyBmb3IgYSBmZWF0dXJlIGl0IGRvZXMgbm90IHVzZTsgcmVqZWN0IGl0IHJhdGhlciB0aGFuIHN0b3JlIGl0LgogICAgLy8gYXNzZXJ0IGZlZV9hc3NldCA9PSAwIG9yIGFzc2V0X2ZlZSA+IDAsICJBc3NldCBmZWUgbXVzdCBiZSBwb3NpdGl2ZSIKICAgIGFzc2VydCAvLyBBc3NldCBmZWUgbXVzdCBiZSBwb3NpdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxODUtMTg4CiAgICAvLyAjIEJvdW5kZWQgaGVyZSByYXRoZXIgdGhhbiBpbiBgZXhlY3V0ZWA6IGFuIGFyZ3VtZW50IGxpc3QgbG9uZ2VyIHRoYW4KICAgIC8vICMgdGhlIGZhbi1vdXQgd291bGQgcmVnaXN0ZXIgaGFwcGlseSBhbmQgdGhlbiBmYWlsIG9uIGV2ZXJ5IGV4ZWN1dGlvbiwKICAgIC8vICMgZm9yIGdvb2QsIHdoaWNoIGlzIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBmZWUtY2FwIHRyYXAuCiAgICAvLyBhc3NlcnQgVUludDY0KDApIDwgYXJnX2NvdW50IDw9IE1BWF9DQUxMX0FSR1MsICJBcmd1bWVudCBjb3VudCBvdXQgb2YgYm91bmRzIgogICAgZGlnIDE0CiAgICBieiByZWdpc3Rlcl9ib29sX2ZhbHNlQDE2CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMwogICAgPD0KICAgIGJ6IHJlZ2lzdGVyX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMiAvLyAxCgpyZWdpc3Rlcl9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxODUtMTg4CiAgICAvLyAjIEJvdW5kZWQgaGVyZSByYXRoZXIgdGhhbiBpbiBgZXhlY3V0ZWA6IGFuIGFyZ3VtZW50IGxpc3QgbG9uZ2VyIHRoYW4KICAgIC8vICMgdGhlIGZhbi1vdXQgd291bGQgcmVnaXN0ZXIgaGFwcGlseSBhbmQgdGhlbiBmYWlsIG9uIGV2ZXJ5IGV4ZWN1dGlvbiwKICAgIC8vICMgZm9yIGdvb2QsIHdoaWNoIGlzIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBmZWUtY2FwIHRyYXAuCiAgICAvLyBhc3NlcnQgVUludDY0KDApIDwgYXJnX2NvdW50IDw9IE1BWF9DQUxMX0FSR1MsICJBcmd1bWVudCBjb3VudCBvdXQgb2YgYm91bmRzIgogICAgYXNzZXJ0IC8vIEFyZ3VtZW50IGNvdW50IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTkwCiAgICAvLyBhc3NlcnQgc2l6ZSA8PSBNQVhfQ0FMTF9EQVRBLCAiQXJndW1lbnQgbGlzdCB0b28gbGFyZ2UiCiAgICBkdXAKICAgIHB1c2hpbnQgMTAyNAogICAgPD0KICAgIGFzc2VydCAvLyBBcmd1bWVudCBsaXN0IHRvbyBsYXJnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToxOTIKICAgIC8vIHJlcXVpcmVkX21iciA9IEJPWF9NQlJfRklYRUQgKyA0MDAgKiBzaXplCiAgICBwdXNoaW50IDQwMAogICAgKgogICAgaW50YyA3IC8vIDU4MTAwCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gbWJyX3BheW1lbnQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgdW5jb3ZlciA2CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTkzLTE5NQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBtYnJfcGF5bWVudC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiTUJSIHBheW1lbnQgbXVzdCBmdW5kIHRoZSBhcHAgYWNjb3VudCIKICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IGZ1bmQgdGhlIGFwcCBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjE5Ni0yMTIKICAgIC8vICMgQSByZWtleSBoYW5kcyBjb250cm9sIG9mIHRoZSBzZW5kZXIncyBhY2NvdW50IHRvIHdob2V2ZXIgdGhlIGdyb3VwCiAgICAvLyAjIG5hbWVzLCBhbmQgYSBjbG9zZSBzd2VlcHMgaXQgZW1wdHkgdG8gd2hvZXZlciB0aGUgZ3JvdXAgbmFtZXMuCiAgICAvLyAjIEJvdGggaGFybSBvbmx5IHRoZSBzZW5kZXIsIHNvIHRoZSBjb250cmFjdCBsb3NlcyBub3RoaW5nIGJ5CiAgICAvLyAjIHJlZnVzaW5nIHRoZW0uIFRoZSBleHBvc3VyZSBpcyBhIGZyb250IGVuZCBwdXR0aW5nIGVpdGhlciBpbnRvIGEKICAgIC8vICMgZ3JvdXAgYSB1c2VyIHNpZ25zIHdpdGhvdXQgcmVhZGluZyBpdCBjbG9zZWx5LgogICAgLy8gIyBUaGUgdXBrZWVwJ3MgY3JlYXRvciBpcyBgVHhuLnNlbmRlcmAsIGFuZCBgY2FuY2VsYCBwYXlzIHRoZSBjcmVhdG9yLgogICAgLy8gIyBXaXRob3V0IHRoaXMsIHRob3NlIGFyZSB0d28gZGlmZmVyZW50IGFjY291bnRzIGFuZCBub3RoaW5nIHJlcXVpcmVzCiAgICAvLyAjIHRoZW0gdG8gbWF0Y2g6IGEgdmljdGltIHNpZ25zIGJvdGggcGF5bWVudHMgdG8gdGhlIGdlbnVpbmUgYXBwCiAgICAvLyAjIGFjY291bnQgb2YgdGhlIGdlbnVpbmUgYXBwIGlkLCBhbiBhdHRhY2tlciBzaWducyB0aGUgYXBwIGNhbGwsIGFuZAogICAgLy8gIyB0aGUgYXR0YWNrZXIgb3ducyB0aGUgdXBrZWVwIGFuZCBjYW5jZWxzIGl0IGZvciB0aGUgZXNjcm93IHBsdXMgdGhlCiAgICAvLyAjIHJlbGVhc2VkIGJveCBNQlIuIEV2ZXJ5IGNoZWNrIGFueW9uZSBpcyB0YXVnaHQgdG8gbWFrZSBwYXNzZXMsCiAgICAvLyAjIGJlY2F1c2UgdGhlIHJlY2VpdmVyIGFuZCB0aGUgYXBwIGlkIHJlYWxseSBhcmUgdGhlIHJpZ2h0IG9uZXMuIFRoZQogICAgLy8gIyBzZW5kZXIgb2YgdGhlIGFwcCBjYWxsIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgZGlmZmVycywgYW5kIGl0IGlzIHRoZQogICAgLy8gIyBvbmUgdGhpbmcgbm8gd2FsbGV0IGhpZ2hsaWdodHMuIGBzdWJzY3JpcHRpb24uc3Vic2NyaWJlYCBoYXMgYm91bmQKICAgIC8vICMgaXRzIHBheWVyIHNpbmNlIGl0IHdhcyB3cml0dGVuOyB0aGUgY29udHJhY3QgaG9sZGluZyB0aGUgbW9uZXkgZGlkCiAgICAvLyAjIG5vdC4KICAgIC8vIGFzc2VydCBtYnJfcGF5bWVudC5zZW5kZXIgPT0gVHhuLnNlbmRlciwgIk1CUiBwYXltZW50IG11c3QgY29tZSBmcm9tIHRoZSBjYWxsZXIiCiAgICBkdXAKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IGNvbWUgZnJvbSB0aGUgY2FsbGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjIxNAogICAgLy8gZnVuZGluZ19wYXltZW50LnNlbmRlciA9PSBUeG4uc2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjIxMy0yMTUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZGluZ19wYXltZW50LnNlbmRlciA9PSBUeG4uc2VuZGVyCiAgICAvLyApLCAiRnVuZGluZyBwYXltZW50IG11c3QgY29tZSBmcm9tIHRoZSBjYWxsZXIiCiAgICBhc3NlcnQgLy8gRnVuZGluZyBwYXltZW50IG11c3QgY29tZSBmcm9tIHRoZSBjYWxsZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjE2CiAgICAvLyBhc3NlcnQgbWJyX3BheW1lbnQucmVrZXlfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcywgIk1CUiBwYXltZW50IG11c3Qgbm90IHJla2V5IgogICAgZHVwCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgbXVzdCBub3QgcmVrZXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjE4CiAgICAvLyBtYnJfcGF5bWVudC5jbG9zZV9yZW1haW5kZXJfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgZHVwCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjIxNy0yMTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbWJyX3BheW1lbnQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJNQlIgcGF5bWVudCBtdXN0IG5vdCBjbG9zZSIKICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IG5vdCBjbG9zZQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBtYnJfcGF5bWVudC5hbW91bnQgPj0gcmVxdWlyZWRfbWJyLCAiTUJSIHBheW1lbnQgdG9vIHNtYWxsIgogICAgZ3R4bnMgQW1vdW50CiAgICB1bmNvdmVyIDIKICAgID49CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgdG9vIHNtYWxsCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gZnVuZGluZ19wYXltZW50LnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyMjEtMjIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGZ1bmRpbmdfcGF5bWVudC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiRnVuZGluZyBtdXN0IGdvIHRvIHRoZSBhcHAgYWNjb3VudCIKICAgIGFzc2VydCAvLyBGdW5kaW5nIG11c3QgZ28gdG8gdGhlIGFwcCBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gYXNzZXJ0IGZ1bmRpbmdfcGF5bWVudC5yZWtleV90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzLCAiRnVuZGluZyBtdXN0IG5vdCByZWtleSIKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEZ1bmRpbmcgbXVzdCBub3QgcmVrZXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjI2CiAgICAvLyBmdW5kaW5nX3BheW1lbnQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGd0eG5zIENsb3NlUmVtYWluZGVyVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjI1LTIyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kaW5nX3BheW1lbnQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJGdW5kaW5nIG11c3Qgbm90IGNsb3NlIgogICAgYXNzZXJ0IC8vIEZ1bmRpbmcgbXVzdCBub3QgY2xvc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBmZWVfY2FwID4gZmVlX3Blcl9leGVjdXRpb246CiAgICBkdXAKICAgIGRpZyAyCiAgICA+CiAgICBibnogcmVnaXN0ZXJfaWZfYm9keUAxOAogICAgcG9wCgpyZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyMzcKICAgIC8vIGZ1bmRpbmdfcGF5bWVudC5hbW91bnQgPj0gcmVxdWlyZWRfZnVuZGluZwogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjM2LTIzOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kaW5nX3BheW1lbnQuYW1vdW50ID49IHJlcXVpcmVkX2Z1bmRpbmcKICAgIC8vICksICJGdW5kaW5nIG11c3QgY292ZXIgYXQgbGVhc3Qgb25lIGV4ZWN1dGlvbiIKICAgIGFzc2VydCAvLyBGdW5kaW5nIG11c3QgY292ZXIgYXQgbGVhc3Qgb25lIGV4ZWN1dGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyNDAKICAgIC8vIHVwa2VlcF9pZCA9IHNlbGYubmV4dF91cGtlZXBfaWQudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA0IC8vICJuZXh0X3Vwa2VlcF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3Vwa2VlcF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjQxCiAgICAvLyBib3ggPSBCb3goVXBrZWVwLCBrZXk9b3AuY29uY2F0KGIidSIsIG9wLml0b2IodXBrZWVwX2lkKSkpCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyNDMKICAgIC8vIGNyZWF0b3I9YXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyNDcKICAgIC8vIG5leHRfZXhlY3V0aW9uX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCArIGludGVydmFsX3JvdW5kcyksCiAgICBnbG9iYWwgUm91bmQKICAgIHVuY292ZXIgOQogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyNDkKICAgIC8vIGJhbGFuY2U9YXJjNC5VSW50NjQoZnVuZGluZ19wYXltZW50LmFtb3VudCksCiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjUwCiAgICAvLyB0aW1lc19leGVjdXRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIGludGNfMSAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjI1My0yNTUKICAgIC8vICMgTmV2ZXIgc2VydmljZWQsIHNvIHRoZSBmaXJzdCBleGVjdXRpb24gaXMgbWVhc3VyZWQgZnJvbSBub3cgYW5kCiAgICAvLyAjIGFycml2ZXMgZXhhY3RseSBvbmUgaW50ZXJ2YWwgbGF0ZXI6IG9uIHRpbWUsIGF0IHRoZSBiYXNlIGZlZS4KICAgIC8vIGxhc3Rfc2VydmljZWRfcm91bmQ9YXJjNC5VSW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyNDItMjU5CiAgICAvLyBib3gudmFsdWUgPSBVcGtlZXAoCiAgICAvLyAgICAgY3JlYXRvcj1hcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgICAgdGFyZ2V0X2FwcD1hcmM0LlVJbnQ2NCh0YXJnZXRfYXBwLmlkKSwKICAgIC8vICAgICBjYWxsX2FyZ3M9Y2FsbF9hcmdzLmNvcHkoKSwKICAgIC8vICAgICBpbnRlcnZhbF9yb3VuZHM9YXJjNC5VSW50NjQoaW50ZXJ2YWxfcm91bmRzKSwKICAgIC8vICAgICBuZXh0X2V4ZWN1dGlvbl9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQgKyBpbnRlcnZhbF9yb3VuZHMpLAogICAgLy8gICAgIGZlZV9wZXJfZXhlY3V0aW9uPWFyYzQuVUludDY0KGZlZV9wZXJfZXhlY3V0aW9uKSwKICAgIC8vICAgICBiYWxhbmNlPWFyYzQuVUludDY0KGZ1bmRpbmdfcGF5bWVudC5hbW91bnQpLAogICAgLy8gICAgIHRpbWVzX2V4ZWN1dGVkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIHBvbGljeT1hcmM0LlVJbnQ2NChwb2xpY3kpLAogICAgLy8gICAgIGZlZV9jYXA9YXJjNC5VSW50NjQoZmVlX2NhcCksCiAgICAvLyAgICAgIyBOZXZlciBzZXJ2aWNlZCwgc28gdGhlIGZpcnN0IGV4ZWN1dGlvbiBpcyBtZWFzdXJlZCBmcm9tIG5vdyBhbmQKICAgIC8vICAgICAjIGFycml2ZXMgZXhhY3RseSBvbmUgaW50ZXJ2YWwgbGF0ZXI6IG9uIHRpbWUsIGF0IHRoZSBiYXNlIGZlZS4KICAgIC8vICAgICBsYXN0X3NlcnZpY2VkX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCksCiAgICAvLyAgICAgZmVlX2Fzc2V0PWFyYzQuVUludDY0KGZlZV9hc3NldCksCiAgICAvLyAgICAgYXNzZXRfZmVlPWFyYzQuVUludDY0KGFzc2V0X2ZlZSksCiAgICAvLyAgICAgYXNzZXRfYmFsYW5jZT1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIGJ5dGVjXzMgLy8gMHgwMDgyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLm5leHRfdXBrZWVwX2lkLnZhbHVlID0gdXBrZWVwX2lkICsgMQogICAgc3dhcAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ5dGVjIDQgLy8gIm5leHRfdXBrZWVwX2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MTQ5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCnJlZ2lzdGVyX2lmX2JvZHlAMTg6CiAgICBidXJ5IDEKICAgIGIgcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUAxOQoKcmVnaXN0ZXJfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMSAvLyAwCiAgICBiIHJlZ2lzdGVyX2Jvb2xfbWVyZ2VAMTcKCnJlZ2lzdGVyX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZWdpc3Rlcl9ib29sX21lcmdlQDEzCgpyZWdpc3Rlcl9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiByZWdpc3Rlcl9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMua2VlcGVyLmNvbnRyYWN0LktlZXBlci50b3BfdXBbcm91dGluZ10oKSAtPiB2b2lkOgp0b3BfdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjI2MwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMiAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjY5CiAgICAvLyBmdW5kaW5nX3BheW1lbnQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjI2OC0yNzAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZnVuZGluZ19wYXltZW50LnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJGdW5kaW5nIG11c3QgZ28gdG8gdGhlIGFwcCBhY2NvdW50IgogICAgYXNzZXJ0IC8vIEZ1bmRpbmcgbXVzdCBnbyB0byB0aGUgYXBwIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6Mjc5CiAgICAvLyBmdW5kaW5nX3BheW1lbnQuc2VuZGVyID09IFR4bi5zZW5kZXIKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyNzEtMjgwCiAgICAvLyAjIEJvdW5kIHRvIHRoZSBjYWxsZXIsIGxpa2UgYHJlZ2lzdGVyYC4gVG9wcGluZyB1cCBpcyBkZWxpYmVyYXRlbHkKICAgIC8vICMgcGVybWlzc2lvbmxlc3MgYW5kIHN0YXlzIHNvOiBhIHdlbGwtd2lzaGVyIGNhbiBzdGlsbCBmdW5kIHNvbWVib2R5CiAgICAvLyAjIGVsc2UncyB1cGtlZXAsIHRoZXkgc2ltcGx5IGhhdmUgdG8gcGF5IGZvciBpdCB0aGVtc2VsdmVzLiBXaGF0IHRoaXMKICAgIC8vICMgc3RvcHMgaXMgdGhlIGdyb3VwIHdoZXJlIGEgdmljdGltIHNpZ25zIHRoZSBwYXltZW50IGFuZCBhbiBhdHRhY2tlcgogICAgLy8gIyBzaWducyB0aGUgY2FsbCBuYW1pbmcgdGhlaXIgb3duIHVwa2VlcCwgd2hpY2ggb25seSB0aGV5IGNhbiBjYW5jZWwuCiAgICAvLyAjIGByZWdpc3RlcmAgZ290IHRoaXMgYXNzZXJ0IGFuZCB0aGVzZSB0aHJlZSBkaWQgbm90LCB3aGljaCBpcyB0aGUKICAgIC8vICMgc2FtZSBmaXgtb25lLXNpdGUgZmFpbHVyZSB0aHJlZSByZXZpZXdlcnMgaGF2ZSBub3cgbmFtZWQuCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGZ1bmRpbmdfcGF5bWVudC5zZW5kZXIgPT0gVHhuLnNlbmRlcgogICAgLy8gKSwgIkZ1bmRpbmcgcGF5bWVudCBtdXN0IGNvbWUgZnJvbSB0aGUgY2FsbGVyIgogICAgYXNzZXJ0IC8vIEZ1bmRpbmcgcGF5bWVudCBtdXN0IGNvbWUgZnJvbSB0aGUgY2FsbGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjI4MQogICAgLy8gYXNzZXJ0IGZ1bmRpbmdfcGF5bWVudC5yZWtleV90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzLCAiRnVuZGluZyBtdXN0IG5vdCByZWtleSIKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEZ1bmRpbmcgbXVzdCBub3QgcmVrZXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MjgzCiAgICAvLyBmdW5kaW5nX3BheW1lbnQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGR1cAogICAgZ3R4bnMgQ2xvc2VSZW1haW5kZXJUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyODItMjg0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGZ1bmRpbmdfcGF5bWVudC5jbG9zZV9yZW1haW5kZXJfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgLy8gKSwgIkZ1bmRpbmcgbXVzdCBub3QgY2xvc2UiCiAgICBhc3NlcnQgLy8gRnVuZGluZyBtdXN0IG5vdCBjbG9zZQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyODUKICAgIC8vIGFzc2VydCBmdW5kaW5nX3BheW1lbnQuYW1vdW50ID4gMCwgIkFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIgogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyODcKICAgIC8vIGJveCA9IEJveChVcGtlZXAsIGtleT1vcC5jb25jYXQoYiJ1Iiwgb3AuaXRvYih1cGtlZXBfaWQpKSkKICAgIHN3YXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg3NQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjI4OAogICAgLy8gYXNzZXJ0IGJveCwgIlVwa2VlcCBub3QgZm91bmQiCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFVwa2VlcCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6Mjg5CiAgICAvLyB1cGtlZXAgPSBib3gudmFsdWUuY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyODktMjkwCiAgICAvLyB1cGtlZXAgPSBib3gudmFsdWUuY29weSgpCiAgICAvLyBuZXdfYmFsYW5jZTogVUludDY0ID0gdXBrZWVwLmJhbGFuY2UuYXNfdWludDY0KCkgKyBmdW5kaW5nX3BheW1lbnQuYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgNjYKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyOTAKICAgIC8vIG5ld19iYWxhbmNlOiBVSW50NjQgPSB1cGtlZXAuYmFsYW5jZS5hc191aW50NjQoKSArIGZ1bmRpbmdfcGF5bWVudC5hbW91bnQKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyOTEtMjkzCiAgICAvLyBib3gudmFsdWUgPSB1cGtlZXAuX3JlcGxhY2UoCiAgICAvLyAgICAgYmFsYW5jZT1hcmM0LlVJbnQ2NChuZXdfYmFsYW5jZSksIGNhbGxfYXJncz11cGtlZXAuY2FsbF9hcmdzLmNvcHkoKQogICAgLy8gKQogICAgZGlnIDEKICAgIGludGNfMSAvLyAwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyOTIKICAgIC8vIGJhbGFuY2U9YXJjNC5VSW50NjQobmV3X2JhbGFuY2UpLCBjYWxsX2FyZ3M9dXBrZWVwLmNhbGxfYXJncy5jb3B5KCkKICAgIGRpZyA0CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDUKICAgIGxlbgogICAgdW5jb3ZlciA2CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjI5MS0yOTMKICAgIC8vIGJveC52YWx1ZSA9IHVwa2VlcC5fcmVwbGFjZSgKICAgIC8vICAgICBiYWxhbmNlPWFyYzQuVUludDY0KG5ld19iYWxhbmNlKSwgY2FsbF9hcmdzPXVwa2VlcC5jYWxsX2FyZ3MuY29weSgpCiAgICAvLyApCiAgICBkaWcgNAogICAgcHVzaGludCA0MgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgNQogICAgcHVzaGludCA1MAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgNgogICAgcHVzaGludCA1OAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gYmFsYW5jZT1hcmM0LlVJbnQ2NChuZXdfYmFsYW5jZSksIGNhbGxfYXJncz11cGtlZXAuY2FsbF9hcmdzLmNvcHkoKQogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjI5MS0yOTMKICAgIC8vIGJveC52YWx1ZSA9IHVwa2VlcC5fcmVwbGFjZSgKICAgIC8vICAgICBiYWxhbmNlPWFyYzQuVUludDY0KG5ld19iYWxhbmNlKSwgY2FsbF9hcmdzPXVwa2VlcC5jYWxsX2FyZ3MuY29weSgpCiAgICAvLyApCiAgICBkaWcgNwogICAgcHVzaGludCA3NAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgOAogICAgcHVzaGludCA4MgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgOQogICAgcHVzaGludCA5MAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgMTAKICAgIHB1c2hpbnQgOTgKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDExCiAgICBwdXNoaW50IDEwNgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgMTE0CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAxMwogICAgcHVzaGludCAxMjIKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICBieXRlY18zIC8vIDB4MDA4MgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIGRpZyA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyNjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5rZWVwZXIuY29udHJhY3QuS2VlcGVyLmNhbmNlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNhbmNlbDoKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyOTYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozMDQKICAgIC8vIGJveCA9IEJveChVcGtlZXAsIGtleT1vcC5jb25jYXQoYiJ1Iiwgb3AuaXRvYih1cGtlZXBfaWQpKSkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzA1CiAgICAvLyBhc3NlcnQgYm94LCAiVXBrZWVwIG5vdCBmb3VuZCIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFVwa2VlcCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzA2CiAgICAvLyB1cGtlZXAgPSBib3gudmFsdWUuY29weSgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozMDYtMzA3CiAgICAvLyB1cGtlZXAgPSBib3gudmFsdWUuY29weSgpCiAgICAvLyBhc3NlcnQgdXBrZWVwLmNyZWF0b3IubmF0aXZlID09IFR4bi5zZW5kZXIsICJPbmx5IHRoZSBjcmVhdG9yIGNhbiBjYW5jZWwiCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozMDcKICAgIC8vIGFzc2VydCB1cGtlZXAuY3JlYXRvci5uYXRpdmUgPT0gVHhuLnNlbmRlciwgIk9ubHkgdGhlIGNyZWF0b3IgY2FuIGNhbmNlbCIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgY3JlYXRvciBjYW4gY2FuY2VsCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjMwOC0zMTEKICAgIC8vICMgVGhlIHVuc3BlbnQgYm9udXMgZ29lcyBiYWNrIHRvbywgd2hpY2ggdGhlIGNyZWF0b3IgY2FuIG9ubHkgcmVjZWl2ZQogICAgLy8gIyBpZiB0aGV5IGhvbGQgdGhlIGFzc2V0LiBDaGVja2VkIGJlZm9yZSBhbnl0aGluZyBpcyByZWZ1bmRlZCwgc28gYQogICAgLy8gIyBjcmVhdG9yIHdobyBjYW5ub3QgdGFrZSB0aGUgQVNBIGRvZXMgbm90IGxvc2UgdGhlIEFMR08gYXMgd2VsbC4KICAgIC8vIGJvbnVzX2Fzc2V0OiBVSW50NjQgPSB1cGtlZXAuZmVlX2Fzc2V0LmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIHB1c2hpbnQgMTA2CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzEyLTMyMgogICAgLy8gIyBQYXkgb3V0IG5vIG1vcmUgb2YgdGhlIGJvbnVzIHRoYW4gdGhlIGFwcCBhY3R1YWxseSBob2xkcy4gVGhlIGJvb2sKICAgIC8vICMgdmFsdWUgY2FuIGV4Y2VlZCB0aGUgcmVhbCBob2xkaW5nOiBhbiBBU0Egd2l0aCBhIGNsYXdiYWNrIGFkZHJlc3MKICAgIC8vICMgY2FuIGJlIHRha2VuIGJhY2sgb3V0IG9mIHRoaXMgYWNjb3VudCBieSBpdHMgaXNzdWVyLCBhbmQgYSBmcm96ZW4KICAgIC8vICMgb25lIGNhbm5vdCBiZSBzZW50IGF0IGFsbC4gVHJ1c3RpbmcgdGhlIGJvb2sgdmFsdWUgd291bGQgbWFrZSB0aGUKICAgIC8vICMgYXNzZXQgdHJhbnNmZXIgZmFpbCwgYW5kIGJlY2F1c2UgaXQgc2hhcmVzIGEgdHJhbnNhY3Rpb24gd2l0aCB0aGUKICAgIC8vICMgQUxHTyByZWZ1bmQsIHRoZSByZWZ1bmQgd291bGQgZmFpbCB3aXRoIGl0LiBUaGUgY3JlYXRvciB3b3VsZCBsb3NlCiAgICAvLyAjIHRoZWlyIGVzY3JvdyBhbmQgdGhlaXIgYm94IG1pbmltdW0gYmFsYW5jZSB0byBzb21lYm9keSBlbHNlJ3MgYXNzZXQKICAgIC8vICMgc2V0dGluZ3MsIHBlcm1hbmVudGx5LCBvbiBhIGNvbnRyYWN0IHdpdGggbm8gZGVsZXRlIHBhdGguCiAgICAvLyAjCiAgICAvLyAjIFNvIHRoZSBBU0EgaXMgYmVzdCBlZmZvcnQgYW5kIHRoZSBBTEdPIGlzIG5vdC4KICAgIC8vIGJvbnVzOiBVSW50NjQgPSB1cGtlZXAuYXNzZXRfYmFsYW5jZS5hc191aW50NjQoKQogICAgcHVzaGludCAxMjIKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjMyMy0zMjUKICAgIC8vICMgT3B0LWluIGZpcnN0LCBiZWNhdXNlIHJlYWRpbmcgYSBiYWxhbmNlIG9yIGEgZnJlZXplIGZsYWcgZm9yIGFuCiAgICAvLyAjIGFjY291bnQgdGhhdCBuZXZlciBvcHRlZCBpbiBmYWlscyByYXRoZXIgdGhhbiBhbnN3ZXJpbmcuCiAgICAvLyBpZiBib251cyA+IDAgYW5kIG5vdCBUeG4uc2VuZGVyLmlzX29wdGVkX2luKEFzc2V0KGJvbnVzX2Fzc2V0KSk6CiAgICBieiBjYW5jZWxfYWZ0ZXJfaWZfZWxzZUA0CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIGJueiBjYW5jZWxfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjMyNi0zMjgKICAgIC8vICMgQ2FuY2VsbGluZyBzdGlsbCByZXR1cm5zIHRoZSBBTEdPLiBGb3JjaW5nIGFuIG9wdC1pbiBmaXJzdCB3b3VsZAogICAgLy8gIyBsZXQgYW4gYXNzZXQgdGhlIGNyZWF0b3IgY2Fubm90IGhvbGQgYmxvY2sgdGhlaXIgb3duIHJlZnVuZC4KICAgIC8vIGJvbnVzID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSAzCgpjYW5jZWxfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozMjkKICAgIC8vIGlmIGJvbnVzID4gMDoKICAgIGRpZyAyCiAgICBieiBjYW5jZWxfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gaGVsZDogVUludDY0ID0gQXNzZXQoYm9udXNfYXNzZXQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgNAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozMzEKICAgIC8vIGlmIGhlbGQgPCBib251czoKICAgIGRpZyAzCiAgICA8CiAgICBieiBjYW5jZWxfYWZ0ZXJfaWZfZWxzZUA4CiAgICBkaWcgNAogICAgYnVyeSAzCgpjYW5jZWxfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozMzMtMzM2CiAgICAvLyBpZiBib251cyA+IDAgYW5kICgKICAgIC8vICAgICBBc3NldChib251c19hc3NldCkuZnJvemVuKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgb3IgQXNzZXQoYm9udXNfYXNzZXQpLmZyb3plbihUeG4uc2VuZGVyKQogICAgLy8gKToKICAgIGRpZyAyCiAgICBieiBjYW5jZWxfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozMzQKICAgIC8vIEFzc2V0KGJvbnVzX2Fzc2V0KS5mcm96ZW4oR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgNAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRGcm96ZW4KICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzM0LTMzNQogICAgLy8gQXNzZXQoYm9udXNfYXNzZXQpLmZyb3plbihHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gb3IgQXNzZXQoYm9udXNfYXNzZXQpLmZyb3plbihUeG4uc2VuZGVyKQogICAgYm56IGNhbmNlbF9pZl9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjMzNQogICAgLy8gb3IgQXNzZXQoYm9udXNfYXNzZXQpLmZyb3plbihUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0RnJvemVuCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjMzNC0zMzUKICAgIC8vIEFzc2V0KGJvbnVzX2Fzc2V0KS5mcm96ZW4oR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vIG9yIEFzc2V0KGJvbnVzX2Fzc2V0KS5mcm96ZW4oVHhuLnNlbmRlcikKICAgIGJ6IGNhbmNlbF9hZnRlcl9pZl9lbHNlQDEyCgpjYW5jZWxfaWZfYm9keUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzM3LTM0MwogICAgLy8gIyBBIGZyb3plbiBob2xkaW5nIHN0aWxsIHJlcG9ydHMgYSBiYWxhbmNlLCBzbyBjaGVja2luZyB0aGUgYW1vdW50CiAgICAvLyAjIGlzIG5vdCBlbm91Z2guIFRoZSB0cmFuc2ZlciB3b3VsZCBmYWlsIHdpdGggImFzc2V0IGZyb3plbiBpbgogICAgLy8gIyByZWNpcGllbnQiLCBhbmQgaXQgc2hhcmVzIGEgdHJhbnNhY3Rpb24gd2l0aCB0aGUgQUxHTyByZWZ1bmQsIHNvCiAgICAvLyAjIHRoZSBjcmVhdG9yIHdvdWxkIGxvc2UgdGhlaXIgZXNjcm93IGFuZCBib3ggbWluaW11bSBiYWxhbmNlIGZvcgogICAgLy8gIyBnb29kLiBUaGV5IGNhbm5vdCBldmVuIGVzY2FwZSBieSBvcHRpbmcgb3V0OiBhIGZyb3plbiBhY2NvdW50CiAgICAvLyAjIGNhbm5vdCBjbG9zZSBhbiBhc3NldCBob2xkaW5nLgogICAgLy8gYm9udXMgPSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDMKCmNhbmNlbF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozNDcKICAgIC8vIHVwa2VlcC5iYWxhbmNlLmFzX3VpbnQ2NCgpCiAgICBzd2FwCiAgICBkdXAKICAgIHB1c2hpbnQgNjYKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozNDgKICAgIC8vICsgQk9YX01CUl9GSVhFRAogICAgaW50YyA3IC8vIDU4MTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM0Ny0zNDgKICAgIC8vIHVwa2VlcC5iYWxhbmNlLmFzX3VpbnQ2NCgpCiAgICAvLyArIEJPWF9NQlJfRklYRUQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzQ5CiAgICAvLyArIDQwMCAqIHVwa2VlcC5jYWxsX2FyZ3MuYnl0ZXMubGVuZ3RoCiAgICB1bmNvdmVyIDIKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGxlbgogICAgcHVzaGludCA0MDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzQ3LTM0OQogICAgLy8gdXBrZWVwLmJhbGFuY2UuYXNfdWludDY0KCkKICAgIC8vICsgQk9YX01CUl9GSVhFRAogICAgLy8gKyA0MDAgKiB1cGtlZXAuY2FsbF9hcmdzLmJ5dGVzLmxlbmd0aAogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzUxCiAgICAvLyBkZWwgYm94LnZhbHVlCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzUyCiAgICAvLyBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PXJlZnVuZCkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIHR4biBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzIgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gaWYgYm9udXMgPiAwOgogICAgZGlnIDEKICAgIGJ6IGNhbmNlbF9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM1NC0zNTgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PUFzc2V0KGJvbnVzX2Fzc2V0KSwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1ib251cywKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzU2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzU0LTM1OAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9QXNzZXQoYm9udXNfYXNzZXQpLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWJvbnVzLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCmNhbmNlbF9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weToyOTYKICAgIC8vIEBhYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5rZWVwZXIuY29udHJhY3QuS2VlcGVyLmV4ZWN1dGVbcm91dGluZ10oKSAtPiB2b2lkOgpleGVjdXRlOgogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzYxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzY3CiAgICAvLyBib3ggPSBCb3goVXBrZWVwLCBrZXk9b3AuY29uY2F0KGIidSIsIG9wLml0b2IodXBrZWVwX2lkKSkpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4NzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM2OAogICAgLy8gYXNzZXJ0IGJveCwgIlVwa2VlcCBub3QgZm91bmQiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBVcGtlZXAgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gdXBrZWVwID0gYm94LnZhbHVlLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gdXBrZWVwID0gYm94LnZhbHVlLmNvcHkoKQogICAgLy8gZHVlOiBVSW50NjQgPSB1cGtlZXAubmV4dF9leGVjdXRpb25fcm91bmQuYXNfdWludDY0KCkKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM3MAogICAgLy8gZHVlOiBVSW50NjQgPSB1cGtlZXAubmV4dF9leGVjdXRpb25fcm91bmQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozNzEKICAgIC8vIGFzc2VydCBHbG9iYWwucm91bmQgPj0gZHVlLCAiTm90IGR1ZSIKICAgIGdsb2JhbCBSb3VuZAogICAgPD0KICAgIGFzc2VydCAvLyBOb3QgZHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gaW50ZXJ2YWw6IFVJbnQ2NCA9IHVwa2VlcC5pbnRlcnZhbF9yb3VuZHMuYXNfdWludDY0KCkKICAgIGR1cAogICAgcHVzaGludCA0MgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6Mzc0CiAgICAvLyBiYXNlOiBVSW50NjQgPSB1cGtlZXAuZmVlX3Blcl9leGVjdXRpb24uYXNfdWludDY0KCkKICAgIGR1cAogICAgcHVzaGludCA1OAogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozNzUKICAgIC8vIGNhcDogVUludDY0ID0gdXBrZWVwLmZlZV9jYXAuYXNfdWludDY0KCkKICAgIHB1c2hpbnQgOTAKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidG9pCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozNzctMzkwCiAgICAvLyAjIGBkdWUgPiBsYXN0X3NlcnZpY2VkX3JvdW5kYCBtZWFucyB0aGlzIHVwa2VlcCB3YXMgb24gc2NoZWR1bGUgdGhlCiAgICAvLyAjIGxhc3QgdGltZSBpdCByYW4sIHNvIGJlaW5nIGxhdGUgbm93IGlzIGdlbnVpbmUgbmVnbGVjdC4gV2hlbiBpdCBpcwogICAgLy8gIyBmYWxzZSB0aGUgY2FsbCBpcyBhIHJlcGxheSBvZiBhIGJhY2tsb2csIGFuZCBhIHJlcGxheSBuZXZlciBwYXlzCiAgICAvLyAjIG1vcmUgdGhhbiBiYXNlLgogICAgLy8gIwogICAgLy8gIyBCb3RoIGhhbHZlcyBhcmUgbmVlZGVkLiBNZWFzdXJpbmcgbGF0ZW5lc3MgZnJvbSB0aGUgbGFzdCBzZXJ2aWNlIGlzCiAgICAvLyAjIHdoYXQgc3RvcHMgYSBidXJzdCBkcmFpbmVkIGluIG9uZSBnbyBmcm9tIHBheWluZyB0aGUgY2VpbGluZyBvbgogICAgLy8gIyBldmVyeSByZXBsYXkuIE9uIGl0cyBvd24gaXQgaXMgbm90IGVub3VnaDogdW5kZXIgQ0FUQ0hfVVAgYSByZXBsYXkKICAgIC8vICMgb25seSBhZHZhbmNlcyB0aGUgc2NoZWR1bGUgYnkgb25lIGludGVydmFsLCBzbyBhIGtlZXBlciB0aGF0IHdhaXRzCiAgICAvLyAjIHR3byBpbnRlcnZhbHMgYmV0d2VlbiByZXBsYXlzIGlzIGxhdGUgYWdhaW4gYnkgaXRzIG93biBtZWFzdXJlLCBhbmQKICAgIC8vICMgY29sbGVjdHMgdGhlIGNlaWxpbmcgZXZlcnkgdGltZSB3aGlsZSB0aGUgYmFja2xvZyBncm93cyB3aXRob3V0CiAgICAvLyAjIGJvdW5kLiBNZWFzdXJlZDogMzQgcnVucyB0b29rIDEwMCUgb2YgYSA0MDAsMDAwIMK1QUxHTyBlc2Nyb3cgYW5kCiAgICAvLyAjIGxlZnQgdGhlIHVwa2VlcCA1LDQwMCByb3VuZHMgZnVydGhlciBiZWhpbmQgdGhhbiBpdCBzdGFydGVkLgogICAgLy8gaWYgY2FwID4gYmFzZSBhbmQgZHVlID4gdXBrZWVwLmxhc3Rfc2VydmljZWRfcm91bmQuYXNfdWludDY0KCk6CiAgICA+CiAgICBibnogZXhlY3V0ZV9hbmRfY29udGRAMgogICAgcG9wCiAgICBkaWcgMgogICAgYnVyeSAxMwoKZXhlY3V0ZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MDgKICAgIC8vIGFzc2VydCB1cGtlZXAuYmFsYW5jZS5hc191aW50NjQoKSA+PSBmZWUsICJJbnN1ZmZpY2llbnQgZnVuZGluZyIKICAgIGR1cG4gMgogICAgcHVzaGludCA2NgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxNQogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgZnVuZGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MTAKICAgIC8vIG5leHRfZHVlOiBVSW50NjQgPSBkdWUgKyBpbnRlcnZhbAogICAgZGlnIDgKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gaWYgdXBrZWVwLnBvbGljeS5hc191aW50NjQoKSA9PSBTS0lQX0FIRUFEOgogICAgcHVzaGludCA4MgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMjAKICAgIGJ0b2kKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYnogZXhlY3V0ZV9hZnRlcl9pZl9lbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQxMi00MTUKICAgIC8vICMgU25hcCB0byB0aGUgZmlyc3Qgc2xvdCBzdHJpY3RseSBpbiB0aGUgZnV0dXJlLCBrZWVwaW5nIHRoZQogICAgLy8gIyBzY2hlZHVsZSdzIHBoYXNlOiBhIGRhaWx5IHVwa2VlcCBzdGF5cyBvbiBpdHMgdGltZSBvZiBkYXkgcmF0aGVyCiAgICAvLyAjIHRoYW4gZHJpZnRpbmcgdG8gd2hlbmV2ZXIgYSBrZWVwZXIgaGFwcGVuZWQgdG8gYXJyaXZlLgogICAgLy8gbWlzc2VkOiBVSW50NjQgPSAoR2xvYmFsLnJvdW5kIC0gZHVlKSAvLyBpbnRlcnZhbAogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgOAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQxNgogICAgLy8gbmV4dF9kdWUgPSBkdWUgKyAobWlzc2VkICsgMSkgKiBpbnRlcnZhbAogICAgaW50Y18yIC8vIDEKICAgICsKICAgICoKICAgICsKICAgIGJ1cnkgMTEKCmV4ZWN1dGVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDE3CiAgICAvLyBuZXdfYmFsYW5jZTogVUludDY0ID0gdXBrZWVwLmJhbGFuY2UuYXNfdWludDY0KCkgLSBmZWUKICAgIGRpZyAxMwogICAgLQogICAgYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MTgKICAgIC8vIHRpbWVzOiBVSW50NjQgPSB1cGtlZXAudGltZXNfZXhlY3V0ZWQuYXNfdWludDY0KCkgKyAxCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgNzQKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDIwLTQyNQogICAgLy8gIyBUaGUgQVNBIGJvbnVzIGlzIHBhaWQgb25seSB3aGVuIHRoZXJlIGlzIG9uZSwgdGhlIGVzY3JvdyBjYW4gY292ZXIgaXQKICAgIC8vICMgYW5kIHRoZSBrZWVwZXIgY2FuIHJlY2VpdmUgaXQuIEEga2VlcGVyIHRoYXQgaGFzIG5vdCBvcHRlZCBpbiBpcyBub3QKICAgIC8vICMgYSBmYWlsZWQgZXhlY3V0aW9uIOKAlCBpdCB0YWtlcyB0aGUgZnVsbCBBTEdPIGZlZSBhbmQgZm9yZmVpdHMgdGhlCiAgICAvLyAjIGJvbnVzLCB3aGljaCBzdGF5cyBpbiBlc2Nyb3cgZm9yIHRoZSBjcmVhdG9yLiBSZXZlcnRpbmcgaW5zdGVhZCB3b3VsZAogICAgLy8gIyBxdWlldGx5IHNocmluayB0aGUga2VlcGVyIHNldCBmb3IgZXhhY3RseSB0aGUgdXBrZWVwcyBwYXlpbmcgZXh0cmEuCiAgICAvLyBib251c19hc3NldDogVUludDY0ID0gdXBrZWVwLmZlZV9hc3NldC5hc191aW50NjQoKQogICAgZHVwCiAgICBwdXNoaW50IDEwNgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGJ1cnkgMTkKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MjYKICAgIC8vIGJvbnVzOiBVSW50NjQgPSB1cGtlZXAuYXNzZXRfZmVlLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIHB1c2hpbnQgMTE0CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAyMgogICAgYnRvaQogICAgYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MjcKICAgIC8vIGFzc2V0X2JhbGFuY2U6IFVJbnQ2NCA9IHVwa2VlcC5hc3NldF9iYWxhbmNlLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDEyMgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQzNi00NDEKICAgIC8vIGJvbnVzX2Fzc2V0ID4gMAogICAgLy8gYW5kIGFzc2V0X2JhbGFuY2UgPj0gYm9udXMKICAgIC8vIGFuZCBUeG4uc2VuZGVyLmlzX29wdGVkX2luKEFzc2V0KGJvbnVzX2Fzc2V0KSkKICAgIC8vIGFuZCBBc3NldChib251c19hc3NldCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKSA+PSBib251cwogICAgLy8gYW5kIG5vdCBBc3NldChib251c19hc3NldCkuZnJvemVuKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyBhbmQgbm90IEFzc2V0KGJvbnVzX2Fzc2V0KS5mcm96ZW4oVHhuLnNlbmRlcikKICAgIGJ6IGV4ZWN1dGVfYm9vbF9mYWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MzcKICAgIC8vIGFuZCBhc3NldF9iYWxhbmNlID49IGJvbnVzCiAgICBkdXAKICAgIGRpZyAxNwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDM2LTQ0MQogICAgLy8gYm9udXNfYXNzZXQgPiAwCiAgICAvLyBhbmQgYXNzZXRfYmFsYW5jZSA+PSBib251cwogICAgLy8gYW5kIFR4bi5zZW5kZXIuaXNfb3B0ZWRfaW4oQXNzZXQoYm9udXNfYXNzZXQpKQogICAgLy8gYW5kIEFzc2V0KGJvbnVzX2Fzc2V0KS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpID49IGJvbnVzCiAgICAvLyBhbmQgbm90IEFzc2V0KGJvbnVzX2Fzc2V0KS5mcm96ZW4oR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vIGFuZCBub3QgQXNzZXQoYm9udXNfYXNzZXQpLmZyb3plbihUeG4uc2VuZGVyKQogICAgYnogZXhlY3V0ZV9ib29sX2ZhbHNlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gYW5kIFR4bi5zZW5kZXIuaXNfb3B0ZWRfaW4oQXNzZXQoYm9udXNfYXNzZXQpKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDE2CiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MzYtNDQxCiAgICAvLyBib251c19hc3NldCA+IDAKICAgIC8vIGFuZCBhc3NldF9iYWxhbmNlID49IGJvbnVzCiAgICAvLyBhbmQgVHhuLnNlbmRlci5pc19vcHRlZF9pbihBc3NldChib251c19hc3NldCkpCiAgICAvLyBhbmQgQXNzZXQoYm9udXNfYXNzZXQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykgPj0gYm9udXMKICAgIC8vIGFuZCBub3QgQXNzZXQoYm9udXNfYXNzZXQpLmZyb3plbihHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gYW5kIG5vdCBBc3NldChib251c19hc3NldCkuZnJvemVuKFR4bi5zZW5kZXIpCiAgICBieiBleGVjdXRlX2Jvb2xfZmFsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDM5CiAgICAvLyBhbmQgQXNzZXQoYm9udXNfYXNzZXQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykgPj0gYm9udXMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMTYKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgZGlnIDE3CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MzYtNDQxCiAgICAvLyBib251c19hc3NldCA+IDAKICAgIC8vIGFuZCBhc3NldF9iYWxhbmNlID49IGJvbnVzCiAgICAvLyBhbmQgVHhuLnNlbmRlci5pc19vcHRlZF9pbihBc3NldChib251c19hc3NldCkpCiAgICAvLyBhbmQgQXNzZXQoYm9udXNfYXNzZXQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykgPj0gYm9udXMKICAgIC8vIGFuZCBub3QgQXNzZXQoYm9udXNfYXNzZXQpLmZyb3plbihHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gYW5kIG5vdCBBc3NldChib251c19hc3NldCkuZnJvemVuKFR4bi5zZW5kZXIpCiAgICBieiBleGVjdXRlX2Jvb2xfZmFsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDQwCiAgICAvLyBhbmQgbm90IEFzc2V0KGJvbnVzX2Fzc2V0KS5mcm96ZW4oR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMTYKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0RnJvemVuCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICBibnogZXhlY3V0ZV9ib29sX2ZhbHNlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gYW5kIG5vdCBBc3NldChib251c19hc3NldCkuZnJvemVuKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMTYKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0RnJvemVuCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICBibnogZXhlY3V0ZV9ib29sX2ZhbHNlQDE5CiAgICBpbnRjXzIgLy8gMQoKZXhlY3V0ZV9ib29sX21lcmdlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NDMKICAgIC8vIGlmIHBheXNfYm9udXM6CiAgICBkdXAKICAgIGJ6IGV4ZWN1dGVfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NDQKICAgIC8vIGFzc2V0X2JhbGFuY2UgPSBhc3NldF9iYWxhbmNlIC0gYm9udXMKICAgIHN3YXAKICAgIGRpZyAxNwogICAgLQogICAgc3dhcAoKZXhlY3V0ZV9hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NDYtNDUzCiAgICAvLyBib3gudmFsdWUgPSB1cGtlZXAuX3JlcGxhY2UoCiAgICAvLyAgICAgbmV4dF9leGVjdXRpb25fcm91bmQ9YXJjNC5VSW50NjQobmV4dF9kdWUpLAogICAgLy8gICAgIGJhbGFuY2U9YXJjNC5VSW50NjQobmV3X2JhbGFuY2UpLAogICAgLy8gICAgIHRpbWVzX2V4ZWN1dGVkPWFyYzQuVUludDY0KHRpbWVzKSwKICAgIC8vICAgICBsYXN0X3NlcnZpY2VkX3JvdW5kPWFyYzQuVUludDY0KEdsb2JhbC5yb3VuZCksCiAgICAvLyAgICAgYXNzZXRfYmFsYW5jZT1hcmM0LlVJbnQ2NChhc3NldF9iYWxhbmNlKSwKICAgIC8vICAgICBjYWxsX2FyZ3M9dXBrZWVwLmNhbGxfYXJncy5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgcHVzaGludCAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyCiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDUyCiAgICAvLyBjYWxsX2FyZ3M9dXBrZWVwLmNhbGxfYXJncy5jb3B5KCksCiAgICBkaWcgMTIKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDQ3CiAgICAvLyBuZXh0X2V4ZWN1dGlvbl9yb3VuZD1hcmM0LlVJbnQ2NChuZXh0X2R1ZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NDgKICAgIC8vIGJhbGFuY2U9YXJjNC5VSW50NjQobmV3X2JhbGFuY2UpLAogICAgZGlnIDE4CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ0OQogICAgLy8gdGltZXNfZXhlY3V0ZWQ9YXJjNC5VSW50NjQodGltZXMpLAogICAgZGlnIDE3CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ1MAogICAgLy8gbGFzdF9zZXJ2aWNlZF9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ1MQogICAgLy8gYXNzZXRfYmFsYW5jZT1hcmM0LlVJbnQ2NChhc3NldF9iYWxhbmNlKSwKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDQ2LTQ1MwogICAgLy8gYm94LnZhbHVlID0gdXBrZWVwLl9yZXBsYWNlKAogICAgLy8gICAgIG5leHRfZXhlY3V0aW9uX3JvdW5kPWFyYzQuVUludDY0KG5leHRfZHVlKSwKICAgIC8vICAgICBiYWxhbmNlPWFyYzQuVUludDY0KG5ld19iYWxhbmNlKSwKICAgIC8vICAgICB0aW1lc19leGVjdXRlZD1hcmM0LlVJbnQ2NCh0aW1lcyksCiAgICAvLyAgICAgbGFzdF9zZXJ2aWNlZF9yb3VuZD1hcmM0LlVJbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gICAgIGFzc2V0X2JhbGFuY2U9YXJjNC5VSW50NjQoYXNzZXRfYmFsYW5jZSksCiAgICAvLyAgICAgY2FsbF9hcmdzPXVwa2VlcC5jYWxsX2FyZ3MuY29weSgpLAogICAgLy8gKQogICAgdW5jb3ZlciA3CiAgICBkaWcgNwogICAgY29uY2F0CiAgICBieXRlY18zIC8vIDB4MDA4MgogICAgY29uY2F0CiAgICBkaWcgMTYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyNQogICAgY29uY2F0CiAgICBkaWcgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDIzCiAgICBjb25jYXQKICAgIGRpZyAyNQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDU1LTQ2MAogICAgLy8gIyBPbmUgc3RhdGljIGJyYW5jaCBwZXIgYXJndW1lbnQgY291bnQuIEJ1aWxkaW5nIHRoZSBhcnJheSBpbiBhIGxvb3AKICAgIC8vICMgY29tcGlsZXMgYnV0IGRvZXMgbm90IHdvcms6IFB1eWEgbW9kZWxzIGBhcHBfYXJnc2AgYXMKICAgIC8vICMgY29tcGlsZS10aW1lLW51bWJlcmVkIHNsb3RzIGFuZCBob2lzdHMgdGhlIGlubmVyIHRyYW5zYWN0aW9uIG91dCBvZgogICAgLy8gIyB0aGUgbG9vcCwgc28gb25seSB0aGUgbGFzdCBhc3NpZ25tZW50IHN1cnZpdmVzLiBgcmVnaXN0ZXJgIGJvdW5kcyB0aGUKICAgIC8vICMgY291bnQsIHNvIHRoZSBmaW5hbCBicmFuY2ggaXMgdW5yZWFjaGFibGUuCiAgICAvLyB0YXJnZXQ6IFVJbnQ2NCA9IHVwa2VlcC50YXJnZXRfYXBwLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gYXJnX2NvdW50OiBVSW50NjQgPSB1cGtlZXAuY2FsbF9hcmdzLmxlbmd0aAogICAgaW50YyA1IC8vIDEzMAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDYyCiAgICAvLyBpZiBhcmdfY291bnQgPT0gMToKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYnogZXhlY3V0ZV9lbHNlX2JvZHlAMjUKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NjMtNDY3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9dGFyZ2V0LAogICAgLy8gICAgIGFwcF9hcmdzPSh1cGtlZXAuY2FsbF9hcmdzWzBdLm5hdGl2ZSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5Ob09wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NjUKICAgIC8vIGFwcF9hcmdzPSh1cGtlZXAuY2FsbF9hcmdzWzBdLm5hdGl2ZSwpLAogICAgdW5jb3ZlciAzCiAgICBkdXAKICAgIGludGMgNSAvLyAxMzAKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgaW50YyA0IC8vIDEzMgogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDQgLy8gMTMyCiAgICArCiAgICBkdXAyCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBib3hfZXh0cmFjdAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDY2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uTm9PcCwKICAgIGludGNfMSAvLyBOb09wCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ2MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ2My00NjcKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD10YXJnZXQsCiAgICAvLyAgICAgYXBwX2FyZ3M9KHVwa2VlcC5jYWxsX2FyZ3NbMF0ubmF0aXZlLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKZXhlY3V0ZV9hZnRlcl9pZl9lbHNlQDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0ODIKICAgIC8vIGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9ZmVlKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgdHhuIFNlbmRlcgogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18yIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0ODMKICAgIC8vIGlmIHBheXNfYm9udXM6CiAgICBieiBleGVjdXRlX2FmdGVyX2lmX2Vsc2VAMzgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDg0LTQ4OAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9QXNzZXQoYm9udXNfYXNzZXQpLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWJvbnVzLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0ODYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMTYKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZGlnIDE0CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0ODQKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ4NC00ODgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PUFzc2V0KGJvbnVzX2Fzc2V0KSwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1ib251cywKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpleGVjdXRlX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgpleGVjdXRlX2Vsc2VfYm9keUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDY4CiAgICAvLyBlbGlmIGFyZ19jb3VudCA9PSAyOgogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IGV4ZWN1dGVfZWxzZV9ib2R5QDI4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDY5LTQ3MwogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXRhcmdldCwKICAgIC8vICAgICBhcHBfYXJncz0odXBrZWVwLmNhbGxfYXJnc1swXS5uYXRpdmUsIHVwa2VlcC5jYWxsX2FyZ3NbMV0ubmF0aXZlLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gYXBwX2FyZ3M9KHVwa2VlcC5jYWxsX2FyZ3NbMF0ubmF0aXZlLCB1cGtlZXAuY2FsbF9hcmdzWzFdLm5hdGl2ZSwpLAogICAgdW5jb3ZlciAzCiAgICBkdXAKICAgIGludGMgNSAvLyAxMzAKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIGludGMgNCAvLyAxMzIKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50YyA0IC8vIDEzMgogICAgKwogICAgZGlnIDIKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzIgLy8gMQogICAgdW5jb3ZlciAyCiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMTM0CiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxMzIKICAgICsKICAgIGRpZyAyCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDcyCiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uTm9PcCwKICAgIGludGNfMSAvLyBOb09wCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NjkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NjktNDczCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9dGFyZ2V0LAogICAgLy8gICAgIGFwcF9hcmdzPSh1cGtlZXAuY2FsbF9hcmdzWzBdLm5hdGl2ZSwgdXBrZWVwLmNhbGxfYXJnc1sxXS5uYXRpdmUsKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uTm9PcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBiIGV4ZWN1dGVfYWZ0ZXJfaWZfZWxzZUAzNAoKZXhlY3V0ZV9lbHNlX2JvZHlAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ3NAogICAgLy8gZWxpZiBhcmdfY291bnQgPT0gMzoKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBVbnN1cHBvcnRlZCBhcmd1bWVudCBjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0NzUtNDc5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9dGFyZ2V0LAogICAgLy8gICAgIGFwcF9hcmdzPSh1cGtlZXAuY2FsbF9hcmdzWzBdLm5hdGl2ZSwgdXBrZWVwLmNhbGxfYXJnc1sxXS5uYXRpdmUsIHVwa2VlcC5jYWxsX2FyZ3NbMl0ubmF0aXZlLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ3NwogICAgLy8gYXBwX2FyZ3M9KHVwa2VlcC5jYWxsX2FyZ3NbMF0ubmF0aXZlLCB1cGtlZXAuY2FsbF9hcmdzWzFdLm5hdGl2ZSwgdXBrZWVwLmNhbGxfYXJnc1syXS5uYXRpdmUsKSwKICAgIHVuY292ZXIgMwogICAgZHVwCiAgICBpbnRjIDUgLy8gMTMwCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMTMyCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxMzIKICAgICsKICAgIGRpZyAyCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBleHRyYWN0IDIgMAogICAgaW50Y18yIC8vIDEKICAgIGRpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMTM0CiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGMgNCAvLyAxMzIKICAgICsKICAgIGRpZyAzCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDQKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBleHRyYWN0IDIgMAogICAgaW50Y18zIC8vIDIKICAgIHVuY292ZXIgMwogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDEzNgogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjIDQgLy8gMTMyCiAgICArCiAgICBkaWcgMwogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjQ3OAogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICBpbnRjXzEgLy8gTm9PcAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDc1CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NDc1LTQ3OQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXRhcmdldCwKICAgIC8vICAgICBhcHBfYXJncz0odXBrZWVwLmNhbGxfYXJnc1swXS5uYXRpdmUsIHVwa2VlcC5jYWxsX2FyZ3NbMV0ubmF0aXZlLCB1cGtlZXAuY2FsbF9hcmdzWzJdLm5hdGl2ZSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5Ob09wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgZXhlY3V0ZV9hZnRlcl9pZl9lbHNlQDM0CgpleGVjdXRlX2Jvb2xfZmFsc2VAMTk6CiAgICBpbnRjXzEgLy8gMAogICAgYiBleGVjdXRlX2Jvb2xfbWVyZ2VAMjAKCmV4ZWN1dGVfYW5kX2NvbnRkQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM3Ny0zOTAKICAgIC8vICMgYGR1ZSA+IGxhc3Rfc2VydmljZWRfcm91bmRgIG1lYW5zIHRoaXMgdXBrZWVwIHdhcyBvbiBzY2hlZHVsZSB0aGUKICAgIC8vICMgbGFzdCB0aW1lIGl0IHJhbiwgc28gYmVpbmcgbGF0ZSBub3cgaXMgZ2VudWluZSBuZWdsZWN0LiBXaGVuIGl0IGlzCiAgICAvLyAjIGZhbHNlIHRoZSBjYWxsIGlzIGEgcmVwbGF5IG9mIGEgYmFja2xvZywgYW5kIGEgcmVwbGF5IG5ldmVyIHBheXMKICAgIC8vICMgbW9yZSB0aGFuIGJhc2UuCiAgICAvLyAjCiAgICAvLyAjIEJvdGggaGFsdmVzIGFyZSBuZWVkZWQuIE1lYXN1cmluZyBsYXRlbmVzcyBmcm9tIHRoZSBsYXN0IHNlcnZpY2UgaXMKICAgIC8vICMgd2hhdCBzdG9wcyBhIGJ1cnN0IGRyYWluZWQgaW4gb25lIGdvIGZyb20gcGF5aW5nIHRoZSBjZWlsaW5nIG9uCiAgICAvLyAjIGV2ZXJ5IHJlcGxheS4gT24gaXRzIG93biBpdCBpcyBub3QgZW5vdWdoOiB1bmRlciBDQVRDSF9VUCBhIHJlcGxheQogICAgLy8gIyBvbmx5IGFkdmFuY2VzIHRoZSBzY2hlZHVsZSBieSBvbmUgaW50ZXJ2YWwsIHNvIGEga2VlcGVyIHRoYXQgd2FpdHMKICAgIC8vICMgdHdvIGludGVydmFscyBiZXR3ZWVuIHJlcGxheXMgaXMgbGF0ZSBhZ2FpbiBieSBpdHMgb3duIG1lYXN1cmUsIGFuZAogICAgLy8gIyBjb2xsZWN0cyB0aGUgY2VpbGluZyBldmVyeSB0aW1lIHdoaWxlIHRoZSBiYWNrbG9nIGdyb3dzIHdpdGhvdXQKICAgIC8vICMgYm91bmQuIE1lYXN1cmVkOiAzNCBydW5zIHRvb2sgMTAwJSBvZiBhIDQwMCwwMDAgwrVBTEdPIGVzY3JvdyBhbmQKICAgIC8vICMgbGVmdCB0aGUgdXBrZWVwIDUsNDAwIHJvdW5kcyBmdXJ0aGVyIGJlaGluZCB0aGFuIGl0IHN0YXJ0ZWQuCiAgICAvLyBpZiBjYXAgPiBiYXNlIGFuZCBkdWUgPiB1cGtlZXAubGFzdF9zZXJ2aWNlZF9yb3VuZC5hc191aW50NjQoKToKICAgIGRpZyAxCiAgICBwdXNoaW50IDk4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZGlnIDkKICAgIDwKICAgIGJueiBleGVjdXRlX2lmX2JvZHlAMwogICAgcG9wbiAyCiAgICBkaWcgMgogICAgYnVyeSAxMwogICAgYiBleGVjdXRlX2FmdGVyX2lmX2Vsc2VAMTAKCmV4ZWN1dGVfaWZfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozOTEtMzkzCiAgICAvLyAjIEVzY2FsYXRpb24gZXhpc3RzIHRvIGNsZWFyIGEgbWFya2V0OyBvbmNlIGEga2VlcGVyIGhhcyBhcnJpdmVkCiAgICAvLyAjIHRoZSBtYXJrZXQgaGFzIGNsZWFyZWQuCiAgICAvLyBsYXRlbmVzczogVUludDY0ID0gR2xvYmFsLnJvdW5kIC0gdXBrZWVwLmxhc3Rfc2VydmljZWRfcm91bmQuYXNfdWludDY0KCkKICAgIGdsb2JhbCBSb3VuZAogICAgc3dhcAogICAgLQogICAgZHVwCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gZXhjZXNzOiBVSW50NjQgPSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gaWYgbGF0ZW5lc3MgPiBpbnRlcnZhbDoKICAgIGRpZyA2CiAgICA+CiAgICBieiBleGVjdXRlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozOTYKICAgIC8vIGV4Y2VzcyA9IGxhdGVuZXNzIC0gaW50ZXJ2YWwKICAgIGRpZyAxMgogICAgZGlnIDYKICAgIC0KICAgIGJ1cnkgMTUKCmV4ZWN1dGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTozOTcKICAgIC8vIGlmIGV4Y2VzcyA+IGludGVydmFsOgogICAgZGlnIDE0CiAgICBkaWcgNgogICAgPgogICAgYnogZXhlY3V0ZV9hZnRlcl9pZl9lbHNlQDcKICAgIGRpZyA1CiAgICBidXJ5IDE1CgpleGVjdXRlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6Mzk5LTQwMAogICAgLy8gIyBMaW5lYXIgZnJvbSBiYXNlIHRvIGNhcCBvdmVyIG9uZSBtaXNzZWQgaW50ZXJ2YWwsIHRoZW4gZmxhdC4KICAgIC8vIGZlZSA9IGJhc2UgKyAoY2FwIC0gYmFzZSkgKiBleGNlc3MgLy8gaW50ZXJ2YWwKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC0KICAgIGRpZyAxNQogICAgKgogICAgZGlnIDYKICAgIC8KICAgICsKICAgIGR1cAogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0MDEtNDA2CiAgICAvLyAjIEFuIHVwa2VlcCBjYW4gb25seSBiaWQgd2hhdCBpdCBob2xkcy4gV2l0aG91dCB0aGlzLCBhbiBlc2Nyb3cKICAgIC8vICMgdGhhdCBoYXMgZmFsbGVuIGJlbG93IHRoZSBlc2NhbGF0ZWQgZmVlIGZyZWV6ZXMgdGhlIHVwa2VlcCBmb3IKICAgIC8vICMgZ29vZCDigJQgbGF0ZW5lc3Mgb25seSBncm93cywgc28gdGhlIHByaWNlIGl0IGNhbm5vdCBwYXkgb25seQogICAgLy8gIyByaXNlcy4gRHJvcHBpbmcgYmFjayB0byB0aGUgYmFzZSBmZWUga2VlcHMgaXQgZXhlY3V0YWJsZSBieQogICAgLy8gIyBhbnlvbmUgdW50aWwgdGhlIGVzY3JvdyBpcyBnZW51aW5lbHkgZW1wdHkuCiAgICAvLyBpZiB1cGtlZXAuYmFsYW5jZS5hc191aW50NjQoKSA8IGZlZToKICAgIGRpZyAxCiAgICBwdXNoaW50IDY2CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgID4KICAgIGJ6IGV4ZWN1dGVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgZGlnIDIKICAgIGJ1cnkgMTMKICAgIGIgZXhlY3V0ZV9hZnRlcl9pZl9lbHNlQDEwCgoKLy8gc21hcnRfY29udHJhY3RzLmtlZXBlci5jb250cmFjdC5LZWVwZXIub3B0X2luX2Fzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0X2luX2Fzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gYm94ID0gQm94KFVwa2VlcCwga2V5PW9wLmNvbmNhdChiInUiLCBvcC5pdG9iKHVwa2VlcF9pZCkpKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NTA0CiAgICAvLyBhc3NlcnQgYm94LCAiVXBrZWVwIG5vdCBmb3VuZCIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gVXBrZWVwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1MDYKICAgIC8vIGJveC52YWx1ZS5mZWVfYXNzZXQuYXNfdWludDY0KCkgPT0gYXNzZXQuaWQKICAgIHB1c2hpbnQgMTA2CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1MDUtNTA3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGJveC52YWx1ZS5mZWVfYXNzZXQuYXNfdWludDY0KCkgPT0gYXNzZXQuaWQKICAgIC8vICksICJUaGF0IHVwa2VlcCBkb2VzIG5vdCB1c2UgdGhpcyBhc3NldCIKICAgIGFzc2VydCAvLyBUaGF0IHVwa2VlcCBkb2VzIG5vdCB1c2UgdGhpcyBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1MDkKICAgIC8vIG1icl9wYXltZW50LnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUwOC01MTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbWJyX3BheW1lbnQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgIk1CUiBwYXltZW50IG11c3QgZnVuZCB0aGUgYXBwIGFjY291bnQiCiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgbXVzdCBmdW5kIHRoZSBhcHAgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1MTEtNTEzCiAgICAvLyAjIFRoZSBkZXBvc2l0IGlzIG5vdCByZWZ1bmRhYmxlLCBzbyBhIHBheW1lbnQgc29tZWJvZHkgZWxzZSBzaWduZWQgaXMKICAgIC8vICMgbW9uZXkgdGFrZW4gZnJvbSB0aGVtIGFuZCBrZXB0LCB3aXRoIG5vdGhpbmcgY3JlZGl0aW5nIHRoZW0gZm9yIGl0LgogICAgLy8gYXNzZXJ0IG1icl9wYXltZW50LnNlbmRlciA9PSBUeG4uc2VuZGVyLCAiTUJSIHBheW1lbnQgbXVzdCBjb21lIGZyb20gdGhlIGNhbGxlciIKICAgIGRpZyAxCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgbXVzdCBjb21lIGZyb20gdGhlIGNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1MTQKICAgIC8vIGFzc2VydCBtYnJfcGF5bWVudC5yZWtleV90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzLCAiTUJSIHBheW1lbnQgbXVzdCBub3QgcmVrZXkiCiAgICBkaWcgMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE1CUiBwYXltZW50IG11c3Qgbm90IHJla2V5CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUxNgogICAgLy8gbWJyX3BheW1lbnQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGRpZyAxCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUxNS01MTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbWJyX3BheW1lbnQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJNQlIgcGF5bWVudCBtdXN0IG5vdCBjbG9zZSIKICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IG5vdCBjbG9zZQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1MTgKICAgIC8vIGFzc2VydCBtYnJfcGF5bWVudC5hbW91bnQgPj0gQVNTRVRfT1BUX0lOX01CUiwgIk1CUiBwYXltZW50IHRvbyBzbWFsbCIKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgcHVzaGludCAxMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgdG9vIHNtYWxsCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUxOS01MjMKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUyMQogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1MTkKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUxOS01MjMKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo0OTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDAwMDAwMDAwMDE4NmEwCiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMua2VlcGVyLmNvbnRyYWN0LktlZXBlci50b3BfdXBfYXNzZXRbcm91dGluZ10oKSAtPiB2b2lkOgp0b3BfdXBfYXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjUzNwogICAgLy8gYm94ID0gQm94KFVwa2VlcCwga2V5PW9wLmNvbmNhdChiInUiLCBvcC5pdG9iKHVwa2VlcF9pZCkpKQogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NTM4CiAgICAvLyBhc3NlcnQgYm94LCAiVXBrZWVwIG5vdCBmb3VuZCIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gVXBrZWVwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1MzkKICAgIC8vIHVwa2VlcCA9IGJveC52YWx1ZS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjU0MQogICAgLy8gYXNzZXRfZnVuZGluZy5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBkaWcgMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjU0MC01NDIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXNzZXRfZnVuZGluZy5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiQXNzZXQgZnVuZGluZyBtdXN0IGdvIHRvIHRoZSBhcHAgYWNjb3VudCIKICAgIGFzc2VydCAvLyBBc3NldCBmdW5kaW5nIG11c3QgZ28gdG8gdGhlIGFwcCBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjU0NgogICAgLy8gYXNzZXRfZnVuZGluZy5zZW5kZXIgPT0gVHhuLnNlbmRlcgogICAgZGlnIDEKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NTQzLTU0NwogICAgLy8gIyBTYW1lIHJlYXNvbiBhcyBgdG9wX3VwYDogYSBib251cyBzb21lYm9keSBlbHNlJ3MgdHJhbnNmZXIgcGFpZCBmb3IKICAgIC8vICMgYmVjb21lcyB0aGUgdXBrZWVwIGNyZWF0b3IncyB0byBzcGVuZCwgYW5kIG9ubHkgdGhleSBjYW4gY2FuY2VsLgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhc3NldF9mdW5kaW5nLnNlbmRlciA9PSBUeG4uc2VuZGVyCiAgICAvLyApLCAiQXNzZXQgZnVuZGluZyBtdXN0IGNvbWUgZnJvbSB0aGUgY2FsbGVyIgogICAgYXNzZXJ0IC8vIEFzc2V0IGZ1bmRpbmcgbXVzdCBjb21lIGZyb20gdGhlIGNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1NDgKICAgIC8vIGFzc2VydCBhc3NldF9mdW5kaW5nLnJla2V5X3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MsICJBc3NldCBmdW5kaW5nIG11c3Qgbm90IHJla2V5IgogICAgZGlnIDEKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBBc3NldCBmdW5kaW5nIG11c3Qgbm90IHJla2V5CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjU1MAogICAgLy8gYXNzZXRfZnVuZGluZy5hc3NldF9jbG9zZV90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICBkaWcgMQogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjU0OS01NTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYXNzZXRfZnVuZGluZy5hc3NldF9jbG9zZV90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICAvLyApLCAiQXNzZXQgZnVuZGluZyBtdXN0IG5vdCBjbG9zZSB0aGUgYXNzZXQiCiAgICBhc3NlcnQgLy8gQXNzZXQgZnVuZGluZyBtdXN0IG5vdCBjbG9zZSB0aGUgYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NTUzCiAgICAvLyBhc3NldF9mdW5kaW5nLnhmZXJfYXNzZXQuaWQgPT0gdXBrZWVwLmZlZV9hc3NldC5hc191aW50NjQoKQogICAgZGlnIDEKICAgIGd0eG5zIFhmZXJBc3NldAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTA2CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnRvaQogICAgdW5jb3ZlciAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1NTItNTU0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFzc2V0X2Z1bmRpbmcueGZlcl9hc3NldC5pZCA9PSB1cGtlZXAuZmVlX2Fzc2V0LmFzX3VpbnQ2NCgpCiAgICAvLyApLCAiV3JvbmcgYXNzZXQgZm9yIHRoaXMgdXBrZWVwIgogICAgYXNzZXJ0IC8vIFdyb25nIGFzc2V0IGZvciB0aGlzIHVwa2VlcAogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1NTYKICAgIC8vIHVwa2VlcC5hc3NldF9iYWxhbmNlLmFzX3VpbnQ2NCgpICsgYXNzZXRfZnVuZGluZy5hc3NldF9hbW91bnQKICAgIGRpZyAxCiAgICBwdXNoaW50IDEyMgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjU1OC01NjEKICAgIC8vIGJveC52YWx1ZSA9IHVwa2VlcC5fcmVwbGFjZSgKICAgIC8vICAgICBhc3NldF9iYWxhbmNlPWFyYzQuVUludDY0KG5ld19hc3NldF9iYWxhbmNlKSwKICAgIC8vICAgICBjYWxsX2FyZ3M9dXBrZWVwLmNhbGxfYXJncy5jb3B5KCksCiAgICAvLyApCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDAKICAgIHB1c2hpbnQgMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgcHVzaGludCAzMgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMva2VlcGVyL2NvbnRyYWN0LnB5OjU2MAogICAgLy8gY2FsbF9hcmdzPXVwa2VlcC5jYWxsX2FyZ3MuY29weSgpLAogICAgZGlnIDUKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNgogICAgbGVuCiAgICB1bmNvdmVyIDcKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NTU4LTU2MQogICAgLy8gYm94LnZhbHVlID0gdXBrZWVwLl9yZXBsYWNlKAogICAgLy8gICAgIGFzc2V0X2JhbGFuY2U9YXJjNC5VSW50NjQobmV3X2Fzc2V0X2JhbGFuY2UpLAogICAgLy8gICAgIGNhbGxfYXJncz11cGtlZXAuY2FsbF9hcmdzLmNvcHkoKSwKICAgIC8vICkKICAgIGRpZyA1CiAgICBwdXNoaW50IDQyCiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyA2CiAgICBwdXNoaW50IDUwCiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyA3CiAgICBwdXNoaW50IDU4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyA4CiAgICBwdXNoaW50IDY2CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyA5CiAgICBwdXNoaW50IDc0CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAxMAogICAgcHVzaGludCA4MgogICAgaW50Y18wIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgMTEKICAgIHB1c2hpbnQgOTAKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDEyCiAgICBwdXNoaW50IDk4CiAgICBpbnRjXzAgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAxMwogICAgcHVzaGludCAxMTQKICAgIGludGNfMCAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1NTkKICAgIC8vIGFzc2V0X2JhbGFuY2U9YXJjNC5VSW50NjQobmV3X2Fzc2V0X2JhbGFuY2UpLAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2tlZXBlci9jb250cmFjdC5weTo1NTgtNTYxCiAgICAvLyBib3gudmFsdWUgPSB1cGtlZXAuX3JlcGxhY2UoCiAgICAvLyAgICAgYXNzZXRfYmFsYW5jZT1hcmM0LlVJbnQ2NChuZXdfYXNzZXRfYmFsYW5jZSksCiAgICAvLyAgICAgY2FsbF9hcmdzPXVwa2VlcC5jYWxsX2FyZ3MuY29weSgpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICBieXRlY18zIC8vIDB4MDA4MgogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9rZWVwZXIvY29udHJhY3QucHk6NTI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAICAABAoQBggGAlOvcA/TFAyYFAXUEFR98dQZmcm96ZW4CAIIObmV4dF91cGtlZXBfaWQxGEAABycEI2cqI2cxG0EAWYAEoOgYcjYaAI4BAEAxGRREMRhEggcEDixsDwQ2Ns/GBPn2OC0ENpZr+ARbScxcBFxn7XYE1EqsazYaAI4HACMANAICAtwDpQa0By8AMRmBBBIxGBBEQgAIMRkUMRgUEEMxADIJEkQjKmVEFEQkQzEAMgkSRCMqZUQURCokZyRDgAAxFiUJSTgQJBJEMRYkCUk4ECQSRDYaAUlOAhUiEkQ2GgJJTgRJI1lJTgYlC0xJFUxXAgAjSUsJDEEAIUklC0sCSU8CWUlPBklOBBJESwEVUiNZJQgITgMkCEL/2EYCTCUISwESRDYaA0lOBUkVIhJEF0lOBTYaBElOB0kVIhJEF0lOAzYaBUlOCUkVIhJEFzYaBklOCkkVIhJEF0lOBTYaB0lOC0kVIhJEF04GNhoISU4LSRUiEkQXRRVLA4EKD0RPAyEGDkRLAoGgHw9ETwIhBg5ETCQOREEACEsBSwQPQQDmJERLASEGDkRPAkEABUsPQQDQJERLDkEAxUsOgQMOQQC9JERJgYAIDkSBkAMLIQcITwZJOAcyChJESTgAMQASREsESU4COAAxABJESTggMgMSREk4CTIDEkQ4CE8CD0RJOAcyChJESTggMgMSRDgJMgMSRElLAg1AAF9ITDgISU8CD0QjJwRlREkWKEsBUDEAMgZPCQgWTwUWIxYyBhZPBE8IUCtQTw1QTwRQTwtQTwNQSwJQTwlQTwhQTFBPBlBPBVBMUE8EUEsBvEi/TCQIJwRMZylMULAkQ0UBQv+dI0L/QCNC/y0jQv8XNhoBSRUiEkQXMRYkCUk4ECQSREk4BzIKEkRJOAAxABJESTggMgMSREk4CTIDEkQ4CElETBYoTFBJvUUBREm+SExJgUIiuhdPAwhLASOBILpLAoEgIrpLBIEoWUsFFU8GTgJSSwSBKiK6SwWBMiK6SwaBOiK6TwYWSweBSiK6SwiBUiK6SwmBWiK6SwqBYiK6SwuBaiK6SwyBciK6Sw2BeiK6Tw1PDVArUE8LUE8KUE8JUEsIUE8HUE8GUE8FUE8EUE8DUE8CUExQTwJQSwK8SE8CTL8pTFCwJEOAADYaAUkVIhJEFxYoTFBHAr1FAURJvkhMSSOBILoxABJESYFqIroXTgOBeiK6F0lOA0EADjEASwRwAEUBQAADI0UDSwJBABcyCksEcABMSU4CRQdESwMMQQAESwRFA0sCQQAXMgpLBHABREAACjEASwRwAURBAAMjRQNMSYFCIroXIQcITwJJgShZSwEVUhWBkAMLCElPArxIsTEAsgeyCCSyECOyAbNLAUEAFbExAEsCshKyFEsCshGBBLIQI7IBsxYpTFCwJEMjRwKAAEcHNhoBSRUiEkQXFihMUEcCvUUBREm+SE4CSYEyIroXSU4DMgYOREmBKiK6SU4DF04CSYE6IrpJTgMXSU4CTgOBWiK6SU4DF0lPAg1AAl9ISwJFDUcCgUIiuhdJTgJLDw9ESwhLBwhFDIFSIrpJRRQXJBJBABQyBksISU4CCUsHSU4CCiQICwhFC0sNCUULRwKBSiK6FyQIRQpJgWoiuklFExdJTgJFEUmBciK6SUUWF0USgXoiuhdMQQHuSUsRD0EB5zEASxBwAEUBQQHcMgpLEHAAREsRD0EBzzIKSxBwAURAAcUxAEsQcAFEQAG7JElBAAVMSxEJTEsCSSOBILpLAYEgIrpLDEmBKFlLARVSSw8WSU4GSxIWSxEWMgYWTwoWTwdLB1ArUEsQUE8FUEsNUE8EUE8DUEsZUEsJUE8CUEsXUEsZUExQTFBLArxISwJMvxdOAyEFJboXSSQSQQBdSLFPA0khBSW6F0RJIQQluhchBAhKJboXJQi6VwIAI7IZshpPArIYgQayECOyAbOxMQBLDrIIsgckshAjsgGzQQAVsTEASxCyErIUSw6yEYEEshAjsgGzKUxQsCRDSSUSQQBfSLFPA0khBSW6F0lESwEhBCW6FyEECEsCSwEluhclCEsDTgK6VwIAJE8CDERLAYGGASW6FyEECEsCSwEluhclCE8DTgK6VwIAI7IZTLIashpPArIYgQayECOyAbNC/22BAxJEsU8DSSEFJboXSURLASEEJboXIQQISwJLASW6FyUISwNOArpXAgAkSwIMREsCgYYBJboXIQQISwNLASW6FyUISwROArpXAgAlTwMMREsCgYgBJboXIQQISwNLASW6FyUITwROArpXAgAjshlPArIaTLIashpPArIYgQayECOyAbNC/uYjQv5CSwGBYiK6F0lLCQxAAAlGAksCRQ1C/Y8yBkwJSUUOI0UQSwYNQQAHSwxLBglFD0sOSwYNQQAESwVFD0sDSU4CCUsPC0sGCghJRQ5LAYFCIroXDUH9UUsCRQ1C/UoxFiQJSTgQJBJENhoBSRUiEkQXNhoCSRUiEkQXTBYoTFBJvUUBRIFqIroXSwESREsBOAcyChJESwE4ADEAEkRLATggMgMSREsBOAkyAxJETDgIgaCNBg9EsTIKI7ISshSyEYEEshAjsgGzgAwVH3x1AAAAAAABhqCwJEM2GgFJFSISRBcxFiQJSTgQgQQSREwWKExQSb1FAURJvkhOAksBOBQyChJESwE4ADEAEkRLATggMgMSREsBOBUyAxJESwE4EUsBgWoiukkXTwISREsBgXoiuhdPAzgSCEsCI4EguksDgSAiuksFgShZSwYVTwdOAlJLBYEqIrpLBoEyIrpLB4E6IrpLCIFCIrpLCYFKIrpLCoFSIrpLC4FaIrpLDIFiIrpLDYFyIrpPDBZPDE8MUCtQTwpQTwlQTwhQTwdQTwZQTwVQTwRQTwNQTwRQTwJQSwFQTwJQSwK8SE8CTL8pTFCwJEM=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": {} }