{ "name": "AlgoSafe", "structs": { "Object78E87395": [ { "name": "groupId", "type": "uint64" }, { "name": "account", "type": "address" } ], "Object9F556C53": [ { "name": "proposalId", "type": "uint64" }, { "name": "account", "type": "address" } ], "ObjectAE8BF7D4": [ { "name": "custodianGroupId", "type": "uint64" }, { "name": "assetId", "type": "uint64" } ], "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" }, { "name": "guardAmount", "type": "uint64" } ], "Approval": [ { "name": "signer", "type": "address" }, { "name": "round", "type": "uint64" } ], "AssetGuard": [ { "name": "createdRound", "type": "uint64" }, { "name": "lockedAmount", "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" }, { "name": "groupType", "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" }, { "name": "payloadVersion", "type": "uint64" }, { "name": "totalTxns", "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" }, { "name": "groupType", "type": "uint64" }, { "name": "guardCount", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "string", "name": "name" }, { "type": "uint64", "name": "validatorAppId" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "createApplication \u2014 called once on deployment. Initialises global state.\r\nThe creator is the only account that can bootstrap the safe.\r\n\r\nvalidatorAppId is pinned by BYTECODE HASH, not by trust in the deployer:\r\nthe approval program of the given app must hash to the compiled\r\nAlgoSafeTxnValidator (see validator-hash.generated.ts). Because that\r\nbytecode rejects UpdateApplication and DeleteApplication, the program\r\nbehind the ID is immutable, so this single check holds for the safe's\r\nwhole lifetime.", "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": "bootstrap \u2014 simple one-call bootstrap for a fresh safe.\r\nCreates group 1 with full admin+action privileges and adds the creator as\r\nthe sole member. Incompatible with bootstrapGroup (the two paths cannot mix).", "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": "bootstrapGroup", "args": [ { "type": "(string,uint64,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": "bootstrapGroup \u2014 clone-friendly bootstrap; may be called multiple times before\r\nfinalizeBootstrap(). Each call creates one group with its full member set.\r\nUsed by deployClonedSafe() to mirror the predecessor safe's governance structure\r\ninto a newly deployed contract before activating it.", "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": "bootstrapRekeyedAddress \u2014 seed the rekeyed-address registry during cloning.\r\nOnly callable before finalizeBootstrap(); mirrors entries from the predecessor.", "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": "finalizeBootstrap \u2014 activates a cloned safe seeded via bootstrapGroup.\r\nRequires at least one active group with PRIV_GROUP to prevent lockout.\r\nAfter this call _newProposal succeeds and normal governance begins.", "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": "proposeTransactionGroup \u2014 create and optionally immediately execute a transaction\r\nproposal. The caller must be a member of groupId.\r\n\r\nexecute=true skips the approval phase (valid only when the group's threshold\r\nis 1, so the proposer's auto-approval alone makes the proposal READY; the\r\ngroup may have any number of members).\r\n\r\nThe payload is stored in chunk slot 1; further chunks can be appended via\r\nappendTransactionGroupPayload before the first independent approval.", "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": "CustodianGroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "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": "CustodianGroupDissolved", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "AssetGuardSet", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" }, { "type": "uint64", "name": "lockedAmount" } ] }, { "name": "AssetGuardRemoved", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "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": "appendTransactionGroupPayload \u2014 add an additional payload chunk to an existing\r\ntransaction proposal. Only the original proposer may append, and only while\r\nno independent approver has signed yet (approvalsCount === 1 means only the\r\nauto-approval from _newProposal). Each append bumps payloadVersion so any\r\nsigner that has already approved sees \"payload changed since review\" on their\r\nnext call and must re-approve the new version.\r\n\r\nPrevents appending to expired proposals (blocks extending validity window).", "events": [], "recommendations": {} }, { "name": "proposeAdminChange", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,uint64,string,address,uint64,string,uint64,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": "proposeAdminChange \u2014 create a governance change proposal.\r\n\r\nRouting:\r\n ADM_DISSOLVE_CUSTODIAN \u2014 the proposing group must be the custodian group\r\n itself. Admins cannot force-dissolve a custodian.\r\n All other change types \u2014 the proposing group must hold the relevant admin\r\n privilege (PRIV_GROUP or PRIV_POLICY via _assertPrivilegeForChange).\r\n\r\nPayload-level correctness (e.g. guard existence, target group type) is\r\nintentionally deferred to execution time in _applyAdminChange. This saves\r\n~700 bytes of compiled binary by not duplicating the check logic at proposal\r\ntime, at the cost of wasted box storage if an invalid proposal passes approval.\r\n\r\nThe cooldown cap is asserted here (before the box is written) so that a\r\nbad cooldown value cannot be stored and later cause an arithmetic overflow\r\nin _executeProposalInternal even if the group approves the 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": "expectedPayloadVersion" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "approveProposal \u2014 add the caller's approval to an open proposal.\r\n\r\nexpectedPayloadVersion must match the proposal's live payloadVersion; this\r\nbinds the approval to the exact payload content the signer reviewed and\r\nprevents a bait-and-switch attack where the proposer appends a different\r\nchunk after other signers have already approved.\r\n\r\nAlso asserts that the group's membershipEpoch hasn't changed since proposal\r\ncreation \u2014 removing a compromised member invalidates all pending approvals.", "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": "executeProposal \u2014 execute a READY proposal (threshold met, not expired).", "events": [ { "name": "CustodianGroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "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": "CustodianGroupDissolved", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "AssetGuardSet", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" }, { "type": "uint64", "name": "lockedAmount" } ] }, { "name": "AssetGuardRemoved", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "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": "cancelProposal \u2014 cancel an open proposal.\r\n\r\n2026-10-14 audit M-01: a bare \"any member\" rule let one signer of an M-of-N\r\ngroup veto every proposal (including their own removal). Cancellation is\r\nnow limited to the proposer, or any current member once the proposal is\r\nstale (expired, or stranded by a membership-epoch bump \u2014 such proposals can\r\nonly be cancelled and re-created). Approvers get no cancel right: any member\r\ncan approve first, so it would not stop a hostile signer.", "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": "pruneProposal \u2014 delete terminal proposal boxes to reclaim MBR.\r\nCallable on EXECUTED proposals immediately (the ledger already retains the\r\nexecution record; a past-expiry gate adds no safety, only delays MBR\r\nreclamation \u2014 M-01). CANCELLED proposals still require past-expiry, kept\r\nas a review-retention window for a cancelled-but-contested proposal.\r\nRemoves the proposal box, all payload chunk boxes, and the admin-change box.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 7, "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==" }, "validatorApp": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dmFwcA==" } }, "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==" }, "assetGuards": { "keyType": "ObjectAE8BF7D4", "valueType": "AssetGuard", "prefix": "YWc=" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1115, 1322, 1593, 1756, 1949, 2143, 2799, 2836, 3019, 3552, 3785, 5057, 5273, 5528, 5673, 5841 ], "errorMessage": "Box must have value" }, { "pc": [ 3443 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 126 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 831, 5344 ], "errorMessage": "address required" }, { "pc": [ 5153 ], "errorMessage": "already a member" }, { "pc": [ 1829 ], "errorMessage": "already approved" }, { "pc": [ 488, 767, 825, 900 ], "errorMessage": "already bootstrapped" }, { "pc": [ 842, 5355 ], "errorMessage": "already registered" }, { "pc": [ 3310 ], "errorMessage": "app args total length exceeded" }, { "pc": [ 3150 ], "errorMessage": "app update not supported" }, { "pc": [ 3133 ], "errorMessage": "appId required" }, { "pc": [ 3127 ], "errorMessage": "appl not allowed" }, { "pc": [ 494 ], "errorMessage": "bootstrapGroup already used; cannot mix bootstrap paths" }, { "pc": [ 1654 ], "errorMessage": "can only dissolve own custodian group" }, { "pc": [ 5093 ], "errorMessage": "can only dissolve own group" }, { "pc": [ 1382 ], "errorMessage": "cannot modify payload after independent approval" }, { "pc": [ 5681 ], "errorMessage": "cannot set privileges on custodian groups" }, { "pc": [ 479, 486, 492, 758, 765, 816, 823, 891, 898, 904, 1068, 1282, 2411, 2688, 2711, 2900, 3329, 5755, 5808, 5913, 5968, 6059, 6066, 6346, 6367, 6733, 6770, 6808, 7080, 7136 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1628 ], "errorMessage": "cooldown cap" }, { "pc": [ 2370 ], "errorMessage": "cooldown too large" }, { "pc": [ 6642 ], "errorMessage": "custodian actions limited to pay/axfer" }, { "pc": [ 2387 ], "errorMessage": "custodian groups cannot have admin privileges" }, { "pc": [ 3637 ], "errorMessage": "daily limit exceeded" }, { "pc": [ 2618 ], "errorMessage": "duplicate member" }, { "pc": [ 1304 ], "errorMessage": "empty payload" }, { "pc": [ 1059 ], "errorMessage": "empty tx group" }, { "pc": [ 3562 ], "errorMessage": "exceeds guard allocation" }, { "pc": [ 6355 ], "errorMessage": "expiry must be in the future" }, { "pc": [ 6673 ], "errorMessage": "group admin required" }, { "pc": [ 2937 ], "errorMessage": "group cooldown not elapsed" }, { "pc": [ 1087, 1599, 2843 ], "errorMessage": "group disabled" }, { "pc": [ 1844, 2887 ], "errorMessage": "group membership changed since proposal creation" }, { "pc": [ 2763 ], "errorMessage": "group not found" }, { "pc": [ 6258 ], "errorMessage": "guard not found" }, { "pc": [ 2578, 3092, 3271, 3355, 3858, 4005, 4148, 4271, 4342, 4476, 4627, 4908 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 2346, 5554, 6838 ], "errorMessage": "invalid actions" }, { "pc": [ 679, 961, 1206 ], "errorMessage": "invalid array encoding" }, { "pc": [ 295, 462, 637, 649, 707, 799, 931, 988, 1123, 1176, 1233, 1518, 1540, 2314, 3075, 3171, 3190, 3204, 3218, 3338, 3841, 3988, 4131, 4254, 4320, 4371, 4414, 4459, 4610, 4891, 6601 ], "errorMessage": "invalid array length header" }, { "pc": [ 1028 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 302, 469, 806 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 728 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1009, 1254 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 793 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 3448 ], "errorMessage": "invalid number of bytes for arc4.tuple>" }, { "pc": [ 313, 736, 923, 1017, 1040, 1158, 1168, 1262, 1492, 1553, 1562, 1708, 1717, 1726, 1865, 1874, 1907, 1916, 2101, 2110 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1545 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::AdminChange" }, { "pc": [ 642 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::GroupSeed" }, { "pc": [ 3146 ], "errorMessage": "invalid onCompletion" }, { "pc": [ 2358, 5691, 6850 ], "errorMessage": "invalid privileges" }, { "pc": [ 1301 ], "errorMessage": "invalid slot" }, { "pc": [ 629 ], "errorMessage": "invalid tail pointer at index 0 of ((len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 984, 1229 ], "errorMessage": "invalid tail pointer at index 1 of (uint64,(len+uint8[]))" }, { "pc": [ 1510 ], "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,uint64)" }, { "pc": [ 703 ], "errorMessage": "invalid tail pointer at index 2 of (uint8[32],uint64,(len+utf8[]))" }, { "pc": [ 1532 ], "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,uint64)" }, { "pc": [ 969, 1214 ], "errorMessage": "invalid tail pointer for (len+(uint64,(len+uint8[]))[])" }, { "pc": [ 687 ], "errorMessage": "invalid tail pointer for (len+(uint8[32],uint64,(len+utf8[]))[])" }, { "pc": [ 2334 ], "errorMessage": "invalid threshold" }, { "pc": [ 624, 698, 979, 1224, 1504, 1527 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ 2602, 5136, 6827 ], "errorMessage": "member required" }, { "pc": [ 6051 ], "errorMessage": "memberAddr must be the last member" }, { "pc": [ 2316 ], "errorMessage": "members required" }, { "pc": [ 3700 ], "errorMessage": "monthly limit exceeded" }, { "pc": [ 5709, 5888 ], "errorMessage": "must keep at least one active group admin" }, { "pc": [ 905 ], "errorMessage": "need an active group admin" }, { "pc": [ 6817 ], "errorMessage": "new group starts with one member" }, { "pc": [ 3542 ], "errorMessage": "no guard for custodian+asset" }, { "pc": [ 1814, 2211, 2774 ], "errorMessage": "not a group member" }, { "pc": [ 5266 ], "errorMessage": "not a member" }, { "pc": [ 1329 ], "errorMessage": "not a tx group" }, { "pc": [ 1775 ], "errorMessage": "not approvable" }, { "pc": [ 2059 ], "errorMessage": "not authorised to cancel" }, { "pc": [ 6349 ], "errorMessage": "not bootstrapped" }, { "pc": [ 1968 ], "errorMessage": "not cancellable" }, { "pc": [ 2805 ], "errorMessage": "not ready to execute" }, { "pc": [ 5436 ], "errorMessage": "not registered" }, { "pc": [ 2181 ], "errorMessage": "not yet expired" }, { "pc": [ 481, 760, 818, 893 ], "errorMessage": "only creator can bootstrap" }, { "pc": [ 1646 ], "errorMessage": "only custodian groups can propose self-dissolution" }, { "pc": [ 1375 ], "errorMessage": "only proposer can append" }, { "pc": [ 1795 ], "errorMessage": "payload changed since review" }, { "pc": [ 6662 ], "errorMessage": "policy admin required" }, { "pc": [ 1360, 1787, 2814 ], "errorMessage": "proposal expired" }, { "pc": [ 1348 ], "errorMessage": "proposal not pending" }, { "pc": [ 2164 ], "errorMessage": "proposal not terminal" }, { "pc": [ 5083 ], "errorMessage": "proposing group must be custodian" }, { "pc": [ 6022 ], "errorMessage": "remove all guards before dissolving" }, { "pc": [ 6031 ], "errorMessage": "remove other members before dissolving" }, { "pc": [ 1070, 1284, 2902 ], "errorMessage": "safe paused" }, { "pc": [ 3137 ], "errorMessage": "self-call not allowed" }, { "pc": [ 6122, 6241 ], "errorMessage": "target must be a custodian group" }, { "pc": [ 5489 ], "errorMessage": "threshold exceeds members" }, { "pc": [ 5480 ], "errorMessage": "threshold must be at least 1" }, { "pc": [ 2873 ], "errorMessage": "threshold not met" }, { "pc": [ 3230 ], "errorMessage": "too many accounts" }, { "pc": [ 3224 ], "errorMessage": "too many app args" }, { "pc": [ 3235 ], "errorMessage": "too many foreign apps" }, { "pc": [ 3239 ], "errorMessage": "too many foreign assets" }, { "pc": [ 3246 ], "errorMessage": "too many references" }, { "pc": [ 1063 ], "errorMessage": "too many txs" }, { "pc": [ 1424 ], "errorMessage": "too many txs across chunks" }, { "pc": [ 1619, 6295 ], "errorMessage": "unknown change type" }, { "pc": [ 318 ], "errorMessage": "validator app not found" }, { "pc": [ 355 ], "errorMessage": "validator bytecode mismatch" }, { "pc": [ 5292 ], "errorMessage": "would drop below threshold" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiAxMzAgMTAwMDAwMDAKICAgIGJ5dGVjYmxvY2sgImciICIiICJhcGdjIiAiZ2NudCIgIm0iICJib290IiAicCIgImNyZWF0b3IiICJuZ2lkIiAicGF1c2VkIiAidHhnIiAweDE1MWY3Yzc1IDB4N2M2MDU5ZTYgIm5waWQiIDB4MDAyMiAiciIgImRwIiAweDAwMmEgMHhkMDcwNTA3YSAweDAwMTIgImFnIiAweDA2ODEwMSAidmFwcCIgMHgwMDBhIDB4ZGVkZDAzYTggMHgwMDhhIDB4MGNkNzM1N2MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIGV4cG9ydCBjbGFzcyBBbGdvU2FmZSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxNQogICAgcHVzaGJ5dGVzcyAweDkxNGJhNjMzIDB4MTRhOGZmYmEgMHhkNTUxNTY4MiAweDBiMjQzY2E3IDB4YWMzYTlhMzIgMHg0NDI0NDVmNyAweDNmOWI4YTMwIDB4ZjRiNDg2ZWUgMHhmYjcwODhlOCAweDdmNTFmYzI4IDB4ZGNhZGZmOTYgLy8gbWV0aG9kICJib290c3RyYXAoc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcEdyb3VwKChzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGFkZHJlc3MsdWludDY0LHN0cmluZylbXSx1aW50NjQpdWludDY0IiwgbWV0aG9kICJib290c3RyYXBSZWtleWVkQWRkcmVzcyhhZGRyZXNzLHN0cmluZyl2b2lkIiwgbWV0aG9kICJmaW5hbGl6ZUJvb3RzdHJhcCgpdm9pZCIsIG1ldGhvZCAicHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAodWludDY0LCh1aW50NjQsYnl0ZVtdKVtdLHVpbnQ2NCxib29sLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCxieXRlW10pW10sdWludDY0KXZvaWQiLCBtZXRob2QgInByb3Bvc2VBZG1pbkNoYW5nZSh1aW50NjQsKHVpbnQ2NCx1aW50NjQsc3RyaW5nLGFkZHJlc3MsdWludDY0LHN0cmluZyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFwcHJvdmVQcm9wb3NhbCh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJleGVjdXRlUHJvcG9zYWwodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjYW5jZWxQcm9wb3NhbCh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgInBydW5lUHJvcG9zYWwodWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYm9vdHN0cmFwIGJvb3RzdHJhcEdyb3VwIGJvb3RzdHJhcFJla2V5ZWRBZGRyZXNzIGZpbmFsaXplQm9vdHN0cmFwIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkIHByb3Bvc2VBZG1pbkNoYW5nZSBhcHByb3ZlUHJvcG9zYWwgZXhlY3V0ZVByb3Bvc2FsIGNhbmNlbFByb3Bvc2FsIHBydW5lUHJvcG9zYWwKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIGV4cG9ydCBjbGFzcyBBbGdvU2FmZSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweGJmMmUxZTc4IC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oc3RyaW5nLHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlQXBwbGljYXRpb24KICAgIGVycgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDIxIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMjEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmNyZWF0ZUFwcGxpY2F0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDAxCiAgICAvLyBwdWJsaWMgY3JlYXRlQXBwbGljYXRpb24obmFtZTogc3RyaW5nLCB2YWxpZGF0b3JBcHBJZDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwMgogICAgLy8gY29uc3QgW3ZhbGlkYXRvclByb2dyYW0sIHZhbGlkYXRvckV4aXN0c10gPSBvcC5BcHBQYXJhbXMuYXBwQXBwcm92YWxQcm9ncmFtKHZhbGlkYXRvckFwcElkKQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDMKICAgIC8vIGFzc2VydCh2YWxpZGF0b3JFeGlzdHMsICd2YWxpZGF0b3IgYXBwIG5vdCBmb3VuZCcpCiAgICBhc3NlcnQgLy8gdmFsaWRhdG9yIGFwcCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDQKICAgIC8vIGFzc2VydChvcC5zaGEyNTYodmFsaWRhdG9yUHJvZ3JhbSkgPT09IEJ5dGVzLmZyb21IZXgoVkFMSURBVE9SX0FQUFJPVkFMX1NIQTI1Nl9IRVgpLCAndmFsaWRhdG9yIGJ5dGVjb2RlIG1pc21hdGNoJykKICAgIHNoYTI1NgogICAgcHVzaGJ5dGVzIDB4MGRkNjkyMzQ0ZjgwZTdkNTc3MGY0N2JjZGUyNmMzMWVhYWYyNGQ0NWI1ZDE3N2RmY2JjNzI0MTc0MmUxODhiMQogICAgPT0KICAgIGFzc2VydCAvLyB2YWxpZGF0b3IgYnl0ZWNvZGUgbWlzbWF0Y2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjIKICAgIC8vIHZhbGlkYXRvckFwcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd2YXBwJyB9KQogICAgYnl0ZWMgMjIgLy8gInZhcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA1CiAgICAvLyB0aGlzLnZhbGlkYXRvckFwcC52YWx1ZSA9IHZhbGlkYXRvckFwcElkCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNQogICAgLy8gbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICduYW1lJyB9KQogICAgcHVzaGJ5dGVzICJuYW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwNgogICAgLy8gdGhpcy5uYW1lLnZhbHVlID0gbmFtZQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM2CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdjcmVhdG9yJyB9KQogICAgYnl0ZWMgNyAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDcKICAgIC8vIHRoaXMuY3JlYXRvci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQxCiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDUgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA4CiAgICAvLyB0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NQogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDEzIC8vICJucGlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMAogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlY18zIC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMQogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA5IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDEyCiAgICAvLyB0aGlzLnBhdXNlZC52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyB2ZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogJ3ZlcicgfSkKICAgIHB1c2hieXRlc3MgInZlciIgIkJJQVRFQy1BTEdPLVNBRkUtdjMuMy4wIiAvLyAidmVyIiwgIkJJQVRFQy1BTEdPLVNBRkUtdjMuMy4wIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gQ09OVFJBQ1RfVkVSU0lPTgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18yIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyBlbWl0PFNhZmVDcmVhdGVkPih7IG5hbWUsIGNyZWF0b3I6IFR4bi5zZW5kZXIgfSkKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWMgMTQgLy8gMHgwMDIyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhlMjljOGI0NyAvLyBtZXRob2QgIlNhZmVDcmVhdGVkKHN0cmluZyxhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDAxCiAgICAvLyBwdWJsaWMgY3JlYXRlQXBwbGljYXRpb24obmFtZTogc3RyaW5nLCB2YWxpZGF0b3JBcHBJZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5ib290c3RyYXBbcm91dGluZ10oKSAtPiB2b2lkOgpib290c3RyYXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwKGdyb3VwTmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM2CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdjcmVhdG9yJyB9KQogICAgYnl0ZWMgNyAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjQKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA1IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI2CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cENvdW50LnZhbHVlID09PSBVaW50NjQoMCksICdib290c3RyYXBHcm91cCBhbHJlYWR5IHVzZWQ7IGNhbm5vdCBtaXggYm9vdHN0cmFwIHBhdGhzJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlY18zIC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyNgogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9PT0gVWludDY0KDApLCAnYm9vdHN0cmFwR3JvdXAgYWxyZWFkeSB1c2VkOyBjYW5ub3QgbWl4IGJvb3RzdHJhcCBwYXRocycpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGJvb3RzdHJhcEdyb3VwIGFscmVhZHkgdXNlZDsgY2Fubm90IG1peCBib290c3RyYXAgcGF0aHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjgtNDM4CiAgICAvLyBjb25zdCBzZWVkOiBHcm91cFNlZWQgPSB7CiAgICAvLyAgIG5hbWU6IGdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogUFJJVl9BTEwsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBBQ1RfQUxMLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBtb250aGx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IFVpbnQ2NCgwKSwKICAgIC8vICAgZ3JvdXBUeXBlOiBHVF9TVEFOREFSRCwKICAgIC8vIH0KICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDMwCiAgICAvLyB0aHJlc2hvbGQ6IFVpbnQ2NCgxKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI4LTQzOAogICAgLy8gY29uc3Qgc2VlZDogR3JvdXBTZWVkID0gewogICAgLy8gICBuYW1lOiBncm91cE5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IFBSSVZfQUxMLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogQUNUX0FMTCwKICAgIC8vICAgbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBVaW50NjQoMCksCiAgICAvLyAgIGdyb3VwVHlwZTogR1RfU1RBTkRBUkQsCiAgICAvLyB9CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDQyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDcwMDAwMDAwMDAwMDAwMDNmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDM5CiAgICAvLyBjb25zdCBzZWVkTWVtYmVyczogTWVtYmVyU2VlZFtdID0gW3sgYWRkcjogVHhuLnNlbmRlciwgYWNjb3VudFR5cGU6IFVpbnQ2NCgxKSwgbGFiZWw6ICdjcmVhdG9yJyB9XQogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMmEwMDA3NjM3MjY1NjE3NDZmNzIKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0MAogICAgLy8gdGhpcy5fc2VlZEdyb3VwKHNlZWQsIHNlZWRNZW1iZXJzKQogICAgY2FsbHN1YiBfc2VlZEdyb3VwCiAgICBwb3BuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNSAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDEKICAgIC8vIHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjMKICAgIC8vIHB1YmxpYyBib290c3RyYXAoZ3JvdXBOYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmJvb3RzdHJhcEdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwR3JvdXA6CiAgICBieXRlY18xIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDUwCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwR3JvdXAoc2VlZDogR3JvdXBTZWVkLCBtZW1iZXJzOiBNZW1iZXJTZWVkW10sIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA2NiAvLyA2NgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAwIG9mICgobGVuK3V0ZjhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDY4IC8vIDY4CiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Okdyb3VwU2VlZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMAoKYm9vdHN0cmFwR3JvdXBfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1MAogICAgLy8gcHVibGljIGJvb3RzdHJhcEdyb3VwKHNlZWQ6IEdyb3VwU2VlZCwgbWVtYmVyczogTWVtYmVyU2VlZFtdLCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdWludDY0IHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IGJvb3RzdHJhcEdyb3VwX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDIgb2YgKHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pKQogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNDQgLy8gNDQKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBib290c3RyYXBHcm91cF9mb3JfaGVhZGVyQDEKCmJvb3RzdHJhcEdyb3VwX2FmdGVyX2ZvckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1MAogICAgLy8gcHVibGljIGJvb3RzdHJhcEdyb3VwKHNlZWQ6IEdyb3VwU2VlZCwgbWVtYmVyczogTWVtYmVyU2VlZFtdLCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdWludDY0IHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Ok1lbWJlclNlZWQ+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1MQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDUyCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkaWcgNwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM2CiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdjcmVhdG9yJyB9KQogICAgYnl0ZWMgNyAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NTQKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA1IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU2CiAgICAvLyByZXR1cm4gdGhpcy5fc2VlZEdyb3VwKHNlZWQsIG1lbWJlcnMpCiAgICBkaWcgNgogICAgZGlnIDYKICAgIGNhbGxzdWIgX3NlZWRHcm91cAogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDUwCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwR3JvdXAoc2VlZDogR3JvdXBTZWVkLCBtZW1iZXJzOiBNZW1iZXJTZWVkW10sIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgaXRvYgogICAgYnl0ZWMgMTEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmJvb3RzdHJhcFJla2V5ZWRBZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwUmVrZXllZEFkZHJlc3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTI2CiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwUmVrZXllZEFkZHJlc3MoYWRkcjogQWNjb3VudCwgbGFiZWw6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjcKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNgogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDcgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTI3CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjgKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnYWxyZWFkeSBib290c3RyYXBwZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNSAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjgKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnYWxyZWFkeSBib290c3RyYXBwZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUyOQogICAgLy8gYXNzZXJ0KGFkZHIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2FkZHJlc3MgcmVxdWlyZWQnKQogICAgZGlnIDEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhZGRyZXNzIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyByZWtleWVkQWRkcmVzc2VzID0gQm94TWFwPEFjY291bnQsIFJla2V5ZWRBZGRyZXNzPih7IGtleVByZWZpeDogJ3InIH0pCiAgICBieXRlYyAxNSAvLyAiciIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIGFzc2VydCghdGhpcy5yZWtleWVkQWRkcmVzc2VzKGFkZHIpLmV4aXN0cywgJ2FscmVhZHkgcmVnaXN0ZXJlZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzMQogICAgLy8gY29uc3QgZW50cnk6IFJla2V5ZWRBZGRyZXNzID0geyBsYWJlbCwgYWRkZWRSb3VuZDogR2xvYmFsLnJvdW5kIH0KICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlYyAyMyAvLyAweDAwMGEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzMgogICAgLy8gdGhpcy5yZWtleWVkQWRkcmVzc2VzKGFkZHIpLnZhbHVlID0gY2xvbmUoZW50cnkpCiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzMKICAgIC8vIGVtaXQ8UmVrZXllZEFkZHJlc3NBZGRlZD4oeyBhZGRyLCBsYWJlbCB9KQogICAgc3dhcAogICAgYnl0ZWMgMTQgLy8gMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjQgLy8gbWV0aG9kICJSZWtleWVkQWRkcmVzc0FkZGVkKGFkZHJlc3Msc3RyaW5nKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTI2CiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwUmVrZXllZEFkZHJlc3MoYWRkcjogQWNjb3VudCwgbGFiZWw6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZmluYWxpemVCb290c3RyYXBbcm91dGluZ10oKSAtPiB2b2lkOgpmaW5hbGl6ZUJvb3RzdHJhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDIKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNgogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDcgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQyCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDMKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnYWxyZWFkeSBib290c3RyYXBwZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNSAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDMKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnYWxyZWFkeSBib290c3RyYXBwZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0NAogICAgLy8gYXNzZXJ0KHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPj0gVWludDY0KDEpLCAnbmVlZCBhbiBhY3RpdmUgZ3JvdXAgYWRtaW4nKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18yIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0NAogICAgLy8gYXNzZXJ0KHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPj0gVWludDY0KDEpLCAnbmVlZCBhbiBhY3RpdmUgZ3JvdXAgYWRtaW4nKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2VydCAvLyBuZWVkIGFuIGFjdGl2ZSBncm91cCBhZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA1IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0NQogICAgLy8gdGhpcy5ib290c3RyYXBwZWQudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0MQogICAgLy8gcHVibGljIGZpbmFsaXplQm9vdHN0cmFwKCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUucHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjMtNTY5CiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBleGVjdXRlOiBib29sZWFuLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjMtNTY5CiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBleGVjdXRlOiBib29sZWFuLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKHVpbnQ2NCwobGVuK3VpbnQ4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50NjQsKGxlbit1aW50OFtdKSkKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfZm9yX2hlYWRlckAxCgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjMtNTY5CiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBleGVjdXRlOiBib29sZWFuLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OlNhZmVUeG4+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBidXJ5IDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBidXJ5IDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzAKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3MQogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZGlnIDEwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0Cgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTczCiAgICAvLyBhc3NlcnQocGF5bG9hZC5sZW5ndGggPj0gVWludDY0KDEpLCAnZW1wdHkgdHggZ3JvdXAnKQogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGVtcHR5IHR4IGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc0CiAgICAvLyBhc3NlcnQocGF5bG9hZC5sZW5ndGggPD0gTUFYX0dST1VQX1RYTlMsICd0b28gbWFueSB0eHMnKQogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSB0eHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzUKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA5IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc1CiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gc2FmZSBwYXVzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzYKICAgIC8vIHRoaXMuX2Fzc2VydE1lbWJlcihncm91cElkKQogICAgZGlnIDYKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc3CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3Ny01NzgKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBwdXNoaW50IDExNCAvLyAxMTQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3OAogICAgLy8gYXNzZXJ0KGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgYnRvaQogICAgYXNzZXJ0IC8vIGdyb3VwIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc5CiAgICAvLyBjb25zdCBwaWQgPSB0aGlzLl9uZXdQcm9wb3NhbChncm91cElkLCBQVF9UUkFOU0FDVElPTl9HUk9VUCwgZXhwaXJ5Um91bmQpCiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDEwCiAgICBjYWxsc3ViIF9uZXdQcm9wb3NhbAogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODAKICAgIC8vIHRoaXMuX3N0b3JlUGF5bG9hZEdyb3VwKHBpZCwgVWludDY0KDEpLCBwYXlsb2FkKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDgKICAgIGNhbGxzdWIgX3N0b3JlUGF5bG9hZEdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTgxCiAgICAvLyBjb25zdCBwID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSkKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDYgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODEKICAgIC8vIGNvbnN0IHAgPSBjbG9uZSh0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4MgogICAgLy8gcC5udW1QYXlsb2FkcyA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTgzCiAgICAvLyBwLnRvdGFsVHhucyA9IHBheWxvYWQubGVuZ3RoCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODQKICAgIC8vIHRoaXMucHJvcG9zYWxzKHBpZCkudmFsdWUgPSBjbG9uZShwKQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4NQogICAgLy8gaWYgKGV4ZWN1dGUpIHsKICAgIGRpZyA5CiAgICBieiBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODYKICAgIC8vIHRoaXMuX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsKHBpZCkKICAgIGRpZyA3CiAgICBjYWxsc3ViIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbAoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2My01NjkKICAgIC8vIHB1YmxpYyBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cCgKICAgIC8vICAgZ3JvdXBJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGV4cGlyeVJvdW5kOiB1aW50NjQsCiAgICAvLyAgIGV4ZWN1dGU6IGJvb2xlYW4sCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgYnl0ZWMgMTEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYwMS02MDYKICAgIC8vIHB1YmxpYyBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZCgKICAgIC8vICAgcHJvcG9zYWxJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjAxLTYwNgogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKAogICAgLy8gICBwcm9wb3NhbElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWRJbmRleDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKHVpbnQ2NCwobGVuK3VpbnQ4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50NjQsKGxlbit1aW50OFtdKSkKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfZm9yX2hlYWRlckAxCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDEtNjA2CiAgICAvLyBwdWJsaWMgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQoCiAgICAvLyAgIHByb3Bvc2FsSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6U2FmZVR4bj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYwNwogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjA4CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkaWcgMTAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTAKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA5IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjEwCiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gc2FmZSBwYXVzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTEKICAgIC8vIGFzc2VydChwYXlsb2FkSW5kZXggPj0gVWludDY0KDIpICYmIHBheWxvYWRJbmRleCA8PSBVaW50NjQoNiksICdpbnZhbGlkIHNsb3QnKQogICAgZGlnIDYKICAgIGludGNfMyAvLyAyCiAgICA+PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxMAogICAgZGlnIDYKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA8PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxMAogICAgaW50Y18xIC8vIDEKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjExCiAgICAvLyBhc3NlcnQocGF5bG9hZEluZGV4ID49IFVpbnQ2NCgyKSAmJiBwYXlsb2FkSW5kZXggPD0gVWludDY0KDYpLCAnaW52YWxpZCBzbG90JykKICAgIGFzc2VydCAvLyBpbnZhbGlkIHNsb3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTIKICAgIC8vIGFzc2VydChwYXlsb2FkLmxlbmd0aCA+PSBVaW50NjQoMSksICdlbXB0eSBwYXlsb2FkJykKICAgIGRpZyA0CiAgICBhc3NlcnQgLy8gZW1wdHkgcGF5bG9hZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxMwogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyA4CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjEzCiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxNAogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnBheWxvYWRUeXBlID09PSBQVF9UUkFOU0FDVElPTl9HUk9VUCwgJ25vdCBhIHR4IGdyb3VwJykKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIG5vdCBhIHR4IGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjE1CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAncHJvcG9zYWwgbm90IHBlbmRpbmcnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfdHJ1ZUAxMwogICAgZGlnIDkKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxNAoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF90cnVlQDEzOgogICAgaW50Y18xIC8vIDEKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjE1CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAncHJvcG9zYWwgbm90IHBlbmRpbmcnKQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIG5vdCBwZW5kaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjE2CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDw9IHByb3Bvc2FsLmV4cGlyeVJvdW5kLCAncHJvcG9zYWwgZXhwaXJlZCcpCiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyAxMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBwcm9wb3NhbCBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjE3CiAgICAvLyB0aGlzLl9hc3NlcnRNZW1iZXIocHJvcG9zYWwuZ3JvdXBJZCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9hc3NlcnRNZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBwcm9wb3NhbC5wcm9wb3NlciwgJ29ubHkgcHJvcG9zZXIgY2FuIGFwcGVuZCcpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgZXh0cmFjdCA0OCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHByb3Bvc2VyIGNhbiBhcHBlbmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTkKICAgIC8vIGFzc2VydChwcm9wb3NhbC5hcHByb3ZhbHNDb3VudCA9PT0gVWludDY0KDEpLCAnY2Fubm90IG1vZGlmeSBwYXlsb2FkIGFmdGVyIGluZGVwZW5kZW50IGFwcHJvdmFsJykKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbm5vdCBtb2RpZnkgcGF5bG9hZCBhZnRlciBpbmRlcGVuZGVudCBhcHByb3ZhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyMgogICAgLy8gY29uc3Qga2V5OiB1aW50NjQgPSBwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcGF5bG9hZEluZGV4CiAgICBkaWcgOQogICAgcHVzaGludCA3IC8vIDcKICAgICoKICAgIGRpZyA4CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjIzCiAgICAvLyBsZXQgbmV3VG90YWw6IHVpbnQ2NCA9IHByb3Bvc2FsLnRvdGFsVHhucwogICAgc3dhcAogICAgcHVzaGludCAxMDQgLy8gMTA0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyNAogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDEwIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyNAogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyNS02MjYKICAgIC8vIGNvbnN0IGV4aXN0aW5nID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgLy8gbmV3VG90YWwgPSBuZXdUb3RhbCAtIGV4aXN0aW5nLmxlbmd0aAogICAgZGlnIDEzCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI2CiAgICAvLyBuZXdUb3RhbCA9IG5ld1RvdGFsIC0gZXhpc3RpbmcubGVuZ3RoCiAgICAtCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyOAogICAgLy8gbmV3VG90YWwgPSBuZXdUb3RhbCArIHBheWxvYWQubGVuZ3RoCiAgICBkaWcgNQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyOQogICAgLy8gYXNzZXJ0KG5ld1RvdGFsIDw9IE1BWF9HUk9VUF9UWE5TLCAndG9vIG1hbnkgdHhzIGFjcm9zcyBjaHVua3MnKQogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IHR4cyBhY3Jvc3MgY2h1bmtzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjMxCiAgICAvLyB0aGlzLl9zdG9yZVBheWxvYWRHcm91cChwcm9wb3NhbElkLCBwYXlsb2FkSW5kZXgsIHBheWxvYWQpCiAgICBkaWcgOQogICAgZGlnIDgKICAgIGR1cAogICAgY292ZXIgMwogICAgZGlnIDkKICAgIGNhbGxzdWIgX3N0b3JlUGF5bG9hZEdyb3VwCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzQKICAgIC8vIHVwZGF0ZWQudG90YWxUeG5zID0gbmV3VG90YWwKICAgIGl0b2IKICAgIGRpZyAxMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UyIDEwNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNQogICAgLy8gdXBkYXRlZC5wYXlsb2FkVmVyc2lvbiA9IHVwZGF0ZWQucGF5bG9hZFZlcnNpb24gKyBVaW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCA5NiAvLyA5NgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA5NgogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNgogICAgLy8gaWYgKHBheWxvYWRJbmRleCA+IHByb3Bvc2FsLm51bVBheWxvYWRzKSB7CiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPgogICAgYnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNwogICAgLy8gdXBkYXRlZC5udW1QYXlsb2FkcyA9IHBheWxvYWRJbmRleAogICAgZGlnIDgKICAgIHJlcGxhY2UyIDgwCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzOQogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZSh1cGRhdGVkKQogICAgZGlnIDE0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjAxLTYwNgogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKAogICAgLy8gICBwcm9wb3NhbElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWRJbmRleDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX21lcmdlQDE1CgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDEwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9tZXJnZUAxMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUucHJvcG9zZUFkbWluQ2hhbmdlW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJvcG9zZUFkbWluQ2hhbmdlOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2MC02NjUKICAgIC8vIHB1YmxpYyBwcm9wb3NlQWRtaW5DaGFuZ2UoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgY2hhbmdlOiBBZG1pbkNoYW5nZSwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTMyIC8vIDEzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAyIG9mICh1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSx1aW50OFszMl0sdWludDY0LChsZW4rdXRmOFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMTM0IC8vIDEzNAogICAgKwogICAgZGlnIDIKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDUgb2YgKHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFkbWluQ2hhbmdlCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjYKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjcKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjkKICAgIC8vIHRoaXMuX2Fzc2VydE1lbWJlcihncm91cElkKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcwCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcwCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDgKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcwLTY3MQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcxCiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBidG9pCiAgICBhc3NlcnQgLy8gZ3JvdXAgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzMKICAgIC8vIGFzc2VydChjaGFuZ2UuY2hhbmdlVHlwZSA+PSBBRE1fQ1JFQVRFX0dST1VQICYmIGNoYW5nZS5jaGFuZ2VUeXBlIDw9IEFETV9SRU1PVkVfR1VBUkQsICd1bmtub3duIGNoYW5nZSB0eXBlJykKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA2CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfYm9vbF9mYWxzZUA2CiAgICBkaWcgNAogICAgcHVzaGludCAxNCAvLyAxNAogICAgPD0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9ib29sX2ZhbHNlQDYKICAgIGludGNfMSAvLyAxCgpwcm9wb3NlQWRtaW5DaGFuZ2VfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3MwogICAgLy8gYXNzZXJ0KGNoYW5nZS5jaGFuZ2VUeXBlID49IEFETV9DUkVBVEVfR1JPVVAgJiYgY2hhbmdlLmNoYW5nZVR5cGUgPD0gQURNX1JFTU9WRV9HVUFSRCwgJ3Vua25vd24gY2hhbmdlIHR5cGUnKQogICAgYXNzZXJ0IC8vIHVua25vd24gY2hhbmdlIHR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzcKICAgIC8vIGFzc2VydChjaGFuZ2UuY29vbGRvd25Sb3VuZHMgPD0gTUFYX0NPT0xET1dOX1JPVU5EUywgJ2Nvb2xkb3duIGNhcCcpCiAgICBkaWcgMgogICAgcHVzaGludCAxMDggLy8gMTA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50YyA1IC8vIDEwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIGNvb2xkb3duIGNhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3OAogICAgLy8gaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fRElTU09MVkVfQ1VTVE9ESUFOKSB7CiAgICBkaWcgNAogICAgcHVzaGludCAxMiAvLyAxMgogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3OQogICAgLy8gYXNzZXJ0KGdyb3VwLmdyb3VwVHlwZSA9PT0gR1RfQ1VTVE9ESUFOLCAnb25seSBjdXN0b2RpYW4gZ3JvdXBzIGNhbiBwcm9wb3NlIHNlbGYtZGlzc29sdXRpb24nKQogICAgZGlnIDYKICAgIHB1c2hpbnQgMTIyIC8vIDEyMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGN1c3RvZGlhbiBncm91cHMgY2FuIHByb3Bvc2Ugc2VsZi1kaXNzb2x1dGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4MAogICAgLy8gYXNzZXJ0KGNoYW5nZS50YXJnZXRHcm91cElkID09PSBncm91cElkLCAnY2FuIG9ubHkgZGlzc29sdmUgb3duIGN1c3RvZGlhbiBncm91cCcpCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNAogICAgPT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBkaXNzb2x2ZSBvd24gY3VzdG9kaWFuIGdyb3VwCgpwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODUKICAgIC8vIGNvbnN0IHBpZCA9IHRoaXMuX25ld1Byb3Bvc2FsKGdyb3VwSWQsIFBUX0FETUlOLCBleHBpcnlSb3VuZCkKICAgIGRpZyAzCiAgICBwdXNoaW50IDUgLy8gNQogICAgZGlnIDMKICAgIGNhbGxzdWIgX25ld1Byb3Bvc2FsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg2CiAgICAvLyB0aGlzLmFkbWluUGF5bG9hZHMocGlkKS52YWx1ZSA9IGNsb25lKGNoYW5nZSkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzcKICAgIC8vIGFkbWluUGF5bG9hZHMgPSBCb3hNYXA8dWludDY0LCBBZG1pbkNoYW5nZT4oeyBrZXlQcmVmaXg6ICdkcCcgfSkKICAgIGJ5dGVjIDE2IC8vICJkcCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODYKICAgIC8vIHRoaXMuYWRtaW5QYXlsb2FkcyhwaWQpLnZhbHVlID0gY2xvbmUoY2hhbmdlKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGRpZyA0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjYwLTY2NQogICAgLy8gcHVibGljIHByb3Bvc2VBZG1pbkNoYW5nZSgKICAgIC8vICAgZ3JvdXBJZDogdWludDY0LAogICAgLy8gICBjaGFuZ2U6IEFkbWluQ2hhbmdlLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGJ5dGVjIDExIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjgyCiAgICAvLyB0aGlzLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlLmNoYW5nZVR5cGUsIGdyb3VwKQogICAgZGlnIDQKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UKICAgIHBvcAogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAxMAoKcHJvcG9zZUFkbWluQ2hhbmdlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmFwcHJvdmVQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcHJvdmVQcm9wb3NhbDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDUKICAgIC8vIHB1YmxpYyBhcHByb3ZlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBleHBlY3RlZFBheWxvYWRWZXJzaW9uOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwNgogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogYXBwcm92ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwNwogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgphcHByb3ZlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwOQogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDYgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDkKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTAKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgYXBwcm92YWJsZScpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJueiBhcHByb3ZlUHJvcG9zYWxfYm9vbF90cnVlQDUKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IGFwcHJvdmVQcm9wb3NhbF9ib29sX2ZhbHNlQDYKCmFwcHJvdmVQcm9wb3NhbF9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgphcHByb3ZlUHJvcG9zYWxfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxMAogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBhcHByb3ZhYmxlJykKICAgIGFzc2VydCAvLyBub3QgYXBwcm92YWJsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcxMQogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSBwcm9wb3NhbC5leHBpcnlSb3VuZCwgJ3Byb3Bvc2FsIGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBwcm9wb3NhbCBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzEyCiAgICAvLyBhc3NlcnQocHJvcG9zYWwucGF5bG9hZFZlcnNpb24gPT09IGV4cGVjdGVkUGF5bG9hZFZlcnNpb24sICdwYXlsb2FkIGNoYW5nZWQgc2luY2UgcmV2aWV3JykKICAgIGR1cAogICAgcHVzaGludCA5NiAvLyA5NgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIHBheWxvYWQgY2hhbmdlZCBzaW5jZSByZXZpZXcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTMKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzEzCiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgZ3JvdXAgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzE0CiAgICAvLyBhc3NlcnQoIXRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdhbHJlYWR5IGFwcHJvdmVkJykKICAgIGRpZyA3CiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIGFwcHJvdmFscyA9IEJveE1hcDx7IHByb3Bvc2FsSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBBcHByb3ZhbD4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgcHVzaGJ5dGVzICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzE0CiAgICAvLyBhc3NlcnQoIXRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdhbHJlYWR5IGFwcHJvdmVkJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYXBwcm92ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzE2CiAgICAvLyB0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZS5tZW1iZXJzaGlwRXBvY2ggPT09IHByb3Bvc2FsLmVwb2NoQXRDcmVhdGlvbiwKICAgIHB1c2hpbnQgMTA2IC8vIDEwNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgcHVzaGludCA4OCAvLyA4OAogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzE1LTcxOAogICAgLy8gYXNzZXJ0KAogICAgLy8gICB0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZS5tZW1iZXJzaGlwRXBvY2ggPT09IHByb3Bvc2FsLmVwb2NoQXRDcmVhdGlvbiwKICAgIC8vICAgJ2dyb3VwIG1lbWJlcnNoaXAgY2hhbmdlZCBzaW5jZSBwcm9wb3NhbCBjcmVhdGlvbicsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VkIHNpbmNlIHByb3Bvc2FsIGNyZWF0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzE5CiAgICAvLyB0aGlzLl9yZWNvcmRBcHByb3ZhbChwcm9wb3NhbElkLCBwcm9wb3NhbCkKICAgIGRpZyAzCiAgICBzd2FwCiAgICBjYWxsc3ViIF9yZWNvcmRBcHByb3ZhbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzA1CiAgICAvLyBwdWJsaWMgYXBwcm92ZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZXhwZWN0ZWRQYXlsb2FkVmVyc2lvbjogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcHByb3ZlUHJvcG9zYWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwcm92ZVByb3Bvc2FsX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZXhlY3V0ZVByb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZVByb3Bvc2FsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyMwogICAgLy8gcHVibGljIGV4ZWN1dGVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyNAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyNQogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyNwogICAgLy8gdGhpcy5fZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwocHJvcG9zYWxJZCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyMwogICAgLy8gcHVibGljIGV4ZWN1dGVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmNhbmNlbFByb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKY2FuY2VsUHJvcG9zYWw6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDAKICAgIC8vIHB1YmxpYyBjYW5jZWxQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0MQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogY2FuY2VsUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQyCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmNhbmNlbFByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDQKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkaWcgMQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDQKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDUKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgY2FuY2VsbGFibGUnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogY2FuY2VsUHJvcG9zYWxfYm9vbF90cnVlQDUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IGNhbmNlbFByb3Bvc2FsX2Jvb2xfZmFsc2VANgoKY2FuY2VsUHJvcG9zYWxfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKY2FuY2VsUHJvcG9zYWxfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0NQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBjYW5jZWxsYWJsZScpCiAgICBhc3NlcnQgLy8gbm90IGNhbmNlbGxhYmxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQ2CiAgICAvLyBjb25zdCBpc1Byb3Bvc2VyID0gVHhuLnNlbmRlciA9PT0gcHJvcG9zYWwucHJvcG9zZXIKICAgIHR4biBTZW5kZXIKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3QgNDggMzIKICAgID09CiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDcKICAgIC8vIGNvbnN0IGlzTWVtYmVyID0gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgOAogICAgZHVwCiAgICBidXJ5IDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQ3CiAgICAvLyBjb25zdCBpc01lbWJlciA9IHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IHByb3Bvc2FsLmdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0OAogICAgLy8gbGV0IGlzU3RhbGUgPSBHbG9iYWwucm91bmQgPiBwcm9wb3NhbC5leHBpcnlSb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBzd2FwCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPgogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDkKICAgIC8vIGlmICghaXNTdGFsZSAmJiB0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS5leGlzdHMpIHsKICAgIGJueiBjYW5jZWxQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDkKICAgIC8vIGlmICghaXNTdGFsZSAmJiB0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogY2FuY2VsUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1MAogICAgLy8gaXNTdGFsZSA9IHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlLm1lbWJlcnNoaXBFcG9jaCAhPT0gcHJvcG9zYWwuZXBvY2hBdENyZWF0aW9uCiAgICBkaWcgOAogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyA3CiAgICBwdXNoaW50IDg4IC8vIDg4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgIT0KICAgIGJ1cnkgNAoKY2FuY2VsUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTIKICAgIC8vIGFzc2VydChpc1Byb3Bvc2VyIHx8IChpc01lbWJlciAmJiBpc1N0YWxlKSwgJ25vdCBhdXRob3Jpc2VkIHRvIGNhbmNlbCcpCiAgICBkaWcgNAogICAgYm56IGNhbmNlbFByb3Bvc2FsX2Jvb2xfdHJ1ZUAxMwogICAgZGlnIDUKICAgIGJ6IGNhbmNlbFByb3Bvc2FsX2Jvb2xfZmFsc2VAMTQKICAgIGRpZyAzCiAgICBieiBjYW5jZWxQcm9wb3NhbF9ib29sX2ZhbHNlQDE0CgpjYW5jZWxQcm9wb3NhbF9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQoKY2FuY2VsUHJvcG9zYWxfYm9vbF9tZXJnZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTIKICAgIC8vIGFzc2VydChpc1Byb3Bvc2VyIHx8IChpc01lbWJlciAmJiBpc1N0YWxlKSwgJ25vdCBhdXRob3Jpc2VkIHRvIGNhbmNlbCcpCiAgICBhc3NlcnQgLy8gbm90IGF1dGhvcmlzZWQgdG8gY2FuY2VsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzU0CiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfQ0FOQ0VMTEVECiAgICBwdXNoaW50IDQgLy8gNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1NC03NTUKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9IFNUQVRVU19DQU5DRUxMRUQKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMTAKICAgIGludGNfMiAvLyA4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzU2CiAgICAvLyBlbWl0PFByb3Bvc2FsQ2FuY2VsbGVkPih7IHByb3Bvc2FsSWQgfSkKICAgIHB1c2hieXRlcyAweGFlMmFiYzA2IC8vIG1ldGhvZCAiUHJvcG9zYWxDYW5jZWxsZWQodWludDY0KSIKICAgIGRpZyA4CiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0MAogICAgLy8gcHVibGljIGNhbmNlbFByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2FuY2VsUHJvcG9zYWxfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNhbmNlbFByb3Bvc2FsX2Jvb2xfbWVyZ2VAMTUKCmNhbmNlbFByb3Bvc2FsX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIGNhbmNlbFByb3Bvc2FsX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUucHJ1bmVQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBydW5lUHJvcG9zYWw6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiA1CiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIHB1YmxpYyBwcnVuZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzY4CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2OQogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzEKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkaWcgMQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzEKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzIKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19FWEVDVVRFRCB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19DQU5DRUxMRUQsICdwcm9wb3NhbCBub3QgdGVybWluYWwnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBibnogcHJ1bmVQcm9wb3NhbF9ib29sX3RydWVANQogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYnogcHJ1bmVQcm9wb3NhbF9ib29sX2ZhbHNlQDYKCnBydW5lUHJvcG9zYWxfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKcHJ1bmVQcm9wb3NhbF9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzcyCiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfRVhFQ1VURUQgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQ0FOQ0VMTEVELCAncHJvcG9zYWwgbm90IHRlcm1pbmFsJykKICAgIGFzc2VydCAvLyBwcm9wb3NhbCBub3QgdGVybWluYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzMKICAgIC8vIGlmIChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19DQU5DRUxMRUQpIHsKICAgIGRpZyAyCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IHBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzc0CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kID4gcHJvcG9zYWwuZXhwaXJ5Um91bmQsICdub3QgeWV0IGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgNQogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgID4KICAgIGFzc2VydCAvLyBub3QgeWV0IGV4cGlyZWQKCnBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4MAogICAgLy8gaWYgKHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLmV4aXN0cykgewogICAgZGlnIDQKICAgIGV4dHJhY3QgMCA4CiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODAKICAgIC8vIGlmICh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzgxCiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgZGlnIDUKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODEKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgYSBncm91cCBtZW1iZXIKCnBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODQKICAgIC8vIGlmIChwcm9wb3NhbC5wYXlsb2FkVHlwZSA9PT0gUFRfVFJBTlNBQ1RJT05fR1JPVVApIHsKICAgIGRpZyA0CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBwcnVuZVByb3Bvc2FsX2Vsc2VfYm9keUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4NQogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBwcm9wb3NhbC5udW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDQKCnBydW5lUHJvcG9zYWxfd2hpbGVfdG9wQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4NQogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBwcm9wb3NhbC5udW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGRpZyA0CiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgID49CiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODYKICAgIC8vIGNvbnN0IGtleTogdWludDY0ID0gcHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHAKICAgIGRpZyAxCiAgICBwdXNoaW50IDcgLy8gNwogICAgKgogICAgZGlnIDQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODcKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyB0cmFuc2FjdGlvbkdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNhZmVUeG5Hcm91cD4oeyBrZXlQcmVmaXg6ICd0eGcnIH0pCiAgICBieXRlYyAxMCAvLyAidHhnIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODcKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gdGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmRlbGV0ZSgpCiAgICBkaWcgOAogICAgYm94X2RlbAogICAgcG9wCgpwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg1CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IHByb3Bvc2FsLm51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKICAgIGIgcHJ1bmVQcm9wb3NhbF93aGlsZV90b3BAMTMKCnBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTQKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLmRlbGV0ZSgpCiAgICBkaWcgOQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzY3CiAgICAvLyBwdWJsaWMgcHJ1bmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnBydW5lUHJvcG9zYWxfZWxzZV9ib2R5QDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3NwogICAgLy8gYWRtaW5QYXlsb2FkcyA9IEJveE1hcDx1aW50NjQsIEFkbWluQ2hhbmdlPih7IGtleVByZWZpeDogJ2RwJyB9KQogICAgYnl0ZWMgMTYgLy8gImRwIgogICAgZGlnIDcKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTEKICAgIC8vIH0gZWxzZSBpZiAodGhpcy5hZG1pblBheWxvYWRzKHByb3Bvc2FsSWQpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTIKICAgIC8vIHRoaXMuYWRtaW5QYXlsb2Fkcyhwcm9wb3NhbElkKS5kZWxldGUoKQogICAgZGlnIDcKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMjEKCnBydW5lUHJvcG9zYWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJ1bmVQcm9wb3NhbF9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9zZWVkR3JvdXAoc2VlZDogYnl0ZXMsIG1lbWJlcnM6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCBieXRlczoKX3NlZWRHcm91cDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIHByaXZhdGUgX3NlZWRHcm91cChzZWVkOiBHcm91cFNlZWQsIG1lbWJlcnM6IE1lbWJlclNlZWRbXSk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDMKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cG4gNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NQogICAgLy8gY29uc3QgbWVtYmVyQ291bnQgPSBVaW50NjQobWVtYmVycy5sZW5ndGgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjYKICAgIC8vIGFzc2VydChtZW1iZXJDb3VudCA+PSBVaW50NjQoMSksICdtZW1iZXJzIHJlcXVpcmVkJykKICAgIGFzc2VydCAvLyBtZW1iZXJzIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDY3CiAgICAvLyBhc3NlcnQoc2VlZC50aHJlc2hvbGQgPj0gVWludDY0KDEpICYmIHNlZWQudGhyZXNob2xkIDw9IG1lbWJlckNvdW50LCAnaW52YWxpZCB0aHJlc2hvbGQnKQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnogX3NlZWRHcm91cF9ib29sX2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAxMAogICAgZnJhbWVfZGlnIDkKICAgIDw9CiAgICBieiBfc2VlZEdyb3VwX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCl9zZWVkR3JvdXBfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2NwogICAgLy8gYXNzZXJ0KHNlZWQudGhyZXNob2xkID49IFVpbnQ2NCgxKSAmJiBzZWVkLnRocmVzaG9sZCA8PSBtZW1iZXJDb3VudCwgJ2ludmFsaWQgdGhyZXNob2xkJykKICAgIGFzc2VydCAvLyBpbnZhbGlkIHRocmVzaG9sZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2OAogICAgLy8gYXNzZXJ0KHNlZWQuYWxsb3dlZEFjdGlvbnMgPD0gQUNUX0FMTCwgJ2ludmFsaWQgYWN0aW9ucycpCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgcHVzaGludCA2MyAvLyA2MwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIGFjdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIGFzc2VydChzZWVkLmFkbWluUHJpdmlsZWdlcyA8PSBQUklWX0FMTCwgJ2ludmFsaWQgcHJpdmlsZWdlcycpCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgcHVzaGludCA3IC8vIDcKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBwcml2aWxlZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDcwCiAgICAvLyBhc3NlcnQoc2VlZC5jb29sZG93blJvdW5kcyA8PSBNQVhfQ09PTERPV05fUk9VTkRTLCAnY29vbGRvd24gdG9vIGxhcmdlJykKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1MCAvLyA1MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICBpbnRjIDUgLy8gMTAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gY29vbGRvd24gdG9vIGxhcmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDcxCiAgICAvLyBpZiAoc2VlZC5ncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTikgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDgKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX3NlZWRHcm91cF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzMKICAgIC8vIGFzc2VydChzZWVkLmFkbWluUHJpdmlsZWdlcyA9PT0gVWludDY0KDApLCAnY3VzdG9kaWFuIGdyb3VwcyBjYW5ub3QgaGF2ZSBhZG1pbiBwcml2aWxlZ2VzJykKICAgIGZyYW1lX2RpZyA2CiAgICAhCiAgICBhc3NlcnQgLy8gY3VzdG9kaWFuIGdyb3VwcyBjYW5ub3QgaGF2ZSBhZG1pbiBwcml2aWxlZ2VzCgpfc2VlZEdyb3VwX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIHRoaXMuX2Fzc2VydEN1c3RvZGlhbkFjdGlvbnMoc2VlZC5ncm91cFR5cGUsIHNlZWQuYWxsb3dlZEFjdGlvbnMpCiAgICBmcmFtZV9kaWcgOAogICAgZHVwCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9hc3NlcnRDdXN0b2RpYW5BY3Rpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyBjb25zdCBub3cgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc5CiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzkKICAgIC8vIGNvbnN0IGdpZDogdWludDY0ID0gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgNQogICAgZnJhbWVfYnVyeSAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBuYW1lOiBzZWVkLm5hbWUsCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMgogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODcKICAgIC8vIGxpbWl0QXNzZXRJZDogc2VlZC5saW1pdEFzc2V0SWQsCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMjYgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4OAogICAgLy8gZGFpbHlMaW1pdDogc2VlZC5kYWlseUxpbWl0LAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDM0IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0OTEKICAgIC8vIG1vbnRobHlMaW1pdDogc2VlZC5tb250aGx5TGltaXQsCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgNDIgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4MS01MDAKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IHNlZWQubmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBzZWVkLnRocmVzaG9sZCwKICAgIC8vICAgbWVtYmVyQ291bnQsCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogc2VlZC5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBzZWVkLmFsbG93ZWRBY3Rpb25zLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IHNlZWQubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBzZWVkLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IHNlZWQubW9udGhseUxpbWl0LAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBzZWVkLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gICBncm91cFR5cGU6IHNlZWQuZ3JvdXBUeXBlLAogICAgLy8gICBndWFyZENvdW50OiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMTAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBieXRlYyAyNSAvLyAweDAwOGEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDkKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4OQogICAgLy8gZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODEtNTAwCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBzZWVkLm5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogc2VlZC50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50LAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IHNlZWQuYWRtaW5Qcml2aWxlZ2VzLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogc2VlZC5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBzZWVkLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogc2VlZC5kYWlseUxpbWl0LAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBzZWVkLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogc2VlZC5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vICAgZ3JvdXBUeXBlOiBzZWVkLmdyb3VwVHlwZSwKICAgIC8vICAgZ3VhcmRDb3VudDogVWludDY0KDApLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDk3CiAgICAvLyBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDgxLTUwMAogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogc2VlZC5uYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IHNlZWQudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudCwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBzZWVkLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IHNlZWQuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogc2VlZC5saW1pdEFzc2V0SWQsCiAgICAvLyAgIGRhaWx5TGltaXQ6IHNlZWQuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogc2VlZC5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IHNlZWQuY29vbGRvd25Sb3VuZHMsCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyAgIGdyb3VwVHlwZTogc2VlZC5ncm91cFR5cGUsCiAgICAvLyAgIGd1YXJkQ291bnQ6IFVpbnQ2NCgwKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTAxCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTAxCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDMKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBtZW1iZXJDb3VudDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCl9zZWVkR3JvdXBfd2hpbGVfdG9wQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTAzCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbWVtYmVyQ291bnQ7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDkKICAgIDwKICAgIGJ6IF9zZWVkR3JvdXBfYWZ0ZXJfd2hpbGVAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwNC01MDUKICAgIC8vIGNvbnN0IHNlZWRNZW1iZXIgPSBjbG9uZShtZW1iZXJzW2ldKQogICAgLy8gYXNzZXJ0KHNlZWRNZW1iZXIuYWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnbWVtYmVyIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9kaWcgOQogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwNQogICAgLy8gYXNzZXJ0KHNlZWRNZW1iZXIuYWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnbWVtYmVyIHJlcXVpcmVkJykKICAgIGR1cAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIG1lbWJlciByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwNgogICAgLy8gYXNzZXJ0KCF0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IHNlZWRNZW1iZXIuYWRkciB9KS5leGlzdHMsICdkdXBsaWNhdGUgbWVtYmVyJykKICAgIGZyYW1lX2RpZyAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDYKICAgIC8vIGFzc2VydCghdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBzZWVkTWVtYmVyLmFkZHIgfSkuZXhpc3RzLCAnZHVwbGljYXRlIG1lbWJlcicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGR1cGxpY2F0ZSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDcKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IHNlZWRNZW1iZXIuYWNjb3VudFR5cGUsIGxhYmVsOiBzZWVkTWVtYmVyLmxhYmVsLCBhZGRyOiBzZWVkTWVtYmVyLmFkZHIgfQogICAgZGlnIDMKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgbGVuCiAgICBkaWcgNQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgNAogICAgZXh0cmFjdCAzMiA4CiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBieXRlYyAxNyAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwOAogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBzZWVkTWVtYmVyLmFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTA5CiAgICAvLyBlbWl0PE1lbWJlckFkZGVkPih7IGdyb3VwSWQ6IGdpZCwgbWVtYmVyOiBzZWVkTWVtYmVyLmFkZHIsIGFjY291bnRUeXBlOiBzZWVkTWVtYmVyLmFjY291bnRUeXBlIH0pCiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9zZWVkR3JvdXBfd2hpbGVfdG9wQDcKCl9zZWVkR3JvdXBfYWZ0ZXJfd2hpbGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTIKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDggLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTEyCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxMwogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWNfMyAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTMKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlY18zIC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxMwogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNAogICAgLy8gaWYgKHNlZWQuZ3JvdXBUeXBlICE9PSBHVF9DVVNUT0RJQU4gJiYgKHNlZWQuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIDgKICAgIGludGNfMSAvLyAxCiAgICAhPQogICAgYnogX3NlZWRHcm91cF9hZnRlcl9pZl9lbHNlQDEyCiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGJ6IF9zZWVkR3JvdXBfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNQogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTUKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18yIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNQogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgpfc2VlZEdyb3VwX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE4CiAgICAvLyBlbWl0PEdyb3VwQ3JlYXRlZD4oeyBncm91cElkOiBnaWQsIG5hbWU6IHNlZWQubmFtZSwgdGhyZXNob2xkOiBzZWVkLnRocmVzaG9sZCB9KQogICAgZnJhbWVfZGlnIDIKICAgIGJ5dGVjIDE5IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBieXRlYyAyNiAvLyBtZXRob2QgIkdyb3VwQ3JlYXRlZCh1aW50NjQsc3RyaW5nLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxOQogICAgLy8gcmV0dXJuIGdpZAogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9zZWVkR3JvdXBfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgX3NlZWRHcm91cF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9hc3NlcnRNZW1iZXIoZ3JvdXBJZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0TWVtYmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxMAogICAgLy8gcHJpdmF0ZSBfYXNzZXJ0TWVtYmVyKGdyb3VwSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODExCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoZ3JvdXBJZCkuZXhpc3RzLCAnZ3JvdXAgbm90IGZvdW5kJykKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODExCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoZ3JvdXBJZCkuZXhpc3RzLCAnZ3JvdXAgbm90IGZvdW5kJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxMgogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzLCAnbm90IGEgZ3JvdXAgbWVtYmVyJykKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MTIKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgYSBncm91cCBtZW1iZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyOAogICAgLy8gcHJpdmF0ZSBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwocHJvcG9zYWxJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDM5CiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDM5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODI5CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjkKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzAKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCByZWFkeSB0byBleGVjdXRlJykKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBub3QgcmVhZHkgdG8gZXhlY3V0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzMQogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSBwcm9wb3NhbC5leHBpcnlSb3VuZCwgJ3Byb3Bvc2FsIGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMQogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gcHJvcG9zYWwgZXhwaXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzMwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzMwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgc3dhcAogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzMtODM0CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgZHVwCiAgICBwdXNoaW50IDExNCAvLyAxMTQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzNAogICAgLy8gYXNzZXJ0KGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgYnRvaQogICAgYXNzZXJ0IC8vIGdyb3VwIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM1CiAgICAvLyBjb25zdCByZXF1aXJlZFRocmVzaG9sZDogdWludDY0ID0gcHJvcG9zYWwudGhyZXNob2xkID49IGdyb3VwLnRocmVzaG9sZCA/IHByb3Bvc2FsLnRocmVzaG9sZCA6IGdyb3VwLnRocmVzaG9sZAogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgODcKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM2CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuYXBwcm92YWxzQ291bnQgPj0gcmVxdWlyZWRUaHJlc2hvbGQsICd0aHJlc2hvbGQgbm90IG1ldCcpCiAgICBmcmFtZV9kaWcgODIKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyB0aHJlc2hvbGQgbm90IG1ldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzNwogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlcnNoaXBFcG9jaCA9PT0gcHJvcG9zYWwuZXBvY2hBdENyZWF0aW9uLCAnZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VkIHNpbmNlIHByb3Bvc2FsIGNyZWF0aW9uJykKICAgIGZyYW1lX2RpZyA4NQogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDg4IC8vIDg4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIGFzc2VydCAvLyBncm91cCBtZW1iZXJzaGlwIGNoYW5nZWQgc2luY2UgcHJvcG9zYWwgY3JlYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzkKICAgIC8vIGlmIChwcm9wb3NhbC5wYXlsb2FkVHlwZSA9PT0gUFRfVFJBTlNBQ1RJT05fR1JPVVApIHsKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0MAogICAgLy8gYXNzZXJ0KHRoaXMucGF1c2VkLnZhbHVlID09PSBVaW50NjQoMCksICdzYWZlIHBhdXNlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1MAogICAgLy8gcGF1c2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3BhdXNlZCcgfSkKICAgIGJ5dGVjIDkgLy8gInBhdXNlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDAKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBzYWZlIHBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0MgogICAgLy8gaWYgKGdyb3VwLmNvb2xkb3duUm91bmRzICE9PSBVaW50NjQoMCkgJiYgZ3JvdXAubGFzdEV4ZWN1dGlvblJvdW5kICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyA4NQogICAgcHVzaGludCA5MCAvLyA5MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzMKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDcKICAgIGZyYW1lX2RpZyA4NQogICAgcHVzaGludCA5OCAvLyA5OAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDMKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPj0gZ3JvdXAubGFzdEV4ZWN1dGlvblJvdW5kICsgZ3JvdXAuY29vbGRvd25Sb3VuZHMsICdncm91cCBjb29sZG93biBub3QgZWxhcHNlZCcpCiAgICBnbG9iYWwgUm91bmQKICAgIGZyYW1lX2RpZyA3NAogICAgZnJhbWVfZGlnIDczCiAgICArCiAgICA+PQogICAgYXNzZXJ0IC8vIGdyb3VwIGNvb2xkb3duIG5vdCBlbGFwc2VkCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0NQogICAgLy8gdGhpcy5fZXhlY3V0ZVRyYW5zYWN0aW9uR3JvdXAocHJvcG9zYWxJZCwgcHJvcG9zYWwuZ3JvdXBJZCwgZ3JvdXAsIHByb3Bvc2FsLm51bVBheWxvYWRzKQogICAgZnJhbWVfZGlnIDgyCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0MwogICAgLy8gY29uc3QgaXNDdXN0b2RpYW4gPSBncm91cEluLmdyb3VwVHlwZSA9PT0gR1RfQ1VTVE9ESUFOCiAgICBmcmFtZV9kaWcgODUKICAgIHB1c2hpbnQgMTIyIC8vIDEyMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGZyYW1lX2J1cnkgNTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NTgKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA2MQogICAgZnJhbWVfZGlnIDg2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjIKICAgIGZyYW1lX2J1cnkgMjMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAOTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTU4CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDYxCiAgICBmcmFtZV9kaWcgNjAKICAgIDw9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTU5CiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgNjEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjAKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyB0cmFuc2FjdGlvbkdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNhZmVUeG5Hcm91cD4oeyBrZXlQcmVmaXg6ICd0eGcnIH0pCiAgICBieXRlYyAxMCAvLyAidHhnIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjAKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfaWZfYm9keUA5NgogICAgZnJhbWVfZGlnIDIyCiAgICBmcmFtZV9idXJ5IDI0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTU4CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDYxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2MQogICAgZnJhbWVfZGlnIDI0CiAgICBmcmFtZV9idXJ5IDIyCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAOTQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9pZl9ib2R5QDk2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2MQogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxMwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyOAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjIKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUxCiAgICBmcmFtZV9kaWcgMjIKICAgIGZyYW1lX2J1cnkgMjQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAOTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTYxLTk2MgogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAxMwogICAgaW50Y18wIC8vIDAKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2MgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDUxCiAgICA+CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjMtOTY0CiAgICAvLyBjb25zdCBlbnRyeSA9IGNsb25lKHBheWxvYWRbaV0pCiAgICAvLyBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BUFApIHsKICAgIGludGNfMyAvLyAyCiAgICBmcmFtZV9kaWcgNTEKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBmcmFtZV9kaWcgMTMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2NAogICAgLy8gaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQVBQKSB7CiAgICBidG9pCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTY1CiAgICAvLyB0aGlzLl92YWxpZGF0ZUFwcChkZWNvZGVBcmM0PEFwcFR4bj4oZW50cnkuZGF0YSksIGdyb3VwSW4pCiAgICBmcmFtZV9kaWcgMjgKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTEKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExODUKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfQVBQTCkgIT09IFVpbnQ2NCgwKSwgJ2FwcGwgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDIzCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgICYKICAgIGFzc2VydCAvLyBhcHBsIG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE4NgogICAgLy8gYXNzZXJ0KHR4LmFwcElkICE9PSBVaW50NjQoMCksICdhcHBJZCByZXF1aXJlZCcpCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGFzc2VydCAvLyBhcHBJZCByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExODgKICAgIC8vIGFzc2VydCh0eC5hcHBJZCAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkLCAnc2VsZi1jYWxsIG5vdCBhbGxvd2VkJykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgIT0KICAgIGFzc2VydCAvLyBzZWxmLWNhbGwgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTg5CiAgICAvLyBhc3NlcnQodHgub25Db21wbGV0aW9uIDw9IFVpbnQ2NCg1KSwgJ2ludmFsaWQgb25Db21wbGV0aW9uJykKICAgIHN3YXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgb25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5MQogICAgLy8gYXNzZXJ0KHR4Lm9uQ29tcGxldGlvbiAhPT0gVWludDY0KDQpLCAnYXBwIHVwZGF0ZSBub3Qgc3VwcG9ydGVkJykKICAgIHB1c2hpbnQgNCAvLyA0CiAgICAhPQogICAgYXNzZXJ0IC8vIGFwcCB1cGRhdGUgbm90IHN1cHBvcnRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTIKICAgIC8vIGNvbnN0IG51bUFyZ3MgPSBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSA1OQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTMKICAgIC8vIGNvbnN0IG51bUFjY291bnRzID0gVWludDY0KHR4LmFjY291bnRzLmxlbmd0aCkKICAgIGRpZyAxCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5NAogICAgLy8gY29uc3QgbnVtQXBwcyA9IFVpbnQ2NCh0eC5mb3JlaWduQXBwcy5sZW5ndGgpCiAgICBkaWcgMgogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTUKICAgIC8vIGNvbnN0IG51bUFzc2V0cyA9IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCkKICAgIGRpZyAzCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk2CiAgICAvLyBhc3NlcnQobnVtQXJncyA8PSBNQVhfQVBQX0FSR1MsICd0b28gbWFueSBhcHAgYXJncycpCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgYXBwIGFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk3CiAgICAvLyBhc3NlcnQobnVtQWNjb3VudHMgPD0gTUFYX0FQUF9BQ0NPVU5UUywgJ3RvbyBtYW55IGFjY291bnRzJykKICAgIGRpZyAyCiAgICBwdXNoaW50IDQgLy8gNAogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSBhY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTgKICAgIC8vIGFzc2VydChudW1BcHBzIDw9IE1BWF9BUFBfRk9SRUlHTl9BUFBTLCAndG9vIG1hbnkgZm9yZWlnbiBhcHBzJykKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSBmb3JlaWduIGFwcHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk5CiAgICAvLyBhc3NlcnQobnVtQXNzZXRzIDw9IE1BWF9BUFBfRk9SRUlHTl9BU1NFVFMsICd0b28gbWFueSBmb3JlaWduIGFzc2V0cycpCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IGZvcmVpZ24gYXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwMAogICAgLy8gYXNzZXJ0KG51bUFjY291bnRzICsgbnVtQXBwcyArIG51bUFzc2V0cyA8PSBNQVhfQVBQX1RPVEFMX1JFRlMsICd0b28gbWFueSByZWZlcmVuY2VzJykKICAgIGNvdmVyIDIKICAgICsKICAgICsKICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IHJlZmVyZW5jZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjAxCiAgICAvLyBsZXQgdG90YWxBcmdMZW4gPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDY5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwMgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IG51bUFyZ3M7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1MgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAyMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwMgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IG51bUFyZ3M7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTIKICAgIGZyYW1lX2RpZyA1OQogICAgPAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDY0CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMjIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwMwogICAgLy8gdG90YWxBcmdMZW4gPSB0b3RhbEFyZ0xlbiArIHR4LmFwcEFyZ3NbaV0ubGVuZ3RoCiAgICBmcmFtZV9kaWcgNQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2NAogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgNTIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgZnJhbWVfZGlnIDY5CiAgICArCiAgICBmcmFtZV9idXJ5IDY5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwMgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IG51bUFyZ3M7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1MgogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDIyMQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDIyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjA1CiAgICAvLyBhc3NlcnQodG90YWxBcmdMZW4gPD0gTUFYX0FQUF9UT1RBTF9BUkdfTEVOLCAnYXBwIGFyZ3MgdG90YWwgbGVuZ3RoIGV4Y2VlZGVkJykKICAgIGZyYW1lX2RpZyA2OQogICAgcHVzaGludCAyMDQ4IC8vIDIwNDgKICAgIDw9CiAgICBhc3NlcnQgLy8gYXBwIGFyZ3MgdG90YWwgbGVuZ3RoIGV4Y2VlZGVkCiAgICBmcmFtZV9kaWcgMjMKICAgIGZyYW1lX2J1cnkgMjQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjIKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA1MQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTEKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEA5NwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTY3LTk3MgogICAgLy8gY29uc3QgdmFsaWRhdGVkID0gYWJpQ2FsbCh7CiAgICAvLyAgIG1ldGhvZDogQWxnb1NhZmVUeG5WYWxpZGF0b3IucHJvdG90eXBlLnZhbGlkYXRlVHhuLAogICAgLy8gICBhcHBJZDogdGhpcy52YWxpZGF0b3JBcHAudmFsdWUsCiAgICAvLyAgIGFyZ3M6IFtlbnRyeS50eFR5cGUsIGVudHJ5LmRhdGEsIGdyb3VwSW4uYWxsb3dlZEFjdGlvbnMsIGdyb3VwSW4uYWRtaW5Qcml2aWxlZ2VzLCBncm91cEluLmdyb3VwVHlwZV0sCiAgICAvLyAgIGZlZTogMCwKICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTY5CiAgICAvLyBhcHBJZDogdGhpcy52YWxpZGF0b3JBcHAudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2MgogICAgLy8gdmFsaWRhdG9yQXBwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZhcHAnIH0pCiAgICBieXRlYyAyMiAvLyAidmFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NjkKICAgIC8vIGFwcElkOiB0aGlzLnZhbGlkYXRvckFwcC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTcwCiAgICAvLyBhcmdzOiBbZW50cnkudHhUeXBlLCBlbnRyeS5kYXRhLCBncm91cEluLmFsbG93ZWRBY3Rpb25zLCBncm91cEluLmFkbWluUHJpdmlsZWdlcywgZ3JvdXBJbi5ncm91cFR5cGVdLAogICAgZnJhbWVfZGlnIDI4CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDUxCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAyMwogICAgZHVwCiAgICBleHRyYWN0IDI2IDgKICAgIGRpZyAxCiAgICBleHRyYWN0IDE4IDgKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCAxMjIgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2Ny05NzIKICAgIC8vIGNvbnN0IHZhbGlkYXRlZCA9IGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IEFsZ29TYWZlVHhuVmFsaWRhdG9yLnByb3RvdHlwZS52YWxpZGF0ZVR4biwKICAgIC8vICAgYXBwSWQ6IHRoaXMudmFsaWRhdG9yQXBwLnZhbHVlLAogICAgLy8gICBhcmdzOiBbZW50cnkudHhUeXBlLCBlbnRyeS5kYXRhLCBncm91cEluLmFsbG93ZWRBY3Rpb25zLCBncm91cEluLmFkbWluUHJpdmlsZWdlcywgZ3JvdXBJbi5ncm91cFR5cGVdLAogICAgLy8gICBmZWU6IDAsCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4ZTMxY2Q1YTUgLy8gbWV0aG9kICJ2YWxpZGF0ZVR4bih1aW50NjQsYnl0ZVtdLHVpbnQ2NCx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgMTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzEKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk2Ny05NzIKICAgIC8vIGNvbnN0IHZhbGlkYXRlZCA9IGFiaUNhbGwoewogICAgLy8gICBtZXRob2Q6IEFsZ29TYWZlVHhuVmFsaWRhdG9yLnByb3RvdHlwZS52YWxpZGF0ZVR4biwKICAgIC8vICAgYXBwSWQ6IHRoaXMudmFsaWRhdG9yQXBwLnZhbHVlLAogICAgLy8gICBhcmdzOiBbZW50cnkudHhUeXBlLCBlbnRyeS5kYXRhLCBncm91cEluLmFsbG93ZWRBY3Rpb25zLCBncm91cEluLmFkbWluUHJpdmlsZWdlcywgZ3JvdXBJbi5ncm91cFR5cGVdLAogICAgLy8gICBmZWU6IDAsCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgZGlnIDEKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAxMSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGxlbgogICAgcHVzaGludCA1NiAvLyA1NgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC50dXBsZTxhcmM0LnVpbnQ2NCxhcmM0LnVpbnQ2NCxhcmM0LnVpbnQ2NCxhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyBjb25zdCBhc3NldElkID0gdmFsaWRhdGVkWzBdCiAgICBkdXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc0CiAgICAvLyBsZXQgYW1vdW50ID0gdmFsaWRhdGVkWzFdCiAgICBkdXAKICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDQ3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc1CiAgICAvLyBjb25zdCBoYXNDbG9zZSA9IHZhbGlkYXRlZFsyXQogICAgZHVwCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3NgogICAgLy8gY29uc3QgdHhTZW5kZXIgPSB2YWxpZGF0ZWRbM10KICAgIGV4dHJhY3QgMjggMzIKICAgIGZyYW1lX2J1cnkgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzkKICAgIC8vIGNvbnN0IHRyYWNrZWQgPSBhc3NldElkID09PSBncm91cC5saW1pdEFzc2V0SWQKICAgIGZyYW1lX2RpZyA4NgogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICBmcmFtZV9idXJ5IDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTgwCiAgICAvLyBpZiAoaXNDdXN0b2RpYW4gfHwgdHJhY2tlZCkgewogICAgZnJhbWVfZGlnIDUzCiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2lmX2JvZHlAMTA1CiAgICBmcmFtZV9kaWcgNzAKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExOAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2lmX2JvZHlAMTA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk4MQogICAgLy8gaWYgKGhhc0Nsb3NlICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyA1MAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTgzCiAgICAvLyBjb25zdCBzZW5kZXIgPSB0eFNlbmRlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzID8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgOiB0eFNlbmRlcgogICAgZnJhbWVfZGlnIDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAxMDgKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBmcmFtZV9idXJ5IDMwCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9tZXJnZUAxMDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg0CiAgICAvLyBpZiAoYXNzZXRJZCA9PT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgNDgKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDExMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk4NQogICAgLy8gYW1vdW50ID0gb3AuYmFsYW5jZShzZW5kZXIpCiAgICBmcmFtZV9kaWcgMzAKICAgIGJhbGFuY2UKICAgIGZyYW1lX2J1cnkgNDcKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5OTEKICAgIC8vIGlmIChpc0N1c3RvZGlhbikgewogICAgZnJhbWVfZGlnIDUzCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDExNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDIKICAgIC8vIGNvbnN0IGd1YXJkS2V5ID0geyBjdXN0b2RpYW5Hcm91cElkLCBhc3NldElkIH0KICAgIGZyYW1lX2RpZyA0OAogICAgaXRvYgogICAgZnJhbWVfZGlnIDg0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozODQKICAgIC8vIGFzc2V0R3VhcmRzID0gQm94TWFwPHsgY3VzdG9kaWFuR3JvdXBJZDogdWludDY0OyBhc3NldElkOiB1aW50NjQgfSwgQXNzZXRHdWFyZD4oeyBrZXlQcmVmaXg6ICdhZycgfSkKICAgIGJ5dGVjIDIwIC8vICJhZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0MwogICAgLy8gYXNzZXJ0KHRoaXMuYXNzZXRHdWFyZHMoZ3VhcmRLZXkpLmV4aXN0cywgJ25vIGd1YXJkIGZvciBjdXN0b2RpYW4rYXNzZXQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm8gZ3VhcmQgZm9yIGN1c3RvZGlhbithc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDQKICAgIC8vIGlmIChhbW91bnQgPT09IFVpbnQ2NCgwKSkgcmV0dXJuCiAgICBmcmFtZV9kaWcgNDcKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDUKICAgIC8vIGNvbnN0IGd1YXJkID0gY2xvbmUodGhpcy5hc3NldEd1YXJkcyhndWFyZEtleSkudmFsdWUpCiAgICBmcmFtZV9kaWcgMTQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQ2CiAgICAvLyBhc3NlcnQoZ3VhcmQubG9ja2VkQW1vdW50ID49IGFtb3VudCwgJ2V4Y2VlZHMgZ3VhcmQgYWxsb2NhdGlvbicpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfZGlnIDQ3CiAgICBkdXAKICAgIGNvdmVyIDMKICAgID49CiAgICBhc3NlcnQgLy8gZXhjZWVkcyBndWFyZCBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0NwogICAgLy8gZ3VhcmQubG9ja2VkQW1vdW50ID0gZ3VhcmQubG9ja2VkQW1vdW50IC0gYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0Ny0xMDQ4CiAgICAvLyBndWFyZC5sb2NrZWRBbW91bnQgPSBndWFyZC5sb2NrZWRBbW91bnQgLSBhbW91bnQKICAgIC8vIHRoaXMuYXNzZXRHdWFyZHMoZ3VhcmRLZXkpLnZhbHVlID0gY2xvbmUoZ3VhcmQpCiAgICBpbnRjXzIgLy8gOAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5OTIKICAgIC8vIHRoaXMuX2RlZHVjdEZyb21HdWFyZChncm91cElkLCBhc3NldElkLCBhbW91bnQpCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExOAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIyMQogICAgLy8gaWYgKGFtb3VudCA9PT0gVWludDY0KDApKSByZXR1cm4gZ3JvdXAKICAgIGZyYW1lX2RpZyA0NwogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIyMwogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZnJhbWVfYnVyeSA1OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMjUKICAgIC8vIGlmIChncm91cC5kYWlseUxpbWl0ICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyA4NgogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMjYKICAgIC8vIGlmIChub3cgLSBncm91cC5kYWlseVBlcmlvZFN0YXJ0ID49IERBWV9TRUNPTkRTKSB7CiAgICBmcmFtZV9kaWcgODYKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgNTgKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgID49CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjI3CiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZnJhbWVfZGlnIDg2CiAgICBzd2FwCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMjgKICAgIC8vIGdyb3VwLmRhaWx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGZyYW1lX2RpZyA1OAogICAgaXRvYgogICAgcmVwbGFjZTIgNTgKICAgIGZyYW1lX2J1cnkgODYKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIwOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjMwCiAgICAvLyBhc3NlcnQoZ3JvdXAuZGFpbHlVc2FnZSArIGFtb3VudCA8PSBncm91cC5kYWlseUxpbWl0LCAnZGFpbHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDg2CiAgICBkdXAKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgNDcKICAgICsKICAgIGRpZyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gZGFpbHkgbGltaXQgZXhjZWVkZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjMxCiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gZ3JvdXAuZGFpbHlVc2FnZSArIGFtb3VudAogICAgaXRvYgogICAgcmVwbGFjZTIgNTAKICAgIGZyYW1lX2J1cnkgODYKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjM0CiAgICAvLyBpZiAoZ3JvdXAubW9udGhseUxpbWl0ICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyA4NgogICAgcHVzaGludCA2NiAvLyA2NgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzUKICAgIC8vIGlmIChub3cgLSBncm91cC5tb250aGx5UGVyaW9kU3RhcnQgPj0gTU9OVEhfU0VDT05EUykgewogICAgZnJhbWVfZGlnIDg2CiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDU4CiAgICBzd2FwCiAgICAtCiAgICBwdXNoaW50IDI1OTIwMDAgLy8gMjU5MjAwMAogICAgPj0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzYKICAgIC8vIGdyb3VwLm1vbnRobHlVc2FnZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyA4NgogICAgc3dhcAogICAgcmVwbGFjZTIgNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjM3CiAgICAvLyBncm91cC5tb250aGx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGZyYW1lX2RpZyA1OAogICAgaXRvYgogICAgcmVwbGFjZTIgODIKICAgIGZyYW1lX2J1cnkgODYKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjM5CiAgICAvLyBhc3NlcnQoZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50IDw9IGdyb3VwLm1vbnRobHlMaW1pdCwgJ21vbnRobHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDg2CiAgICBkdXAKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgNDcKICAgICsKICAgIGRpZyAxCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gbW9udGhseSBsaW1pdCBleGNlZWRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNDAKICAgIC8vIGdyb3VwLm1vbnRobHlVc2FnZSA9IGdyb3VwLm1vbnRobHlVc2FnZSArIGFtb3VudAogICAgaXRvYgogICAgcmVwbGFjZTIgNzQKICAgIGZyYW1lX2J1cnkgODYKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTE4CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDExMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5ODcKICAgIC8vIGNvbnN0IFtiYWxdID0gb3AuQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZShzZW5kZXIsIGFzc2V0SWQpCiAgICBmcmFtZV9kaWcgMzAKICAgIGZyYW1lX2RpZyA0OAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIGZyYW1lX2J1cnkgNDcKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTEzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAxMDg6CiAgICBmcmFtZV9kaWcgMzIKICAgIGZyYW1lX2J1cnkgMzAKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMTA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDIKICAgIC8vIGdyb3VwLmxhc3RFeGVjdXRpb25Sb3VuZCA9IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgODYKICAgIHN3YXAKICAgIHJlcGxhY2UyIDk4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwMwogICAgLy8gdGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGZyYW1lX2RpZyA4NQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDA2CiAgICAvLyBsZXQgdHhJbmRleCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNzEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDA3CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNjIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDcKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNjIKICAgIGZyYW1lX2RpZyA2MAogICAgPD0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxNDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDA4CiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgNjIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDA5CiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTAgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwOQogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQ1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxMAogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxNwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyOQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDExCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1NAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxMC0xMDExCiAgICAvLyBjb25zdCBwYXlsb2FkID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDE3CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxMQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDU0CiAgICA+CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDEzCiAgICAvLyBjb25zdCBmaXJzdCA9IHR4SW5kZXggPT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIDcxCiAgICAhCiAgICBmcmFtZV9idXJ5IDQ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxNAogICAgLy8gaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfUEFZTUVOVCkgewogICAgaW50Y18zIC8vIDIKICAgIGZyYW1lX2RpZyA1NAogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDc0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxNQogICAgLy8gdGhpcy5fc3RhZ2VQYXltZW50KGRlY29kZUFyYzQ8UGF5bWVudFR4bj4oZW50cnkuZGF0YSksIGZpcnN0KQogICAgZnJhbWVfZGlnIDI5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDU0CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA2NwogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDkKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA2OAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpKQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDY5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDcwCiAgICAvLyB0aGlzLl9zZXRTZW5kZXJJZlNldCh0eC5zZW5kZXIpCiAgICBkdXAKICAgIGV4dHJhY3QgMiAzMgogICAgY2FsbHN1YiBfc2V0U2VuZGVySWZTZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDcxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFJlY2VpdmVyKHR4LnJlY2VpdmVyKQogICAgZHVwCiAgICBleHRyYWN0IDM0IDMyCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3MgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBbW91bnQodHguYW1vdW50KQogICAgZHVwCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDczCiAgICAvLyBpZiAodHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSkgb3AuSVR4bkNyZWF0ZS5zZXRDbG9zZVJlbWFpbmRlclRvKHR4LmNsb3NlUmVtYWluZGVyVG8pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjAwCiAgICBmcmFtZV9kaWcgMgogICAgZXh0cmFjdCA4MiAzMgogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMDA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3NAogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBmcmFtZV9kaWcgMzEKICAgIGR1cAogICAgcHVzaGludCAxMTIgLy8gMTEyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNwogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MwogICAgZnJhbWVfZGlnIDM3CiAgICBpdHhuX2ZpZWxkIE5vdGUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI3CiAgICAvLyB0eEluZGV4ID0gdHhJbmRleCArIFVpbnQ2NCgxKQogICAgZnJhbWVfZGlnIDcxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA3MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTEKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA1NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxMjUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTYKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BU1NFVCkgewogICAgZnJhbWVfZGlnIDc0CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxNwogICAgLy8gdGhpcy5fc3RhZ2VBc3NldChkZWNvZGVBcmM0PEFzc2V0VHhuPihlbnRyeS5kYXRhKSwgZmlyc3QpCiAgICBmcmFtZV9kaWcgMjkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTQKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDc4CiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA0OQogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDc5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXNzZXRUcmFuc2ZlcikpCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0RmVlKFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODEKICAgIC8vIHRoaXMuX3NldFNlbmRlcklmU2V0KHR4LnNlbmRlcikKICAgIGR1cAogICAgZXh0cmFjdCAyIDMyCiAgICBjYWxsc3ViIF9zZXRTZW5kZXJJZlNldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0WGZlckFzc2V0KHR4LnhmZXJBc3NldCkKICAgIGR1cAogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBc3NldFJlY2VpdmVyKHR4LmFzc2V0UmVjZWl2ZXIpCiAgICBkdXAKICAgIGV4dHJhY3QgNDIgMzIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRBbW91bnQodHguYXNzZXRBbW91bnQpCiAgICBkdXAKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4NQogICAgLy8gaWYgKHR4Lmhhc0Fzc2V0Q2xvc2UgIT09IFVpbnQ2NCgwKSkgb3AuSVR4bkNyZWF0ZS5zZXRBc3NldENsb3NlVG8odHguYXNzZXRDbG9zZVRvKQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE5NAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgOTAgMzIKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxOTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4NgogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBmcmFtZV9kaWcgMzEKICAgIGR1cAogICAgcHVzaGludCAxMjAgLy8gMTIwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzOAogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MwogICAgZnJhbWVfZGlnIDM4CiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDE4CiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQVBQKSB7CiAgICBmcmFtZV9kaWcgNzQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDE5CiAgICAvLyB0aGlzLl9zdGFnZUFwcENhbGwoZGVjb2RlQXJjNDxBcHBUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1NAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTEzCiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA0OQogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKSkKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExNQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExNgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbklkKHR4LmFwcElkKQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCAxMCAvLyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTcKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0T25Db21wbGV0aW9uKHR4Lm9uQ29tcGxldGlvbikKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTgKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDQwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNQogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE3OAogICAgZnJhbWVfZGlnIDM1CiAgICBpdHhuX2ZpZWxkIE5vdGUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE3ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFwcEFyZ3MubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE3OToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFwcEFyZ3MubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAzMQogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDEKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDUxCiAgICA+CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjUKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE5LTExMjAKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgLy8gICBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9uQXJncyh0eC5hcHBBcmdzW2ldKQogICAgZnJhbWVfZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNjUKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDUxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTIwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9uQXJncyh0eC5hcHBBcmdzW2ldKQogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExOQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hcHBBcmdzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1MQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE3OQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE4MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTIyCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFjY291bnRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1NQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyMgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDMxCiAgICBkdXAKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDIKICAgIGZyYW1lX2RpZyA0MQogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTUKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTIyLTExMjMKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYWNjb3VudHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIC8vICAgb3AuSVR4bkNyZWF0ZS5zZXRBY2NvdW50cyh0eC5hY2NvdW50c1tpXSkKICAgIGZyYW1lX2RpZyA2CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDU1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjMKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QWNjb3VudHModHguYWNjb3VudHNbaV0pCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyMgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1NgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzEKICAgIGR1cAogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MwogICAgZnJhbWVfZGlnIDQwCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1NgogICAgPgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE4NwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjUtMTEyNgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICAvLyAgIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRzKHR4LmZvcmVpZ25Bc3NldHNbaV0pCiAgICBmcmFtZV9kaWcgNwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1NgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjYKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRzKHR4LmZvcmVpZ25Bc3NldHNbaV0pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI1CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25Bc3NldHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDU2CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTg1CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTg3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjgKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDU3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE4ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI4CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25BcHBzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzEKICAgIGZyYW1lX2RpZyA0MgogICAgZnJhbWVfZGlnIDQzCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1NwogICAgPgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyOC0xMTI5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25BcHBzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICAvLyAgIG9wLklUeG5DcmVhdGUuc2V0QXBwbGljYXRpb25zKHR4LmZvcmVpZ25BcHBzW2ldKQogICAgZnJhbWVfZGlnIDgKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNTcKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9ucyh0eC5mb3JlaWduQXBwc1tpXSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjgKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDU3CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTg4CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDIwCiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfS0VZUkVHKSB7CiAgICBmcmFtZV9kaWcgNzQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDIxCiAgICAvLyB0aGlzLl9zdGFnZUtleVJlZyhkZWNvZGVBcmM0PEtleVJlZ1R4bj4oZW50cnkuZGF0YSksIGZpcnN0KQogICAgZnJhbWVfZGlnIDI5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDU0CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzNAogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDkKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzNQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLktleVJlZ2lzdHJhdGlvbikpCiAgICBpbnRjXzMgLy8gMgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzYKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0RmVlKFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTM3CiAgICAvLyBpZiAodHgub25saW5lICE9PSBVaW50NjQoMCkpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTM4CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVQayh0eC52b3RlS2V5KQogICAgZnJhbWVfZGlnIDMxCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgVm90ZVBLCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzOQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRTZWxlY3Rpb25Qayh0eC5zZWxlY3Rpb25LZXkpCiAgICBkaWcgMQogICAgcHVzaGludCAxMiAvLyAxMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgaXR4bl9maWVsZCBTZWxlY3Rpb25QSwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0U3RhdGVQcm9vZlBrKHR4LnN0YXRlUHJvb2ZLZXkpCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgaXR4bl9maWVsZCBTdGF0ZVByb29mUEsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVGaXJzdCh0eC52b3RlRmlyc3QpCiAgICBmcmFtZV9kaWcgOQogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBWb3RlRmlyc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQyCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVMYXN0KHR4LnZvdGVMYXN0KQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBWb3RlTGFzdAogICAgcHVzaGludCAzMiAvLyAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDMKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Vm90ZUtleURpbHV0aW9uKHR4LnZvdGVLZXlEaWx1dGlvbikKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIFZvdGVLZXlEaWx1dGlvbgogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjIKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BQ0ZHKSB7CiAgICBmcmFtZV9kaWcgNzQKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDIzCiAgICAvLyB0aGlzLl9zdGFnZUFzc2V0Q29uZmlnKGRlY29kZUFyYzQ8QXNzZXRDb25maWdUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1NAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTAKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTUzCiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA0OQogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTU0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXNzZXRDb25maWcpKQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTU1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1NgogICAgLy8gaWYgKHR4LmNvbmZpZ0Fzc2V0ID09PSBVaW50NjQoMCkpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzIKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE2NwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNTcKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRUb3RhbCh0eC50b3RhbCkKICAgIGZyYW1lX2RpZyAxMAogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1OAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldERlY2ltYWxzKHR4LmRlY2ltYWxzKQogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldERlZmF1bHRGcm96ZW4odHguZGVmYXVsdEZyb3plbiAhPT0gVWludDY0KDApKQogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTYwCiAgICAvLyBpZiAodHgudW5pdE5hbWUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0VW5pdE5hbWUoQnl0ZXModHgudW5pdE5hbWUpKQogICAgZnJhbWVfZGlnIDMxCiAgICBkdXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0NAogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNgogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2MQogICAgZnJhbWVfZGlnIDM2CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTYxCiAgICAvLyBpZiAodHguYXNzZXROYW1lICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldE5hbWUoQnl0ZXModHguYXNzZXROYW1lKSkKICAgIGZyYW1lX2RpZyAzMQogICAgZHVwCiAgICBwdXNoaW50IDM2IC8vIDM2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQ1CiAgICBmcmFtZV9kaWcgNDQKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzgKICAgIGJ5dGVjXzEgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjMKICAgIGZyYW1lX2RpZyAzOAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTYyCiAgICAvLyBpZiAodHgudXJsICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldFVybChCeXRlcyh0eC51cmwpKQogICAgZnJhbWVfZGlnIDMxCiAgICBkdXAKICAgIHB1c2hpbnQgMzggLy8gMzgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDYKICAgIGZyYW1lX2RpZyA0NQogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzOQogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2NQogICAgZnJhbWVfZGlnIDM5CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2MwogICAgLy8gaWYgKHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgzMikpIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRNZXRhZGF0YUhhc2godHgubWV0YWRhdGFIYXNoKQogICAgZnJhbWVfZGlnIDMxCiAgICBkdXAKICAgIHB1c2hpbnQgMTY4IC8vIDE2OAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyA0NgogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMwogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTY4CiAgICBmcmFtZV9kaWcgMzMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNZXRhZGF0YUhhc2gKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTY3CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0TWFuYWdlcih0eC5tYW5hZ2VyKQogICAgZnJhbWVfZGlnIDEwCiAgICBkdXAKICAgIGV4dHJhY3QgNDIgMzIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2OAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldFJlc2VydmUodHgucmVzZXJ2ZSkKICAgIGR1cAogICAgZXh0cmFjdCA3NCAzMgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTY5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0RnJlZXplKHR4LmZyZWV6ZSkKICAgIGR1cAogICAgZXh0cmFjdCAxMDYgMzIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRGcmVlemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTcwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0Q2xhd2JhY2sodHguY2xhd2JhY2spCiAgICBleHRyYWN0IDEzOCAzMgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldENsYXdiYWNrCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE3MQogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBmcmFtZV9kaWcgMzEKICAgIGR1cAogICAgcHVzaGludCAxNjggLy8gMTY4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNAogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MwogICAgZnJhbWVfZGlnIDM0CiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE2NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTY1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0KHR4LmNvbmZpZ0Fzc2V0KQogICAgZnJhbWVfZGlnIDcyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2OAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyNAogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1JFS0VZKSB7CiAgICBmcmFtZV9kaWcgNzQKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyNQogICAgLy8gdGhpcy5fc3RhZ2VSZWtleShkZWNvZGVBcmM0PFJla2V5VHhuPihlbnRyeS5kYXRhKSwgZmlyc3QpCiAgICBmcmFtZV9kaWcgMjkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTQKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDExCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5NQogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDkKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5NgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpKQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDk3CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDk4CiAgICAvLyB0aGlzLl9zZXRTZW5kZXJJZlNldCh0eC5zZW5kZXIpCiAgICBleHRyYWN0IDIgMzIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGNhbGxzdWIgX3NldFNlbmRlcklmU2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5OQogICAgLy8gY29uc3Qgc2VsZkFkZHIgPSB0eC5zZW5kZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcyA/IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIDogdHguc2VuZGVyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAxNTMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9tZXJnZUAxNTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwMAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRSZWNlaXZlcihzZWxmQWRkcikKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTAxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFtb3VudChVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTAyCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFJla2V5VG8odHgucmVrZXlUbykKICAgIGZyYW1lX2RpZyAxMQogICAgZXh0cmFjdCAzNCAzMgogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwMwogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBmcmFtZV9kaWcgMzEKICAgIGR1cAogICAgcHVzaGludCA2NCAvLyA2NAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzYKICAgIGJ5dGVjXzEgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDMKICAgIGZyYW1lX2RpZyAzNgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAMTUzOgogICAgZnJhbWVfZGlnIDAKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMTU0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwNwogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBudW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA2MgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNjIKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxMjIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxNDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzMgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1OQogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gU1RBVFVTX0VYRUNVVEVECiAgICBwdXNoaW50IDMgLy8gMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1OS04NjAKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9IFNUQVRVU19FWEVDVVRFRAogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZShwcm9wb3NhbCkKICAgIGZyYW1lX2RpZyA4MQogICAgaW50Y18yIC8vIDgKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjEKICAgIC8vIGVtaXQ8UHJvcG9zYWxFeGVjdXRlZD4oeyBwcm9wb3NhbElkIH0pCiAgICBwdXNoYnl0ZXMgMHgzNWM2N2VmZCAvLyBtZXRob2QgIlByb3Bvc2FsRXhlY3V0ZWQodWludDY0KSIKICAgIGZyYW1lX2RpZyA4MAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3NwogICAgLy8gYWRtaW5QYXlsb2FkcyA9IEJveE1hcDx1aW50NjQsIEFkbWluQ2hhbmdlPih7IGtleVByZWZpeDogJ2RwJyB9KQogICAgYnl0ZWMgMTYgLy8gImRwIgogICAgZnJhbWVfZGlnIDgwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0NwogICAgLy8gY29uc3QgY2hhbmdlID0gY2xvbmUodGhpcy5hZG1pblBheWxvYWRzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDE5CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1MAogICAgLy8gaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fRElTU09MVkVfQ1VTVE9ESUFOKSB7CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzUKICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgID09CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjMKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTEKICAgIC8vIGFzc2VydChncm91cC5ncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTiwgJ3Byb3Bvc2luZyBncm91cCBtdXN0IGJlIGN1c3RvZGlhbicpCiAgICBmcmFtZV9kaWcgODUKICAgIHB1c2hpbnQgMTIyIC8vIDEyMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBwcm9wb3NpbmcgZ3JvdXAgbXVzdCBiZSBjdXN0b2RpYW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTIKICAgIC8vIGFzc2VydChjaGFuZ2UudGFyZ2V0R3JvdXBJZCA9PT0gcHJvcG9zYWwuZ3JvdXBJZCwgJ2NhbiBvbmx5IGRpc3NvbHZlIG93biBncm91cCcpCiAgICBmcmFtZV9kaWcgMTYKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBmcmFtZV9kaWcgODMKICAgID09CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgZGlzc29sdmUgb3duIGdyb3VwCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzAyCiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9DUkVBVEVfR1JPVVApIHsKICAgIGZyYW1lX2RpZyA3NQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwMwogICAgLy8gdGhpcy5fY3JlYXRlR3JvdXAoY2hhbmdlLCBHVF9TVEFOREFSRCkKICAgIGZyYW1lX2RpZyAxOQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgX2NyZWF0ZUdyb3VwCiAgICBwb3AKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwNAogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0FERF9NRU1CRVIpIHsKICAgIGZyYW1lX2RpZyA3NQogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwOAogICAgLy8gY29uc3QgZ2lkID0gY2hhbmdlLnRhcmdldEdyb3VwSWQKICAgIGZyYW1lX2RpZyAxNgogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTEKICAgIC8vIGFzc2VydChjaGFuZ2UubWVtYmVyQWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnbWVtYmVyIHJlcXVpcmVkJykKICAgIGRpZyAxCiAgICBwdXNoaW50cyAxOCAzMiAvLyAxOCwgMzIKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBtZW1iZXIgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTEyCiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnYWxyZWFkeSBhIG1lbWJlcicpCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTIKICAgIC8vIGFzc2VydCghdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdhbHJlYWR5IGEgbWVtYmVyJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBhIG1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTQKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlLCBsYWJlbDogY2hhbmdlLm1lbWJlckxhYmVsLCBhZGRyOiBjaGFuZ2UubWVtYmVyQWRkciB9CiAgICB1bmNvdmVyIDQKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZnJhbWVfZGlnIDE5CiAgICBkdXAKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaXRvYgogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgYnl0ZWMgMTcgLy8gMHgwMDJhCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTE1CiAgICAvLyB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGRpZyAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTctMTUxOAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCArIFVpbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTE4CiAgICAvLyBncm91cC5tZW1iZXJDb3VudCA9IGdyb3VwLm1lbWJlckNvdW50ICsgVWludDY0KDEpCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTctMTUxOQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCArIFVpbnQ2NCgxKQogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgcHVzaGludCAxMCAvLyAxMAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTIxCiAgICAvLyBlbWl0PE1lbWJlckFkZGVkPih7IGdyb3VwSWQ6IGdpZCwgbWVtYmVyOiBjaGFuZ2UubWVtYmVyQWRkciwgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlIH0pCiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMDYKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfTUVNQkVSKSB7CiAgICBmcmFtZV9kaWcgNzUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MzEKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBmcmFtZV9kaWcgMTYKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTMyCiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdub3QgYSBtZW1iZXInKQogICAgc3dhcAogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUzMgogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnbm90IGEgbWVtYmVyJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUzNAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MzQtMTUzNQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTM1CiAgICAvLyBhc3NlcnQoZ3JvdXAubWVtYmVyQ291bnQgLSBVaW50NjQoMSkgPj0gZ3JvdXAudGhyZXNob2xkLCAnd291bGQgZHJvcCBiZWxvdyB0aHJlc2hvbGQnKQogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTM0LTE1MzUKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MzUKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBidG9pCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyB3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MzcKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZGVsZXRlKCkKICAgIHVuY292ZXIgMwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUzOAogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTM5CiAgICAvLyBncm91cC5tZW1iZXJzaGlwRXBvY2ggPSBncm91cC5tZW1iZXJzaGlwRXBvY2ggKyBVaW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1NDAKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTQyCiAgICAvLyBlbWl0PE1lbWJlclJlbW92ZWQ+KHsgZ3JvdXBJZDogZ2lkLCBtZW1iZXI6IGNoYW5nZS5tZW1iZXJBZGRyIH0pCiAgICBwdXNoYnl0ZXMgMHgyYjE0YzJjMSAvLyBtZXRob2QgIk1lbWJlclJlbW92ZWQodWludDY0LGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMwOAogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0FERF9SRUtFWUVEX0FERFIpIHsKICAgIGZyYW1lX2RpZyA3NQogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxMQogICAgLy8gYXNzZXJ0KGNoYW5nZS5tZW1iZXJBZGRyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdhZGRyZXNzIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAxNgogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgZHVwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYWRkcmVzcyByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgMTUgLy8gInIiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxMgogICAgLy8gYXNzZXJ0KCF0aGlzLnJla2V5ZWRBZGRyZXNzZXMoY2hhbmdlLm1lbWJlckFkZHIpLmV4aXN0cywgJ2FscmVhZHkgcmVnaXN0ZXJlZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTMKICAgIC8vIGNvbnN0IGVudHJ5OiBSZWtleWVkQWRkcmVzcyA9IHsgbGFiZWw6IGNoYW5nZS5tZW1iZXJMYWJlbCwgYWRkZWRSb3VuZDogR2xvYmFsLnJvdW5kIH0KICAgIGZyYW1lX2RpZyAxOQogICAgZHVwCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlYyAyMyAvLyAweDAwMGEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTQKICAgIC8vIHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikudmFsdWUgPSBjbG9uZShlbnRyeSkKICAgIGRpZyAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTUKICAgIC8vIGVtaXQ8UmVrZXllZEFkZHJlc3NBZGRlZD4oeyBhZGRyOiBjaGFuZ2UubWVtYmVyQWRkciwgbGFiZWw6IGNoYW5nZS5tZW1iZXJMYWJlbCB9KQogICAgc3dhcAogICAgYnl0ZWMgMTQgLy8gMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjQgLy8gbWV0aG9kICJSZWtleWVkQWRkcmVzc0FkZGVkKGFkZHJlc3Msc3RyaW5nKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTYKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfUkVLRVlFRF9BRERSKSB7CiAgICBmcmFtZV9kaWcgNzUKICAgIHB1c2hpbnQgOSAvLyA5CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTcKICAgIC8vIGFzc2VydCh0aGlzLnJla2V5ZWRBZGRyZXNzZXMoY2hhbmdlLm1lbWJlckFkZHIpLmV4aXN0cywgJ25vdCByZWdpc3RlcmVkJykKICAgIGZyYW1lX2RpZyAxNgogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgMTUgLy8gInIiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxNwogICAgLy8gYXNzZXJ0KHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZXhpc3RzLCAnbm90IHJlZ2lzdGVyZWQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTgKICAgIC8vIHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTkKICAgIC8vIGVtaXQ8UmVrZXllZEFkZHJlc3NSZW1vdmVkPih7IGFkZHI6IGNoYW5nZS5tZW1iZXJBZGRyIH0pCiAgICBwdXNoYnl0ZXMgMHhkYjRjYTUyYSAvLyBtZXRob2QgIlJla2V5ZWRBZGRyZXNzUmVtb3ZlZChhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjAKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9DSEFOR0VfVEhSRVNIT0xEKSB7CiAgICBmcmFtZV9kaWcgNzUKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjEKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE2CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzI0CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA+PSBVaW50NjQoMSksICd0aHJlc2hvbGQgbXVzdCBiZSBhdCBsZWFzdCAxJykKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2MCAvLyA2MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIHRocmVzaG9sZCBtdXN0IGJlIGF0IGxlYXN0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzI1CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA8PSBncm91cC5tZW1iZXJDb3VudCwgJ3RocmVzaG9sZCBleGNlZWRzIG1lbWJlcnMnKQogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgPD0KICAgIGFzc2VydCAvLyB0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMyNi0xMzI3CiAgICAvLyBncm91cC50aHJlc2hvbGQgPSBjaGFuZ2UudGhyZXNob2xkCiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGludGNfMyAvLyAyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjgKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyAxMiAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMzE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMyOQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QT0xJQ1kpIHsKICAgIGZyYW1lX2RpZyA3NQogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDM1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzMAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBmcmFtZV9kaWcgMTYKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzMKICAgIC8vIHRoaXMuX2Fzc2VydEN1c3RvZGlhbkFjdGlvbnMoZ3JvdXAuZ3JvdXBUeXBlLCBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMpCiAgICBkaWcgMQogICAgcHVzaGludCAxMjIgLy8gMTIyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAzCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgYnRvaQogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY2FsbHN1YiBfYXNzZXJ0Q3VzdG9kaWFuQWN0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzUKICAgIC8vIGFzc2VydChjaGFuZ2UuYWxsb3dlZEFjdGlvbnMgPD0gQUNUX0FMTCwgJ2ludmFsaWQgYWN0aW9ucycpCiAgICBwdXNoaW50IDYzIC8vIDYzCiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgYWN0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzYKICAgIC8vIGNvbnN0IGFzc2V0Q2hhbmdlZCA9IGdyb3VwLmxpbWl0QXNzZXRJZCAhPT0gY2hhbmdlLmxpbWl0QXNzZXRJZAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDM0IC8vIDM0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAzCiAgICBwdXNoaW50IDg0IC8vIDg0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGR1cAogICAgYnRvaQogICAgdW5jb3ZlciAyCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzcKICAgIC8vIGdyb3VwLmFsbG93ZWRBY3Rpb25zID0gY2hhbmdlLmFsbG93ZWRBY3Rpb25zCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgcmVwbGFjZTIgMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzM4CiAgICAvLyBncm91cC5saW1pdEFzc2V0SWQgPSBjaGFuZ2UubGltaXRBc3NldElkCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UyIDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzOQogICAgLy8gZ3JvdXAuZGFpbHlMaW1pdCA9IGNoYW5nZS5kYWlseUxpbWl0CiAgICBkaWcgMgogICAgcHVzaGludCA5MiAvLyA5MgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA0MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDAKICAgIC8vIGdyb3VwLm1vbnRobHlMaW1pdCA9IGNoYW5nZS5tb250aGx5TGltaXQKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgcmVwbGFjZTIgNjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQxCiAgICAvLyBncm91cC5jb29sZG93blJvdW5kcyA9IGNoYW5nZS5jb29sZG93blJvdW5kcwogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDEwOCAvLyAxMDgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgcmVwbGFjZTIgOTAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQyCiAgICAvLyBpZiAoYXNzZXRDaGFuZ2VkKSB7CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAzNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDQKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQ1CiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQ2CiAgICAvLyBncm91cC5kYWlseVBlcmlvZFN0YXJ0ID0gbm93CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICByZXBsYWNlMiA1OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDcKICAgIC8vIGdyb3VwLm1vbnRobHlVc2FnZSA9IFVpbnQ2NCgwKQogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMiA3NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDgKICAgIC8vIGdyb3VwLm1vbnRobHlQZXJpb2RTdGFydCA9IG5vdwogICAgc3dhcAogICAgcmVwbGFjZTIgODIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTAKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZnJhbWVfZGlnIDE4CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTEKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyAxMiAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgZnJhbWVfZGlnIDIxCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAzNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzUyCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BSSVZJTEVHRVMpIHsKICAgIGZyYW1lX2RpZyA3NQogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1MwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBmcmFtZV9kaWcgMTYKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1MwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1NQogICAgLy8gYXNzZXJ0KGdyb3VwLmdyb3VwVHlwZSA9PT0gR1RfU1RBTkRBUkQsICdjYW5ub3Qgc2V0IHByaXZpbGVnZXMgb24gY3VzdG9kaWFuIGdyb3VwcycpCiAgICBzd2FwCiAgICBwdXNoaW50IDEyMiAvLyAxMjIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIGNhbm5vdCBzZXQgcHJpdmlsZWdlcyBvbiBjdXN0b2RpYW4gZ3JvdXBzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1NwogICAgLy8gYXNzZXJ0KGNoYW5nZS5hZG1pblByaXZpbGVnZXMgPD0gUFJJVl9BTEwsICdpbnZhbGlkIHByaXZpbGVnZXMnKQogICAgc3dhcAogICAgcHVzaGludCA2OCAvLyA2OAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBwdXNoaW50IDcgLy8gNwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHByaXZpbGVnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU4CiAgICAvLyBhc3NlcnQoIXRoaXMuX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlLCBncm91cCksICdtdXN0IGtlZXAgYXQgbGVhc3Qgb25lIGFjdGl2ZSBncm91cCBhZG1pbicpCiAgICBmcmFtZV9kaWcgMTkKICAgIHN3YXAKICAgIGNhbGxzdWIgX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4KICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAyNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDE5CiAgICAhCiAgICBhc3NlcnQgLy8gbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU5CiAgICAvLyBjb25zdCBoYWRHcm91cFByaXYgPSAoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKQogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGZyYW1lX2J1cnkgNjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzYwCiAgICAvLyBjb25zdCB3aWxsSGF2ZUdyb3VwUHJpdiA9IChjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKQogICAgZGlnIDEKICAgIGV4dHJhY3QgNjggOAogICAgZnJhbWVfYnVyeSAxCiAgICBzd2FwCiAgICBwdXNoaW50IDY4IC8vIDY4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGZyYW1lX2J1cnkgNjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzYxCiAgICAvLyBpZiAoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCkgJiYgaGFkR3JvdXBQcml2ICYmICF3aWxsSGF2ZUdyb3VwUHJpdikgewogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDc2CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQyCiAgICBmcmFtZV9kaWcgNjYKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANDIKICAgIGZyYW1lX2RpZyA2NwogICAgYm56IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzYyCiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18yIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjIKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18yIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjIKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2NgogICAgLy8gZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzID0gY2hhbmdlLmFkbWluUHJpdmlsZWdlcwogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9kaWcgMQogICAgcmVwbGFjZTIgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzY3CiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGZyYW1lX2RpZyAxOQogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjcKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjgKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyAxMiAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2MwogICAgLy8gfSBlbHNlIGlmIChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSAmJiAhaGFkR3JvdXBQcml2ICYmIHdpbGxIYXZlR3JvdXBQcml2KSB7CiAgICBmcmFtZV9kaWcgNzYKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQ3CiAgICBmcmFtZV9kaWcgNjYKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NwogICAgZnJhbWVfZGlnIDY3CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjQKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2NAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2NAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQ3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQ4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNjkKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfQUNUSVZFKSB7CiAgICBmcmFtZV9kaWcgNzUKICAgIHB1c2hpbnQgNyAvLyA3CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA2MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE2CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDI2CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzAtMTM3MQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICAvLyBjb25zdCB3YXNBY3RpdmUgPSBncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKQogICAgZHVwCiAgICBwdXNoaW50IDExNCAvLyAxMTQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzEKICAgIC8vIGNvbnN0IHdhc0FjdGl2ZSA9IGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDc3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3MgogICAgLy8gY29uc3Qgd2lsbEJlQWN0aXZlID0gY2hhbmdlLmFjdGl2ZUZsYWcgIT09IFVpbnQ2NCgwKQogICAgc3dhcAogICAgcHVzaGludCAxMTYgLy8gMTE2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3OAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBmcmFtZV9idXJ5IDc5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3MwogICAgLy8gaWYgKGdyb3VwLmdyb3VwVHlwZSAhPT0gR1RfQ1VTVE9ESUFOKSB7CiAgICBwdXNoaW50IDEyMiAvLyAxMjIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA2MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzQKICAgIC8vIGFzc2VydCghdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGdyb3VwKSwgJ211c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluJykKICAgIGZyYW1lX2RpZyAxOQogICAgZnJhbWVfZGlnIDI2CiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMjYKICAgIGZyYW1lX2J1cnkgMTkKICAgICEKICAgIGFzc2VydCAvLyBtdXN0IGtlZXAgYXQgbGVhc3Qgb25lIGFjdGl2ZSBncm91cCBhZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzUKICAgIC8vIGNvbnN0IGhhc0dyb3VwUHJpdiA9IChncm91cC5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzYKICAgIC8vIGlmIChoYXNHcm91cFByaXYgJiYgd2FzQWN0aXZlICYmICF3aWxsQmVBY3RpdmUpIHsKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANTYKICAgIGZyYW1lX2RpZyA3NwogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA1NgogICAgZnJhbWVfZGlnIDc4CiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzcKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIC0gVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3NwogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3NwogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA2MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzgyCiAgICAvLyBncm91cC5hY3RpdmUgPSB3aWxsQmVBY3RpdmUgPyBVaW50NjQoMSkgOiBVaW50NjQoMCkKICAgIGZyYW1lX2RpZyA3OQogICAgaXRvYgogICAgZnJhbWVfZGlnIDI2CiAgICBzd2FwCiAgICByZXBsYWNlMiAxMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzgzCiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGZyYW1lX2RpZyAxOQogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzODMKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzODQKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyAxMiAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3OAogICAgLy8gfSBlbHNlIGlmIChoYXNHcm91cFByaXYgJiYgIXdhc0FjdGl2ZSAmJiB3aWxsQmVBY3RpdmUpIHsKICAgIGZyYW1lX2RpZyA2OAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANjIKICAgIGZyYW1lX2RpZyA3NwogICAgYm56IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDYyCiAgICBmcmFtZV9kaWcgNzgKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDYyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3OQogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzc5CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzc5CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANjIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4NQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0NSRUFURV9DVVNUT0RJQU4pIHsKICAgIGZyYW1lX2RpZyA3NQogICAgcHVzaGludCAxMSAvLyAxMQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzg2CiAgICAvLyB0aGlzLl9jcmVhdGVHcm91cChjaGFuZ2UsIEdUX0NVU1RPRElBTikKICAgIGZyYW1lX2RpZyAxOQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgX2NyZWF0ZUdyb3VwCiAgICBwb3AKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4NwogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0RJU1NPTFZFX0NVU1RPRElBTikgewogICAgZnJhbWVfZGlnIDYzCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDcxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5MQogICAgLy8gY29uc3QgZ2lkID0gY2hhbmdlLnRhcmdldEdyb3VwSWQKICAgIGZyYW1lX2RpZyAxNgogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzOTIKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5Mi0xMzkzCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoZ3JvdXAuZ3VhcmRDb3VudCA9PT0gVWludDY0KDApLCAncmVtb3ZlIGFsbCBndWFyZHMgYmVmb3JlIGRpc3NvbHZpbmcnKQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTMwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzkzCiAgICAvLyBhc3NlcnQoZ3JvdXAuZ3VhcmRDb3VudCA9PT0gVWludDY0KDApLCAncmVtb3ZlIGFsbCBndWFyZHMgYmVmb3JlIGRpc3NvbHZpbmcnKQogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIHJlbW92ZSBhbGwgZ3VhcmRzIGJlZm9yZSBkaXNzb2x2aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5OAogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50ID09PSBVaW50NjQoMSksICdyZW1vdmUgb3RoZXIgbWVtYmVycyBiZWZvcmUgZGlzc29sdmluZycpCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gcmVtb3ZlIG90aGVyIG1lbWJlcnMgYmVmb3JlIGRpc3NvbHZpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzk5CiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdtZW1iZXJBZGRyIG11c3QgYmUgdGhlIGxhc3QgbWVtYmVyJykKICAgIHVuY292ZXIgMgogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5OQogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnbWVtYmVyQWRkciBtdXN0IGJlIHRoZSBsYXN0IG1lbWJlcicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG1lbWJlckFkZHIgbXVzdCBiZSB0aGUgbGFzdCBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDAwCiAgICAvLyB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDAxCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDAyCiAgICAvLyBpZiAodGhpcy5ncm91cENvdW50LnZhbHVlID4gVWludDY0KDApKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWNfMyAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDAyCiAgICAvLyBpZiAodGhpcy5ncm91cENvdW50LnZhbHVlID4gVWludDY0KDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDAzCiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlY18zIC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDMKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlY18zIC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDMKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDcwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDUKICAgIC8vIGVtaXQ8Q3VzdG9kaWFuR3JvdXBEaXNzb2x2ZWQ+KHsgZ3JvdXBJZDogZ2lkIH0pCiAgICBwdXNoYnl0ZXMgMHhjYzZjYmE5NiAvLyBtZXRob2QgIkN1c3RvZGlhbkdyb3VwRGlzc29sdmVkKHVpbnQ2NCkiCiAgICBmcmFtZV9kaWcgMjAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDcxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDYKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfR1VBUkQpIHsKICAgIGZyYW1lX2RpZyA3NQogICAgcHVzaGludCAxMyAvLyAxMwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDA3CiAgICAvLyBjb25zdCBnaWQgPSBjaGFuZ2UudGFyZ2V0R3JvdXBJZAogICAgZnJhbWVfZGlnIDE2CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQwOAogICAgLy8gY29uc3QgYXNzZXRJZCA9IGNoYW5nZS5saW1pdEFzc2V0SWQgIC8vIGxpbWl0QXNzZXRJZCBkb3VibGVzIGFzIGd1YXJkIGFzc2V0SWQKICAgIHN3YXAKICAgIHB1c2hpbnQgODQgLy8gODQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDkKICAgIC8vIGNvbnN0IHRhcmdldCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDktMTQxMAogICAgLy8gY29uc3QgdGFyZ2V0ID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGFzc2VydCh0YXJnZXQuZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4sICd0YXJnZXQgbXVzdCBiZSBhIGN1c3RvZGlhbiBncm91cCcpCiAgICBwdXNoaW50IDEyMiAvLyAxMjIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MTAKICAgIC8vIGFzc2VydCh0YXJnZXQuZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4sICd0YXJnZXQgbXVzdCBiZSBhIGN1c3RvZGlhbiBncm91cCcpCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyB0YXJnZXQgbXVzdCBiZSBhIGN1c3RvZGlhbiBncm91cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MTEKICAgIC8vIGNvbnN0IGd1YXJkS2V5ID0geyBjdXN0b2RpYW5Hcm91cElkOiBnaWQsIGFzc2V0SWQgfQogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozODQKICAgIC8vIGFzc2V0R3VhcmRzID0gQm94TWFwPHsgY3VzdG9kaWFuR3JvdXBJZDogdWludDY0OyBhc3NldElkOiB1aW50NjQgfSwgQXNzZXRHdWFyZD4oeyBrZXlQcmVmaXg6ICdhZycgfSkKICAgIGJ5dGVjIDIwIC8vICJhZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxMgogICAgLy8gaWYgKHRoaXMuYXNzZXRHdWFyZHMoZ3VhcmRLZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxNQogICAgLy8gZ3VhcmQubG9ja2VkQW1vdW50ID0gY2hhbmdlLmd1YXJkQW1vdW50CiAgICBmcmFtZV9kaWcgMTYKICAgIHB1c2hpbnQgMTI0IC8vIDEyNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxNC0xNDE2CiAgICAvLyBjb25zdCBndWFyZCA9IGNsb25lKHRoaXMuYXNzZXRHdWFyZHMoZ3VhcmRLZXkpLnZhbHVlKQogICAgLy8gZ3VhcmQubG9ja2VkQW1vdW50ID0gY2hhbmdlLmd1YXJkQW1vdW50CiAgICAvLyB0aGlzLmFzc2V0R3VhcmRzKGd1YXJkS2V5KS52YWx1ZSA9IGNsb25lKGd1YXJkKQogICAgaW50Y18yIC8vIDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA3NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDI0CiAgICAvLyBlbWl0PEFzc2V0R3VhcmRTZXQ+KHsgY3VzdG9kaWFuR3JvdXBJZDogZ2lkLCBhc3NldElkLCBsb2NrZWRBbW91bnQ6IGNoYW5nZS5ndWFyZEFtb3VudCB9KQogICAgZnJhbWVfZGlnIDE2CiAgICBwdXNoaW50IDEyNCAvLyAxMjQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIDI3CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGE1MTI5M2FhIC8vIG1ldGhvZCAiQXNzZXRHdWFyZFNldCh1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA3NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDE5CiAgICAvLyBjb25zdCBndWFyZDogQXNzZXRHdWFyZCA9IHsgY3JlYXRlZFJvdW5kOiBHbG9iYWwucm91bmQsIGxvY2tlZEFtb3VudDogY2hhbmdlLmd1YXJkQW1vdW50IH0KICAgIGdsb2JhbCBSb3VuZAogICAgZnJhbWVfZGlnIDE2CiAgICBwdXNoaW50IDEyNCAvLyAxMjQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyMAogICAgLy8gdGhpcy5hc3NldEd1YXJkcyhndWFyZEtleSkudmFsdWUgPSBjbG9uZShndWFyZCkKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDIxCiAgICAvLyB0YXJnZXQuZ3VhcmRDb3VudCA9IHRhcmdldC5ndWFyZENvdW50ICsgVWludDY0KDEpCiAgICBmcmFtZV9kaWcgMTUKICAgIGR1cAogICAgaW50YyA0IC8vIDEzMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjEtMTQyMgogICAgLy8gdGFyZ2V0Lmd1YXJkQ291bnQgPSB0YXJnZXQuZ3VhcmRDb3VudCArIFVpbnQ2NCgxKQogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKHRhcmdldCkKICAgIGludGMgNCAvLyAxMzAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDc1CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDc2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjUKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfR1VBUkQpIHsKICAgIGZyYW1lX2RpZyA3NQogICAgcHVzaGludCAxNCAvLyAxNAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANzgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDI2CiAgICAvLyBjb25zdCBnaWQgPSBjaGFuZ2UudGFyZ2V0R3JvdXBJZAogICAgZnJhbWVfZGlnIDE2CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyNwogICAgLy8gY29uc3QgYXNzZXRJZCA9IGNoYW5nZS5saW1pdEFzc2V0SWQKICAgIHN3YXAKICAgIHB1c2hpbnQgODQgLy8gODQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjgKICAgIC8vIGNvbnN0IHRhcmdldCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDI4LTE0MjkKICAgIC8vIGNvbnN0IHRhcmdldCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICAvLyBhc3NlcnQodGFyZ2V0Lmdyb3VwVHlwZSA9PT0gR1RfQ1VTVE9ESUFOLCAndGFyZ2V0IG11c3QgYmUgYSBjdXN0b2RpYW4gZ3JvdXAnKQogICAgZHVwCiAgICBwdXNoaW50IDEyMiAvLyAxMjIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjkKICAgIC8vIGFzc2VydCh0YXJnZXQuZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4sICd0YXJnZXQgbXVzdCBiZSBhIGN1c3RvZGlhbiBncm91cCcpCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyB0YXJnZXQgbXVzdCBiZSBhIGN1c3RvZGlhbiBncm91cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzAKICAgIC8vIGNvbnN0IGd1YXJkS2V5ID0geyBjdXN0b2RpYW5Hcm91cElkOiBnaWQsIGFzc2V0SWQgfQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4NAogICAgLy8gYXNzZXRHdWFyZHMgPSBCb3hNYXA8eyBjdXN0b2RpYW5Hcm91cElkOiB1aW50NjQ7IGFzc2V0SWQ6IHVpbnQ2NCB9LCBBc3NldEd1YXJkPih7IGtleVByZWZpeDogJ2FnJyB9KQogICAgYnl0ZWMgMjAgLy8gImFnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzEKICAgIC8vIGFzc2VydCh0aGlzLmFzc2V0R3VhcmRzKGd1YXJkS2V5KS5leGlzdHMsICdndWFyZCBub3QgZm91bmQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBndWFyZCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDMyCiAgICAvLyB0aGlzLmFzc2V0R3VhcmRzKGd1YXJkS2V5KS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQzMwogICAgLy8gdGFyZ2V0Lmd1YXJkQ291bnQgPSB0YXJnZXQuZ3VhcmRDb3VudCAtIFVpbnQ2NCgxKQogICAgZGlnIDEKICAgIGludGMgNCAvLyAxMzAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDMzLTE0MzQKICAgIC8vIHRhcmdldC5ndWFyZENvdW50ID0gdGFyZ2V0Lmd1YXJkQ291bnQgLSBVaW50NjQoMSkKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZSh0YXJnZXQpCiAgICB1bmNvdmVyIDIKICAgIGludGMgNCAvLyAxMzAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDM1CiAgICAvLyBlbWl0PEFzc2V0R3VhcmRSZW1vdmVkPih7IGN1c3RvZGlhbkdyb3VwSWQ6IGdpZCwgYXNzZXRJZCB9KQogICAgcHVzaGJ5dGVzIDB4Y2FiNzE5ODggLy8gbWV0aG9kICJBc3NldEd1YXJkUmVtb3ZlZCh1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDc4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzkKICAgIC8vIGFzc2VydChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QQVVTRUQsICd1bmtub3duIGNoYW5nZSB0eXBlJykKICAgIGZyYW1lX2RpZyA3NQogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydCAvLyB1bmtub3duIGNoYW5nZSB0eXBlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ0MQogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUgPSBjaGFuZ2UuYWN0aXZlRmxhZyAhPT0gVWludDY0KDApID8gVWludDY0KDEpIDogVWludDY0KDApCiAgICBmcmFtZV9kaWcgMTYKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyA5IC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ0MQogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUgPSBjaGFuZ2UuYWN0aXZlRmxhZyAhPT0gVWludDY0KDApID8gVWludDY0KDEpIDogVWludDY0KDApCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDQyCiAgICAvLyBlbWl0PFNhZmVQYXVzZWQ+KHsgcGF1c2VkOiB0aGlzLnBhdXNlZC52YWx1ZSB9KQogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4YzRhNzkyNjMgLy8gbWV0aG9kICJTYWZlUGF1c2VkKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTQKICAgIC8vIHRoaXMuX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2UuY2hhbmdlVHlwZSwgZ3JvdXApCiAgICBmcmFtZV9kaWcgNzUKICAgIGZyYW1lX2RpZyA4NgogICAgY2FsbHN1YiBfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlCiAgICBwb3AKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICBmcmFtZV9kaWcgODgKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX25ld1Byb3Bvc2FsKGdyb3VwSWQ6IHVpbnQ2NCwgcGF5bG9hZFR5cGU6IHVpbnQ2NCwgZXhwaXJ5Um91bmQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfbmV3UHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY5CiAgICAvLyBwcml2YXRlIF9uZXdQcm9wb3NhbChncm91cElkOiB1aW50NjQsIHBheWxvYWRUeXBlOiB1aW50NjQsIGV4cGlyeVJvdW5kOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODcwCiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgxKSwgJ25vdCBib290c3RyYXBwZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNSAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzAKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDEpLCAnbm90IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gbm90IGJvb3RzdHJhcHBlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MQogICAgLy8gYXNzZXJ0KGV4cGlyeVJvdW5kID4gR2xvYmFsLnJvdW5kLCAnZXhwaXJ5IG11c3QgYmUgaW4gdGhlIGZ1dHVyZScpCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBSb3VuZAogICAgPgogICAgYXNzZXJ0IC8vIGV4cGlyeSBtdXN0IGJlIGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzIKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MwogICAgLy8gY29uc3QgcGlkOiB1aW50NjQgPSB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NQogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDEzIC8vICJucGlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MwogICAgLy8gY29uc3QgcGlkOiB1aW50NjQgPSB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4MAogICAgLy8gdGhyZXNob2xkOiBncm91cC50aHJlc2hvbGQsCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4MgogICAgLy8gcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg0CiAgICAvLyBlcG9jaEF0Q3JlYXRpb246IGdyb3VwLm1lbWJlcnNoaXBFcG9jaCwKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzcKICAgIC8vIHN0YXR1czogU1RBVFVTX0FDVElWRSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc1LTg4NwogICAgLy8gY29uc3QgcHJvcG9zYWw6IFByb3Bvc2FsID0gewogICAgLy8gICBncm91cElkLAogICAgLy8gICBzdGF0dXM6IFNUQVRVU19BQ1RJVkUsCiAgICAvLyAgIHBheWxvYWRUeXBlLAogICAgLy8gICBhcHByb3ZhbHNDb3VudDogVWludDY0KDApLAogICAgLy8gICB0aHJlc2hvbGQ6IGdyb3VwLnRocmVzaG9sZCwKICAgIC8vICAgZXhwaXJ5Um91bmQsCiAgICAvLyAgIHByb3Bvc2VyOiBUeG4uc2VuZGVyLAogICAgLy8gICBudW1QYXlsb2FkczogVWludDY0KDApLAogICAgLy8gICBlcG9jaEF0Q3JlYXRpb246IGdyb3VwLm1lbWJlcnNoaXBFcG9jaCwKICAgIC8vICAgcGF5bG9hZFZlcnNpb246IFVpbnQ2NCgxKSwKICAgIC8vICAgdG90YWxUeG5zOiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBpdG9iCiAgICBkaWcgNQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc5CiAgICAvLyBhcHByb3ZhbHNDb3VudDogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzUtODg3CiAgICAvLyBjb25zdCBwcm9wb3NhbDogUHJvcG9zYWwgPSB7CiAgICAvLyAgIGdyb3VwSWQsCiAgICAvLyAgIHN0YXR1czogU1RBVFVTX0FDVElWRSwKICAgIC8vICAgcGF5bG9hZFR5cGUsCiAgICAvLyAgIGFwcHJvdmFsc0NvdW50OiBVaW50NjQoMCksCiAgICAvLyAgIHRocmVzaG9sZDogZ3JvdXAudGhyZXNob2xkLAogICAgLy8gICBleHBpcnlSb3VuZCwKICAgIC8vICAgcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIG51bVBheWxvYWRzOiBVaW50NjQoMCksCiAgICAvLyAgIGVwb2NoQXRDcmVhdGlvbjogZ3JvdXAubWVtYmVyc2hpcEVwb2NoLAogICAgLy8gICBwYXlsb2FkVmVyc2lvbjogVWludDY0KDEpLAogICAgLy8gICB0b3RhbFR4bnM6IFVpbnQ2NCgwKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg4CiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDYgLy8gInAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg4CiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4OQogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSA9IHBpZCArIFVpbnQ2NCgxKQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyBuZXh0UHJvcG9zYWxJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICducGlkJyB9KQogICAgYnl0ZWMgMTMgLy8gIm5waWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg5CiAgICAvLyB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlID0gcGlkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5MQogICAgLy8gZW1pdDxQcm9wb3NhbENyZWF0ZWQ+KHsgcHJvcG9zYWxJZDogcGlkLCBncm91cElkLCBwYXlsb2FkVHlwZSwgcHJvcG9zZXI6IFR4bi5zZW5kZXIgfSkKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhiMzUxZDg1NyAvLyBtZXRob2QgIlByb3Bvc2FsQ3JlYXRlZCh1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODk1CiAgICAvLyB0aGlzLl9yZWNvcmRBcHByb3ZhbChwaWQsIHN0b3JlZCkKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjYWxsc3ViIF9yZWNvcmRBcHByb3ZhbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODk2CiAgICAvLyByZXR1cm4gcGlkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9yZWNvcmRBcHByb3ZhbChwcm9wb3NhbElkOiB1aW50NjQsIHByb3Bvc2FsOiBieXRlcykgLT4gYnl0ZXM6Cl9yZWNvcmRBcHByb3ZhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTkKICAgIC8vIHByaXZhdGUgX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcHJvcG9zYWw6IFByb3Bvc2FsKTogdm9pZCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDAKICAgIC8vIGNvbnN0IHJlY29yZDogQXBwcm92YWwgPSB7IHNpZ25lcjogVHhuLnNlbmRlciwgcm91bmQ6IEdsb2JhbC5yb3VuZCB9CiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwMQogICAgLy8gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUocmVjb3JkKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MQogICAgLy8gYXBwcm92YWxzID0gQm94TWFwPHsgcHJvcG9zYWxJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIEFwcHJvdmFsPih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBwdXNoYnl0ZXMgImEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDEKICAgIC8vIHRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS52YWx1ZSA9IGNsb25lKHJlY29yZCkKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDQKICAgIC8vIHVwZGF0ZWQuYXBwcm92YWxzQ291bnQgPSB1cGRhdGVkLmFwcHJvdmFsc0NvdW50ICsgVWludDY0KDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICByZXBsYWNlMiAyNAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTA1CiAgICAvLyBpZiAodXBkYXRlZC5hcHByb3ZhbHNDb3VudCA+PSB1cGRhdGVkLnRocmVzaG9sZCkgewogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICA+PQogICAgYnogX3JlY29yZEFwcHJvdmFsX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwNgogICAgLy8gdXBkYXRlZC5zdGF0dXMgPSBTVEFUVVNfUkVBRFkKICAgIGludGNfMyAvLyAyCiAgICBpdG9iCiAgICByZXBsYWNlMiA4CgpfcmVjb3JkQXBwcm92YWxfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDYgLy8gInAiCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDgKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlID0gY2xvbmUodXBkYXRlZCkKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTEwCiAgICAvLyBlbWl0PFByb3Bvc2FsQXBwcm92ZWQ+KHsgcHJvcG9zYWxJZCwgc2lnbmVyOiBUeG4uc2VuZGVyLCBhcHByb3ZhbHNDb3VudDogdXBkYXRlZC5hcHByb3ZhbHNDb3VudCB9KQogICAgdHhuIFNlbmRlcgogICAgc3dhcAogICAgZXh0cmFjdCAyNCA4CiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4OThiM2FjOTQgLy8gbWV0aG9kICJQcm9wb3NhbEFwcHJvdmVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9iZWdpbk9yTmV4dChmaXJzdDogdWludDY0KSAtPiB2b2lkOgpfYmVnaW5Pck5leHQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1NgogICAgLy8gcHJpdmF0ZSBfYmVnaW5Pck5leHQoZmlyc3Q6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNTcKICAgIC8vIGlmIChmaXJzdCkgb3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IF9iZWdpbk9yTmV4dF9lbHNlX2JvZHlAMgogICAgaXR4bl9iZWdpbgogICAgcmV0c3ViCgpfYmVnaW5Pck5leHRfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1OAogICAgLy8gZWxzZSBvcC5JVHhuQ3JlYXRlLm5leHQoKQogICAgaXR4bl9uZXh0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9zZXRTZW5kZXJJZlNldChzZW5kZXI6IGJ5dGVzKSAtPiB2b2lkOgpfc2V0U2VuZGVySWZTZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA2MgogICAgLy8gcHJpdmF0ZSBfc2V0U2VuZGVySWZTZXQoc2VuZGVyOiBBY2NvdW50KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDYzCiAgICAvLyBpZiAoc2VuZGVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpIG9wLklUeG5DcmVhdGUuc2V0U2VuZGVyKHNlbmRlcikKICAgIGZyYW1lX2RpZyAtMQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogX3NldFNlbmRlcklmU2V0X2FmdGVyX2lmX2Vsc2VAMgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFNlbmRlcgoKX3NldFNlbmRlcklmU2V0X2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3N0b3JlUGF5bG9hZEdyb3VwKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcGF5bG9hZEluZGV4OiB1aW50NjQsIHBheWxvYWQ6IGJ5dGVzKSAtPiBieXRlczoKX3N0b3JlUGF5bG9hZEdyb3VwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMDgKICAgIC8vIHByaXZhdGUgX3N0b3JlUGF5bG9hZEdyb3VwKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcGF5bG9hZEluZGV4OiB1aW50NjQsIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCk6IHZvaWQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwOQogICAgLy8gaWYgKHBheWxvYWQubGVuZ3RoID4gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBieiBfc3RvcmVQYXlsb2FkR3JvdXBfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxMAogICAgLy8gdGhpcy50cmFuc2FjdGlvbkdyb3Vwcyhwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcGF5bG9hZEluZGV4KS52YWx1ZSA9IGNsb25lKHBheWxvYWQpCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDEwIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjEwCiAgICAvLyB0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlID0gY2xvbmUocGF5bG9hZCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKCl9zdG9yZVBheWxvYWRHcm91cF9hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2Fzc2VydEN1c3RvZGlhbkFjdGlvbnMoZ3JvdXBUeXBlOiB1aW50NjQsIGFsbG93ZWRBY3Rpb25zOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRDdXN0b2RpYW5BY3Rpb25zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNTcKICAgIC8vIHByaXZhdGUgX2Fzc2VydEN1c3RvZGlhbkFjdGlvbnMoZ3JvdXBUeXBlOiB1aW50NjQsIGFsbG93ZWRBY3Rpb25zOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNTgKICAgIC8vIGlmIChncm91cFR5cGUgPT09IEdUX0NVU1RPRElBTikgewogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9hc3NlcnRDdXN0b2RpYW5BY3Rpb25zX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjAKICAgIC8vIGFzc2VydChhbGxvd2VkQWN0aW9ucyA8PSAoQUNUX1BBWSB8IEFDVF9BWEZFUiksICdjdXN0b2RpYW4gYWN0aW9ucyBsaW1pdGVkIHRvIHBheS9heGZlcicpCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8PQogICAgYXNzZXJ0IC8vIGN1c3RvZGlhbiBhY3Rpb25zIGxpbWl0ZWQgdG8gcGF5L2F4ZmVyCgpfYXNzZXJ0Q3VzdG9kaWFuQWN0aW9uc19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlVHlwZTogdWludDY0LCBncm91cDogYnl0ZXMpIC0+IGJ5dGVzOgpfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjUKICAgIC8vIHByaXZhdGUgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2VUeXBlOiB1aW50NjQsIGdyb3VwOiBTaWduZXJHcm91cCk6IHZvaWQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2NgogICAgLy8gaWYgKGNoYW5nZVR5cGUgPT09IEFETV9TRVRfUE9MSUNZKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYnogX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjcKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9QT0xJQ1kpICE9PSBVaW50NjQoMCksICdwb2xpY3kgYWRtaW4gcmVxdWlyZWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDIKICAgICYKICAgIGFzc2VydCAvLyBwb2xpY3kgYWRtaW4gcmVxdWlyZWQKCl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2VfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2OQogICAgLy8gYXNzZXJ0KChncm91cC5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApLCAnZ3JvdXAgYWRtaW4gcmVxdWlyZWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBncm91cCBhZG1pbiByZXF1aXJlZAogICAgYiBfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlOiBieXRlcywgZ3JvdXA6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCBieXRlczoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI3OQogICAgLy8gcHJpdmF0ZSBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2U6IEFkbWluQ2hhbmdlLCBncm91cDogU2lnbmVyR3JvdXApOiBib29sZWFuIHsKICAgIHByb3RvIDIgMwogICAgYnl0ZWNfMSAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODAKICAgIC8vIGNvbnN0IGhhc0dyb3VwUHJpdiA9IChncm91cC5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODEKICAgIC8vIGlmICghaGFzR3JvdXBQcml2IHx8IGdyb3VwLmFjdGl2ZSA9PT0gVWludDY0KDApKSB7CiAgICBieiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMwoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5faWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODIKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIHJldHN1YgoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODQKICAgIC8vIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QUklWSUxFR0VTKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYnogX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI4NQogICAgLy8gY29uc3Qgd2lsbEhhdmVHcm91cFByaXYgPSAoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA2OCAvLyA2OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI4NgogICAgLy8gcmV0dXJuICF3aWxsSGF2ZUdyb3VwUHJpdiAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgYm56IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VANwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18yIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODYKICAgIC8vIHJldHVybiAhd2lsbEhhdmVHcm91cFByaXYgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPD0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VANwogICAgaW50Y18xIC8vIDEKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjg2CiAgICAvLyByZXR1cm4gIXdpbGxIYXZlR3JvdXBQcml2ICYmIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPD0gVWludDY0KDEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfbWVyZ2VAOAoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyODgKICAgIC8vIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9BQ1RJVkUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjg5CiAgICAvLyBjb25zdCB3aWxsQmVBY3RpdmUgPSBjaGFuZ2UuYWN0aXZlRmxhZyAhPT0gVWludDY0KDApCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjkwCiAgICAvLyByZXR1cm4gIXdpbGxCZUFjdGl2ZSAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgYm56IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VAMTMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjkwCiAgICAvLyByZXR1cm4gIXdpbGxCZUFjdGl2ZSAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA8PQogICAgYnogX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYm9vbF9mYWxzZUAxMwogICAgaW50Y18xIC8vIDEKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfbWVyZ2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI5MAogICAgLy8gcmV0dXJuICF3aWxsQmVBY3RpdmUgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIHJldHN1YgoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYm9vbF9mYWxzZUAxMzoKICAgIGludGNfMCAvLyAwCiAgICBiIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfbWVyZ2VAMTQKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI5MgogICAgLy8gcmV0dXJuIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fY3JlYXRlR3JvdXAoY2hhbmdlOiBieXRlcywgZ3JvdXBUeXBlOiB1aW50NjQpIC0+IGJ5dGVzOgpfY3JlYXRlR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1MgogICAgLy8gcHJpdmF0ZSBfY3JlYXRlR3JvdXAoY2hhbmdlOiBBZG1pbkNoYW5nZSwgZ3JvdXBUeXBlOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NTMKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDU0CiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDU0CiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1NwogICAgLy8gYXNzZXJ0KGNoYW5nZS50aHJlc2hvbGQgPT09IFVpbnQ2NCgxKSwgJ25ldyBncm91cCBzdGFydHMgd2l0aCBvbmUgbWVtYmVyJykKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA2MCAvLyA2MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gbmV3IGdyb3VwIHN0YXJ0cyB3aXRoIG9uZSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDYwCiAgICAvLyBhc3NlcnQoY2hhbmdlLm1lbWJlckFkZHIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ21lbWJlciByZXF1aXJlZCcpCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMTggMzIKICAgIGR1cAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIG1lbWJlciByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NjEKICAgIC8vIGFzc2VydChjaGFuZ2UuYWxsb3dlZEFjdGlvbnMgPD0gQUNUX0FMTCwgJ2ludmFsaWQgYWN0aW9ucycpCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXBuIDIKICAgIHB1c2hpbnQgNjMgLy8gNjMKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBhY3Rpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ2MgogICAgLy8gYXNzZXJ0KGNoYW5nZS5hZG1pblByaXZpbGVnZXMgPD0gUFJJVl9BTEwsICdpbnZhbGlkIHByaXZpbGVnZXMnKQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDY4IC8vIDY4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDcgLy8gNwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHByaXZpbGVnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDY1CiAgICAvLyB0aGlzLl9hc3NlcnRDdXN0b2RpYW5BY3Rpb25zKGdyb3VwVHlwZSwgY2hhbmdlLmFsbG93ZWRBY3Rpb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRDdXN0b2RpYW5BY3Rpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ2OAogICAgLy8gbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1OCAvLyA1OAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzIKICAgIC8vIGFkbWluUHJpdmlsZWdlczogZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4gPyBVaW50NjQoMCkgOiBjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzLAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2NyZWF0ZUdyb3VwX3Rlcm5hcnlfZmFsc2VAMgogICAgaW50Y18wIC8vIDAKCl9jcmVhdGVHcm91cF90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ3NAogICAgLy8gbGltaXRBc3NldElkOiBjaGFuZ2UubGltaXRBc3NldElkLAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDg0IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDc1CiAgICAvLyBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCA5MiA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ3OAogICAgLy8gbW9udGhseUxpbWl0OiBjaGFuZ2UubW9udGhseUxpbWl0LAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDEwMCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ4MQogICAgLy8gY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAxMDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NjctMTQ4NwogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICAvLyBGb3JjZSBhZG1pblByaXZpbGVnZXMgdG8gMCBmb3IgY3VzdG9kaWFuIGdyb3VwcyDigJQgdGhlIGNhbGxlcidzIHZhbHVlIGlzIGlnbm9yZWQuCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4gPyBVaW50NjQoMCkgOiBjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogY2hhbmdlLmFsbG93ZWRBY3Rpb25zLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IGNoYW5nZS5saW1pdEFzc2V0SWQsCiAgICAvLyAgIGRhaWx5TGltaXQ6IGNoYW5nZS5kYWlseUxpbWl0LAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBjaGFuZ2UubW9udGhseUxpbWl0LAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBjaGFuZ2UuY29vbGRvd25Sb3VuZHMsCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyAgIGdyb3VwVHlwZSwKICAgIC8vICAgZ3VhcmRDb3VudDogVWludDY0KDApLAogICAgLy8gfQogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciA1CiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyA3CiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgYnl0ZWMgMjUgLy8gMHgwMDhhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDcwCiAgICAvLyBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDY3LTE0ODcKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IGNoYW5nZS5ncm91cE5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogY2hhbmdlLnRocmVzaG9sZCwKICAgIC8vICAgbWVtYmVyQ291bnQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgLy8gRm9yY2UgYWRtaW5Qcml2aWxlZ2VzIHRvIDAgZm9yIGN1c3RvZGlhbiBncm91cHMg4oCUIHRoZSBjYWxsZXIncyB2YWx1ZSBpcyBpZ25vcmVkLgogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGdyb3VwVHlwZSA9PT0gR1RfQ1VTVE9ESUFOID8gVWludDY0KDApIDogY2hhbmdlLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IGNoYW5nZS5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBjaGFuZ2UubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogY2hhbmdlLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gICBncm91cFR5cGUsCiAgICAvLyAgIGd1YXJkQ291bnQ6IFVpbnQ2NCgwKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDc2CiAgICAvLyBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NjctMTQ4NwogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICAvLyBGb3JjZSBhZG1pblByaXZpbGVnZXMgdG8gMCBmb3IgY3VzdG9kaWFuIGdyb3VwcyDigJQgdGhlIGNhbGxlcidzIHZhbHVlIGlzIGlnbm9yZWQuCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4gPyBVaW50NjQoMCkgOiBjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogY2hhbmdlLmFsbG93ZWRBY3Rpb25zLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IGNoYW5nZS5saW1pdEFzc2V0SWQsCiAgICAvLyAgIGRhaWx5TGltaXQ6IGNoYW5nZS5kYWlseUxpbWl0LAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBjaGFuZ2UubW9udGhseUxpbWl0LAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBjaGFuZ2UuY29vbGRvd25Sb3VuZHMsCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyAgIGdyb3VwVHlwZSwKICAgIC8vICAgZ3VhcmRDb3VudDogVWludDY0KDApLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDUKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ4OAogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDg4CiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTAKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlLCBsYWJlbDogY2hhbmdlLm1lbWJlckxhYmVsLCBhZGRyOiBjaGFuZ2UubWVtYmVyQWRkciB9CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMTEKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCA1MCA4CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDE3IC8vIDB4MDAyYQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgOAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5MQogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTEKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDkzCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDggLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5MwogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSA9IGdpZCArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDk0CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlY18zIC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTQKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlY18zIC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTQKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDk2CiAgICAvLyBpZiAoZ3JvdXBUeXBlID09PSBHVF9DVVNUT0RJQU4pIHsKICAgIGZyYW1lX2RpZyAxMwogICAgYnogX2NyZWF0ZUdyb3VwX2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5NwogICAgLy8gZW1pdDxDdXN0b2RpYW5Hcm91cENyZWF0ZWQ+KHsgZ3JvdXBJZDogZ2lkLCBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLCB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQgfSkKICAgIGZyYW1lX2RpZyA0CiAgICBieXRlYyAxOSAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NDA0NjM2NDUgLy8gbWV0aG9kICJDdXN0b2RpYW5Hcm91cENyZWF0ZWQodWludDY0LHN0cmluZyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCl9jcmVhdGVHcm91cF9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwNAogICAgLy8gZW1pdDxNZW1iZXJBZGRlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogY2hhbmdlLm1lbWJlckFkZHIsIGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSB9KQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfY3JlYXRlR3JvdXBfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ5OQogICAgLy8gaWYgKChjaGFuZ2UuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYnogX2NyZWF0ZUdyb3VwX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MDAKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwMAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NgogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwMAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpfY3JlYXRlR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MDIKICAgIC8vIGVtaXQ8R3JvdXBDcmVhdGVkPih7IGdyb3VwSWQ6IGdpZCwgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkIH0pCiAgICBmcmFtZV9kaWcgNAogICAgYnl0ZWMgMTkgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBjb25jYXQKICAgIGJ5dGVjIDI2IC8vIG1ldGhvZCAiR3JvdXBDcmVhdGVkKHVpbnQ2NCxzdHJpbmcsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9jcmVhdGVHcm91cF9hZnRlcl9pZl9lbHNlQDgKCl9jcmVhdGVHcm91cF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICBmcmFtZV9kaWcgMTAKICAgIGIgX2NyZWF0ZUdyb3VwX3Rlcm5hcnlfbWVyZ2VAMwo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAGAAEIAoIBgK3iBCYbAWcABGFwZ2MEZ2NudAFtBGJvb3QBcAdjcmVhdG9yBG5naWQGcGF1c2VkA3R4ZwQVH3x1BHxgWeYEbnBpZAIAIgFyAmRwAgAqBNBwUHoCABICYWcDBoEBBHZhcHACAAoE3t0DqAIAigQM1zV8MRkURDEYQQBVggsEkUumMwQUqP+6BNVRVoIECyQ8pwSsOpoyBEQkRfcEP5uKMAT0tIbuBPtwiOgEf1H8KATcrf+WNhoAjgsA8QGOAjkCnQK4A6IE8gXKBmoGjgdRAIAEvy4eeDYaAI4BADwAigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScVsh4nFbIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFJIlklCEsBFRJEVwIANhoCSRUkEkQXSXIARAGAIA3WkjRPgOfVdw9HvN4mwx6q8k1FtdF338vHJBdC4YixEkQnFkxngARuYW1lSwFnJwcxAGcnBSJnJwgjZycNI2crImcnCSJnggIDdmVyF0JJQVRFQy1BTEdPLVNBRkUtdjMuMy4wZyoiZzEASwEVFlcGAk8CUCcOTwJQTFCABOKci0dMULAjQzYaAUkiWSUISwEVEkRXAgAxACInB2VEEkQiJwVlRBREIitlRBRESRUWVwYCTFAjFoBCAEIAAAAAAAAAAQAAAAAAAAAHAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATwJQMQBPAlCACwAqAAdjcmVhdG9yUIAEAAEAAkxQiAagRgMnBSNnI0MpNhoBRwIVSwEiWUmBQhJETwJMSwJSIlmBRAgSRDYaAkcCIllJTgIlC0xJFUxXAgAiSUsFDEEAM0cCJQtLA0lPAllJSwdJTgQSREsBFVJJFUsBgShZSYEqEkRMUiJZgSwICEUFIwhFAUL/xksDJQhLAxJENhoDSRUkEkQXSUUJIw1BAAZLByKI/fcxACInB2VEEkQiJwVlRBRESwZLBogF90YCFicLTFCwI0M2GgFJFYEgEkQ2GgJJIlklCEsBFRJEVwIAMQAiJwdlRBJEIicFZUQUREsBMgMTRCcPSwJQSb1FARREMgZLAhUWVwYCTwNQTBYnF0xQSwFQSwK8SE8CTL9MJw5QTFAnGExQsCNDMQAiJwdlRBJEIicFZUQURCIqZUREJwUjZyNDIilHAzYaAUkVJBJEFzYaAkcCIllJTgIlC0xJFUxXAgAiSUsFDEEAMkcCJQtLA0lPAllJSwdJTgQSREsBFVJJFUsBJFlJgQoSRExSIlmBDAgIRQUjCEUBQv/HSwMlCEsDEkQ2GgNJFSQSRBdFCTYaBEkVIxJEIlNFCjYaBUkVJBJEF0lFDCMNQQAGSwoiiPzHSwRJRIEQDkQiJwllRBRESwZJiAaJSRYoTFCBciS6F0QjSwqIFH1JRQlJI0sIiBVzTBZJRQ4nBkxQSb5EIxZcUE8CIlkWXGi/SwlBAAVLB4gGZicLSwxQsCNDIkcCKUk2GgFJFSQSRBc2GgJHAhUkEkQXNhoDRwIiWUlOAiULTEkVTFcCACJJSwUMQQAyRwIlC0sDSU8CWUlLB0lOBBJESwEVUkkVSwEkWUmBChJETFIiWYEMCAhFBSMIRQFC/8dLAyUISwMSRDYaBEkVJBJEF0lFDCMNQQAGSwoiiPvpIicJZUQUREsGJQ9BALpLBoEGDkEAsiNESwRESwgWJwZMUElFD75MSU4CRQ5ESYEQWyMSRCRbSUULIxJAAAdLCSUSQQB/I0QyBksMSU4CgShbDkRJIluIBWcxAEsBVzAgEkRJgRhbIxJESwmBBwtLCAhMgWhbTBYnCkxQSUUPvUUBQQAHSw0iJboXCUsFCEmBEA5ESwlLCElOA0sJiBQmSBZLDUlPAlxoSYFgWyMIFlxgTgKBUFsNQQAESwhcUEsOTL8jQyJC/34iQv9LIkkpNhoBSRUkEkQXNhoCRwIVSwGBEFlJgYQBEkRLAkxLAlIiWYGGAQhLAoE6WUlLAhJETwNMSwNSIlklCAgSRDYaA0kVJBJEFzYaBEkVJBJEF0kjDUEABUkiiPrASwNJiASRFihMUElFCEm+TEUIRIFyJLoXREsCIltJRQZBAFRLBIEODkEATCNESwKBbFshBQ5ESwSBDBJBAC5LBoF6JLoXIxJESwIkW0sEEkRLA4EFSwOIEkMWJxBLAVBJvEhLBL8nC0xQsCNDSwRLBogTWkhC/9kiQv+xIkkpNhoBSRUkEkQXNhoCSRUkEkQXNhoDSRUkEkQXSSMNQQAFSSKI+hxLAhZJRQcnBkxQvkxJTgJFB0QkW0lFBSMSQAAHSwMlEkEAUCNEMgZLBUlOAoEoWw5ESYFgW0sDEkQxAEsBVwAISU8CUCcETFC9RQFESwcxAFCAAWFMUL1FARREKExQgWokuhdLAYFYWxJESwNMiBIOSCNDIkL/rTYaAUkVJBJEFzYaAkkVJBJEF0kjDUEABUkiiPmISwGIA3QjQyJHBClHAzYaAUkVJBJEFzYaAkkVJBJEF0kjDUEABUkiiPleSwEWSUUJJwZMUElFC75MSU4CRQlEJFtJRQQjEkAAB0sCJRJBAHYjRDEASwdJTgJXMCASRQYxAEsBVwAISUUOTFAnBExQvUUISDIGTIEoWw1JRQVAABwoSwtQSUUKvUUBQQAPSwiBaiS6F0sHgVhbE0UESwRAAApLBUEAHEsDQQAXI0SBBBZLCiRPAruABK4qvAZLCFCwI0MiQv/mIkL/hyJHBSlJNhoBSRUkEkQXNhoCSRUkEkQXSSMNQQAFSSKI+JxLARZJRQgnBkxQSUULvkxJTgJFB0QkW0lFBIEDEkAACEsCgQQSQQCHI0RLAoEEEkEACTIGSwWBKFsNREsEVwAISUUHKExQvUUBQQANSwUxAFAnBExQvUUBREsEgRBbIxJBADcjRQRLBIFQW0sED0EAI0sBgQcLSwQIFicKTFBJRQq9RQFBAARLCLxISwMjCEUEQv/SSwm8SCNDJxBLB1BJRQm9RQFB/+xLB7xIQv/lIkL/dooCAyJHAilHBYv/IllJRIv+JVtJQQGliwqLCQ5BAZ0jRIv+gRJbSYwFgT8ORIv+gQpbSYwGgQcORIv+gTJbSYwHIQUORIv+gTpbSYwIIxJBAASLBhREiwhJiwVJTgKIEIQyByInCGVMSU4FjANEi/4iWYv+FYv+TgJSVwIAi/5XGgiL/lciCIv+VyoISwMVFlcGAk8EUElOBowAiwoWSYwBJxlMUIsJFlCLBhZQTwUWUE8DUE8CUCIWTEsBUE8DFkxLAVBPA1BLAlBMUIsHFlBLAVBLAVAjFlBPAxZQTFBMUEwWSYwCKExQSbxITL8ijASLBIsJDEEAfov/VwIAiwRJTgIlC0sBTFlPAiMISYwEiwlLAQlLAxVPAiULSwRMWU8CTVJJVwAgSTIDE0SLAksBUCcESwFQSb1FARRESwOBKFlLBBVLBU4CUlcCAE8EVyAISwEVFlcGAk8CUEsBJxFQTwVQTFBLArxITwJMv1AnEkxQsEL/eosDIwgnCExnIitlRCMIK0xniwgjE0EAEIsGIxpBAAkiKmVEIwgqTGeLAicTUIsBUIsAUCcaTFCwiwOL/ov/jAKMAYwAiSJC/mCKAQCL/xYoSwFQvUUBRDEAUCcETFC9RQFEiYoBACJHJylHJ4v/FkknBkxQSb5MSU8CREkkWyUSRDIGSwGBKFsOREkiW0lOAhZJTgIoTFBJTgJJvkxOA0RJgXIkuhdETIEgW0lPAiUkuhdJTgIPQQ2Qi1eLUkmBGFtPAg9Ei1WBaiS6F0sBgVhbEkSBEFsjEkEIZCInCWVEFESLVYFaJLoXSYxJQQAWi1WBYiS6F0mMSkEACTIGi0qLSQgPRItSgVBbjDyLVYF6JLoXIxKMNSOMPYtWSYwWjBeLPYs8DkEC8ov/gQcLiz0IFicKTFBJjA29RQFAABGLFowYiz0jCIw9ixiMFkL/0YsNvkyMHEQijDOLFowYiw0iJboXizMNQf/ZJYszCyUIiw1JTwIluhclCCS6SYwMF4EDEkEBAYscSVcCAEwiWYszSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUklXAgCLF4EaW4EEGkRLASVbSUQyCBNETIEKW0mBBQ5EgQQTREmBEFlLAYESWUsCTwJLAlJJjAUiWUlOA4w7SwGBFFlLAk8CSwJSIllLAoEWWUsDTwNLAlIiWUsDgRhZTwRPA08CUiJZTwOBEA5ESwKBBA5ESwEkDkRJJA5ETgIICCQORCKMRSKMNIs0izsMSYxAQQAoiwVXAgCLQESLNElOAiULSwFMWUpZJQhYVwIAFYtFCIxFIwiMNEL/zYtFgYAQDkSLF4wYizMjCIwzQv7XsSInFmVEixxJVwIATCJZizNJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSixdJVxoISwFXEghPAld6CIAE4xzVpbIaiwyyGk8DshpPArIaTLIashqyGIEGshAisgGztD5JVwQASwFXAAQnCxJEFYE4EkRJgQRbSU4CjDBJgQxbjC9JgRRbjDJXHCCMIItWgSJbEoxGizVAAAWLRkH/TosyQQAWiyAyAxJBANcyCoweizBAAMKLHmCML4s1QQAvizAWi1RMUCcUTFBJjA69RQFEiy9B/xeLDkm+RCRbSYsvSU4DD0RMCRYkTLtC/v+LL0H++jIHjDqLVoEqW0EANotWgTpbizpMCYGAowUPQQAOIhaLVkxcMos6Flw6jFaLVkmBMluLLwhLAYEqW0sBD0QWXDKMVotWgUJbQf6wi1aBUluLOkwJgYCangEPQQAOIhaLVkxcSos6FlxSjFaLVkmBSluLLwhLAYFCW0sBD0QWXEqMVkL+doseizBwAEiML0L/N4sgjB5C/yYyBhaLVkxcYotVSbxITL8ijEcjjD6LPos8DkEE8ov/gQcLiz4IFicKTFBJjBG9RQFBBNOLEb5MjB1EIow2ixEiJboXizYNQQS9i0cUjDElizYLJQiLEUlPAiW6FyUIJLoXSYxKIxJBAIyLHUlXAgBMIlmLNkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAJJVwIAjB+LMYgKcCOyECKyAUlXAiCICm9JVyIgsgdJgUJbsgiBSltBAAeLAldSILIJix9JgXBZSwEVUlcCAEmMJSkTQQAEiyWyBYtHIwiMR4s2IwiMNkL/SItKJRJBAIeLHUlXAgBMIlmLNkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjANJVwIAjB+LMYgJ3YEEshAisgFJVwIgiAnbSYEiW7IRSVcqILIUSYFKW7ISgVJbQQAHiwNXWiCyFYsfSYF4WUsBFVJXAgBJjCYpE0H/aosmsgVC/2OLSoEDEkEBQIsdSVcCAEwiWYs2SSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUklXAgBJTgKMH4sxiAlOgQayECKyAUklW7IYgQpbshlJgRhZSU4CjChJFUxOAlJXAgBJjCMpE0EABIsjsgUijDOLH0mBEFlLAYESWUmMKVJJjAQiWYszDUmMQUEAJIsEVwIAi0FEizNJTgIlC0sBTFlKWSUIWFcCALIaIwiMM0L/vyKMN4sfSYEUWUmMKospTFJJjAYiWYs3DUEAGYsGVwIAizdJTgKBIAuBIFiyHCMIjDdC/88ijDiLH0mBFllJjCuLKFJJjAciWYs4DUEAFosHVwIAizhJTgIkC1uyMCMIjDhC/9MijDmLH4sqiytSSYwIIlmLOQ1B/jGLCFcCAIs5SU4CJAtbsjIjCIw5Qv/Yi0qBBBJBAI+LHUlXAgBMIlmLNkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAlJVwIAjB+LMYgIBiWyECKyASVbQf3Kix9JJFlLAYEKWUsCTwJLAlJXAgCyCksBgQxZSwJPAksCUlcCALILSwEVUlcCALI/iwlJgRBbsgxJgRhbsg2BIFuyDkL9hItKgQUSQQERix1JVwIATCJZizZJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwKSVcCAIwfizGIB2+BA7IQIrIBJVtJjEhAAL2LCkmBCluyIkmBEluyI4EaWyITsiSLH0mBIFlLAYEiWUmMLFJXAgBJjCQpE0EABIsksiWLH0mBJFlJjC2LLExSVwIASYwmKRNBAASLJrImix9JgSZZSYwuiy1MUlcCAEmMJykTQQAEiyeyJ4sfSYGoAVmLLkxSVwIASYwhFYEgEkEABIshsiiLCklXKiCyKUlXSiCyKklXaiCyK1eKILIsix9JgagBWUsBFVJXAgBJjCIpE0H8eYsisgVC/HKLSLIhQv/Di0qBBhJB/GOLHUlXAgBMIlmLNkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAtJVwIAjB+LMYgGViOyECKyAVcCIEmMAEmIBlIyAxJBACoyCrIHIrIIiwtXIiCyIIsfSYFAWUsBFVJXAgBJjCQpE0H77IsksgVC++WLAEL/04s+IwiMPkL7BrOBAxaLUSRPAruABDXGfv2LUFCwiScQi1BQSYwQSb5MjBNEIiS6F0mMS4EMEkmMP0EE4YtVgXokuhcjEkSLECRJuheLUxJEi0sjEkEACosTIogGmUhC/6mLSyUSQQBwixBJJEm6F0sBgwISILpJMgMTREwWSUsCUCcESwFQSb1FARRETwSBMiS6F4sTSYE6WUsBFVJXAgBMFksBFRZXBgJPAlBLAScRUE8GUExQSwK8SE8CTL8oTwNQSYEKJLoXIwgWgQpMu1AnEkxQsEL/MotLgQMSQQBYixBJJEm6F0yDAhIgukwWSU8CUCcESwFQSb1FAUQoTwNQSb5ESwGBCiS6FyMJSwIlJLoXSwEORE8DvEgWXApJgWpbIwgWXGpLAbxIv4AEKxTCwUxQsEL+0otLJBJBAE+LEIMCEiC6STIDE0QnD0sBUEm9RQEURIsTSYE6WUsBFVJXAgAyBksBFRZXBgJPAlBMFicXTFBLAVBLArxITwJMv0wnDlBMUCcYTFCwQv58i0uBCRJBAB+LEIMCEiC6Jw9LAVBJvUUBRLxIgATbTKUqTFCwQv5Vi0uBBBJBACqLEEkkSboXFihLAVBPAoE8JLpJF0lESwKBCiS6Fw5EJUy7JwxMULBC/iOLS4EFEkEAj4sQSSRJuhcWSYwVKExQSYwSSb5ESwGBeiS6F0sDgUwkukkXTwJLAYgENIE/DkRPAoEiJLoXSwOBVCS6SRdPAhNPA08DXBpPAlwiSwKBXCS6XCpLAoFkJLpcQk8CgWwkulxaTEEAGTIHIhZPAksBXDJPAhZMSwFcOk8CXEpMXFKLEkm8SEy/JwyLFVCwQv2Mi0uBBhJBAJ2LEEkkSboXFihMUEm+REyBeiS6FxRETIFEJLoXgQcORIsTTIgD00lOA4wZSU4DjBMUREmBElsjGoxCSwFXRAiMAUyBRFsjGoxDgXJbSYxMQQAwi0JBACuLQ0AAJiIqZUQjCSpMZ4sZiwFcEosTVwgIKEsBUEm8SE8CvycMTFCwQv0Ci0xB/96LQkD/2YtDQf/UIiplRCMIKkxnQv/Ii0uBBxJBAJiLEEkkSboXFihMUEm+TIwaREmBciS6F4xNTIF0JLoXSYxOIhOMT4F6JLoXIxNBAC6LE4saiAMdSU4DjBqMExREgRJbIxpJjERBADKLTUEALYtOQAAoIiplRCMJKkxni08WixpMXHKLE1cICChLAVBJvEhPAr8nDExQsEL8YotEQf/ci01A/9eLTkH/0iIqZUQjCCpMZ0L/xotLgQsSQQAKixMjiAMlSEL8NYs/QQBVixBJJEm6FxZJjBQoSwFQSSEEJLoXFERJgQokuhcjEkRPAoMCEiC6TwJMUCcETFBJvUUBRLxIvEgiK2VEQQAJIitlRCMJK0xngATMbLqWixRQsEL724tLgQ0SQQBxixBJJEm6F0yBVCS6F0wWKEsBUEmMD4F6JLoXIxJETBZQSYwbJxRMUEm9RQFBACGLEIF8JLokTLuLEIF8JLoXFosbTFCABKUSk6pMULBC+4MyBosQgXwkuhdMFkwWUL+LD0khBCS6FyMIFiEETLtC/8eLS4EOEkEATIsQSSRJuhdMgVQkuhdMFihLAVBJgXokuhcjEkRPAhZPAkxQJxRLAVBJvUUBRLxISwEhBCS6FyMJFk8CIQRPAruABMq3GYhMULBC+w6LS4EKEkSLEIF0JLoXIhMnCUsBZxaABMSnkmNMULBC+u2LS4tWiAE6SEL7KItYQvJtigMBIicFZUQjEkSL/zIGDUSL/RYoSwFQIicNZURLASUkuhcxAE8DgWokuhcjFksFSwFQi/4WTEsBUCIWTEsBUE8GFlCL/xZQTwVQSwFQTwQWUE8DUExQSwIWJwZLAVBLAr9LAyMIJw1MZzEATE8FUE8DUExQgASzUdhXTFCwSwFMiAACSImKAgExADIGFlAxAIv+FklOA0xQgAFhTFBMv4v/gRhbIwgWi/9MXBhHAoEYW0yBIFsPQQAEJRZcCCcGiwBJTgJQTwJJTgK/MQBMVxgITgJQTFCABJizrJRMULCL/0yJigEAi/9BAAKxibaJigEAi/8yAxNBAASL/7IAiYoDAYv/IllBABOL/YEHC4v+CBYnCkxQSbxIi/+/i/+JigIAi/4jEkEABov/gQMORImKAgGL/oEFEkEAC4v/gRJbJRpEi/+Ji/+BElsjGkRC//KKAgMpi/+BElsjGkEACIv/gXJbQAAIIov+i/9PA4mL/iJbSYwAgQYSQQAfi/6BRFsjGkAAESIqZUQjDkEACCOL/ov/TwOJIkL/9YsAgQcSQQAdi/6BdFtAABEiKmVEIw5BAAgji/6L/08DiSJC//Uii/6L/08DiYoCASJHBDIHIicIZUSL/oE8W0kjEkSL/lcSIEkyAxNEi/6BTFtHAoE/DkSL/oFEW0lOAoEHDkSL/0yI/xqL/oEQWYv+gTpZSU4Ci/5OAlJXAgCL/yMSSUEBEyKL/ldUCIv+V1wIi/5XZAiL/ldsCIsMSRUWVwYCTFBJTgWMAIsHFkmMAicZTFAjFkxLAVBPBxZQiwkWUE8FUE8EUCIWTEsBUIsFFkxLAVBPBVBLAlBMUE8DUEsBUEsBUE8CUIv/FlBMUExQiwZJTgIWSYwEKEsBUEm8SE8Cv4v+FYv+iwtPAlJXAgCL/lcyCElOAowDSRUWVwYCTFBMJxFQiwhJTgJQTwJQTgJQSYwBJwRMUEm8SEy/IwgnCExnIitlRCMIK0xniw1BACOLBCcTUIsCUIsAUIAEQEY2RUxQsIsBiwNQJxJMULCL/owAiYsKIxpBAAkiKmVEIwgqTGeLBCcTUIsCUIsAUCcaTFCwQv/OiwpC/uk=", "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": "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" } ] }, { "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": "CustodianGroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "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": "CustodianGroupDissolved", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "AssetGuardSet", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" }, { "type": "uint64", "name": "lockedAmount" } ] }, { "name": "AssetGuardRemoved", "args": [ { "type": "uint64", "name": "custodianGroupId" }, { "type": "uint64", "name": "assetId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] }, { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "templateVariables": {} }