{ "name": "AlgoSafe", "structs": { "Object78E87395": [ { "name": "groupId", "type": "uint64" }, { "name": "account", "type": "address" } ], "Object9F556C53": [ { "name": "proposalId", "type": "uint64" }, { "name": "account", "type": "address" } ], "AdminChange": [ { "name": "changeType", "type": "uint64" }, { "name": "targetGroupId", "type": "uint64" }, { "name": "groupName", "type": "string" }, { "name": "memberAddr", "type": "address" }, { "name": "memberType", "type": "uint64" }, { "name": "memberLabel", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "activeFlag", "type": "uint64" } ], "Approval": [ { "name": "signer", "type": "address" }, { "name": "round", "type": "uint64" } ], "GroupSeed": [ { "name": "name", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" } ], "Member": [ { "name": "accountType", "type": "uint64" }, { "name": "label", "type": "string" }, { "name": "addr", "type": "address" } ], "Proposal": [ { "name": "groupId", "type": "uint64" }, { "name": "status", "type": "uint64" }, { "name": "payloadType", "type": "uint64" }, { "name": "approvalsCount", "type": "uint64" }, { "name": "threshold", "type": "uint64" }, { "name": "expiryRound", "type": "uint64" }, { "name": "proposer", "type": "address" }, { "name": "numPayloads", "type": "uint64" }, { "name": "epochAtCreation", "type": "uint64" } ], "RekeyedAddress": [ { "name": "label", "type": "string" }, { "name": "addedRound", "type": "uint64" } ], "SignerGroup": [ { "name": "name", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "memberCount", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "dailyUsage", "type": "uint64" }, { "name": "dailyPeriodStart", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "monthlyUsage", "type": "uint64" }, { "name": "monthlyPeriodStart", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "lastExecutionRound", "type": "uint64" }, { "name": "membershipEpoch", "type": "uint64" }, { "name": "active", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "string", "name": "name" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Initialise the safe. The creator becomes the bootstrap admin and must call\n`bootstrap` once (after funding the app account) to create the first admin\nsigner group. The application is intentionally non-updatable and\nnon-deletable for custody safety.", "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] } ], "recommendations": {} }, { "name": "bootstrap", "args": [ { "type": "string", "name": "groupName" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Genesis bootstrap: create the first admin signer group as a 1-of-1 group\nwhose sole member is the creator, with full admin privileges and all\nactions allowed. Callable exactly once, only by the creator. After this,\nevery privileged change must go through governance.\n\nRequires the app account to be funded for box MBR beforehand.", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] } ], "recommendations": {} }, { "name": "bootstrapGroup", "args": [ { "type": "(string,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "GroupSeed", "name": "seed" }, { "type": "(address,uint64,string)[]", "name": "members" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Clone-friendly bootstrap: create a fully configured signer group (policy,\nthreshold, privileges, and all members at once) while the safe is still\nun-bootstrapped. Callable repeatedly by the creator to seed a new safe with\nanother safe's configuration during a migration, before `finalizeBootstrap`\nhands control over to governance. Usage counters and the membership epoch\nstart fresh. Returns the new group id.", "events": [ { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] } ], "recommendations": {} }, { "name": "bootstrapRekeyedAddress", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Seed the rekeyed-address registry while the safe is still un-bootstrapped\n(cloning a predecessor safe's registry during a migration). After\n`finalizeBootstrap`, registry changes go through governed admin proposals.", "events": [ { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] } ], "recommendations": {} }, { "name": "finalizeBootstrap", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Close the clone-friendly bootstrap phase. Requires at least one active\ngroup holding PRIV_GROUP so governance can never start locked out. From\nthis point on, every privileged change must go through proposals.", "events": [], "recommendations": {} }, { "name": "proposeTransactionGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,byte[])[]", "name": "payload" }, { "type": "uint64", "name": "expiryRound" }, { "type": "bool", "name": "execute" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a transaction-group proposal from the first payload chunk. When the\ntotal number of transactions exceeds the ~2 KB per-ABI-argument limit, call\nappendTransactionGroupPayload (once per extra chunk, slots 2\u20136) before the\nproposal is approved and executed. Stores the payload at slot 1.\n\nWhen `execute` is true, attempts to execute the proposal immediately after\ncreating it \u2014 this only succeeds if the signer group's threshold is 1 (so\nthe proposer's auto-approval alone satisfies it) and the transactions fall\nwithin the group's spending limits, letting a single app call both propose\nand execute a transaction group.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "appendTransactionGroupPayload", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "(uint64,byte[])[]", "name": "payload" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Append an additional payload chunk (slots 2\u20136) to an existing transaction-group\nproposal. Callable only by the original proposer while they remain a *current*\nmember of the group, and only while `approvalsCount === 1` (i.e. no one but the\nproposer's own auto-approval has approved yet). This closes the window for a\nmember to alter the executed transaction set after an independent signer has\napproved the proposal as it existed at that time \u2014 see the `approveProposal` /\n`_executeProposalInternal` comments for how approvals are bound to a payload.\nThe membership check also prevents a member removed from the group after\nproposing from continuing to rewrite their own now-orphaned proposal.", "events": [], "recommendations": {} }, { "name": "proposeAdminChange", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,uint64,string,address,uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "AdminChange", "name": "change" }, { "type": "uint64", "name": "expiryRound" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a governed signer-group administration proposal.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "approveProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record the caller's approval of a proposal.", "events": [ { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "executeProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Execute a proposal once its threshold has been met.", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "cancelProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cancel a pending proposal. Allowed for the proposer or any member of the proposal's group.", "events": [ { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "pruneProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Reclaim box MBR for a proposal that finished (EXECUTED/CANCELLED) and is\npast its expiry round, by deleting its proposal record and any\ntransaction-group/admin payload boxes. Callable by any member of the\nproposal's group. Approval boxes (keyed per-signer, with no on-chain list\nof who approved) are not deleted here.", "events": [], "recommendations": {} }, { "name": "getConfig", "args": [ { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,string)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getSignerGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "SignerGroup" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,address,uint64,uint64)", "struct": "Proposal" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getTransactionGroup", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,byte[])[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,string,address)", "struct": "Member" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "isMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "hasApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getActivePrivGroupCount", "args": [ { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Count of active signer groups currently holding PRIV_GROUP. Never reaches 0.", "events": [], "recommendations": {} }, { "name": "isRekeyedAddress", "args": [ { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getRekeyedAddress", "args": [ { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64)", "struct": "RekeyedAddress" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 6, "bytes": 3 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "name": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmFtZQ==" }, "creator": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcg==" }, "bootstrapped": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym9vdA==" }, "nextGroupId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bmdpZA==" }, "nextProposalId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnBpZA==" }, "groupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2NudA==" }, "paused": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGF1c2Vk" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVy" }, "activePrivGroupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXBnYw==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "groups": { "keyType": "uint64", "valueType": "SignerGroup", "prefix": "Zw==" }, "members": { "keyType": "Object78E87395", "valueType": "Member", "prefix": "bQ==" }, "proposals": { "keyType": "uint64", "valueType": "Proposal", "prefix": "cA==" }, "approvals": { "keyType": "Object9F556C53", "valueType": "Approval", "prefix": "YQ==" }, "transactionGroups": { "keyType": "uint64", "valueType": "(uint64,byte[])[]", "prefix": "dHhn" }, "adminPayloads": { "keyType": "uint64", "valueType": "AdminChange", "prefix": "ZHA=" }, "rekeyedAddresses": { "keyType": "address", "valueType": "RekeyedAddress", "prefix": "cg==" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1775, 1965, 2362, 2544, 2670, 2951, 2995, 3054, 3110, 3358, 3421, 3452, 3617, 4503, 5754, 6243, 6491, 6612, 6749 ], "errorMessage": "Box must have value" }, { "pc": [ 131 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 4324 ], "errorMessage": "acfg not allowed" }, { "pc": [ 1302, 2276 ], "errorMessage": "address required" }, { "pc": [ 6123 ], "errorMessage": "already a member" }, { "pc": [ 2426 ], "errorMessage": "already approved" }, { "pc": [ 503, 880, 1296, 1371 ], "errorMessage": "already bootstrapped" }, { "pc": [ 1313, 2285, 6320 ], "errorMessage": "already registered" }, { "pc": [ 4230 ], "errorMessage": "app args total length exceeded" }, { "pc": [ 4070 ], "errorMessage": "app update not supported" }, { "pc": [ 4057 ], "errorMessage": "appId required" }, { "pc": [ 4052 ], "errorMessage": "appl not allowed" }, { "pc": [ 3900 ], "errorMessage": "asset close target required" }, { "pc": [ 3882 ], "errorMessage": "asset receiver required" }, { "pc": [ 3874 ], "errorMessage": "axfer not allowed" }, { "pc": [ 1825 ], "errorMessage": "cannot modify payload after independent approval" }, { "pc": [ 494, 501, 510, 679, 871, 878, 950, 1206, 1223, 1287, 1294, 1362, 1369, 1375, 1539, 2822, 2827, 2832, 2837, 2842, 2847, 3266, 3404, 5780, 6036, 6051, 6676, 6729, 6811, 6866, 6887, 6908, 7436, 7473 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 3748 ], "errorMessage": "close target required" }, { "pc": [ 937, 2029, 2179 ], "errorMessage": "cooldown too large" }, { "pc": [ 7321 ], "errorMessage": "daily limit exceeded" }, { "pc": [ 1135 ], "errorMessage": "duplicate member" }, { "pc": [ 1757 ], "errorMessage": "empty payload" }, { "pc": [ 1530 ], "errorMessage": "empty tx group" }, { "pc": [ 6896 ], "errorMessage": "expiry must be in the future" }, { "pc": [ 2006 ], "errorMessage": "first member required" }, { "pc": [ 7376 ], "errorMessage": "group admin required" }, { "pc": [ 3546 ], "errorMessage": "group cooldown not elapsed" }, { "pc": [ 1558, 1972, 3459 ], "errorMessage": "group disabled" }, { "pc": [ 2441, 3503 ], "errorMessage": "group membership changed since proposal creation" }, { "pc": [ 3378 ], "errorMessage": "group not found" }, { "pc": [ 1095, 3689, 3841, 4017, 4191, 4290, 4397, 4576, 4723, 4866, 4989, 5060, 5194, 5345, 5624 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 914, 2014, 2171 ], "errorMessage": "invalid actions" }, { "pc": [ 792, 1432, 1666 ], "errorMessage": "invalid array encoding" }, { "pc": [ 370, 477, 751, 762, 820, 1270, 1402, 1459, 1636, 1693, 1897, 1918, 3672, 3824, 4000, 4091, 4110, 4124, 4138, 4273, 4380, 4559, 4706, 4849, 4972, 5038, 5089, 5132, 5177, 5328, 5607, 7151 ], "errorMessage": "invalid array length header" }, { "pc": [ 1499 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 377, 484, 1277 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 841 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1480, 1714 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1264, 3078, 3134, 3197, 3282, 3331 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 849, 1394, 1488, 1511, 1618, 1628, 1722, 1872, 1931, 1940, 2323, 2332, 2462, 2471, 2502, 2511, 2628, 2637, 2805, 2922, 2931, 2965, 2974, 3009, 3018, 3027, 3068, 3086, 3124, 3142, 3187, 3205, 3250, 3290, 3339 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1923 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::AdminChange" }, { "pc": [ 756 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::GroupSeed" }, { "pc": [ 4066 ], "errorMessage": "invalid onCompletion" }, { "pc": [ 927, 2022, 2213 ], "errorMessage": "invalid privileges" }, { "pc": [ 1754 ], "errorMessage": "invalid slot" }, { "pc": [ 740 ], "errorMessage": "invalid tail pointer at index 0 of ((len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 1455, 1689 ], "errorMessage": "invalid tail pointer at index 1 of (uint64,(len+uint8[]))" }, { "pc": [ 1889 ], "errorMessage": "invalid tail pointer at index 2 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 816 ], "errorMessage": "invalid tail pointer at index 2 of (uint8[32],uint64,(len+utf8[]))" }, { "pc": [ 1910 ], "errorMessage": "invalid tail pointer at index 5 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 1440, 1674 ], "errorMessage": "invalid tail pointer for (len+(uint64,(len+uint8[]))[])" }, { "pc": [ 800 ], "errorMessage": "invalid tail pointer for (len+(uint8[32],uint64,(len+utf8[]))[])" }, { "pc": [ 903 ], "errorMessage": "invalid threshold" }, { "pc": [ 735, 811, 1450, 1684, 1884, 1905 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ 4253 ], "errorMessage": "keyreg not allowed" }, { "pc": [ 1119, 2084 ], "errorMessage": "member required" }, { "pc": [ 883 ], "errorMessage": "members required" }, { "pc": [ 4354 ], "errorMessage": "metadataHash must be 0 or 32 bytes" }, { "pc": [ 7268 ], "errorMessage": "monthly limit exceeded" }, { "pc": [ 2222, 2256, 6630, 6767 ], "errorMessage": "must keep at least one active group admin" }, { "pc": [ 1376 ], "errorMessage": "need an active group admin" }, { "pc": [ 5792 ], "errorMessage": "new group starts with one member" }, { "pc": [ 2412, 3389 ], "errorMessage": "not a group member" }, { "pc": [ 6236 ], "errorMessage": "not a member" }, { "pc": [ 1782 ], "errorMessage": "not a tx group" }, { "pc": [ 2381 ], "errorMessage": "not approvable" }, { "pc": [ 2590 ], "errorMessage": "not authorised to cancel" }, { "pc": [ 6890 ], "errorMessage": "not bootstrapped" }, { "pc": [ 2563 ], "errorMessage": "not cancellable" }, { "pc": [ 3427 ], "errorMessage": "not ready to execute" }, { "pc": [ 2309, 6401 ], "errorMessage": "not registered" }, { "pc": [ 2703 ], "errorMessage": "not yet expired" }, { "pc": [ 496, 873, 1289, 1364 ], "errorMessage": "only creator can bootstrap" }, { "pc": [ 1818 ], "errorMessage": "only proposer can append" }, { "pc": [ 3722 ], "errorMessage": "pay not allowed" }, { "pc": [ 7365 ], "errorMessage": "policy admin required" }, { "pc": [ 2393, 3436 ], "errorMessage": "proposal expired" }, { "pc": [ 1801 ], "errorMessage": "proposal not pending" }, { "pc": [ 2691 ], "errorMessage": "proposal not terminal" }, { "pc": [ 3730 ], "errorMessage": "receiver required" }, { "pc": [ 4429 ], "errorMessage": "rekey not allowed" }, { "pc": [ 4435 ], "errorMessage": "rekey requires group admin privilege" }, { "pc": [ 4442 ], "errorMessage": "rekey target required" }, { "pc": [ 1541, 3406 ], "errorMessage": "safe paused" }, { "pc": [ 2076, 2110, 2134, 2163, 2204, 2247 ], "errorMessage": "target group not found" }, { "pc": [ 1998, 2139 ], "errorMessage": "threshold >= 1" }, { "pc": [ 6452 ], "errorMessage": "threshold exceeds members" }, { "pc": [ 3489 ], "errorMessage": "threshold not met" }, { "pc": [ 4150 ], "errorMessage": "too many accounts" }, { "pc": [ 4144 ], "errorMessage": "too many app args" }, { "pc": [ 4155 ], "errorMessage": "too many foreign apps" }, { "pc": [ 4159 ], "errorMessage": "too many foreign assets" }, { "pc": [ 4166 ], "errorMessage": "too many references" }, { "pc": [ 1534 ], "errorMessage": "too many txs" }, { "pc": [ 2296 ], "errorMessage": "unknown change type" }, { "pc": [ 4371 ], "errorMessage": "unknown tx type" }, { "pc": [ 6262 ], "errorMessage": "would drop below threshold" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiAxMDAwMDAwMCAxNjgKICAgIGJ5dGVjYmxvY2sgImciICJhcGdjIiAiIiAweDE1MWY3Yzc1ICJtIiAicCIgImJvb3QiICJuZ2lkIiAiZ2NudCIgInIiICJjcmVhdG9yIiAidHhnIiAibnBpZCIgInBhdXNlZCIgMHhkMDcwNTA3YSAweDdjNjA1OWU2IDB4MDAyMiAweDAwMTIgMHgwY2Q3MzU3YyAweDAwMmEgImRwIiAiYSIgMHgwMCAweDA2ODEwMSAibmFtZSIgInZlciIgMHgwMDdhIDB4MDAwYSAweGRlZGQwM2E4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzEzCiAgICAvLyBleHBvcnQgY2xhc3MgQWxnb1NhZmUgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjUKICAgIHB1c2hieXRlc3MgMHg5MTRiYTYzMyAweDFhMGIzMDNhIDB4ZDU1MTU2ODIgMHgwYjI0M2NhNyAweGFjM2E5YTMyIDB4NDQyNDQ1ZjcgMHhkY2VlNDQyNyAweDFmNzY4Yzc5IDB4ZmI3MDg4ZTggMHg3ZjUxZmMyOCAweGRjYWRmZjk2IDB4YjZiN2FlYWQgMHhkMWNjMmJiNiAweGFiYTEyNzJhIDB4ZjljYjRhMzcgMHg2NWFhYTBlZCAweGNiZDczMjQyIDB4NTAzNDE2MTcgMHhmNGZhNTQ0YyAweGIyODU3MmNhIDB4ZDM3ZGZiMjAgLy8gbWV0aG9kICJib290c3RyYXAoc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcEdyb3VwKChzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYWRkcmVzcyx1aW50NjQsc3RyaW5nKVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImJvb3RzdHJhcFJla2V5ZWRBZGRyZXNzKGFkZHJlc3Msc3RyaW5nKXZvaWQiLCBtZXRob2QgImZpbmFsaXplQm9vdHN0cmFwKCl2b2lkIiwgbWV0aG9kICJwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cCh1aW50NjQsKHVpbnQ2NCxieXRlW10pW10sdWludDY0LGJvb2wsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQodWludDY0LHVpbnQ2NCwodWludDY0LGJ5dGVbXSlbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAicHJvcG9zZUFkbWluQ2hhbmdlKHVpbnQ2NCwodWludDY0LHVpbnQ2NCxzdHJpbmcsYWRkcmVzcyx1aW50NjQsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhcHByb3ZlUHJvcG9zYWwodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJleGVjdXRlUHJvcG9zYWwodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjYW5jZWxQcm9wb3NhbCh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgInBydW5lUHJvcG9zYWwodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnZXRDb25maWcodWludDY0KShzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHN0cmluZykiLCBtZXRob2QgImdldFNpZ25lckdyb3VwKHVpbnQ2NCx1aW50NjQpKHN0cmluZyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldFByb3Bvc2FsKHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGFkZHJlc3MsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldFRyYW5zYWN0aW9uR3JvdXAodWludDY0LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCxieXRlW10pW10iLCBtZXRob2QgImdldE1lbWJlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCxzdHJpbmcsYWRkcmVzcykiLCBtZXRob2QgImlzTWVtYmVyKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NClib29sIiwgbWV0aG9kICJoYXNBcHByb3ZlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpYm9vbCIsIG1ldGhvZCAiZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiaXNSZWtleWVkQWRkcmVzcyhhZGRyZXNzLHVpbnQ2NClib29sIiwgbWV0aG9kICJnZXRSZWtleWVkQWRkcmVzcyhhZGRyZXNzLHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBib290c3RyYXAgYm9vdHN0cmFwR3JvdXAgYm9vdHN0cmFwUmVrZXllZEFkZHJlc3MgZmluYWxpemVCb290c3RyYXAgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQgcHJvcG9zZUFkbWluQ2hhbmdlIGFwcHJvdmVQcm9wb3NhbCBleGVjdXRlUHJvcG9zYWwgY2FuY2VsUHJvcG9zYWwgcHJ1bmVQcm9wb3NhbCBnZXRDb25maWcgZ2V0U2lnbmVyR3JvdXAgZ2V0UHJvcG9zYWwgZ2V0VHJhbnNhY3Rpb25Hcm91cCBnZXRNZW1iZXIgaXNNZW1iZXIgaGFzQXBwcm92ZWQgZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnQgaXNSZWtleWVkQWRkcmVzcyBnZXRSZWtleWVkQWRkcmVzcwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxMwogICAgLy8gZXhwb3J0IGNsYXNzIEFsZ29TYWZlIGV4dGVuZHMgQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4MTE1NzU2ZGIgLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbihzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZUFwcGxpY2F0aW9uCiAgICBlcnIKCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwoKZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMToKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBlbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDYKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyMyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDIzIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5jcmVhdGVBcHBsaWNhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gcHVibGljIGNyZWF0ZUFwcGxpY2F0aW9uKG5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTUKICAgIC8vIG5hbWUgPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiAnbmFtZScgfSkKICAgIGJ5dGVjIDI0IC8vICJuYW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1MAogICAgLy8gdGhpcy5uYW1lLnZhbHVlID0gbmFtZQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE2CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdjcmVhdG9yJyB9KQogICAgYnl0ZWMgMTAgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzUxCiAgICAvLyB0aGlzLmNyZWF0b3IudmFsdWUgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA2IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1MgogICAgLy8gdGhpcy5ib290c3RyYXBwZWQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDcgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzUzCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIG5leHRQcm9wb3NhbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25waWQnIH0pCiAgICBieXRlYyAxMiAvLyAibnBpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgOCAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIxCiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgMTMgLy8gInBhdXNlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIHRoaXMucGF1c2VkLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjIKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiAndmVyJyB9KQogICAgYnl0ZWMgMjUgLy8gInZlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IENPTlRSQUNUX1ZFUlNJT04KICAgIHB1c2hieXRlcyAiQklBVEVDLUFMR08tU0FGRS12MS42LjAiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTkKICAgIC8vIGVtaXQ8U2FmZUNyZWF0ZWQ+KHsgbmFtZSwgY3JlYXRvcjogVHhuLnNlbmRlciB9KQogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlYyAxNiAvLyAweDAwMjIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGUyOWM4YjQ3IC8vIG1ldGhvZCAiU2FmZUNyZWF0ZWQoc3RyaW5nLGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIHB1YmxpYyBjcmVhdGVBcHBsaWNhdGlvbihuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmJvb3RzdHJhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIHB1YmxpYyBib290c3RyYXAoZ3JvdXBOYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTYKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2NyZWF0b3InIH0pCiAgICBieXRlYyAxMCAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA2IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyBjb25zdCBub3cgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzc1CiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgNyAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzUKICAgIC8vIGNvbnN0IGdpZDogdWludDY0ID0gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzctMzk0CiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBncm91cE5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IFBSSVZfQUxMLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogQUNUX0FMTCwKICAgIC8vICAgbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBVaW50NjQoMCksCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyB9CiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzkKICAgIC8vIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzctMzk0CiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBncm91cE5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IFBSSVZfQUxMLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogQUNUX0FMTCwKICAgIC8vICAgbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBVaW50NjQoMCksCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyB9CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzgzCiAgICAvLyBsaW1pdEFzc2V0SWQ6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzc3LTM5NAogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgbWVtYmVyQ291bnQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBQUklWX0FMTCwKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IEFDVF9BTEwsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogVWludDY0KDApLAogICAgLy8gICBkYWlseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogVWludDY0KDApLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgaXRvYgogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDdhMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDA3MDAwMDAwMDAwMDAwMDAzZjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTUKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncnApCiAgICBkaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzk1CiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5NwogICAgLy8gY29uc3QgbTogTWVtYmVyID0geyBhY2NvdW50VHlwZTogVWludDY0KDEpLCBsYWJlbDogJ2NyZWF0b3InLCBhZGRyOiBUeG4uc2VuZGVyIH0KICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEwMDJhCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDc2MzcyNjU2MTc0NmY3MgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzk4CiAgICAvLyB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZGlnIDEKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTgKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSA9IGdpZCArIFVpbnQ2NCgxKQogICAgdW5jb3ZlciAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDcgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDAwCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwMQogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgOCAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDEKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA4IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwMQogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA2IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwMgogICAgLy8gdGhpcy5ib290c3RyYXBwZWQudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA0CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDYKICAgIC8vIGVtaXQ8R3JvdXBDcmVhdGVkPih7IGdyb3VwSWQ6IGdpZCwgbmFtZTogZ3JvdXBOYW1lLCB0aHJlc2hvbGQ6IFVpbnQ2NCgxKSB9KQogICAgZHVwCiAgICBieXRlYyAxNyAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAiR3JvdXBDcmVhdGVkKHVpbnQ2NCxzdHJpbmcsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyBlbWl0PE1lbWJlckFkZGVkPih7IGdyb3VwSWQ6IGdpZCwgbWVtYmVyOiBUeG4uc2VuZGVyLCBhY2NvdW50VHlwZTogVWludDY0KDEpIH0pCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJNZW1iZXJBZGRlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIHB1YmxpYyBib290c3RyYXAoZ3JvdXBOYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmJvb3RzdHJhcEdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwR3JvdXA6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTgKICAgIC8vIHB1YmxpYyBib290c3RyYXBHcm91cChzZWVkOiBHcm91cFNlZWQsIG1lbWJlcnM6IE1lbWJlclNlZWRbXSwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDAgb2YgKChsZW4rdXRmOFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Okdyb3VwU2VlZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMAoKYm9vdHN0cmFwR3JvdXBfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxOAogICAgLy8gcHVibGljIGJvb3RzdHJhcEdyb3VwKHNlZWQ6IEdyb3VwU2VlZCwgbWVtYmVyczogTWVtYmVyU2VlZFtdLCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdWludDY0IHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IGJvb3RzdHJhcEdyb3VwX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDIgb2YgKHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pKQogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBib290c3RyYXBHcm91cF9mb3JfaGVhZGVyQDEKCmJvb3RzdHJhcEdyb3VwX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxOAogICAgLy8gcHVibGljIGJvb3RzdHJhcEdyb3VwKHNlZWQ6IEdyb3VwU2VlZCwgbWVtYmVyczogTWVtYmVyU2VlZFtdLCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdWludDY0IHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Ok1lbWJlclNlZWQ+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGJvb3RzdHJhcEdyb3VwX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMAogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZGlnIDExCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0Cgpib290c3RyYXBHcm91cF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDIyCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTYKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2NyZWF0b3InIH0pCiAgICBieXRlYyAxMCAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA2IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBhc3NlcnQobWVtYmVyQ291bnQgPj0gVWludDY0KDEpLCAnbWVtYmVycyByZXF1aXJlZCcpCiAgICBkaWcgNAogICAgYXNzZXJ0IC8vIG1lbWJlcnMgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjYKICAgIC8vIGFzc2VydChzZWVkLnRocmVzaG9sZCA+PSBVaW50NjQoMSkgJiYgc2VlZC50aHJlc2hvbGQgPD0gbWVtYmVyQ291bnQsICdpbnZhbGlkIHRocmVzaG9sZCcpCiAgICBkaWcgNgogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGJ6IGJvb3RzdHJhcEdyb3VwX2Jvb2xfZmFsc2VAMTAKICAgIGRpZyA4CiAgICBkaWcgNQogICAgPD0KICAgIGJ6IGJvb3RzdHJhcEdyb3VwX2Jvb2xfZmFsc2VAMTAKICAgIGludGNfMSAvLyAxCgpib290c3RyYXBHcm91cF9ib29sX21lcmdlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNgogICAgLy8gYXNzZXJ0KHNlZWQudGhyZXNob2xkID49IFVpbnQ2NCgxKSAmJiBzZWVkLnRocmVzaG9sZCA8PSBtZW1iZXJDb3VudCwgJ2ludmFsaWQgdGhyZXNob2xkJykKICAgIGFzc2VydCAvLyBpbnZhbGlkIHRocmVzaG9sZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNwogICAgLy8gYXNzZXJ0KHNlZWQuYWxsb3dlZEFjdGlvbnMgPD0gQUNUX0FMTCwgJ2ludmFsaWQgYWN0aW9ucycpCiAgICBkaWcgNgogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDYzIC8vIDYzCiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgYWN0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyOAogICAgLy8gYXNzZXJ0KHNlZWQuYWRtaW5Qcml2aWxlZ2VzIDw9IFBSSVZfQUxMLCAnaW52YWxpZCBwcml2aWxlZ2VzJykKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDExCiAgICBkdXAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgcHJpdmlsZWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyOQogICAgLy8gYXNzZXJ0KHNlZWQuY29vbGRvd25Sb3VuZHMgPD0gTUFYX0NPT0xET1dOX1JPVU5EUywgJ2Nvb2xkb3duIHRvbyBsYXJnZScpCiAgICBkaWcgMgogICAgcHVzaGludCA1MCAvLyA1MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIGNvb2xkb3duIHRvbyBsYXJnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMgogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDcgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMyCiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGJ1cnkgMTgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIG5hbWU6IHNlZWQubmFtZSwKICAgIGRpZyAxMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIGxpbWl0QXNzZXRJZDogc2VlZC5saW1pdEFzc2V0SWQsCiAgICBkaWcgNQogICAgZXh0cmFjdCAyNiA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQxCiAgICAvLyBkYWlseUxpbWl0OiBzZWVkLmRhaWx5TGltaXQsCiAgICBkaWcgNgogICAgZXh0cmFjdCAzNCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ0CiAgICAvLyBtb250aGx5TGltaXQ6IHNlZWQubW9udGhseUxpbWl0LAogICAgdW5jb3ZlciA3CiAgICBleHRyYWN0IDQyIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzQtNDUxCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBzZWVkLm5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogc2VlZC50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IHNlZWQuYWRtaW5Qcml2aWxlZ2VzLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogc2VlZC5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBzZWVkLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogc2VlZC5kYWlseUxpbWl0LAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBzZWVkLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogc2VlZC5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciA3CiAgICBidXJ5IDI0CiAgICBkaWcgMTcKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAyNAogICAgYnl0ZWMgMjYgLy8gMHgwMDdhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0MgogICAgLy8gZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzQtNDUxCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBzZWVkLm5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogc2VlZC50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IHNlZWQuYWRtaW5Qcml2aWxlZ2VzLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogc2VlZC5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBzZWVkLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogc2VlZC5kYWlseUxpbWl0LAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBzZWVkLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogc2VlZC5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1MAogICAgLy8gYWN0aXZlOiBVaW50NjQoMSksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzNC00NTEKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IHNlZWQubmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBzZWVkLnRocmVzaG9sZCwKICAgIC8vICAgbWVtYmVyQ291bnQsCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogc2VlZC5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBzZWVkLmFsbG93ZWRBY3Rpb25zLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IHNlZWQubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBzZWVkLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IHNlZWQubW9udGhseUxpbWl0LAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBzZWVkLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NTIKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncnApCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDUyCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NTQKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBtZW1iZXJDb3VudDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEwCgpib290c3RyYXBHcm91cF93aGlsZV90b3BAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU0CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbWVtYmVyQ291bnQ7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBkaWcgOQogICAgZGlnIDUKICAgIDwKICAgIGJ6IGJvb3RzdHJhcEdyb3VwX2FmdGVyX3doaWxlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU1LTQ1NgogICAgLy8gY29uc3Qgc2VlZE1lbWJlciA9IGNsb25lKG1lbWJlcnNbaV0pCiAgICAvLyBhc3NlcnQoc2VlZE1lbWJlci5hZGRyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdtZW1iZXIgcmVxdWlyZWQnKQogICAgZGlnIDkKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNwogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NgogICAgLy8gYXNzZXJ0KHNlZWRNZW1iZXIuYWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnbWVtYmVyIHJlcXVpcmVkJykKICAgIGR1cAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIG1lbWJlciByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NwogICAgLy8gYXNzZXJ0KCF0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IHNlZWRNZW1iZXIuYWRkciB9KS5leGlzdHMsICdkdXBsaWNhdGUgbWVtYmVyJykKICAgIGRpZyAxNAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU3CiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogc2VlZE1lbWJlci5hZGRyIH0pLmV4aXN0cywgJ2R1cGxpY2F0ZSBtZW1iZXInKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBkdXBsaWNhdGUgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyBjb25zdCBtOiBNZW1iZXIgPSB7IGFjY291bnRUeXBlOiBzZWVkTWVtYmVyLmFjY291bnRUeXBlLCBsYWJlbDogc2VlZE1lbWJlci5sYWJlbCwgYWRkcjogc2VlZE1lbWJlci5hZGRyIH0KICAgIGRpZyAzCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgIGxlbgogICAgZGlnIDUKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDQKICAgIGV4dHJhY3QgMzIgOAogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgYnl0ZWMgMTkgLy8gMHgwMDJhCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NTkKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogc2VlZE1lbWJlci5hZGRyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGRpZyAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2MAogICAgLy8gZW1pdDxNZW1iZXJBZGRlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogc2VlZE1lbWJlci5hZGRyLCBhY2NvdW50VHlwZTogc2VlZE1lbWJlci5hY2NvdW50VHlwZSB9KQogICAgY29uY2F0CiAgICBieXRlYyAxNCAvLyBtZXRob2QgIk1lbWJlckFkZGVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBib290c3RyYXBHcm91cF93aGlsZV90b3BAMTIKCmJvb3RzdHJhcEdyb3VwX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2MwogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSA9IGdpZCArIFVpbnQ2NCgxKQogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDcgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgOCAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA4IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NQogICAgLy8gaWYgKChzZWVkLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkpIHsKICAgIGRpZyA3CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYnogYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NgogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjYKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NgogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgpib290c3RyYXBHcm91cF9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gZW1pdDxHcm91cENyZWF0ZWQ+KHsgZ3JvdXBJZDogZ2lkLCBuYW1lOiBzZWVkLm5hbWUsIHRocmVzaG9sZDogc2VlZC50aHJlc2hvbGQgfSkKICAgIGRpZyAxMgogICAgZHVwCiAgICBieXRlYyAxNyAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZGlnIDE1CiAgICBjb25jYXQKICAgIGRpZyAxNgogICAgY29uY2F0CiAgICBieXRlYyAxOCAvLyBtZXRob2QgIkdyb3VwQ3JlYXRlZCh1aW50NjQsc3RyaW5nLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxOAogICAgLy8gcHVibGljIGJvb3RzdHJhcEdyb3VwKHNlZWQ6IEdyb3VwU2VlZCwgbWVtYmVyczogTWVtYmVyU2VlZFtdLCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdWludDY0IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmJvb3RzdHJhcEdyb3VwX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBib290c3RyYXBHcm91cF9ib29sX21lcmdlQDExCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5ib290c3RyYXBSZWtleWVkQWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmJvb3RzdHJhcFJla2V5ZWRBZGRyZXNzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gcHVibGljIGJvb3RzdHJhcFJla2V5ZWRBZGRyZXNzKGFkZHI6IEFjY291bnQsIGxhYmVsOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTYKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2NyZWF0b3InIH0pCiAgICBieXRlYyAxMCAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4MAogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA2IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4MAogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDgxCiAgICAvLyBhc3NlcnQoYWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnYWRkcmVzcyByZXF1aXJlZCcpCiAgICBkaWcgMQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFkZHJlc3MgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIHJla2V5ZWRBZGRyZXNzZXMgPSBCb3hNYXA8QWNjb3VudCwgUmVrZXllZEFkZHJlc3M+KHsga2V5UHJlZml4OiAncicgfSkKICAgIGJ5dGVjIDkgLy8gInIiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBhc3NlcnQoIXRoaXMucmVrZXllZEFkZHJlc3NlcyhhZGRyKS5leGlzdHMsICdhbHJlYWR5IHJlZ2lzdGVyZWQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODMKICAgIC8vIGNvbnN0IGVudHJ5OiBSZWtleWVkQWRkcmVzcyA9IHsgbGFiZWwsIGFkZGVkUm91bmQ6IEdsb2JhbC5yb3VuZCB9CiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWMgMjcgLy8gMHgwMDBhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODQKICAgIC8vIHRoaXMucmVrZXllZEFkZHJlc3NlcyhhZGRyKS52YWx1ZSA9IGNsb25lKGVudHJ5KQogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg1CiAgICAvLyBlbWl0PFJla2V5ZWRBZGRyZXNzQWRkZWQ+KHsgYWRkciwgbGFiZWwgfSkKICAgIHN3YXAKICAgIGJ5dGVjIDE2IC8vIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDI4IC8vIG1ldGhvZCAiUmVrZXllZEFkZHJlc3NBZGRlZChhZGRyZXNzLHN0cmluZykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gcHVibGljIGJvb3RzdHJhcFJla2V5ZWRBZGRyZXNzKGFkZHI6IEFjY291bnQsIGxhYmVsOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmZpbmFsaXplQm9vdHN0cmFwW3JvdXRpbmddKCkgLT4gdm9pZDoKZmluYWxpemVCb290c3RyYXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDk0CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTYKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2NyZWF0b3InIH0pCiAgICBieXRlYyAxMCAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0OTQKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ5NQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA2IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ5NQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDk2CiAgICAvLyBhc3NlcnQodGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA+PSBVaW50NjQoMSksICduZWVkIGFuIGFjdGl2ZSBncm91cCBhZG1pbicpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDk2CiAgICAvLyBhc3NlcnQodGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA+PSBVaW50NjQoMSksICduZWVkIGFuIGFjdGl2ZSBncm91cCBhZG1pbicpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXJ0IC8vIG5lZWQgYW4gYWN0aXZlIGdyb3VwIGFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDYgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDk3CiAgICAvLyB0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDkzCiAgICAvLyBwdWJsaWMgZmluYWxpemVCb290c3RyYXAoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5wcm9wb3NlVHJhbnNhY3Rpb25Hcm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNi01MjIKICAgIC8vIHB1YmxpYyBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cCgKICAgIC8vICAgZ3JvdXBJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGV4cGlyeVJvdW5kOiB1aW50NjQsCiAgICAvLyAgIGV4ZWN1dGU6IGJvb2xlYW4sCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMAoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNi01MjIKICAgIC8vIHB1YmxpYyBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cCgKICAgIC8vICAgZ3JvdXBJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGV4cGlyeVJvdW5kOiB1aW50NjQsCiAgICAvLyAgIGV4ZWN1dGU6IGJvb2xlYW4sCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisodWludDY0LChsZW4rdWludDhbXSkpW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDEgb2YgKHVpbnQ2NCwobGVuK3VpbnQ4W10pKQogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9mb3JfaGVhZGVyQDEKCnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNi01MjIKICAgIC8vIHB1YmxpYyBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cCgKICAgIC8vICAgZ3JvdXBJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGV4cGlyeVJvdW5kOiB1aW50NjQsCiAgICAvLyAgIGV4ZWN1dGU6IGJvb2xlYW4sCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6U2FmZVR4bj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGJ1cnkgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ1cnkgMTAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUyMwogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTI0CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkaWcgMTAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjYKICAgIC8vIGFzc2VydChwYXlsb2FkLmxlbmd0aCA+PSBVaW50NjQoMSksICdlbXB0eSB0eCBncm91cCcpCiAgICBkaWcgNAogICAgZHVwCiAgICBhc3NlcnQgLy8gZW1wdHkgdHggZ3JvdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjcKICAgIC8vIGFzc2VydChwYXlsb2FkLmxlbmd0aCA8PSBNQVhfR1JPVVBfVFhOUywgJ3RvbyBtYW55IHR4cycpCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IHR4cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUyOAogICAgLy8gYXNzZXJ0KHRoaXMucGF1c2VkLnZhbHVlID09PSBVaW50NjQoMCksICdzYWZlIHBhdXNlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gcGF1c2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3BhdXNlZCcgfSkKICAgIGJ5dGVjIDEzIC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTI4CiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gc2FmZSBwYXVzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjkKICAgIC8vIHRoaXMuX2Fzc2VydE1lbWJlcihncm91cElkKQogICAgZGlnIDYKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTMwCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBkdXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTMwCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBwdXNoaW50IDExNCAvLyAxMTQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYXNzZXJ0IC8vIGdyb3VwIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTMxCiAgICAvLyBjb25zdCBwaWQgPSB0aGlzLl9uZXdQcm9wb3NhbChncm91cElkLCBQVF9UUkFOU0FDVElPTl9HUk9VUCwgZXhwaXJ5Um91bmQpCiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9uZXdQcm9wb3NhbAogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzIKICAgIC8vIHRoaXMuX3N0b3JlUGF5bG9hZEdyb3VwKHBpZCwgVWludDY0KDEpLCBwYXlsb2FkKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDgKICAgIGNhbGxzdWIgX3N0b3JlUGF5bG9hZEdyb3VwCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzMKICAgIC8vIGNvbnN0IHAgPSBjbG9uZSh0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlKQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNSAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzNAogICAgLy8gcC5udW1QYXlsb2FkcyA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzMtNTM1CiAgICAvLyBjb25zdCBwID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSkKICAgIC8vIHAubnVtUGF5bG9hZHMgPSBVaW50NjQoMSkKICAgIC8vIHRoaXMucHJvcG9zYWxzKHBpZCkudmFsdWUgPSBjbG9uZShwKQogICAgcHVzaGludCA4MCAvLyA4MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzYKICAgIC8vIGlmIChleGVjdXRlKSB7CiAgICBkaWcgOQogICAgYnogcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM3CiAgICAvLyB0aGlzLl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbChwaWQpCiAgICBkaWcgNwogICAgY2FsbHN1YiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwKCnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTYtNTIyCiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBleGVjdXRlOiBib29sZWFuLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1My01NTgKICAgIC8vIHB1YmxpYyBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZCgKICAgIC8vICAgcHJvcG9zYWxJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTUzLTU1OAogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKAogICAgLy8gICBwcm9wb3NhbElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWRJbmRleDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKHVpbnQ2NCwobGVuK3VpbnQ4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50NjQsKGxlbit1aW50OFtdKSkKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfZm9yX2hlYWRlckAxCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTMtNTU4CiAgICAvLyBwdWJsaWMgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQoCiAgICAvLyAgIHByb3Bvc2FsSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6U2FmZVR4bj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1OQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTYwCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkaWcgMTAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjIKICAgIC8vIGFzc2VydChwYXlsb2FkSW5kZXggPj0gVWludDY0KDIpICYmIHBheWxvYWRJbmRleCA8PSBVaW50NjQoNiksICdpbnZhbGlkIHNsb3QnKQogICAgZGlnIDYKICAgIGludGNfMyAvLyAyCiAgICA+PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxMAogICAgZGlnIDYKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA8PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxMAogICAgaW50Y18xIC8vIDEKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTYyCiAgICAvLyBhc3NlcnQocGF5bG9hZEluZGV4ID49IFVpbnQ2NCgyKSAmJiBwYXlsb2FkSW5kZXggPD0gVWludDY0KDYpLCAnaW52YWxpZCBzbG90JykKICAgIGFzc2VydCAvLyBpbnZhbGlkIHNsb3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjMKICAgIC8vIGFzc2VydChwYXlsb2FkLmxlbmd0aCA+PSBVaW50NjQoMSksICdlbXB0eSBwYXlsb2FkJykKICAgIGRpZyA0CiAgICBhc3NlcnQgLy8gZW1wdHkgcGF5bG9hZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2NAogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyA4CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNSAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY0CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2NQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnBheWxvYWRUeXBlID09PSBQVF9UUkFOU0FDVElPTl9HUk9VUCwgJ25vdCBhIHR4IGdyb3VwJykKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIG5vdCBhIHR4IGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY2CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAncHJvcG9zYWwgbm90IHBlbmRpbmcnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfdHJ1ZUAxMwogICAgZGlnIDkKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxNAoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY2CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAncHJvcG9zYWwgbm90IHBlbmRpbmcnKQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIG5vdCBwZW5kaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY3CiAgICAvLyB0aGlzLl9hc3NlcnRNZW1iZXIocHJvcG9zYWwuZ3JvdXBJZCkKICAgIGRpZyAxMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2Fzc2VydE1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHByb3Bvc2FsLnByb3Bvc2VyLCAnb25seSBwcm9wb3NlciBjYW4gYXBwZW5kJykKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBleHRyYWN0IDQ4IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgcHJvcG9zZXIgY2FuIGFwcGVuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2OQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLmFwcHJvdmFsc0NvdW50ID09PSBVaW50NjQoMSksICdjYW5ub3QgbW9kaWZ5IHBheWxvYWQgYWZ0ZXIgaW5kZXBlbmRlbnQgYXBwcm92YWwnKQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gY2Fubm90IG1vZGlmeSBwYXlsb2FkIGFmdGVyIGluZGVwZW5kZW50IGFwcHJvdmFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTcwCiAgICAvLyB0aGlzLl9zdG9yZVBheWxvYWRHcm91cChwcm9wb3NhbElkLCBwYXlsb2FkSW5kZXgsIHBheWxvYWQpCiAgICBkaWcgOQogICAgZGlnIDgKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDkKICAgIGNhbGxzdWIgX3N0b3JlUGF5bG9hZEdyb3VwCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzEKICAgIC8vIGlmIChwYXlsb2FkSW5kZXggPiBwcm9wb3NhbC5udW1QYXlsb2FkcykgewogICAgc3dhcAogICAgcHVzaGludCA4MCAvLyA4MAogICAgZXh0cmFjdF91aW50NjQKICAgID4KICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzMtNTc0CiAgICAvLyB1cGRhdGVkLm51bVBheWxvYWRzID0gcGF5bG9hZEluZGV4CiAgICAvLyB0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSA9IGNsb25lKHVwZGF0ZWQpCiAgICBkaWcgMTIKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGRpZyA5CiAgICBib3hfcmVwbGFjZQoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTMtNTU4CiAgICAvLyBwdWJsaWMgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQoCiAgICAvLyAgIHByb3Bvc2FsSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfbWVyZ2VAMTUKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX21lcmdlQDExCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5wcm9wb3NlQWRtaW5DaGFuZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgpwcm9wb3NlQWRtaW5DaGFuZ2U6CiAgICBieXRlY18yIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc5LTU4NAogICAgLy8gcHVibGljIHByb3Bvc2VBZG1pbkNoYW5nZSgKICAgIC8vICAgZ3JvdXBJZDogdWludDY0LAogICAgLy8gICBjaGFuZ2U6IEFkbWluQ2hhbmdlLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMjQgLy8gMTI0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDIgb2YgKHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyNiAvLyAxMjYKICAgICsKICAgIGRpZyAyCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA1IG9mICh1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSx1aW50OFszMl0sdWludDY0LChsZW4rdXRmOFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFkbWluQ2hhbmdlCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODUKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODYKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODkKICAgIC8vIHRoaXMuX2Fzc2VydE1lbWJlcihncm91cElkKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTkwCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTkwLTU5MQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIHN3YXAKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBidG9pCiAgICBhc3NlcnQgLy8gZ3JvdXAgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTIKICAgIC8vIHRoaXMuX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2UuY2hhbmdlVHlwZSwgZ3JvdXApCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI0OQogICAgLy8gaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ1JFQVRFX0dST1VQKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlANgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNTAKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkID49IFVpbnQ2NCgxKSwgJ3RocmVzaG9sZCA+PSAxJykKICAgIGRpZyAyCiAgICBkdXAKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gdGhyZXNob2xkID49IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjUxCiAgICAvLyBhc3NlcnQoY2hhbmdlLm1lbWJlckFkZHIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2ZpcnN0IG1lbWJlciByZXF1aXJlZCcpCiAgICBkdXAKICAgIGV4dHJhY3QgMTggMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBmaXJzdCBtZW1iZXIgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjUyCiAgICAvLyBhc3NlcnQoY2hhbmdlLmFsbG93ZWRBY3Rpb25zIDw9IEFDVF9BTEwsICdpbnZhbGlkIGFjdGlvbnMnKQogICAgZHVwCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA2MyAvLyA2MwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIGFjdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjUzCiAgICAvLyBhc3NlcnQoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyA8PSBQUklWX0FMTCwgJ2ludmFsaWQgcHJpdmlsZWdlcycpCiAgICBkdXAKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHByaXZpbGVnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjU0CiAgICAvLyBhc3NlcnQoY2hhbmdlLmNvb2xkb3duUm91bmRzIDw9IE1BWF9DT09MRE9XTl9ST1VORFMsICdjb29sZG93biB0b28gbGFyZ2UnKQogICAgcHVzaGludCAxMDggLy8gMTA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50YyA0IC8vIDEwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIGNvb2xkb3duIHRvbyBsYXJnZQoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTk1CiAgICAvLyBjb25zdCBwaWQgPSB0aGlzLl9uZXdQcm9wb3NhbChncm91cElkLCBQVF9BRE1JTiwgZXhwaXJ5Um91bmQpCiAgICBkaWcgMwogICAgcHVzaGludCA1IC8vIDUKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9uZXdQcm9wb3NhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5NgogICAgLy8gdGhpcy5hZG1pblBheWxvYWRzKHBpZCkudmFsdWUgPSBjbG9uZShjaGFuZ2UpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBhZG1pblBheWxvYWRzID0gQm94TWFwPHVpbnQ2NCwgQWRtaW5DaGFuZ2U+KHsga2V5UHJlZml4OiAnZHAnIH0pCiAgICBieXRlYyAyMCAvLyAiZHAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTk2CiAgICAvLyB0aGlzLmFkbWluUGF5bG9hZHMocGlkKS52YWx1ZSA9IGNsb25lKGNoYW5nZSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3OS01ODQKICAgIC8vIHB1YmxpYyBwcm9wb3NlQWRtaW5DaGFuZ2UoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgY2hhbmdlOiBBZG1pbkNoYW5nZSwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI1NQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0FERF9NRU1CRVIpIHsKICAgIGRpZyA0CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNTYKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjU2CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNTcKICAgIC8vIGFzc2VydChjaGFuZ2UubWVtYmVyQWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnbWVtYmVyIHJlcXVpcmVkJykKICAgIGR1cAogICAgZXh0cmFjdCAxOCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIG1lbWJlciByZXF1aXJlZAoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICBidXJ5IDMKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjgKCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjU4CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fUkVNT1ZFX01FTUJFUikgewogICAgZGlnIDQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNTkKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjU5CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyNwoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjYwCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ0hBTkdFX1RIUkVTSE9MRCkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjEKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjYxCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjIKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkID49IFVpbnQ2NCgxKSwgJ3RocmVzaG9sZCA+PSAxJykKICAgIGR1cAogICAgcHVzaGludCA2MCAvLyA2MAogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2VydCAvLyB0aHJlc2hvbGQgPj0gMQogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyNwoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjYzCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjQKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjY0CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjUKICAgIC8vIGFzc2VydChjaGFuZ2UuYWxsb3dlZEFjdGlvbnMgPD0gQUNUX0FMTCwgJ2ludmFsaWQgYWN0aW9ucycpCiAgICBkdXAKICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDYzIC8vIDYzCiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgYWN0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjYKICAgIC8vIGFzc2VydChjaGFuZ2UuY29vbGRvd25Sb3VuZHMgPD0gTUFYX0NPT0xET1dOX1JPVU5EUywgJ2Nvb2xkb3duIHRvbyBsYXJnZScpCiAgICBkdXAKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGMgNCAvLyAxMDAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBjb29sZG93biB0b28gbGFyZ2UKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjcKCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2NwogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QUklWSUxFR0VTKSB7CiAgICBkaWcgNAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2OAogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGRpZyAyCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjgKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjY5CiAgICAvLyBhc3NlcnQoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyA8PSBQUklWX0FMTCwgJ2ludmFsaWQgcHJpdmlsZWdlcycpCiAgICBkaWcgMQogICAgcHVzaGludCA2OCAvLyA2OAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNyAvLyA3CiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgcHJpdmlsZWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzEKICAgIC8vICF0aGlzLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZSwgY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKSksCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGNhbGxzdWIgX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4KICAgIHBvcAogICAgc3dhcAogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzAtMTI3MwogICAgLy8gYXNzZXJ0KAogICAgLy8gICAhdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkpLAogICAgLy8gICAnbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4nLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIG11c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDI3Cgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzQKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfQUNUSVZFKSB7CiAgICBkaWcgNAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3NQogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGRpZyAyCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzUKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjc3CiAgICAvLyAhdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkpLAogICAgYm94X2dldAogICAgcG9wCiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBwb3AKICAgIHN3YXAKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjc2LTEyNzkKICAgIC8vIGFzc2VydCgKICAgIC8vICAgIXRoaXMuX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlLCBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpKSwKICAgIC8vICAgJ211c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtdXN0IGtlZXAgYXQgbGVhc3Qgb25lIGFjdGl2ZSBncm91cCBhZG1pbgogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyNwoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjgwCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQUREX1JFS0VZRURfQUREUikgewogICAgZGlnIDQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODEKICAgIC8vIGFzc2VydChjaGFuZ2UubWVtYmVyQWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnYWRkcmVzcyByZXF1aXJlZCcpCiAgICBkaWcgMgogICAgZXh0cmFjdCAxOCAzMgogICAgZHVwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYWRkcmVzcyByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgOSAvLyAiciIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODIKICAgIC8vIGFzc2VydCghdGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS5leGlzdHMsICdhbHJlYWR5IHJlZ2lzdGVyZWQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSByZWdpc3RlcmVkCgpwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIGRpZyAyCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDI3Cgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODMKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfUkVLRVlFRF9BRERSKSB7CiAgICBkaWcgNAogICAgcHVzaGludCA5IC8vIDkKICAgID09CiAgICBhc3NlcnQgLy8gdW5rbm93biBjaGFuZ2UgdHlwZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODQKICAgIC8vIGFzc2VydCh0aGlzLnJla2V5ZWRBZGRyZXNzZXMoY2hhbmdlLm1lbWJlckFkZHIpLmV4aXN0cywgJ25vdCByZWdpc3RlcmVkJykKICAgIGRpZyAyCiAgICBleHRyYWN0IDE4IDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZWtleWVkQWRkcmVzc2VzID0gQm94TWFwPEFjY291bnQsIFJla2V5ZWRBZGRyZXNzPih7IGtleVByZWZpeDogJ3InIH0pCiAgICBieXRlYyA5IC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI4NAogICAgLy8gYXNzZXJ0KHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZXhpc3RzLCAnbm90IHJlZ2lzdGVyZWQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IHJlZ2lzdGVyZWQKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjEKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmFwcHJvdmVQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcHJvdmVQcm9wb3NhbDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDUKICAgIC8vIHB1YmxpYyBhcHByb3ZlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGFwcHJvdmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDcKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKYXBwcm92ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDkKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkaWcgMQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA1IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjA5CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjEwCiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAnbm90IGFwcHJvdmFibGUnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogYXBwcm92ZVByb3Bvc2FsX2Jvb2xfdHJ1ZUA1CiAgICBkaWcgMgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBhcHByb3ZlUHJvcG9zYWxfYm9vbF9mYWxzZUA2CgphcHByb3ZlUHJvcG9zYWxfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKYXBwcm92ZVByb3Bvc2FsX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTAKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgYXBwcm92YWJsZScpCiAgICBhc3NlcnQgLy8gbm90IGFwcHJvdmFibGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTEKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPD0gcHJvcG9zYWwuZXhwaXJ5Um91bmQsICdwcm9wb3NhbCBleHBpcmVkJykKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gcHJvcG9zYWwgZXhwaXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxMgogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IHByb3Bvc2FsLmdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzLCAnbm90IGEgZ3JvdXAgbWVtYmVyJykKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTIKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgYSBncm91cCBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTMKICAgIC8vIGFzc2VydCghdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ2FscmVhZHkgYXBwcm92ZWQnKQogICAgZGlnIDYKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gYXBwcm92YWxzID0gQm94TWFwPHsgcHJvcG9zYWxJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIEFwcHJvdmFsPih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBieXRlYyAyMSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxMwogICAgLy8gYXNzZXJ0KCF0aGlzLmFwcHJvdmFscyh7IHByb3Bvc2FsSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzLCAnYWxyZWFkeSBhcHByb3ZlZCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGFwcHJvdmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxNQogICAgLy8gdGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUubWVtYmVyc2hpcEVwb2NoID09PSBwcm9wb3NhbC5lcG9jaEF0Q3JlYXRpb24sCiAgICBwdXNoaW50IDEwNiAvLyAxMDYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgODggLy8gODgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxNC02MTcKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUubWVtYmVyc2hpcEVwb2NoID09PSBwcm9wb3NhbC5lcG9jaEF0Q3JlYXRpb24sCiAgICAvLyAgICdncm91cCBtZW1iZXJzaGlwIGNoYW5nZWQgc2luY2UgcHJvcG9zYWwgY3JlYXRpb24nLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGdyb3VwIG1lbWJlcnNoaXAgY2hhbmdlZCBzaW5jZSBwcm9wb3NhbCBjcmVhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxOQogICAgLy8gdGhpcy5fcmVjb3JkQXBwcm92YWwocHJvcG9zYWxJZCwgcHJvcG9zYWwpCiAgICBkaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfcmVjb3JkQXBwcm92YWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYwNQogICAgLy8gcHVibGljIGFwcHJvdmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcHJvdmVQcm9wb3NhbF9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHByb3ZlUHJvcG9zYWxfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5leGVjdXRlUHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpleGVjdXRlUHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjIzCiAgICAvLyBwdWJsaWMgZXhlY3V0ZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI0CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI1CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI3CiAgICAvLyB0aGlzLl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbChwcm9wb3NhbElkKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjIzCiAgICAvLyBwdWJsaWMgZXhlY3V0ZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuY2FuY2VsUHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpjYW5jZWxQcm9wb3NhbDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzEKICAgIC8vIHB1YmxpYyBjYW5jZWxQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzMgogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogY2FuY2VsUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjMzCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmNhbmNlbFByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzUKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkaWcgMQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA1IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNQogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNgogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBjYW5jZWxsYWJsZScpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJueiBjYW5jZWxQcm9wb3NhbF9ib29sX3RydWVANQogICAgZGlnIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogY2FuY2VsUHJvcG9zYWxfYm9vbF9mYWxzZUA2CgpjYW5jZWxQcm9wb3NhbF9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpjYW5jZWxQcm9wb3NhbF9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjM2CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAnbm90IGNhbmNlbGxhYmxlJykKICAgIGFzc2VydCAvLyBub3QgY2FuY2VsbGFibGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzcKICAgIC8vIGNvbnN0IGlzUHJvcG9zZXIgPSBUeG4uc2VuZGVyID09PSBwcm9wb3NhbC5wcm9wb3NlcgogICAgdHhuIFNlbmRlcgogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdCA0OCAzMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzgKICAgIC8vIGNvbnN0IGlzTWVtYmVyID0gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA4CiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzAKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjM4CiAgICAvLyBjb25zdCBpc01lbWJlciA9IHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IHByb3Bvc2FsLmdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzkKICAgIC8vIGFzc2VydChpc1Byb3Bvc2VyIHx8IGlzTWVtYmVyLCAnbm90IGF1dGhvcmlzZWQgdG8gY2FuY2VsJykKICAgIHx8CiAgICBhc3NlcnQgLy8gbm90IGF1dGhvcmlzZWQgdG8gY2FuY2VsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQxCiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfQ0FOQ0VMTEVECiAgICBwdXNoaW50IDQgLy8gNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY0MS02NDIKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9IFNUQVRVU19DQU5DRUxMRUQKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgNgogICAgaW50Y18yIC8vIDgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIGVtaXQ8UHJvcG9zYWxDYW5jZWxsZWQ+KHsgcHJvcG9zYWxJZCB9KQogICAgcHVzaGJ5dGVzIDB4YWUyYWJjMDYgLy8gbWV0aG9kICJQcm9wb3NhbENhbmNlbGxlZCh1aW50NjQpIgogICAgZGlnIDUKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjMxCiAgICAvLyBwdWJsaWMgY2FuY2VsUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjYW5jZWxQcm9wb3NhbF9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjYW5jZWxQcm9wb3NhbF9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLnBydW5lUHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpwcnVuZVByb3Bvc2FsOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjUzCiAgICAvLyBwdWJsaWMgcHJ1bmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY1NAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NTUKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjU3CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNSAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjU3CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjU4CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfRVhFQ1VURUQgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQ0FOQ0VMTEVELCAncHJvcG9zYWwgbm90IHRlcm1pbmFsJykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYm56IHBydW5lUHJvcG9zYWxfYm9vbF90cnVlQDUKICAgIGRpZyAyCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IHBydW5lUHJvcG9zYWxfYm9vbF9mYWxzZUA2CgpwcnVuZVByb3Bvc2FsX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnBydW5lUHJvcG9zYWxfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY1OAogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0VYRUNVVEVEIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0NBTkNFTExFRCwgJ3Byb3Bvc2FsIG5vdCB0ZXJtaW5hbCcpCiAgICBhc3NlcnQgLy8gcHJvcG9zYWwgbm90IHRlcm1pbmFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjU5CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kID4gcHJvcG9zYWwuZXhwaXJ5Um91bmQsICdub3QgeWV0IGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPgogICAgYXNzZXJ0IC8vIG5vdCB5ZXQgZXhwaXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2MAogICAgLy8gdGhpcy5fYXNzZXJ0TWVtYmVyKHByb3Bvc2FsLmdyb3VwSWQpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjYyCiAgICAvLyBpZiAocHJvcG9zYWwucGF5bG9hZFR5cGUgPT09IFBUX1RSQU5TQUNUSU9OX0dST1VQKSB7CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBwcnVuZVByb3Bvc2FsX2Vsc2VfYm9keUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2MwogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBwcm9wb3NhbC5udW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDQKCnBydW5lUHJvcG9zYWxfd2hpbGVfdG9wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjYzCiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IHByb3Bvc2FsLm51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgPj0KICAgIGJ6IHBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2NAogICAgLy8gY29uc3Qga2V5OiB1aW50NjQgPSBwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcAogICAgZGlnIDEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBkaWcgNAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2NQogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDExIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjY1CiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjYKICAgIC8vIHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5kZWxldGUoKQogICAgZGlnIDcKICAgIGJveF9kZWwKICAgIHBvcAoKcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2MwogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBwcm9wb3NhbC5udW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA0CiAgICBiIHBydW5lUHJvcG9zYWxfd2hpbGVfdG9wQDkKCnBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzIKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLmRlbGV0ZSgpCiAgICBkaWcgOAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjUzCiAgICAvLyBwdWJsaWMgcHJ1bmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnBydW5lUHJvcG9zYWxfZWxzZV9ib2R5QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNQogICAgLy8gYWRtaW5QYXlsb2FkcyA9IEJveE1hcDx1aW50NjQsIEFkbWluQ2hhbmdlPih7IGtleVByZWZpeDogJ2RwJyB9KQogICAgYnl0ZWMgMjAgLy8gImRwIgogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjkKICAgIC8vIH0gZWxzZSBpZiAodGhpcy5hZG1pblBheWxvYWRzKHByb3Bvc2FsSWQpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzAKICAgIC8vIHRoaXMuYWRtaW5QYXlsb2Fkcyhwcm9wb3NhbElkKS5kZWxldGUoKQogICAgZGlnIDYKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTcKCnBydW5lUHJvcG9zYWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJ1bmVQcm9wb3NhbF9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldENvbmZpZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldENvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjgxCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRDb25maWdfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjgyCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldENvbmZpZ19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg1CiAgICAvLyB0aGlzLm5hbWUudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICduYW1lJyB9KQogICAgYnl0ZWMgMjQgLy8gIm5hbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg1CiAgICAvLyB0aGlzLm5hbWUudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4NgogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjAKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDggLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg2CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4NwogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgNyAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODcKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4OAogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyBuZXh0UHJvcG9zYWxJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICducGlkJyB9KQogICAgYnl0ZWMgMTIgLy8gIm5waWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg4CiAgICAvLyB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODkKICAgIC8vIHRoaXMucGF1c2VkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjEKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyAxMyAvLyAicGF1c2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4OQogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5MAogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjIKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiAndmVyJyB9KQogICAgYnl0ZWMgMjUgLy8gInZlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTAKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg0LTY5MQogICAgLy8gcmV0dXJuIFsKICAgIC8vICAgdGhpcy5uYW1lLnZhbHVlLAogICAgLy8gICB0aGlzLmdyb3VwQ291bnQudmFsdWUsCiAgICAvLyAgIHRoaXMubmV4dEdyb3VwSWQudmFsdWUsCiAgICAvLyAgIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUsCiAgICAvLyAgIHRoaXMucGF1c2VkLnZhbHVlLAogICAgLy8gICB0aGlzLnZlcnNpb24udmFsdWUsCiAgICAvLyBdCiAgICBkaWcgNQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDM2IC8vIDM2CiAgICArCiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMjQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3OQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5nZXRTaWduZXJHcm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFNpZ25lckdyb3VwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5NAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTYKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGdldFNpZ25lckdyb3VwX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5NwogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpnZXRTaWduZXJHcm91cF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njk5CiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICBkaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTkKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njk0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldFByb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0UHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzAyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwNAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0UHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzA1CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldFByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDcKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNSAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwNwogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0VHJhbnNhY3Rpb25Hcm91cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFRyYW5zYWN0aW9uR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzEwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxMgogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0VHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTMKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0VHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzE1CiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3Vwcyhwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcGF5bG9hZEluZGV4KS52YWx1ZSkKICAgIGRpZyAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgKgogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDExIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTUKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0TWVtYmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0TWVtYmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxOAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjAKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGdldE1lbWJlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjEKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0TWVtYmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjMKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50IH0pLnZhbHVlKQogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzAKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzIzCiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudCB9KS52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzE4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmlzTWVtYmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKaXNNZW1iZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzI2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyOAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogaXNNZW1iZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzI5CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmlzTWVtYmVyX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzEKICAgIC8vIHJldHVybiB0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50IH0pLmV4aXN0cwogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzAKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzMxCiAgICAvLyByZXR1cm4gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudCB9KS5leGlzdHMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyAyMiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmhhc0FwcHJvdmVkW3JvdXRpbmddKCkgLT4gdm9pZDoKaGFzQXBwcm92ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczNgogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogaGFzQXBwcm92ZWRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzM3CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmhhc0FwcHJvdmVkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzkKICAgIC8vIHJldHVybiB0aGlzLmFwcHJvdmFscyh7IHByb3Bvc2FsSWQsIGFjY291bnQgfSkuZXhpc3RzCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gYXBwcm92YWxzID0gQm94TWFwPHsgcHJvcG9zYWxJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIEFwcHJvdmFsPih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBieXRlYyAyMSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczOQogICAgLy8gcmV0dXJuIHRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudCB9KS5leGlzdHMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczNAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyAyMiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldEFjdGl2ZVByaXZHcm91cENvdW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0NQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQ2CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldEFjdGl2ZVByaXZHcm91cENvdW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDgKICAgIC8vIHJldHVybiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQ4CiAgICAvLyByZXR1cm4gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuaXNSZWtleWVkQWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmlzUmVrZXllZEFkZHJlc3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzUxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1MwogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogaXNSZWtleWVkQWRkcmVzc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTQKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKaXNSZWtleWVkQWRkcmVzc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZWtleWVkQWRkcmVzc2VzID0gQm94TWFwPEFjY291bnQsIFJla2V5ZWRBZGRyZXNzPih7IGtleVByZWZpeDogJ3InIH0pCiAgICBieXRlYyA5IC8vICJyIgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1NgogICAgLy8gcmV0dXJuIHRoaXMucmVrZXllZEFkZHJlc3NlcyhhY2NvdW50KS5leGlzdHMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyAyMiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldFJla2V5ZWRBZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0UmVrZXllZEFkZHJlc3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzU5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2MQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0UmVrZXllZEFkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzYyCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldFJla2V5ZWRBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIHJla2V5ZWRBZGRyZXNzZXMgPSBCb3hNYXA8QWNjb3VudCwgUmVrZXllZEFkZHJlc3M+KHsga2V5UHJlZml4OiAncicgfSkKICAgIGJ5dGVjIDkgLy8gInIiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzY0CiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5yZWtleWVkQWRkcmVzc2VzKGFjY291bnQpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2Fzc2VydE1lbWJlcihncm91cElkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRNZW1iZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzcxCiAgICAvLyBwcml2YXRlIF9hc3NlcnRNZW1iZXIoZ3JvdXBJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzIKICAgIC8vIGFzc2VydCh0aGlzLmdyb3Vwcyhncm91cElkKS5leGlzdHMsICdncm91cCBub3QgZm91bmQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzIKICAgIC8vIGFzc2VydCh0aGlzLmdyb3Vwcyhncm91cElkKS5leGlzdHMsICdncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gZ3JvdXAgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzczCiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc3MwogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzLCAnbm90IGEgZ3JvdXAgbWVtYmVyJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vdCBhIGdyb3VwIG1lbWJlcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwocHJvcG9zYWxJZDogdWludDY0KSAtPiB2b2lkOgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg0CiAgICAvLyBwcml2YXRlIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbChwcm9wb3NhbElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMzgKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMzgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjEKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyAxMyAvLyAicGF1c2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4NQogICAgLy8gYXNzZXJ0KHRoaXMucGF1c2VkLnZhbHVlID09PSBVaW50NjQoMCksICdzYWZlIHBhdXNlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNhZmUgcGF1c2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg2CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA1IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODYKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODcKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCByZWFkeSB0byBleGVjdXRlJykKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBub3QgcmVhZHkgdG8gZXhlY3V0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSBwcm9wb3NhbC5leHBpcnlSb3VuZCwgJ3Byb3Bvc2FsIGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMQogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gcHJvcG9zYWwgZXhwaXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZSkKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzkwLTc5MQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIGR1cAogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTEKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIGJ0b2kKICAgIGFzc2VydCAvLyBncm91cCBkaXNhYmxlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5NgogICAgLy8gY29uc3QgcmVxdWlyZWRUaHJlc2hvbGQ6IHVpbnQ2NCA9IHByb3Bvc2FsLnRocmVzaG9sZCA+PSBncm91cC50aHJlc2hvbGQgPyBwcm9wb3NhbC50aHJlc2hvbGQgOiBncm91cC50aHJlc2hvbGQKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDgzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5NwogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLmFwcHJvdmFsc0NvdW50ID49IHJlcXVpcmVkVGhyZXNob2xkLCAndGhyZXNob2xkIG5vdCBtZXQnKQogICAgZnJhbWVfZGlnIDgwCiAgICBkdXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgID49CiAgICBhc3NlcnQgLy8gdGhyZXNob2xkIG5vdCBtZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDIKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJzaGlwRXBvY2ggPT09IHByb3Bvc2FsLmVwb2NoQXRDcmVhdGlvbiwgJ2dyb3VwIG1lbWJlcnNoaXAgY2hhbmdlZCBzaW5jZSBwcm9wb3NhbCBjcmVhdGlvbicpCiAgICBmcmFtZV9kaWcgODEKICAgIHB1c2hpbnQgMTA2IC8vIDEwNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgcHVzaGludCA4OCAvLyA4OAogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICBhc3NlcnQgLy8gZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VkIHNpbmNlIHByb3Bvc2FsIGNyZWF0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODA0CiAgICAvLyBpZiAocHJvcG9zYWwucGF5bG9hZFR5cGUgPT09IFBUX1RSQU5TQUNUSU9OX0dST1VQKSB7CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MTQKICAgIC8vIGlmIChncm91cC5jb29sZG93blJvdW5kcyAhPT0gVWludDY0KDApICYmIGdyb3VwLmxhc3RFeGVjdXRpb25Sb3VuZCAhPT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgODEKICAgIHB1c2hpbnQgOTAgLy8gOTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDY4CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICBmcmFtZV9kaWcgODEKICAgIHB1c2hpbnQgOTggLy8gOTgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDY5CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODE1CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kID49IGdyb3VwLmxhc3RFeGVjdXRpb25Sb3VuZCArIGdyb3VwLmNvb2xkb3duUm91bmRzLCAnZ3JvdXAgY29vbGRvd24gbm90IGVsYXBzZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBmcmFtZV9kaWcgNjkKICAgIGZyYW1lX2RpZyA2OAogICAgKwogICAgPj0KICAgIGFzc2VydCAvLyBncm91cCBjb29sZG93biBub3QgZWxhcHNlZAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MTcKICAgIC8vIHRoaXMuX2V4ZWN1dGVUcmFuc2FjdGlvbkdyb3VwKHByb3Bvc2FsSWQsIHByb3Bvc2FsLmdyb3VwSWQsIGdyb3VwLCBwcm9wb3NhbC5udW1QYXlsb2FkcykKICAgIGZyYW1lX2RpZyA4MAogICAgcHVzaGludCA4MCAvLyA4MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDMKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA1NwogICAgZnJhbWVfZGlnIDgyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjMKICAgIGZyYW1lX2J1cnkgMjQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BANjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTAzCiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDU3CiAgICBmcmFtZV9kaWcgNTYKICAgIDw9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTA0CiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgNTcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDUKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM0CiAgICAvLyB0cmFuc2FjdGlvbkdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNhZmVUeG5Hcm91cD4oeyBrZXlQcmVmaXg6ICd0eGcnIH0pCiAgICBieXRlYyAxMSAvLyAidHhnIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDUKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfaWZfYm9keUA2OQogICAgZnJhbWVfZGlnIDIzCiAgICBmcmFtZV9idXJ5IDI1CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTAzCiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDU3CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1NwogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9idXJ5IDIzCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BANjcKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9pZl9ib2R5QDY5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwNgogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxNgogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyOAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDcKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQ5CiAgICBmcmFtZV9kaWcgMjMKICAgIGZyYW1lX2J1cnkgMjUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BANzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTA2LTkwNwogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAxNgogICAgaW50Y18wIC8vIDAKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwNwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDQ5CiAgICA+CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDgtOTA5CiAgICAvLyBjb25zdCBlbnRyeSA9IGNsb25lKHBheWxvYWRbaV0pCiAgICAvLyBpZiAoZW50cnkudHhUeXBlID09PSBUWF9QQVlNRU5UKSB7CiAgICBpbnRjXzMgLy8gMgogICAgZnJhbWVfZGlnIDQ5CiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZnJhbWVfZGlnIDE2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTA5CiAgICAvLyBpZiAoZW50cnkudHhUeXBlID09PSBUWF9QQVlNRU5UKSB7CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjcKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxMAogICAgLy8gY29uc3QgdHggPSBkZWNvZGVBcmM0PFBheW1lbnRUeG4+KGVudHJ5LmRhdGEpCiAgICBmcmFtZV9kaWcgMjgKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNDkKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTEwCiAgICAvLyBhc3NlcnQoKGdyb3VwLmFsbG93ZWRBY3Rpb25zICYgQUNUX1BBWSkgIT09IFVpbnQ2NCgwKSwgJ3BheSBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgMjQKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIHBheSBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTEKICAgIC8vIGFzc2VydCh0eC5yZWNlaXZlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVjZWl2ZXIgcmVxdWlyZWQnKQogICAgZHVwCiAgICBleHRyYWN0IDM0IDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgcmVxdWlyZWQKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTEyCiAgICAvLyBpZiAodHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSkgewogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3MQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExMwogICAgLy8gYXNzZXJ0KHR4LmNsb3NlUmVtYWluZGVyVG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2Nsb3NlIHRhcmdldCByZXF1aXJlZCcpCiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA4MiAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGNsb3NlIHRhcmdldCByZXF1aXJlZAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNQogICAgLy8gbGV0IGFtb3VudDogdWludDY0ID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNgogICAgLy8gaWYgKGdyb3VwLmxpbWl0QXNzZXRJZCA9PT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgODIKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANzkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTcKICAgIC8vIGFtb3VudCA9IHR4Lmhhc0Nsb3NlICE9PSBVaW50NjQoMCkgPyBvcC5iYWxhbmNlKHRoaXMuX3Jlc29sdmVTZW5kZXIodHguc2VuZGVyKSkgOiB0eC5hbW91bnQKICAgIGZyYW1lX2RpZyA3MQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VANzcKICAgIGZyYW1lX2RpZyAzCiAgICBleHRyYWN0IDIgMzIKICAgIGNhbGxzdWIgX3Jlc29sdmVTZW5kZXIKICAgIGJhbGFuY2UKICAgIGZyYW1lX2J1cnkgNDYKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDc5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxOQogICAgLy8gZ3JvdXAgPSB0aGlzLl9hY2NvdW50U3BlbmQoZ3JvdXAsIGFtb3VudCkKICAgIGZyYW1lX2RpZyA4MgogICAgZnJhbWVfZGlnIDQ2CiAgICBjYWxsc3ViIF9hY2NvdW50U3BlbmQKICAgIHBvcAogICAgZnJhbWVfYnVyeSA4MgogICAgZnJhbWVfZGlnIDI0CiAgICBmcmFtZV9idXJ5IDI1CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTA3CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQ5CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BANzAKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDc3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNwogICAgLy8gYW1vdW50ID0gdHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSA/IG9wLmJhbGFuY2UodGhpcy5fcmVzb2x2ZVNlbmRlcih0eC5zZW5kZXIpKSA6IHR4LmFtb3VudAogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDQ2CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDc5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDgwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyMAogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0FTU0VUKSB7CiAgICBmcmFtZV9kaWcgNjcKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA5MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyMQogICAgLy8gY29uc3QgdHggPSBkZWNvZGVBcmM0PEFzc2V0VHhuPihlbnRyeS5kYXRhKQogICAgZnJhbWVfZGlnIDI4CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDQ5CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExOAogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9BWEZFUikgIT09IFVpbnQ2NCgwKSwgJ2F4ZmVyIG5vdCBhbGxvd2VkJykKICAgIGZyYW1lX2RpZyAyNAogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAyCiAgICAmCiAgICBhc3NlcnQgLy8gYXhmZXIgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE5CiAgICAvLyBhc3NlcnQodHguYXNzZXRSZWNlaXZlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnYXNzZXQgcmVjZWl2ZXIgcmVxdWlyZWQnKQogICAgZHVwCiAgICBleHRyYWN0IDQyIDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYXNzZXQgcmVjZWl2ZXIgcmVxdWlyZWQKICAgIHB1c2hpbnQgODIgLy8gODIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTIwCiAgICAvLyBpZiAodHguaGFzQXNzZXRDbG9zZSAhPT0gVWludDY0KDApKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcxCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTIxCiAgICAvLyBhc3NlcnQodHguYXNzZXRDbG9zZVRvICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdhc3NldCBjbG9zZSB0YXJnZXQgcmVxdWlyZWQnKQogICAgZnJhbWVfZGlnIDkKICAgIGV4dHJhY3QgOTAgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhc3NldCBjbG9zZSB0YXJnZXQgcmVxdWlyZWQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MjMKICAgIC8vIGNvbnN0IHRyYWNrZWQgPSBncm91cC5saW1pdEFzc2V0SWQgIT09IFVpbnQ2NCgwKSAmJiB0eC54ZmVyQXNzZXQgPT09IGdyb3VwLmxpbWl0QXNzZXRJZAogICAgZnJhbWVfZGlnIDgyCiAgICBwdXNoaW50IDM0IC8vIDM0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDc2CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUA4NgogICAgZnJhbWVfZGlnIDkKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgNzYKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUA4NgogICAgaW50Y18xIC8vIDEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX21lcmdlQDg3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyNgogICAgLy8gbGV0IGFtb3VudDogdWludDY0ID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0NwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyNwogICAgLy8gaWYgKHRyYWNrZWQpIHsKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTI4CiAgICAvLyBpZiAodHguaGFzQXNzZXRDbG9zZSAhPT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgNzEKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAOTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MjkKICAgIC8vIGNvbnN0IFtiYWxdID0gb3AuQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZSh0aGlzLl9yZXNvbHZlU2VuZGVyKHR4LnNlbmRlciksIHR4LnhmZXJBc3NldCkKICAgIGZyYW1lX2RpZyA5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAzMgogICAgY2FsbHN1YiBfcmVzb2x2ZVNlbmRlcgogICAgc3dhcAogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICBmcmFtZV9idXJ5IDQ3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MzUKICAgIC8vIGdyb3VwID0gdGhpcy5fYWNjb3VudFNwZW5kKGdyb3VwLCBhbW91bnQpCiAgICBmcmFtZV9kaWcgODIKICAgIGZyYW1lX2RpZyA0NwogICAgY2FsbHN1YiBfYWNjb3VudFNwZW5kCiAgICBwb3AKICAgIGZyYW1lX2J1cnkgODIKICAgIGZyYW1lX2RpZyAyNAogICAgZnJhbWVfYnVyeSAyNQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMTMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAOTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTMyCiAgICAvLyBhbW91bnQgPSB0eC5hc3NldEFtb3VudAogICAgZnJhbWVfZGlnIDkKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDQ3CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUA4NjoKICAgIGludGNfMCAvLyAwCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX21lcmdlQDg3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDkzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzNgogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0FQUCkgewogICAgZnJhbWVfZGlnIDY3CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAOTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MzcKICAgIC8vIGNvbnN0IHR4ID0gZGVjb2RlQXJjNDxBcHBUeG4+KGVudHJ5LmRhdGEpCiAgICBmcmFtZV9kaWcgMjgKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNDkKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjYKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfQVBQTCkgIT09IFVpbnQ2NCgwKSwgJ2FwcGwgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgICYKICAgIGFzc2VydCAvLyBhcHBsIG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNwogICAgLy8gYXNzZXJ0KHR4LmFwcElkICE9PSBVaW50NjQoMCksICdhcHBJZCByZXF1aXJlZCcpIC8vIGNyZWF0ZS91cGRhdGUgbmVlZCBwcm9ncmFtcyBhbmQgYXJlIG5vdCBzdXBwb3J0ZWQgaGVyZQogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYXNzZXJ0IC8vIGFwcElkIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyOAogICAgLy8gYXNzZXJ0KHR4Lm9uQ29tcGxldGlvbiA8PSBVaW50NjQoNSksICdpbnZhbGlkIG9uQ29tcGxldGlvbicpCiAgICBzd2FwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjkKICAgIC8vIGFzc2VydCh0eC5vbkNvbXBsZXRpb24gIT09IFVpbnQ2NCg0KSwgJ2FwcCB1cGRhdGUgbm90IHN1cHBvcnRlZCcpCiAgICBwdXNoaW50IDQgLy8gNAogICAgIT0KICAgIGFzc2VydCAvLyBhcHAgdXBkYXRlIG5vdCBzdXBwb3J0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTMwCiAgICAvLyBjb25zdCBudW1BcmdzID0gVWludDY0KHR4LmFwcEFyZ3MubGVuZ3RoKQogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzMQogICAgLy8gY29uc3QgbnVtQWNjb3VudHMgPSBVaW50NjQodHguYWNjb3VudHMubGVuZ3RoKQogICAgZGlnIDEKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTMyCiAgICAvLyBjb25zdCBudW1BcHBzID0gVWludDY0KHR4LmZvcmVpZ25BcHBzLmxlbmd0aCkKICAgIGRpZyAyCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzMwogICAgLy8gY29uc3QgbnVtQXNzZXRzID0gVWludDY0KHR4LmZvcmVpZ25Bc3NldHMubGVuZ3RoKQogICAgZGlnIDMKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzQKICAgIC8vIGFzc2VydChudW1BcmdzIDw9IE1BWF9BUFBfQVJHUywgJ3RvbyBtYW55IGFwcCBhcmdzJykKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSBhcHAgYXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzUKICAgIC8vIGFzc2VydChudW1BY2NvdW50cyA8PSBNQVhfQVBQX0FDQ09VTlRTLCAndG9vIG1hbnkgYWNjb3VudHMnKQogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IGFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzNgogICAgLy8gYXNzZXJ0KG51bUFwcHMgPD0gTUFYX0FQUF9GT1JFSUdOX0FQUFMsICd0b28gbWFueSBmb3JlaWduIGFwcHMnKQogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IGZvcmVpZ24gYXBwcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzcKICAgIC8vIGFzc2VydChudW1Bc3NldHMgPD0gTUFYX0FQUF9GT1JFSUdOX0FTU0VUUywgJ3RvbyBtYW55IGZvcmVpZ24gYXNzZXRzJykKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgZm9yZWlnbiBhc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTM4CiAgICAvLyBhc3NlcnQobnVtQWNjb3VudHMgKyBudW1BcHBzICsgbnVtQXNzZXRzIDw9IE1BWF9BUFBfVE9UQUxfUkVGUywgJ3RvbyBtYW55IHJlZmVyZW5jZXMnKQogICAgY292ZXIgMgogICAgKwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgcmVmZXJlbmNlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzkKICAgIC8vIGxldCB0b3RhbEFyZ0xlbiA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQwCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbnVtQXJnczsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUwCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDIwOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQwCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbnVtQXJnczsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA1MAogICAgZnJhbWVfZGlnIDU1CiAgICA8CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNTkKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAyMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQxCiAgICAvLyB0b3RhbEFyZ0xlbiA9IHRvdGFsQXJnTGVuICsgdHguYXBwQXJnc1tpXS5sZW5ndGgKICAgIGZyYW1lX2RpZyAxMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1OQogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgNTAKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgZnJhbWVfZGlnIDY1CiAgICArCiAgICBmcmFtZV9idXJ5IDY1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE0MAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IG51bUFyZ3M7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1MAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDIwOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDIxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQzCiAgICAvLyBhc3NlcnQodG90YWxBcmdMZW4gPD0gTUFYX0FQUF9UT1RBTF9BUkdfTEVOLCAnYXBwIGFyZ3MgdG90YWwgbGVuZ3RoIGV4Y2VlZGVkJykKICAgIGZyYW1lX2RpZyA2NQogICAgcHVzaGludCAyMDQ4IC8vIDIwNDgKICAgIDw9CiAgICBhc3NlcnQgLy8gYXBwIGFyZ3MgdG90YWwgbGVuZ3RoIGV4Y2VlZGVkCiAgICBmcmFtZV9kaWcgMjQKICAgIGZyYW1lX2J1cnkgMjUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTEzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDk3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzOQogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0tFWVJFRykgewogICAgZnJhbWVfZGlnIDY3CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAOTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDEKICAgIC8vIGFzc2VydCgoZ3JvdXBJbi5hbGxvd2VkQWN0aW9ucyAmIEFDVF9LRVlSRUcpICE9PSBVaW50NjQoMCksICdrZXlyZWcgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGFzc2VydCAvLyBrZXlyZWcgbm90IGFsbG93ZWQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTEzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDk5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0MgogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0FDRkcpIHsKICAgIGZyYW1lX2RpZyA2NwogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEwMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0MwogICAgLy8gY29uc3QgdHggPSBkZWNvZGVBcmM0PEFzc2V0Q29uZmlnVHhuPihlbnRyeS5kYXRhKQogICAgZnJhbWVfZGlnIDI4CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDQ5CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE0NwogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9BQ0ZHKSAhPT0gVWludDY0KDApLCAnYWNmZyBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgMjQKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAmCiAgICBhc3NlcnQgLy8gYWNmZyBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDkKICAgIC8vIHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgwKSB8fCB0eC5tZXRhZGF0YUhhc2gubGVuZ3RoID09PSBVaW50NjQoMzIpLAogICAgZHVwCiAgICBwdXNoaW50IDM4IC8vIDM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGMgNSAvLyAxNjgKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjEKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX3RydWVAMjA0CiAgICBmcmFtZV9kaWcgNjEKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUAyMDUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX3RydWVAMjA0OgogICAgaW50Y18xIC8vIDEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX21lcmdlQDIwNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQ4LTExNTEKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdHgubWV0YWRhdGFIYXNoLmxlbmd0aCA9PT0gVWludDY0KDApIHx8IHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgzMiksCiAgICAvLyAgICdtZXRhZGF0YUhhc2ggbXVzdCBiZSAwIG9yIDMyIGJ5dGVzJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtZXRhZGF0YUhhc2ggbXVzdCBiZSAwIG9yIDMyIGJ5dGVzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMDk6CiAgICBmcmFtZV9kaWcgMjQKICAgIGZyYW1lX2J1cnkgMjUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTEzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUAyMDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9tZXJnZUAyMDYKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0NQogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1JFS0VZKSB7CiAgICBmcmFtZV9kaWcgNjcKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYXNzZXJ0IC8vIHVua25vd24gdHggdHlwZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0NgogICAgLy8gY29uc3QgdHggPSBkZWNvZGVBcmM0PFJla2V5VHhuPihlbnRyeS5kYXRhKQogICAgZnJhbWVfZGlnIDI4CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDQ5CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTU1CiAgICAvLyBhc3NlcnQoKGdyb3VwLmFsbG93ZWRBY3Rpb25zICYgQUNUX1JFS0VZKSAhPT0gVWludDY0KDApLCAncmVrZXkgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBkdXAKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAmCiAgICBhc3NlcnQgLy8gcmVrZXkgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTYxCiAgICAvLyBhc3NlcnQoKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCksICdyZWtleSByZXF1aXJlcyBncm91cCBhZG1pbiBwcml2aWxlZ2UnKQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gcmVrZXkgcmVxdWlyZXMgZ3JvdXAgYWRtaW4gcHJpdmlsZWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2NQogICAgLy8gYXNzZXJ0KHR4LnJla2V5VG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5IHRhcmdldCByZXF1aXJlZCcpCiAgICBleHRyYWN0IDM0IDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gcmVrZXkgdGFyZ2V0IHJlcXVpcmVkCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEwOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDExNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NTUKICAgIC8vIGdyb3VwLmxhc3RFeGVjdXRpb25Sb3VuZCA9IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgODIKICAgIHN3YXAKICAgIHJlcGxhY2UyIDk4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTU2CiAgICAvLyB0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZnJhbWVfZGlnIDgxCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk1OAogICAgLy8gbGV0IHR4SW5kZXggPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDY2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTU5CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNTgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk1OQogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBudW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA1OAogICAgZnJhbWVfZGlnIDU2CiAgICA8PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE0MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2MAogICAgLy8gY29uc3Qga2V5OiB1aW50NjQgPSBwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDcgLy8gNwogICAgKgogICAgZnJhbWVfZGlnIDU4CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTYxCiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTEgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTYxCiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjIKICAgIC8vIGNvbnN0IHBheWxvYWQgPSBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkudmFsdWUpCiAgICBmcmFtZV9kaWcgMTgKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMjkKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTYzCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1MQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTYyLTk2MwogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAxOAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2MwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDUxCiAgICA+CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjUKICAgIC8vIGNvbnN0IGZpcnN0ID0gdHhJbmRleCA9PT0gVWludDY0KDApCiAgICBmcmFtZV9kaWcgNjYKICAgICEKICAgIGZyYW1lX2J1cnkgNDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjYKICAgIC8vIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1BBWU1FTlQpIHsKICAgIGludGNfMyAvLyAyCiAgICBmcmFtZV9kaWcgNTEKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBmcmFtZV9kaWcgMTgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3MgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2NwogICAgLy8gdGhpcy5fc3RhZ2VQYXltZW50KGRlY29kZUFyYzQ8UGF5bWVudFR4bj4oZW50cnkuZGF0YSksIGZpcnN0KQogICAgZnJhbWVfZGlnIDI5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDUxCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxMAogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDgKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxMQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpKQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDEyCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDEzCiAgICAvLyB0aGlzLl9zZXRTZW5kZXJJZlNldCh0eC5zZW5kZXIpCiAgICBkdXAKICAgIGV4dHJhY3QgMiAzMgogICAgY2FsbHN1YiBfc2V0U2VuZGVySWZTZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDE0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFJlY2VpdmVyKHR4LnJlY2VpdmVyKQogICAgZHVwCiAgICBleHRyYWN0IDM0IDMyCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxNQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBbW91bnQodHguYW1vdW50KQogICAgZHVwCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDE2CiAgICAvLyBpZiAodHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSkgb3AuSVR4bkNyZWF0ZS5zZXRDbG9zZVJlbWFpbmRlclRvKHR4LmNsb3NlUmVtYWluZGVyVG8pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTk2CiAgICBmcmFtZV9kaWcgNAogICAgZXh0cmFjdCA4MiAzMgogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxOTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxNwogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgcHVzaGludCAxMTIgLy8gMTEyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNgogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEzOAogICAgZnJhbWVfZGlnIDM2CiAgICBpdHhuX2ZpZWxkIE5vdGUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzkKICAgIC8vIHR4SW5kZXggPSB0eEluZGV4ICsgVWludDY0KDEpCiAgICBmcmFtZV9kaWcgNjYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDY2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTYzCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUxCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTIwCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjgKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BU1NFVCkgewogICAgZnJhbWVfZGlnIDcyCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTY5CiAgICAvLyB0aGlzLl9zdGFnZUFzc2V0KGRlY29kZUFyYzQ8QXNzZXRUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjEKICAgIC8vIHRoaXMuX2JlZ2luT3JOZXh0KGZpcnN0KQogICAgZnJhbWVfZGlnIDQ4CiAgICBjYWxsc3ViIF9iZWdpbk9yTmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0VHlwZUVudW0oVWludDY0KFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyKSkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyMwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyNAogICAgLy8gdGhpcy5fc2V0U2VuZGVySWZTZXQodHguc2VuZGVyKQogICAgZHVwCiAgICBleHRyYWN0IDIgMzIKICAgIGNhbGxzdWIgX3NldFNlbmRlcklmU2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyNQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRYZmVyQXNzZXQodHgueGZlckFzc2V0KQogICAgZHVwCiAgICBwdXNoaW50IDM0IC8vIDM0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI2CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFzc2V0UmVjZWl2ZXIodHguYXNzZXRSZWNlaXZlcikKICAgIGR1cAogICAgZXh0cmFjdCA0MiAzMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyNwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBc3NldEFtb3VudCh0eC5hc3NldEFtb3VudCkKICAgIGR1cAogICAgcHVzaGludCA3NCAvLyA3NAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHB1c2hpbnQgODIgLy8gODIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI4CiAgICAvLyBpZiAodHguaGFzQXNzZXRDbG9zZSAhPT0gVWludDY0KDApKSBvcC5JVHhuQ3JlYXRlLnNldEFzc2V0Q2xvc2VUbyh0eC5hc3NldENsb3NlVG8pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTkwCiAgICBmcmFtZV9kaWcgNQogICAgZXh0cmFjdCA5MCAzMgogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE5MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI5CiAgICAvLyBpZiAodHgubm90ZSAhPT0gJycpIG9wLklUeG5DcmVhdGUuc2V0Tm90ZShCeXRlcyh0eC5ub3RlKSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDEyMCAvLyAxMjAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM3CiAgICBieXRlY18yIC8vICIiCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTM4CiAgICBmcmFtZV9kaWcgMzcKICAgIGl0eG5fZmllbGQgTm90ZQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMzgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3MAogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0FQUCkgewogICAgZnJhbWVfZGlnIDcyCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTcxCiAgICAvLyB0aGlzLl9zdGFnZUFwcENhbGwoZGVjb2RlQXJjNDxBcHBUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQ3CiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA0OAogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQ4CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKSkKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1MAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbklkKHR4LmFwcElkKQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCAxMCAvLyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNTEKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0T25Db21wbGV0aW9uKHR4Lm9uQ29tcGxldGlvbikKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNTIKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDM5CiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMwogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE3NAogICAgZnJhbWVfZGlnIDMzCiAgICBpdHhuX2ZpZWxkIE5vdGUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE3NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDUzCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFwcEFyZ3MubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQ5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE3NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDUzCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFwcEFyZ3MubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDAKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDQ5CiAgICA+CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjIKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxNzcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDUzLTEwNTQKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgLy8gICBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9uQXJncyh0eC5hcHBBcmdzW2ldKQogICAgZnJhbWVfZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNjIKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDQ5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDU0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9uQXJncyh0eC5hcHBBcmdzW2ldKQogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1MwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hcHBBcmdzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0OQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE3NQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE3NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDU2CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFjY291bnRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1MgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxNzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1NgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDEKICAgIGZyYW1lX2RpZyA0MAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTIKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDU2LTEwNTcKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYWNjb3VudHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIC8vICAgb3AuSVR4bkNyZWF0ZS5zZXRBY2NvdW50cyh0eC5hY2NvdW50c1tpXSkKICAgIGZyYW1lX2RpZyA3CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDUyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNTcKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QWNjb3VudHModHguYWNjb3VudHNbaV0pCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1NgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTIKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxNzgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1OQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1MwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1OQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MgogICAgZnJhbWVfZGlnIDM5CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MwogICAgPgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE4MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNTktMTA2MAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICAvLyAgIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRzKHR4LmZvcmVpZ25Bc3NldHNbaV0pCiAgICBmcmFtZV9kaWcgOAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1MwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRzKHR4LmZvcmVpZ25Bc3NldHNbaV0pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDU5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25Bc3NldHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUzCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTgxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTgzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjIKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDU0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE4NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDYyCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25BcHBzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzAKICAgIGZyYW1lX2RpZyA0MQogICAgZnJhbWVfZGlnIDQyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTQKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEzOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjItMTA2MwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXBwcy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgLy8gICBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9ucyh0eC5mb3JlaWduQXBwc1tpXSkKICAgIGZyYW1lX2RpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjMKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXBwbGljYXRpb25zKHR4LmZvcmVpZ25BcHBzW2ldKQogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA2MgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXBwcy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3MgogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0tFWVJFRykgewogICAgZnJhbWVfZGlnIDcyCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyB0aGlzLl9zdGFnZUtleVJlZyhkZWNvZGVBcmM0PEtleVJlZ1R4bj4oZW50cnkuZGF0YSksIGZpcnN0KQogICAgZnJhbWVfZGlnIDI5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDUxCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjgKICAgIC8vIHRoaXMuX2JlZ2luT3JOZXh0KGZpcnN0KQogICAgZnJhbWVfZGlnIDQ4CiAgICBjYWxsc3ViIF9iZWdpbk9yTmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjkKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0VHlwZUVudW0oVWludDY0KFRyYW5zYWN0aW9uVHlwZS5LZXlSZWdpc3RyYXRpb24pKQogICAgaW50Y18zIC8vIDIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDcwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3MQogICAgLy8gaWYgKHR4Lm9ubGluZSAhPT0gVWludDY0KDApKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3NAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRWb3RlUGsodHgudm90ZUtleSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIFZvdGVQSwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNzUKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0U2VsZWN0aW9uUGsodHguc2VsZWN0aW9uS2V5KQogICAgZGlnIDEKICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgU2VsZWN0aW9uUEsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDc2CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFN0YXRlUHJvb2ZQayh0eC5zdGF0ZVByb29mS2V5KQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgU3RhdGVQcm9vZlBLCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3NwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRWb3RlRmlyc3QodHgudm90ZUZpcnN0KQogICAgZnJhbWVfZGlnIDExCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIFZvdGVGaXJzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNzgKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Vm90ZUxhc3QodHgudm90ZUxhc3QpCiAgICBkdXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIFZvdGVMYXN0CiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRWb3RlS2V5RGlsdXRpb24odHgudm90ZUtleURpbHV0aW9uKQogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgVm90ZUtleURpbHV0aW9uCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEzOAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc0CiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQUNGRykgewogICAgZnJhbWVfZGlnIDcyCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc1CiAgICAvLyB0aGlzLl9zdGFnZUFzc2V0Q29uZmlnKGRlY29kZUFyYzQ8QXNzZXRDb25maWdUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTIKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg0CiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA0OAogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXNzZXRDb25maWcpKQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg2CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4NwogICAgLy8gaWYgKHR4LmNvbmZpZ0Fzc2V0ID09PSBVaW50NjQoMCkpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjcKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE2MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRUb3RhbCh0eC50b3RhbCkKICAgIGZyYW1lX2RpZyAxMgogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5MQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldERlY2ltYWxzKHR4LmRlY2ltYWxzKQogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5MgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldERlZmF1bHRGcm96ZW4odHguZGVmYXVsdEZyb3plbiAhPT0gVWludDY0KDApKQogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDkzCiAgICAvLyBpZiAodHgudW5pdE5hbWUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0VW5pdE5hbWUoQnl0ZXModHgudW5pdE5hbWUpKQogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MwogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNQogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE1NwogICAgZnJhbWVfZGlnIDM1CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE1NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDk0CiAgICAvLyBpZiAodHguYXNzZXROYW1lICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldE5hbWUoQnl0ZXModHguYXNzZXROYW1lKSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDM2IC8vIDM2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQ0CiAgICBmcmFtZV9kaWcgNDMKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzcKICAgIGJ5dGVjXzIgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNTkKICAgIGZyYW1lX2RpZyAzNwogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE1OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDk1CiAgICAvLyBpZiAodHgudXJsICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldFVybChCeXRlcyh0eC51cmwpKQogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIHB1c2hpbnQgMzggLy8gMzgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDUKICAgIGZyYW1lX2RpZyA0NAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzOAogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2MQogICAgZnJhbWVfZGlnIDM4CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5NgogICAgLy8gaWYgKHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgzMikpIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRNZXRhZGF0YUhhc2godHgubWV0YWRhdGFIYXNoKQogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIGludGMgNSAvLyAxNjgKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgNDUKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzEKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2NAogICAgZnJhbWVfZGlnIDMxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWV0YWRhdGFIYXNoCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwMgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldE1hbmFnZXIodHgubWFuYWdlcikKICAgIGZyYW1lX2RpZyAxMgogICAgZHVwCiAgICBleHRyYWN0IDQyIDMyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMDMKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRSZXNlcnZlKHR4LnJlc2VydmUpCiAgICBkdXAKICAgIGV4dHJhY3QgNzQgMzIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwNAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldEZyZWV6ZSh0eC5mcmVlemUpCiAgICBkdXAKICAgIGV4dHJhY3QgMTA2IDMyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RnJlZXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwNQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldENsYXdiYWNrKHR4LmNsYXdiYWNrKQogICAgZXh0cmFjdCAxMzggMzIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRDbGF3YmFjawogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMDYKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIGludGMgNSAvLyAxNjgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMyCiAgICBieXRlY18yIC8vICIiCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTM4CiAgICBmcmFtZV9kaWcgMzIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMzgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTYzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMDAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXQodHguY29uZmlnQXNzZXQpCiAgICBmcmFtZV9kaWcgNjcKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTY0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzYKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9SRUtFWSkgewogICAgZnJhbWVfZGlnIDcyCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEzOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3NwogICAgLy8gdGhpcy5fc3RhZ2VSZWtleShkZWNvZGVBcmM0PFJla2V5VHhuPihlbnRyeS5kYXRhKSwgZmlyc3QpCiAgICBmcmFtZV9kaWcgMjkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTEKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMzYKICAgIC8vIHRoaXMuX2JlZ2luT3JOZXh0KGZpcnN0KQogICAgZnJhbWVfZGlnIDQ4CiAgICBjYWxsc3ViIF9iZWdpbk9yTmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMzcKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0VHlwZUVudW0oVWludDY0KFRyYW5zYWN0aW9uVHlwZS5QYXltZW50KSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzOAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzOQogICAgLy8gdGhpcy5fc2V0U2VuZGVySWZTZXQodHguc2VuZGVyKQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAzMgogICAgZHVwCiAgICBjYWxsc3ViIF9zZXRTZW5kZXJJZlNldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0UmVjZWl2ZXIodGhpcy5fcmVzb2x2ZVNlbmRlcih0eC5zZW5kZXIpKQogICAgY2FsbHN1YiBfcmVzb2x2ZVNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDEKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QW1vdW50KFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0UmVrZXlUbyh0eC5yZWtleVRvKQogICAgc3dhcAogICAgZXh0cmFjdCAzNCAzMgogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0MwogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBkdXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM0CiAgICBieXRlY18yIC8vICIiCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTM4CiAgICBmcmFtZV9kaWcgMzQKICAgIGl0eG5fZmllbGQgTm90ZQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMzgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NTkKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDU4CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTE3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTQxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk4NAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODI1CiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfRVhFQ1VURUQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODI1LTgyNgogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gU1RBVFVTX0VYRUNVVEVECiAgICAvLyB0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZnJhbWVfZGlnIDc5CiAgICBpbnRjXzIgLy8gOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyNwogICAgLy8gZW1pdDxQcm9wb3NhbEV4ZWN1dGVkPih7IHByb3Bvc2FsSWQgfSkKICAgIHB1c2hieXRlcyAweDM1YzY3ZWZkIC8vIG1ldGhvZCAiUHJvcG9zYWxFeGVjdXRlZCh1aW50NjQpIgogICAgZnJhbWVfZGlnIDc4CiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBhZG1pblBheWxvYWRzID0gQm94TWFwPHVpbnQ2NCwgQWRtaW5DaGFuZ2U+KHsga2V5UHJlZml4OiAnZHAnIH0pCiAgICBieXRlYyAyMCAvLyAiZHAiCiAgICBmcmFtZV9kaWcgNzgKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODIwCiAgICAvLyBjb25zdCBjaGFuZ2UgPSBjbG9uZSh0aGlzLmFkbWluUGF5bG9hZHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMjAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODIwLTgyMQogICAgLy8gY29uc3QgY2hhbmdlID0gY2xvbmUodGhpcy5hZG1pblBheWxvYWRzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgLy8gdGhpcy5fYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlKGNoYW5nZS5jaGFuZ2VUeXBlLCBncm91cCkKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjEKICAgIC8vIHRoaXMuX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2UuY2hhbmdlVHlwZSwgZ3JvdXApCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzAKICAgIGR1cAogICAgZnJhbWVfZGlnIDgyCiAgICBjYWxsc3ViIF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyOTEKICAgIC8vIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0NSRUFURV9HUk9VUCkgewogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2NAogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjUKICAgIC8vIGNvbnN0IGdpZDogdWludDY0ID0gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTgKICAgIC8vIG5leHRHcm91cElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25naWQnIH0pCiAgICBieXRlYyA3IC8vICJuZ2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjUKICAgIC8vIGNvbnN0IGdpZDogdWludDY0ID0gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzY2CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA8PSBVaW50NjQoMSksICduZXcgZ3JvdXAgc3RhcnRzIHdpdGggb25lIG1lbWJlcicpCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgcHVzaGludCA2MCAvLyA2MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIG5ldyBncm91cCBzdGFydHMgd2l0aCBvbmUgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2OQogICAgLy8gbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIGZyYW1lX2RpZyAyMAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzcyCiAgICAvLyBhZG1pblByaXZpbGVnZXM6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICBkaWcgNAogICAgcHVzaGludCA2OCAvLyA2OAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3MwogICAgLy8gYWxsb3dlZEFjdGlvbnM6IGNoYW5nZS5hbGxvd2VkQWN0aW9ucywKICAgIGRpZyA1CiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzc0CiAgICAvLyBsaW1pdEFzc2V0SWQ6IGNoYW5nZS5saW1pdEFzc2V0SWQsCiAgICBkaWcgNgogICAgcHVzaGludCA4NCAvLyA4NAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3NQogICAgLy8gZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICBkaWcgNwogICAgcHVzaGludCA5MiAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3OAogICAgLy8gbW9udGhseUxpbWl0OiBjaGFuZ2UubW9udGhseUxpbWl0LAogICAgZGlnIDgKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4MQogICAgLy8gY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIGRpZyA5CiAgICBwdXNoaW50IDEwOCAvLyAxMDgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjgtMTM4NQogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGRpZyA2CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciA4CiAgICBmcmFtZV9idXJ5IDAKICAgIHVuY292ZXIgOQogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE0CiAgICBieXRlYyAyNiAvLyAweDAwN2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzEKICAgIC8vIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjgtMTM4NQogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzc2CiAgICAvLyBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjgtMTM4NQogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzg2CiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZGlnIDUKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4NgogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzg4CiAgICAvLyBjb25zdCBtOiBNZW1iZXIgPSB7IGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSwgbGFiZWw6IGNoYW5nZS5tZW1iZXJMYWJlbCwgYWRkcjogY2hhbmdlLm1lbWJlckFkZHIgfQogICAgZGlnIDQKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDQKICAgIGxlbgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgNAogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMTUKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBieXRlYyAxOSAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4OQogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzODkKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzkxCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDcgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5MQogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSA9IGdpZCArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzkyCiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA4IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzOTIKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA4IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzOTIKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzkzCiAgICAvLyBpZiAoKGNoYW5nZS5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApKSB7CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5NAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzk0CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzk0CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzk3CiAgICAvLyBlbWl0PEdyb3VwQ3JlYXRlZD4oeyBncm91cElkOiBnaWQsIG5hbWU6IGNoYW5nZS5ncm91cE5hbWUsIHRocmVzaG9sZDogY2hhbmdlLnRocmVzaG9sZCB9KQogICAgZnJhbWVfZGlnIDIxCiAgICBieXRlYyAxNyAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDE0CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAiR3JvdXBDcmVhdGVkKHVpbnQ2NCxzdHJpbmcsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5OAogICAgLy8gZW1pdDxNZW1iZXJBZGRlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogY2hhbmdlLm1lbWJlckFkZHIsIGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSB9KQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxNQogICAgY29uY2F0CiAgICBieXRlYyAxNCAvLyBtZXRob2QgIk1lbWJlckFkZGVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyOTMKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9BRERfTUVNQkVSKSB7CiAgICBmcmFtZV9kaWcgNzAKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDIKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDAzCiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnYWxyZWFkeSBhIG1lbWJlcicpCiAgICBkaWcgMQogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDAzCiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnYWxyZWFkeSBhIG1lbWJlcicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDA1CiAgICAvLyBjb25zdCBtOiBNZW1iZXIgPSB7IGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSwgbGFiZWw6IGNoYW5nZS5tZW1iZXJMYWJlbCwgYWRkcjogY2hhbmdlLm1lbWJlckFkZHIgfQogICAgdW5jb3ZlciA0CiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAyMAogICAgZHVwCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGl0b2IKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGJ5dGVjIDE5IC8vIDB4MDAyYQogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQwNgogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDA4LTE0MDkKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGdyb3VwLm1lbWJlckNvdW50ID0gZ3JvdXAubWVtYmVyQ291bnQgKyBVaW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQwOQogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCArIFVpbnQ2NCgxKQogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDA4LTE0MTAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGdyb3VwLm1lbWJlckNvdW50ID0gZ3JvdXAubWVtYmVyQ291bnQgKyBVaW50NjQoMSkKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxMgogICAgLy8gZW1pdDxNZW1iZXJBZGRlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogY2hhbmdlLm1lbWJlckFkZHIsIGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSB9KQogICAgY29uY2F0CiAgICBieXRlYyAxNCAvLyBtZXRob2QgIk1lbWJlckFkZGVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyOTUKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfTUVNQkVSKSB7CiAgICBmcmFtZV9kaWcgNzAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MTYKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDE3CiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdub3QgYSBtZW1iZXInKQogICAgc3dhcAogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxNwogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnbm90IGEgbWVtYmVyJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxOQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MTktMTQyMAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDIwCiAgICAvLyBhc3NlcnQoZ3JvdXAubWVtYmVyQ291bnQgLSBVaW50NjQoMSkgPj0gZ3JvdXAudGhyZXNob2xkLCAnd291bGQgZHJvcCBiZWxvdyB0aHJlc2hvbGQnKQogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDE5LTE0MjAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjAKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBidG9pCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyB3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjIKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZGVsZXRlKCkKICAgIHVuY292ZXIgMwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyMwogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDI3CiAgICAvLyBncm91cC5tZW1iZXJzaGlwRXBvY2ggPSBncm91cC5tZW1iZXJzaGlwRXBvY2ggKyBVaW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjgKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDMwCiAgICAvLyBlbWl0PE1lbWJlclJlbW92ZWQ+KHsgZ3JvdXBJZDogZ2lkLCBtZW1iZXI6IGNoYW5nZS5tZW1iZXJBZGRyIH0pCiAgICBwdXNoYnl0ZXMgMHgyYjE0YzJjMSAvLyBtZXRob2QgIk1lbWJlclJlbW92ZWQodWludDY0LGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjk3CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQUREX1JFS0VZRURfQUREUikgewogICAgZnJhbWVfZGlnIDcwCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjk5CiAgICAvLyBhc3NlcnQoIXRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZXhpc3RzLCAnYWxyZWFkeSByZWdpc3RlcmVkJykKICAgIGZyYW1lX2RpZyAxNwogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgOSAvLyAiciIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjk5CiAgICAvLyBhc3NlcnQoIXRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZXhpc3RzLCAnYWxyZWFkeSByZWdpc3RlcmVkJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSByZWdpc3RlcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwMAogICAgLy8gY29uc3QgZW50cnk6IFJla2V5ZWRBZGRyZXNzID0geyBsYWJlbDogY2hhbmdlLm1lbWJlckxhYmVsLCBhZGRlZFJvdW5kOiBHbG9iYWwucm91bmQgfQogICAgZnJhbWVfZGlnIDIwCiAgICBkdXAKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGJ5dGVjIDI3IC8vIDB4MDAwYQogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwMQogICAgLy8gdGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS52YWx1ZSA9IGNsb25lKGVudHJ5KQogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwMgogICAgLy8gZW1pdDxSZWtleWVkQWRkcmVzc0FkZGVkPih7IGFkZHI6IGNoYW5nZS5tZW1iZXJBZGRyLCBsYWJlbDogY2hhbmdlLm1lbWJlckxhYmVsIH0pCiAgICBzd2FwCiAgICBieXRlYyAxNiAvLyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAyOCAvLyBtZXRob2QgIlJla2V5ZWRBZGRyZXNzQWRkZWQoYWRkcmVzcyxzdHJpbmcpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzAzCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fUkVNT1ZFX1JFS0VZRURfQUREUikgewogICAgZnJhbWVfZGlnIDcwCiAgICBwdXNoaW50IDkgLy8gOQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzA0CiAgICAvLyBhc3NlcnQodGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS5leGlzdHMsICdub3QgcmVnaXN0ZXJlZCcpCiAgICBmcmFtZV9kaWcgMTcKICAgIHB1c2hpbnRzIDE4IDMyIC8vIDE4LCAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIHJla2V5ZWRBZGRyZXNzZXMgPSBCb3hNYXA8QWNjb3VudCwgUmVrZXllZEFkZHJlc3M+KHsga2V5UHJlZml4OiAncicgfSkKICAgIGJ5dGVjIDkgLy8gInIiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwNAogICAgLy8gYXNzZXJ0KHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZXhpc3RzLCAnbm90IHJlZ2lzdGVyZWQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMDUKICAgIC8vIHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMDYKICAgIC8vIGVtaXQ8UmVrZXllZEFkZHJlc3NSZW1vdmVkPih7IGFkZHI6IGNoYW5nZS5tZW1iZXJBZGRyIH0pCiAgICBwdXNoYnl0ZXMgMHhkYjRjYTUyYSAvLyBtZXRob2QgIlJla2V5ZWRBZGRyZXNzUmVtb3ZlZChhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwNwogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0NIQU5HRV9USFJFU0hPTEQpIHsKICAgIGZyYW1lX2RpZyA3MAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwOAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMDkKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkIDw9IGdyb3VwLm1lbWJlckNvdW50LCAndGhyZXNob2xkIGV4Y2VlZHMgbWVtYmVycycpCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwOC0xMzA5CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkIDw9IGdyb3VwLm1lbWJlckNvdW50LCAndGhyZXNob2xkIGV4Y2VlZHMgbWVtYmVycycpCiAgICBkaWcgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwOQogICAgLy8gYXNzZXJ0KGNoYW5nZS50aHJlc2hvbGQgPD0gZ3JvdXAubWVtYmVyQ291bnQsICd0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzJykKICAgIGJ0b2kKICAgIDw9CiAgICBhc3NlcnQgLy8gdGhyZXNob2xkIGV4Y2VlZHMgbWVtYmVycwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTAtMTMxMQogICAgLy8gZ3JvdXAudGhyZXNob2xkID0gY2hhbmdlLnRocmVzaG9sZAogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBpbnRjXzMgLy8gMgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzEyCiAgICAvLyBlbWl0PEdyb3VwVXBkYXRlZD4oeyBncm91cElkOiBjaGFuZ2UudGFyZ2V0R3JvdXBJZCB9KQogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJHcm91cFVwZGF0ZWQodWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxMwogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QT0xJQ1kpIHsKICAgIGZyYW1lX2RpZyA3MAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxNAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTQKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTQtMTMxNQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICAvLyBjb25zdCBhc3NldENoYW5nZWQgPSBncm91cC5saW1pdEFzc2V0SWQgIT09IGNoYW5nZS5saW1pdEFzc2V0SWQKICAgIHN3YXAKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTUKICAgIC8vIGNvbnN0IGFzc2V0Q2hhbmdlZCA9IGdyb3VwLmxpbWl0QXNzZXRJZCAhPT0gY2hhbmdlLmxpbWl0QXNzZXRJZAogICAgYnRvaQogICAgZGlnIDIKICAgIHB1c2hpbnQgODQgLy8gODQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBidG9pCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxNgogICAgLy8gZ3JvdXAuYWxsb3dlZEFjdGlvbnMgPSBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMKICAgIGRpZyAzCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzE3CiAgICAvLyBncm91cC5saW1pdEFzc2V0SWQgPSBjaGFuZ2UubGltaXRBc3NldElkCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UyIDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxOAogICAgLy8gZ3JvdXAuZGFpbHlMaW1pdCA9IGNoYW5nZS5kYWlseUxpbWl0CiAgICBkaWcgMgogICAgcHVzaGludCA5MiAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA0MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTkKICAgIC8vIGdyb3VwLm1vbnRobHlMaW1pdCA9IGNoYW5nZS5tb250aGx5TGltaXQKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgcmVwbGFjZTIgNjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzIwCiAgICAvLyBncm91cC5jb29sZG93blJvdW5kcyA9IGNoYW5nZS5jb29sZG93blJvdW5kcwogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDEwOCAvLyAxMDgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgcmVwbGFjZTIgOTAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzIxCiAgICAvLyBpZiAoYXNzZXRDaGFuZ2VkKSB7CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjIKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzIzCiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzI0CiAgICAvLyBncm91cC5kYWlseVBlcmlvZFN0YXJ0ID0gbm93CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA1OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjUKICAgIC8vIGdyb3VwLm1vbnRobHlVc2FnZSA9IFVpbnQ2NCgwKQogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMiA3NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjYKICAgIC8vIGdyb3VwLm1vbnRobHlQZXJpb2RTdGFydCA9IG5vdwogICAgc3dhcAogICAgcmVwbGFjZTIgODIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjgKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZnJhbWVfZGlnIDE5CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjkKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyAxNSAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgZnJhbWVfZGlnIDIyCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzAKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfUFJJVklMRUdFUykgewogICAgZnJhbWVfZGlnIDcwCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzMxCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxNwogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzMQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzQKICAgIC8vIGFzc2VydCghdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGdyb3VwKSwgJ211c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluJykKICAgIGZyYW1lX2RpZyAyMAogICAgc3dhcAogICAgY2FsbHN1YiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDI2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMjAKICAgICEKICAgIGFzc2VydCAvLyBtdXN0IGtlZXAgYXQgbGVhc3Qgb25lIGFjdGl2ZSBncm91cCBhZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzUKICAgIC8vIGNvbnN0IGhhZEdyb3VwUHJpdiA9IChncm91cC5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgZnJhbWVfYnVyeSA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzYKICAgIC8vIGNvbnN0IHdpbGxIYXZlR3JvdXBQcml2ID0gKGNoYW5nZS5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBkaWcgMQogICAgZXh0cmFjdCA2OCA4CiAgICBmcmFtZV9idXJ5IDEKICAgIHN3YXAKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgZnJhbWVfYnVyeSA2MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzcKICAgIC8vIGlmIChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSAmJiBoYWRHcm91cFByaXYgJiYgIXdpbGxIYXZlR3JvdXBQcml2KSB7CiAgICBwdXNoaW50IDExNCAvLyAxMTQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzMKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMzkKICAgIGZyYW1lX2RpZyA2MAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAzOQogICAgZnJhbWVfZGlnIDYzCiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAzOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzgKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzOAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzOAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQyCiAgICAvLyBncm91cC5hZG1pblByaXZpbGVnZXMgPSBjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzCiAgICBmcmFtZV9kaWcgMjYKICAgIGZyYW1lX2RpZyAxCiAgICByZXBsYWNlMiAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDMKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZnJhbWVfZGlnIDIwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM0MwogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM0NAogICAgLy8gZW1pdDxHcm91cFVwZGF0ZWQ+KHsgZ3JvdXBJZDogY2hhbmdlLnRhcmdldEdyb3VwSWQgfSkKICAgIGJ5dGVjIDE1IC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzkKICAgIC8vIH0gZWxzZSBpZiAoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCkgJiYgIWhhZEdyb3VwUHJpdiAmJiB3aWxsSGF2ZUdyb3VwUHJpdikgewogICAgZnJhbWVfZGlnIDczCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NAogICAgZnJhbWVfZGlnIDYwCiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANDQKICAgIGZyYW1lX2RpZyA2MwogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQwCiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDAKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDAKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA0NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQ3CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxNwogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM0NwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDgKICAgIC8vIGFzc2VydCghdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGdyb3VwKSwgJ211c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluJykKICAgIGZyYW1lX2RpZyAyMAogICAgc3dhcAogICAgY2FsbHN1YiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDI3CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMjAKICAgICEKICAgIGFzc2VydCAvLyBtdXN0IGtlZXAgYXQgbGVhc3Qgb25lIGFjdGl2ZSBncm91cCBhZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDkKICAgIC8vIGNvbnN0IGhhc0dyb3VwUHJpdiA9IChncm91cC5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1MAogICAgLy8gY29uc3Qgd2FzQWN0aXZlID0gZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCkKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzUxCiAgICAvLyBjb25zdCB3aWxsQmVBY3RpdmUgPSBjaGFuZ2UuYWN0aXZlRmxhZyAhPT0gVWludDY0KDApCiAgICBzd2FwCiAgICBwdXNoaW50IDExNiAvLyAxMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzUKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgZnJhbWVfYnVyeSA3NwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTIKICAgIC8vIGlmIChoYXNHcm91cFByaXYgJiYgd2FzQWN0aXZlICYmICF3aWxsQmVBY3RpdmUpIHsKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANTEKICAgIGZyYW1lX2RpZyA3NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA1MQogICAgZnJhbWVfZGlnIDc1CiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA1MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTMKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1MwogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1MwogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU3CiAgICAvLyBncm91cC5hY3RpdmUgPSB3aWxsQmVBY3RpdmUgPyBVaW50NjQoMSkgOiBVaW50NjQoMCkKICAgIGZyYW1lX2RpZyA3NwogICAgaXRvYgogICAgZnJhbWVfZGlnIDI3CiAgICBzd2FwCiAgICByZXBsYWNlMiAxMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU4CiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGZyYW1lX2RpZyAyMAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTgKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTkKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyAxNSAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA1MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU0CiAgICAvLyB9IGVsc2UgaWYgKGhhc0dyb3VwUHJpdiAmJiAhd2FzQWN0aXZlICYmIHdpbGxCZUFjdGl2ZSkgewogICAgZnJhbWVfZGlnIDY0CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1NgogICAgZnJhbWVfZGlnIDc0CiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANTYKICAgIGZyYW1lX2RpZyA3NQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU1CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTUKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTUKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1NgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAMjoKICAgIGZyYW1lX2RpZyA4NAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fbmV3UHJvcG9zYWwoZ3JvdXBJZDogdWludDY0LCBwYXlsb2FkVHlwZTogdWludDY0LCBleHBpcnlSb3VuZDogdWludDY0KSAtPiB1aW50NjQ6Cl9uZXdQcm9wb3NhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzEKICAgIC8vIHByaXZhdGUgX25ld1Byb3Bvc2FsKGdyb3VwSWQ6IHVpbnQ2NCwgcGF5bG9hZFR5cGU6IHVpbnQ2NCwgZXhwaXJ5Um91bmQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzYKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDEpLCAnbm90IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA2IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzNgogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMSksICdub3QgYm9vdHN0cmFwcGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBub3QgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM3CiAgICAvLyBhc3NlcnQoZXhwaXJ5Um91bmQgPiBHbG9iYWwucm91bmQsICdleHBpcnkgbXVzdCBiZSBpbiB0aGUgZnV0dXJlJykKICAgIGZyYW1lX2RpZyAtMQogICAgZ2xvYmFsIFJvdW5kCiAgICA+CiAgICBhc3NlcnQgLy8gZXhwaXJ5IG11c3QgYmUgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzOAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM5CiAgICAvLyBjb25zdCBwaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyBuZXh0UHJvcG9zYWxJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICducGlkJyB9KQogICAgYnl0ZWMgMTIgLy8gIm5waWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM5CiAgICAvLyBjb25zdCBwaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ2CiAgICAvLyB0aHJlc2hvbGQ6IGdyb3VwLnRocmVzaG9sZCwKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ4CiAgICAvLyBwcm9wb3NlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTAKICAgIC8vIGVwb2NoQXRDcmVhdGlvbjogZ3JvdXAubWVtYmVyc2hpcEVwb2NoLAogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDEwNiAvLyAxMDYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0MwogICAgLy8gc3RhdHVzOiBTVEFUVVNfQUNUSVZFLAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDEtODUxCiAgICAvLyBjb25zdCBwcm9wb3NhbDogUHJvcG9zYWwgPSB7CiAgICAvLyAgIGdyb3VwSWQsCiAgICAvLyAgIHN0YXR1czogU1RBVFVTX0FDVElWRSwKICAgIC8vICAgcGF5bG9hZFR5cGUsCiAgICAvLyAgIGFwcHJvdmFsc0NvdW50OiBVaW50NjQoMCksCiAgICAvLyAgIHRocmVzaG9sZDogZ3JvdXAudGhyZXNob2xkLAogICAgLy8gICBleHBpcnlSb3VuZCwKICAgIC8vICAgcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIG51bVBheWxvYWRzOiBVaW50NjQoMCksCiAgICAvLyAgIGVwb2NoQXRDcmVhdGlvbjogZ3JvdXAubWVtYmVyc2hpcEVwb2NoLAogICAgLy8gfQogICAgaXRvYgogICAgZGlnIDUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQ1CiAgICAvLyBhcHByb3ZhbHNDb3VudDogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDEtODUxCiAgICAvLyBjb25zdCBwcm9wb3NhbDogUHJvcG9zYWwgPSB7CiAgICAvLyAgIGdyb3VwSWQsCiAgICAvLyAgIHN0YXR1czogU1RBVFVTX0FDVElWRSwKICAgIC8vICAgcGF5bG9hZFR5cGUsCiAgICAvLyAgIGFwcHJvdmFsc0NvdW50OiBVaW50NjQoMCksCiAgICAvLyAgIHRocmVzaG9sZDogZ3JvdXAudGhyZXNob2xkLAogICAgLy8gICBleHBpcnlSb3VuZCwKICAgIC8vICAgcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIG51bVBheWxvYWRzOiBVaW50NjQoMCksCiAgICAvLyAgIGVwb2NoQXRDcmVhdGlvbjogZ3JvdXAubWVtYmVyc2hpcEVwb2NoLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1MgogICAgLy8gdGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA1IC8vICJwIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1MgogICAgLy8gdGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTMKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUgPSBwaWQgKyBVaW50NjQoMSkKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxOQogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDEyIC8vICJucGlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1MwogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSA9IHBpZCArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTUKICAgIC8vIGVtaXQ8UHJvcG9zYWxDcmVhdGVkPih7IHByb3Bvc2FsSWQ6IHBpZCwgZ3JvdXBJZCwgcGF5bG9hZFR5cGUsIHByb3Bvc2VyOiBUeG4uc2VuZGVyIH0pCiAgICB0eG4gU2VuZGVyCiAgICBzd2FwCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4YjM1MWQ4NTcgLy8gbWV0aG9kICJQcm9wb3NhbENyZWF0ZWQodWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1OQogICAgLy8gdGhpcy5fcmVjb3JkQXBwcm92YWwocGlkLCBzdG9yZWQpCiAgICBkaWcgMQogICAgc3dhcAogICAgY2FsbHN1YiBfcmVjb3JkQXBwcm92YWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2MAogICAgLy8gcmV0dXJuIHBpZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fcmVjb3JkQXBwcm92YWwocHJvcG9zYWxJZDogdWludDY0LCBwcm9wb3NhbDogYnl0ZXMpIC0+IGJ5dGVzOgpfcmVjb3JkQXBwcm92YWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY0CiAgICAvLyBwcml2YXRlIF9yZWNvcmRBcHByb3ZhbChwcm9wb3NhbElkOiB1aW50NjQsIHByb3Bvc2FsOiBQcm9wb3NhbCk6IHZvaWQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY1CiAgICAvLyBjb25zdCByZWNvcmQ6IEFwcHJvdmFsID0geyBzaWduZXI6IFR4bi5zZW5kZXIsIHJvdW5kOiBHbG9iYWwucm91bmQgfQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjYKICAgIC8vIHRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS52YWx1ZSA9IGNsb25lKHJlY29yZCkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIGFwcHJvdmFscyA9IEJveE1hcDx7IHByb3Bvc2FsSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBBcHByb3ZhbD4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgMjEgLy8gImEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjYKICAgIC8vIHRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS52YWx1ZSA9IGNsb25lKHJlY29yZCkKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjkKICAgIC8vIHVwZGF0ZWQuYXBwcm92YWxzQ291bnQgPSB1cGRhdGVkLmFwcHJvdmFsc0NvdW50ICsgVWludDY0KDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICByZXBsYWNlMiAyNAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODcwCiAgICAvLyBpZiAodXBkYXRlZC5hcHByb3ZhbHNDb3VudCA+PSB1cGRhdGVkLnRocmVzaG9sZCkgewogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA+PQogICAgYnogX3JlY29yZEFwcHJvdmFsX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MQogICAgLy8gdXBkYXRlZC5zdGF0dXMgPSBTVEFUVVNfUkVBRFkKICAgIGludGNfMyAvLyAyCiAgICBpdG9iCiAgICByZXBsYWNlMiA4CgpfcmVjb3JkQXBwcm92YWxfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMQogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDUgLy8gInAiCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzMKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlID0gY2xvbmUodXBkYXRlZCkKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc3CiAgICAvLyBzaWduZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc4CiAgICAvLyBhcHByb3ZhbHNDb3VudDogdXBkYXRlZC5hcHByb3ZhbHNDb3VudCwKICAgIHN3YXAKICAgIGV4dHJhY3QgMjQgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3NS04NzkKICAgIC8vIGVtaXQ8UHJvcG9zYWxBcHByb3ZlZD4oewogICAgLy8gICBwcm9wb3NhbElkLAogICAgLy8gICBzaWduZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFwcHJvdmFsc0NvdW50OiB1cGRhdGVkLmFwcHJvdmFsc0NvdW50LAogICAgLy8gfSkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg5OGIzYWM5NCAvLyBtZXRob2QgIlByb3Bvc2FsQXBwcm92ZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2JlZ2luT3JOZXh0KGZpcnN0OiB1aW50NjQpIC0+IHZvaWQ6Cl9iZWdpbk9yTmV4dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5OTMKICAgIC8vIHByaXZhdGUgX2JlZ2luT3JOZXh0KGZpcnN0OiBib29sZWFuKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5OTQKICAgIC8vIGlmIChmaXJzdCkgb3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IF9iZWdpbk9yTmV4dF9lbHNlX2JvZHlAMgogICAgaXR4bl9iZWdpbgogICAgcmV0c3ViCgpfYmVnaW5Pck5leHRfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTk1CiAgICAvLyBlbHNlIG9wLklUeG5DcmVhdGUubmV4dCgpCiAgICBpdHhuX25leHQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3Jlc29sdmVTZW5kZXIoc2VuZGVyOiBieXRlcykgLT4gYnl0ZXM6Cl9yZXNvbHZlU2VuZGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk5OQogICAgLy8gcHJpdmF0ZSBfcmVzb2x2ZVNlbmRlcihzZW5kZXI6IEFjY291bnQpOiBBY2NvdW50IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDAKICAgIC8vIHJldHVybiBzZW5kZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcyA/IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIDogc2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IF9yZXNvbHZlU2VuZGVyX3Rlcm5hcnlfZmFsc2VAMgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHJldHN1YgoKX3Jlc29sdmVTZW5kZXJfdGVybmFyeV9mYWxzZUAyOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwMAogICAgLy8gcmV0dXJuIHNlbmRlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzID8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgOiBzZW5kZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3NldFNlbmRlcklmU2V0KHNlbmRlcjogYnl0ZXMpIC0+IHZvaWQ6Cl9zZXRTZW5kZXJJZlNldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDA1CiAgICAvLyBwcml2YXRlIF9zZXRTZW5kZXJJZlNldChzZW5kZXI6IEFjY291bnQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDYKICAgIC8vIGlmIChzZW5kZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgb3AuSVR4bkNyZWF0ZS5zZXRTZW5kZXIoc2VuZGVyKQogICAgZnJhbWVfZGlnIC0xCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBfc2V0U2VuZGVySWZTZXRfYWZ0ZXJfaWZfZWxzZUAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgU2VuZGVyCgpfc2V0U2VuZGVySWZTZXRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fc3RvcmVQYXlsb2FkR3JvdXAocHJvcG9zYWxJZDogdWludDY0LCBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzOgpfc3RvcmVQYXlsb2FkR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE3MQogICAgLy8gcHJpdmF0ZSBfc3RvcmVQYXlsb2FkR3JvdXAocHJvcG9zYWxJZDogdWludDY0LCBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwgcGF5bG9hZDogU2FmZVR4bkdyb3VwKTogdm9pZCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTcyCiAgICAvLyBpZiAocGF5bG9hZC5sZW5ndGggPiBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ6IF9zdG9yZVBheWxvYWRHcm91cF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTczCiAgICAvLyB0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlID0gY2xvbmUocGF5bG9hZCkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGludCA3IC8vIDcKICAgICoKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTEgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNzMKICAgIC8vIHRoaXMudHJhbnNhY3Rpb25Hcm91cHMocHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHBheWxvYWRJbmRleCkudmFsdWUgPSBjbG9uZShwYXlsb2FkKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAoKX3N0b3JlUGF5bG9hZEdyb3VwX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYWNjb3VudFNwZW5kKGdyb3VwSW46IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gYnl0ZXMsIGJ5dGVzOgpfYWNjb3VudFNwZW5kOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExODQKICAgIC8vIHByaXZhdGUgX2FjY291bnRTcGVuZChncm91cEluOiBTaWduZXJHcm91cCwgYW1vdW50OiB1aW50NjQpOiBTaWduZXJHcm91cCB7CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE4NwogICAgLy8gaWYgKGFtb3VudCA9PT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExODgKICAgIC8vIHJldHVybiBncm91cAogICAgZnJhbWVfZGlnIC0yCiAgICBkdXAKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTEKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTMKICAgIC8vIGlmIChncm91cC5kYWlseUxpbWl0ICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiBfYWNjb3VudFNwZW5kX2lmX2JvZHlAMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCl9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMDIKICAgIC8vIGlmIChncm91cC5tb250aGx5TGltaXQgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjAzCiAgICAvLyBpZiAobm93IC0gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID49IE1PTlRIX1NFQ09ORFMpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgMjU5MjAwMCAvLyAyNTkyMDAwCiAgICA+PQogICAgYnogX2FjY291bnRTcGVuZF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjA0CiAgICAvLyBncm91cC5tb250aGx5VXNhZ2UgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmVwbGFjZTIgNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjA1CiAgICAvLyBncm91cC5tb250aGx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MgogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjA3CiAgICAvLyBhc3NlcnQoZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50IDw9IGdyb3VwLm1vbnRobHlMaW1pdCwgJ21vbnRobHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA3NCAvLyA3NAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZGlnIDEKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBtb250aGx5IGxpbWl0IGV4Y2VlZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwOAogICAgLy8gZ3JvdXAubW9udGhseVVzYWdlID0gZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50CiAgICBpdG9iCiAgICByZXBsYWNlMiA3NAogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxMQogICAgLy8gcmV0dXJuIGdyb3VwCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCgpfYWNjb3VudFNwZW5kX2lmX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk0CiAgICAvLyBpZiAobm93IC0gZ3JvdXAuZGFpbHlQZXJpb2RTdGFydCA+PSBEQVlfU0VDT05EUykgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgID49CiAgICBibnogX2FjY291bnRTcGVuZF9pZl9ib2R5QDQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk4CiAgICAvLyBhc3NlcnQoZ3JvdXAuZGFpbHlVc2FnZSArIGFtb3VudCA8PSBncm91cC5kYWlseUxpbWl0LCAnZGFpbHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBkYWlseSBsaW1pdCBleGNlZWRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTkKICAgIC8vIGdyb3VwLmRhaWx5VXNhZ2UgPSBncm91cC5kYWlseVVzYWdlICsgYW1vdW50CiAgICBpdG9iCiAgICByZXBsYWNlMiA1MAogICAgZnJhbWVfYnVyeSAwCiAgICBiIF9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA2CgpfYWNjb3VudFNwZW5kX2lmX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk1CiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTYKICAgIC8vIGdyb3VwLmRhaWx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICByZXBsYWNlMiA1OAogICAgZnJhbWVfYnVyeSAwCiAgICBiIF9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA1CgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlKGNoYW5nZVR5cGU6IHVpbnQ2NCwgZ3JvdXA6IGJ5dGVzKSAtPiBieXRlczoKX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjE4CiAgICAvLyBwcml2YXRlIF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlVHlwZTogdWludDY0LCBncm91cDogU2lnbmVyR3JvdXApOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMTkKICAgIC8vIGlmIChjaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2VfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjIwCiAgICAvLyBhc3NlcnQoKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfUE9MSUNZKSAhPT0gVWludDY0KDApLCAncG9saWN5IGFkbWluIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAyCiAgICAmCiAgICBhc3NlcnQgLy8gcG9saWN5IGFkbWluIHJlcXVpcmVkCgpfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgpfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMjIKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGFkbWluIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gZ3JvdXAgYWRtaW4gcmVxdWlyZWQKICAgIGIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZTogYnl0ZXMsIGdyb3VwOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6Cl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzIKICAgIC8vIHByaXZhdGUgX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlOiBBZG1pbkNoYW5nZSwgZ3JvdXA6IFNpZ25lckdyb3VwKTogYm9vbGVhbiB7CiAgICBwcm90byAyIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjMzCiAgICAvLyBjb25zdCBoYXNHcm91cFByaXYgPSAoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjM0CiAgICAvLyBpZiAoIWhhc0dyb3VwUHJpdiB8fCBncm91cC5hY3RpdmUgPT09IFVpbnQ2NCgwKSkgewogICAgYnogX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5faWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDMKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2lmX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjM1CiAgICAvLyByZXR1cm4gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjM3CiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfUFJJVklMRUdFUykgewogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzgKICAgIC8vIGNvbnN0IHdpbGxIYXZlR3JvdXBQcml2ID0gKGNoYW5nZS5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzkKICAgIC8vIHJldHVybiAhd2lsbEhhdmVHcm91cFByaXYgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDcKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjM5CiAgICAvLyByZXR1cm4gIXdpbGxIYXZlR3JvdXBQcml2ICYmIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPD0gVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIDw9CiAgICBieiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIzOQogICAgLy8gcmV0dXJuICF3aWxsSGF2ZUdyb3VwUHJpdiAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDgKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjQxCiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfQUNUSVZFKSB7CiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBieiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI0MgogICAgLy8gY29uc3Qgd2lsbEJlQWN0aXZlID0gY2hhbmdlLmFjdGl2ZUZsYWcgIT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDExNiAvLyAxMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI0MwogICAgLy8gcmV0dXJuICF3aWxsQmVBY3RpdmUgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDEzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI0MwogICAgLy8gcmV0dXJuICF3aWxsQmVBY3RpdmUgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPD0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VAMTMKICAgIGludGNfMSAvLyAxCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNDMKICAgIC8vIHJldHVybiAhd2lsbEJlQWN0aXZlICYmIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPD0gVWludDY0KDEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VAMTM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDE0Cgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNDUKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAGAAEIAoCt4gSoASYdAWcEYXBnYwAEFR98dQFtAXAEYm9vdARuZ2lkBGdjbnQBcgdjcmVhdG9yA3R4ZwRucGlkBnBhdXNlZATQcFB6BHxgWeYCACICABIEDNc1fAIAKgJkcAFhAQADBoEBBG5hbWUDdmVyAgB6AgAKBN7dA6gxGRREMRhBAJuCFQSRS6YzBBoLMDoE1VFWggQLJDynBKw6mjIERCRF9wTc7kQnBB92jHkE+3CI6AR/UfwoBNyt/5YEtreurQTRzCu2BKuhJyoE+ctKNwRlqqDtBMvXMkIEUDQWFwT0+lRMBLKFcsoE0337IDYaAI4VALUBrQPFBCkERAUkBiUH5gh0CJgJFQnLCkAKawqXCtILCgtJC4gLpwvYAIAEEVdW2zYaAI4BADwAigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScXsh4nF7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFJIlklCEsBFRJEVwIAJxhLAWcnCjEAZycGImcnByNnJwwjZycIImcnDSJnJxmAF0JJQVRFQy1BTEdPLVNBRkUtdjEuNi4wZykiZzEASwEVFlcGAk8CUCcQTwJQTFCABOKci0dMULAjQzYaAUkiWSUISwEVEkRXAgAxACInCmVEEkQiJwZlRBREMgciJwdlREsCFRZXBgJPA1AjFiIWTwQWgDoAegAAAAAAAAABAAAAAAAAAAEAAAAAAAAABwAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwFQSwJQSwJQTFBLAVBLAVBMUEsBUEsCUEsDFihLAVBJvEhPAr+ACgAAAAAAAAABACoxAFCACQAHY3JlYXRvclBLATEAUCcETFBJvEhMv08DIwgnB0xnIicIZUQjCCcITGcnBiNnKSNnSScRUEsCUE8DUCcSTFCwMQBQTFAnDkxQsCNDIkcCKkcENhoBRwIVSwEiWUmBOhJETwJMSwJSSU4CIlmBPAgSRDYaAkkiWUlOAiULTEkVTFcCACJJSwUMQQAzRwIlC0sDSU8CWUlLB0lOBBJESwEVUkkVSwGBKFlJgSoSRExSIlmBLAgIRQUjCEUBQv/GSwMlCEsDEkQ2GgNJFSQSRBdJRQ0jDUEABksLIoj90TEAIicKZUQSRCInBmVEFERLBERLBiVbSUUKQQFmSwhLBQ5BAV4jREsGSYESW0mBPw5ESwGBCltJRQtJgQcOREsCgTJbSSEEDkQyByInB2VMSU4HRRJESwtXAgBLBVcaCEsGVyIITwdXKghLAxUWVwYCTwRQSU4HRRhLERZJRRgnGkxQSw4WUE8GFlBPBxZQTwNQTwJQIhZMSwFQTwMWTEsBUE8DUEsCUExQTwIWUEsBUExQIxZQTFBMFklFDyhMUEm8SEy/IkUKSwlLBQxBAHlLCUklC0sDSU4DTFlMIwhJRQ1LB0sBCUsDFU8CJQtLBExZTwJNUklXACBJMgMTREsOSwFQJwRLAVBJvUUBFERLA4EoWUsEFUsFTgJSVwIATwRXIAhLARUWVwYCTwJQSwEnE1BPBVBMUEsCvEhPAky/UCcOTFCwQv9/SwojCCcHTGciJwhlRCMIJwhMZ0sHIxpBAAkiKWVEIwgpTGdLDEknEVBLD1BLEFAnEkxQsCtMULAjQyJC/p82GgFJFYEgEkQ2GgJJIlklCEsBFRJEVwIAMQAiJwplRBJEIicGZUQUREsBMgMTRCcJSwJQSb1FARREMgZLAhUWVwYCTwNQTBYnG0xQSwFQSwK8SE8CTL9MJxBQTFAnHExQsCNDMQAiJwplRBJEIicGZUQURCIpZUREJwYjZyNDIipHAzYaAUkVJBJEFzYaAkcCIllJTgIlC0xJFUxXAgAiSUsFDEEAMkcCJQtLA0lPAllJSwdJTgQSREsBFVJJFUsBJFlJgQoSRExSIlmBDAgIRQUjCEUBQv/HSwMlCEsDEkQ2GgNJFSQSRBdFCTYaBEkVIxJEIlNFCjYaBUkVJBJEF0lFDCMNQQAGSwoiiPs7SwRJRIEQDkQiJw1lRBRESwZJiAcZSRYoTFCBciS6F0QjSwqIFMNJRQlJI0sIiBXCSBZJRQ0nBUxQIxaBUEy7SwlBAAVLB4gG/ytLDFCwI0MiSSpJNhoBSRUkEkQXNhoCRwIVJBJEFzYaA0cCIllJTgIlC0xJFUxXAgAiSUsFDEEAMkcCJQtLA0lPAllJSwdJTgQSREsBFVJJFUsBJFlJgQoSRExSIlmBDAgIRQUjCEUBQv/HSwMlCEsDEkQ2GgRJFSQSRBdJRQwjDUEABksKIoj6aEsGJQ9BAHNLBoEGDkEAayNESwRESwgWJwVMUElFDr5MSU4CRQ5ESYEQWyMSRCRbSUULIxJAAAdLCSUSQQA4I0RLC0kiW4gGEzEASwFXMCASREmBGFsjEkRLCUsISU4CSwmIFLtITIFQWw1BAAdLDIFQSwm7I0MiQv/FIkL/kio2GgFJFSQSRBc2GgJHAhVLAYEQWUmBfBJESwJMSwJSIlmBfghLAoE6WUlLAhJETwNMSwNSIlklCAgSRDYaA0kVJBJEFzYaBEkVJBJEF0kjDUEABUkiiPmRSwNJiAV+FihMUEm+REyBciS6F0RLAyJbSUUHSU8CiBTxSCMSQQBBSwJJgTxbRElXEiAyAxNESYFMW4E/DkRJgURbgQcORIFsWyEEDkRLA4EFSwOIEukWJxRLAVBJvEhLBL8rTFCwI0NLBCUSQQAaSwJJVwgIKExQvUUBRElXEiAyAxNERQNC/8RLBIEDEkEAEEsCSVcICChMUL1FAURC/+NLBIEEEkEAFUsCSVcICChMUL1FAURJgTxbREL/xksEgQUSQQAgSwJJVwgIKExQvUUBREmBTFuBPw5ESYFsWyEEDkRC/55LBIEGEkEAI0sCSVcICChMUEm9RQFESwGBRFuBBw5EvkiIFClITBREQv9zSwSBBxJBABpLAklXCAgoTFBJvUUBRL5IiBQHSEwUREL/UUsEJBJBABhLAlcSIEkyAxNEJwlMUL1FARRESwJC/zJLBIEJEkRLAlcSICcJTFC9RQFEQv/lIkkqNhoBSRUkEkQXNhoCSRUkEkQXSSMNQQAFSSKI+AlLARZJRQYnBUxQvkxJTgJFBkQkW0lFBCMSQAAHSwIlEkEARyNEMgZLBElOAoEoWw5EMQBLAVcACElPAlAnBExQvUUBREsGMQBQJxVMUL1FARREKExQgWokuhdLAYFYWxJESwJMiBHPSCNDIkL/tjYaAUkVJBJEFzYaAkkVJBJEF0kjDUEABUkiiPd+SwGIA4YjQyJHAio2GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj3VksBFklFBicFTFBJRQe+TElOAkUGRCRbSUUEIxJAAAdLAiUSQQAyI0QxAEsESU4CVzAgEkxXAAgxAFAnBExQvUUBEUSBBBZLBiRPAruABK4qvAZLBVCwI0MiQv/LIkcEKkk2GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj22EsBFklFBycFTFBJRQq+TElOAkUHRCRbSUUEgQMSQAAISwKBBBJBAGgjRDIGSwVJTgKBKFsNREkiW4gCj4EQWyMSQQA3I0UESwSBUFtLBA9BACNLAYEHC0sECBYnC0xQSUUJvUUBQQAESwe8SEsDIwhFBEL/0ksIvEgjQycUSwZQSUUIvUUBQf/sSwa8SEL/5SJC/5U2GgFJFSQSRBdJIw1BAAVJIoj2MCInGGVEIicIZUQiJwdlRCInDGVEIicNZUQiJxllREsFFRZXBgJPBlBJFYEkCE8GFoACACRMUE8GFlBPBRZQTwQWUEsDFRZXBgJPBFBPAhZXBgJPAkxQTwJQTFArTFCwI0M2GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj1sksBFihMUL5EK0xQsCNDNhoBSRUkEkQXNhoCSRUkEkQXSSMNQQAFSSKI9YdLARYnBUxQvkQrTFCwI0M2GgFJFSQSRBc2GgJJFSQSRBc2GgNJFSQSRBdJIw1BAAVJIoj1UksCgQcLSwIIFicLTFC+RCtMULAjQzYaAUkVJBJEFzYaAkkVgSASRDYaA0kVJBJEF0kjDUEABUkiiPUXSwIWSwJQJwRMUL5EK0xQsCNDNhoBSRUkEkQXNhoCSRWBIBJENhoDSRUkEkQXSSMNQQAFSSKI9N9LAhZLAlAnBExQvUUBJxYiTwJUK0xQsCNDNhoBSRUkEkQXNhoCSRWBIBJENhoDSRUkEkQXSSMNQQAFSSKI9KBLAhZLAlAnFUxQvUUBJxYiTwJUK0xQsCNDNhoBSRUkEkQXSSMNQQAFSSKI9HMiKWVEFitMULAjQzYaAUkVgSASRDYaAkkVJBJEF0kjDUEABUkiiPRLJwlLAlC9RQEnFiJPAlQrTFCwI0M2GgFJFYEgEkQ2GgJJFSQSRBdJIw1BAAVJIoj0GicJSwJQvkQrTFCwI0OKAQCL/xYoSwFQvUUBRDEAUCcETFC9RQFEiYoBACJHJipHJiInDWVEFESL/xZJJwVMUEm+TElPAkRJJFslEkQyBksBgShbDkRJVwAIKExQSU4CSb5MTgNESYFyJLoXREyBIFtJTwIlJLoXSU4CD0ENRYtTi1BJgRhbTwIPRItRgWokuhdLAYFYWxJEgRBbIxJBCLWLUYFaJLoXSYxEQQAWi1GBYiS6F0mMRUEACTIGi0WLRAgPRItQgVBbjDgjjDmLUkmMF4wYizmLOA5BA2qL/4EHC4s5CBYnC0xQSYwQvUUBQAARixeMGYs5IwiMOYsZjBdC/9GLEL5MjBxEIowxixeMGYsQIiW6F4sxDUH/2SWLMQslCIsQSU8CJboXJQgkuhdJjEMjEkEAkYscSVcCAEwiWYsxSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUkmMA4sYgRpbIxpESVciIDIDE0SBSltJjEdBAAmLA1dSIDIDE0QijC6LUoEiW0AAEItHQQAiiwNXAiCIDQtgjC6LUosuiA1CSIxSixiMGYsxIwiMMUL/UosDgUJbjC5C/9+LQyUSQQCoixxJVwIATCJZizFJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwJixiBGlslGkRJVyogMgMTRIFSW0mMR0EACYsJV1ogMgMTRItSgSJbSYxMQQBEiwmBIluLTBJBADkjIowvQQAXi0dBACOLCUlXAiCIDGBMgSJbcABIjC+LUosviAyRSIxSixiMGUL/TIsJgUpbjC9C/+UiQv/Ei0OBAxJBAPaLHElXAgBMIlmLMUklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJVwIAixiBGluBBBpESwElW0RMgQpbSYEFDkSBBBNESYEQWUsBgRJZSwJPAksCUkmMDSJZSU4DjDdLAYEUWUsCTwJLAlIiWUsCgRZZSwNPA0sCUiJZSwOBGFlPBE8DTwJSIllPA4EQDkRLAoEEDkRLASQOREkkDkROAggIJA5EIoxBIowyizKLNwxJjDtBACiLDVcCAIs7RIsySU4CJQtLAUxZSlklCFhXAgAVi0EIjEEjCIwyQv/Ni0GBgBAORIsYjBlC/kCLQ4EEEkEAC4sYgRpbJBpEQv4ti0OBBRJBAGWLHElXAgBMIlmLMUklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJXAgCLGIEaW4EQGkRJgSZZSwEhBVlSVwIAFUmMPUEACIs9gSASQQAJI0SLGIwZQv3EIkL/9ItDgQYSRIscSVcCAEwiWYsxSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUosYSYEaW4EgGkSBElsjGkRXIiAyAxNEQv+lMgYWi1JMXGKLUUm8SEy/IoxCI4w6izqLOA5BBN2L/4EHC4s6CBYnC0xQSYwSvUUBQQS+ixK+TIwdRCKMM4sSIiW6F4szDUEEqItCFIwwJYszCyUIixJJTwIluhclCCS6F0mMSCMSQQCMix1JVwIATCJZizNJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwESVcCAIweizCICbcjshAisgFJVwIgiAnHSVciILIHSYFCW7IIgUpbQQAHiwRXUiCyCYseSYFwWUsBFVJXAgBJjCQqE0EABIsksgWLQiMIjEKLMyMIjDNC/0iLSCUSQQCHix1JVwIATCJZizNJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwFSVcCAIweizCICSSBBLIQIrIBSVcCIIgJM0mBIluyEUlXKiCyFEmBSluyEoFSW0EAB4sFV1ogshWLHkmBeFlLARVSVwIASYwlKhNB/2qLJbIFQv9ji0iBAxJBAUCLHUlXAgBMIlmLM0klC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJVwIASU4CjB6LMIgIlYEGshAisgFJJVuyGIEKW7IZSYEYWUlOAownSRVMTgJSVwIASYwhKhNBAASLIbIFIowxix5JgRBZSwGBEllJjChSSYwGIlmLMQ1JjD5BACSLBlcCAIs+RIsxSU4CJQtLAUxZSlklCFhXAgCyGiMIjDFC/78ijDSLHkmBFFlJjCmLKExSSYwHIlmLNA1BABmLB1cCAIs0SU4CgSALgSBYshwjCIw0Qv/PIow1ix5JgRZZSYwqiydSSYwIIlmLNQ1BABaLCFcCAIs1SU4CJAtbsjAjCIw1Qv/TIow2ix6LKYsqUkmMCiJZizYNQf4xiwpXAgCLNklOAiQLW7IyIwiMNkL/2ItIgQQSQQCPix1JVwIATCJZizNJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwLSVcCAIweizCIB00lshAisgElW0H9yoseSSRZSwGBCllLAk8CSwJSVwIAsgpLAYEMWUsCTwJLAlJXAgCyC0sBFVJXAgCyP4sLSYEQW7IMSYEYW7INgSBbsg5C/YSLSIEFEkEBD4sdSVcCAEwiWYszSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUkmMDElXAgCMHoswiAa2gQOyECKyASVbSYxDQAC7iwxJgQpbsiJJgRJbsiOBGlsiE7Ikix5JgSBZSwGBIllJjCtSVwIASYwjKhNBAASLI7Ilix5JgSRZSYwsiytMUlcCAEmMJSoTQQAEiyWyJoseSYEmWUmMLYssTFJXAgBJjCYqE0EABIsmsieLHkkhBVmLLUxSVwIASYwfFYEgEkEABIsfsiiLDElXKiCyKUlXSiCyKklXaiCyK1eKILIsix5JIQVZSwEVUlcCAEmMICoTQfx7iyCyBUL8dItDsiFC/8SLSIEGEkH8ZYsdSVcCAEwiWYszSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUklXAgCLMIgFpCOyECKyAUsBVwIgSYgFsogFnrIHIrIITFciILIgSYFAWUsBFVJXAgBJjCIqE0H7/IsisgVC+/WLOiMIjDpC+xuzgQMWi08kTwK7gAQ1xn79i05QsIknFItOUEmMEUm+TIwURCIkuhdJjEZJi1KIBitIIxJBATgyByInB2VEixFJgTwkuhdJIw5EixRJgRBZSwGBOllLAk8CSwJSVwIASwSBRCS6F0sFgUwkuhdLBoFUJLoXSweBXCS6F0sIgWQkuhdLCYFsJLoXSwYVFlcGAk8HUElOCIwATwkWSYwOJxpMUCMWTEsBUEsHFlBPBhZQTwUWUE8EFlAiFkxLAVBPCxZMSwFQTwUWUEsCUExQTwMWUEsBUExQTFBPA1BLBRZJjBUoSwFQSbxITwK/SwSBMiS6F0sEFU8FTwVPAlJXAgBPBIMCEiC6TwIWSU4CjA9LAhUWVwYCTwNQTwInE1BLAlBMUE4CUEmMAicETFBJvEhMv0wjCCcHTGciJwhlRCMIJwhMZyMaQQAJIillRCMIKUxnixUnEVCLDlCLAFAnEkxQsIsCiw9QJw5MULBC/pOLRiUSQQBrixFJJEm6F0sBgwISILpMFklLAlAnBEsBUEm9RQEURE8EgTIkuheLFEmBOllLARVSVwIATBZLARUWVwYCTwJQSwEnE1BPBlBMUEsCvEhPAky/KE8DUEmBCiS6FyMIFoEKTLtQJw5MULBC/iGLRoEDEkEAWIsRSSRJuhdMgwISILpMFklPAlAnBEsBUEm9RQFEKE8DUEm+REsBgQokuhcjCUsCJSS6F0sBDkRPA7xIFlwKSYFqWyMIFlxqSwG8SL+ABCsUwsFMULBC/cGLRiQSQQBKixGDAhIguicJSwFQSb1FARREixRJgTpZSwEVUlcCADIGSwEVFlcGAk8CUEwWJxtMUEsBUEsCvEhPAky/TCcQUExQJxxMULBC/XCLRoEJEkEAH4sRgwISILonCUsBUEm9RQFEvEiABNtMpSpMULBC/UmLRoEEEkEAKIsRSSRJuhcWKEsBUE8CgTwkukkXSwKBCiS6Fw5EJUy7Jw9MULBC/RmLRoEFEkEAeYsRSSRJuhcWSYwWKExQSYwTSb5ETIEiJLoXSwKBVCS6SRdPAhNLA4FMJLpPA0xcGk8CXCJLAoFcJLpcKksCgWQkulxCTwKBbCS6XFpMQQAZMgciFk8CSwFcMk8CFkxLAVw6TwJcSkxcUosTSbxITL8nD4sWULBC/JiLRoEGEkEAiYsRJEm6FxYoTFC+RIsUTIgC+UlOA4waSU4DjBQUREmBElsjGow8SwFXRAiMAUyBRFsjGow/gXJbSYxJQQAwizxBACuLP0AAJiIpZUQjCSlMZ4saiwFcEosUVwgIKEsBUEm8SE8CvycPTFCwQvwii0lB/96LPED/2Ys/Qf/UIillRCMIKUxnQv/IixEkSboXFihMUL5EixRMiAJwSU4DjBtJTgOMFBRESYESWyMaSU4CjECBcluMSkyBdFtJjEsiE4xNQQAyi0pBAC2LS0AAKCIpZUQjCSlMZ4tNFosbTFxyixRXCAgoSwFQSbxITwK/Jw9MULBC+5mLQEH/3ItKQP/Xi0tB/9IiKWVEIwgpTGdC/8aLVELyuIoDASInBmVEIxJEi/8yBg1Ei/0WKEsBUCInDGVESwElJLoXMQBPA4FqJLoXIxZLBUxQi/4WTEsBUCIWTEsBUE8FFlCL/xZQTwRQTFBPAhZQSwIWJwVLAVBLAr9LAyMIJwxMZzEATE8FUE8DUExQgASzUdhXTFCwSwFMiAACSImKAgExADIGFlAxAIv+FklOA0xQJxVMUEy/i/+BGFsjCBaL/0xcGEcCgRhbTIEgWw9BAAQlFlwIJwWLAElOAlBPAklOAr8xAExXGAhOAlBMUIAEmLOslExQsIv/TImKAQCL/0EAArGJtomKAQGL/zIDEkEAAzIKiYv/iYoBAIv/MgMTQQAEi/+yAImKAwGL/yJZQQATi/2BBwuL/ggWJwtMUEm8SIv/v4v/iYoCAiIqi/9AAAiL/klPA08DiTIHjAGL/oEqW0AATIv+jACLAIFCW0EAN4sAgVJbiwFMCYGAmp4BD0EADiIWiwBMXEqLARZcUowAiwBJgUpbi/8ISwGBQltLAQ9EFlxKjACLAIv+TwNPA4mL/oE6W4sBTAmBgKMFD0AAHov+jACLAEmBMluL/whLAYEqW0sBD0QWXDKMAEL/iSIWi/5MXDKLARZcOowAQv/VigIBi/6BBRJBAAuL/4ESWyUaRIv/iYv/gRJbIxpEQv/yigIDKov/gRJbIxpBAAiL/4FyW0AACCKL/ov/TwOJi/4iW0mMAIEGEkEAH4v+gURbIxpAABEiKWVEIw5BAAgji/6L/08DiSJC//WLAIEHEkEAHYv+gXRbQAARIillRCMOQQAII4v+i/9PA4kiQv/1Iov+i/9PA4k=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] }, { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "templateVariables": {} }