{ "name": "ValidatorRegistry", "structs": { "Constraints": [ { "name": "epochPayoutRoundsMin", "type": "uint64" }, { "name": "epochPayoutRoundsMax", "type": "uint64" }, { "name": "minPctToValidatorWFourDecimals", "type": "uint64" }, { "name": "maxPctToValidatorWFourDecimals", "type": "uint64" }, { "name": "minEntryStake", "type": "uint64" }, { "name": "maxAlgoPerPool", "type": "uint64" }, { "name": "maxAlgoPerValidator", "type": "uint64" }, { "name": "amtConsideredSaturated", "type": "uint64" }, { "name": "maxNodes", "type": "uint64" }, { "name": "maxPoolsPerNode", "type": "uint64" }, { "name": "maxStakersPerPool", "type": "uint64" } ], "MbrAmounts": [ { "name": "addValidatorMbr", "type": "uint64" }, { "name": "addPoolMbr", "type": "uint64" }, { "name": "poolInitMbr", "type": "uint64" }, { "name": "addStakerMbr", "type": "uint64" } ], "NodePoolAssignmentConfig": [ { "name": "nodes", "type": "(uint64[3])[8]" } ], "PoolInfo": [ { "name": "poolAppId", "type": "uint64" }, { "name": "totalStakers", "type": "uint16" }, { "name": "totalAlgoStaked", "type": "uint64" } ], "PoolTokenPayoutRatio": [ { "name": "poolPctOfWhole", "type": "uint64[24]" }, { "name": "updatedForPayout", "type": "uint64" } ], "ValidatorConfig": [ { "name": "id", "type": "uint64" }, { "name": "owner", "type": "address" }, { "name": "manager", "type": "address" }, { "name": "nfdForInfo", "type": "uint64" }, { "name": "entryGatingType", "type": "uint8" }, { "name": "entryGatingAddress", "type": "address" }, { "name": "entryGatingAssets", "type": "uint64[4]" }, { "name": "gatingAssetMinBalance", "type": "uint64" }, { "name": "rewardTokenId", "type": "uint64" }, { "name": "rewardPerPayout", "type": "uint64" }, { "name": "epochRoundLength", "type": "uint32" }, { "name": "percentToValidator", "type": "uint32" }, { "name": "validatorCommissionAddress", "type": "address" }, { "name": "minEntryStake", "type": "uint64" }, { "name": "maxAlgoPerPool", "type": "uint64" }, { "name": "poolsPerNode", "type": "uint8" }, { "name": "sunsettingOn", "type": "uint64" }, { "name": "sunsettingTo", "type": "uint64" } ], "ValidatorCurState": [ { "name": "numPools", "type": "uint16" }, { "name": "totalStakers", "type": "uint64" }, { "name": "totalAlgoStaked", "type": "uint64" }, { "name": "rewardTokenHeldBack", "type": "uint64" } ], "ValidatorInfo": [ { "name": "config", "type": "ValidatorConfig" }, { "name": "state", "type": "ValidatorCurState" }, { "name": "pools", "type": "(uint64,uint16,uint64)[24]" }, { "name": "tokenPayoutRatio", "type": "PoolTokenPayoutRatio" }, { "name": "nodePoolAssignments", "type": "NodePoolAssignmentConfig" } ], "ValidatorPoolKey": [ { "name": "id", "type": "uint64" }, { "name": "poolId", "type": "uint64" }, { "name": "poolAppId", "type": "uint64" } ] }, "methods": [ { "name": "updateApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "UpdateApplication" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "createApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "initStakingContract", "args": [ { "type": "uint64", "name": "approvalProgramSize" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "loadStakingContractData", "args": [ { "type": "uint64", "name": "offset" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "finalizeStakingContract", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "gas", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "gas is a dummy no-op call that can be used to pool-up resource references and opcode cost", "events": [], "recommendations": {} }, { "name": "getMbrAmounts", "args": [], "returns": { "type": "(uint64,uint64,uint64,uint64)", "struct": "MbrAmounts" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns the MBR amounts needed for various actions:\n[\n addValidatorMbr: uint64 - mbr needed to add a new validator - paid to validator contract\n addPoolMbr: uint64 - mbr needed to add a new pool - paid to validator\n poolInitMbr: uint64 - mbr needed to initStorage() of pool - paid to pool itself\n addStakerMbr: uint64 - mbr staker needs to add to first staking payment (stays w/ validator)\n]", "events": [], "recommendations": {} }, { "name": "getProtocolConstraints", "args": [], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "Constraints" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters.", "events": [], "recommendations": {} }, { "name": "getNumValidators", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns the current number of validators", "events": [], "recommendations": {} }, { "name": "getValidatorConfig", "args": [ { "type": "uint64", "name": "validatorId" } ], "returns": { "type": "(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)", "struct": "ValidatorConfig" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "getValidatorState", "args": [ { "type": "uint64", "name": "validatorId" } ], "returns": { "type": "(uint16,uint64,uint64,uint64)", "struct": "ValidatorCurState" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "getValidatorOwnerAndManager", "args": [ { "type": "uint64", "name": "validatorId" } ], "returns": { "type": "(address,address)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "getPools", "args": [ { "type": "uint64", "name": "validatorId", "desc": "" } ], "returns": { "type": "(uint64,uint16,uint64)[]", "desc": "- array of pools\nNot callable from other contracts because >1K return but can be called w/ simulate which bumps log returns" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Return list of all pools for this validator.", "events": [], "recommendations": {} }, { "name": "getPoolAppId", "args": [ { "type": "uint64", "name": "validatorId" }, { "type": "uint64", "name": "poolId" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "getPoolInfo", "args": [ { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "name": "poolKey" } ], "returns": { "type": "(uint64,uint16,uint64)", "struct": "PoolInfo" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "getCurMaxStakePerPool", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.", "events": [], "recommendations": {} }, { "name": "doesStakerNeedToPayMBR", "args": [ { "type": "address", "name": "staker", "desc": "" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount", "events": [], "recommendations": {} }, { "name": "getStakedPoolsForAccount", "args": [ { "type": "address", "name": "staker", "desc": "- The account to retrieve staked pools for." } ], "returns": { "type": "(uint64,uint64,uint64)[]", "desc": "- The array of staked pools for the account." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Retrieves the staked pools for an account.", "events": [], "recommendations": {} }, { "name": "getTokenPayoutRatio", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." } ], "returns": { "type": "(uint64[24],uint64)", "struct": "PoolTokenPayoutRatio", "desc": "- The token payout ratio for the validator." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.", "events": [], "recommendations": {} }, { "name": "getNodePoolAssignments", "args": [ { "type": "uint64", "name": "validatorId" } ], "returns": { "type": "((uint64[3])[8])", "struct": "NodePoolAssignmentConfig" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "getNFDRegistryID", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "addValidator", "args": [ { "type": "pay", "name": "mbrPayment", "desc": "payment from caller which covers mbr increase of new validator storage" }, { "type": "string", "name": "nfdName", "desc": "(Optional) Name of nfd (used as double-check against id specified in config)" }, { "type": "(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)", "struct": "ValidatorConfig", "name": "config", "desc": "ValidatorConfig struct" } ], "returns": { "type": "uint64", "desc": "validator id" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds a new validator\nRequires at least 10 ALGO as the 'fee' for the transaction to help dissuade spammed validator adds.", "events": [], "recommendations": {} }, { "name": "changeValidatorManager", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator to change the manager for." }, { "type": "address", "name": "manager", "desc": "- The new manager address." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Changes the Validator manager for a specific Validator id.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "changeValidatorSunsetInfo", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator to update." }, { "type": "uint64", "name": "sunsettingOn", "desc": "- The new sunset timestamp." }, { "type": "uint64", "name": "sunsettingTo", "desc": "- The new sunset to validator id." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Updates the sunset information for a given validator.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "changeValidatorNFD", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator to update." }, { "type": "uint64", "name": "nfdAppID", "desc": "- The application id of the NFD to assign to the validator." }, { "type": "string", "name": "nfdName", "desc": "- The name of the NFD (which must match)" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Changes the NFD for a validator in the validatorList contract.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "changeValidatorCommissionAddress", "args": [ { "type": "uint64", "name": "validatorId" }, { "type": "address", "name": "commissionAddress" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Change the commission address that validator rewards are sent to.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "changeValidatorRewardInfo", "args": [ { "type": "uint64", "name": "validatorId" }, { "type": "uint8", "name": "EntryGatingType" }, { "type": "address", "name": "EntryGatingAddress" }, { "type": "uint64[4]", "name": "EntryGatingAssets" }, { "type": "uint64", "name": "GatingAssetMinBalance" }, { "type": "uint64", "name": "RewardPerPayout" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Allow the additional rewards (gating entry, additional token rewards) information be changed at will.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "addPool", "args": [ { "type": "pay", "name": "mbrPayment", "desc": "payment from caller which covers mbr increase of adding a new pool" }, { "type": "uint64", "name": "validatorId", "desc": "is id of validator to pool to (must be owner or manager)" }, { "type": "uint64", "name": "nodeNum", "desc": "is node number to add to" } ], "returns": { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "desc": "pool key to created pool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc.\nThe caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself.\n\n[ ONLY OWNER OR MANAGER CAN call ]", "events": [], "recommendations": {} }, { "name": "addStake", "args": [ { "type": "pay", "name": "stakedAmountPayment", "desc": "- payment coming from staker to place into a pool" }, { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." }, { "type": "uint64", "name": "valueToVerify", "desc": "- only if validator has gating to enter - this is asset id or nfd id that corresponds to gating.\nTxn sender is factored in as well if that is part of gating.\n*" } ], "returns": { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "desc": "- The key of the validator pool." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds stake to a validator pool.", "events": [], "recommendations": {} }, { "name": "setTokenPayoutRatio", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- validator id (and thus pool) calling us. Verified so that sender MUST be pool 1 of this validator." } ], "returns": { "type": "(uint64[24],uint64)", "struct": "PoolTokenPayoutRatio", "desc": "PoolTokenPayoutRatio - the finished ratio data" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "setTokenPayoutRatio is called by Staking Pool # 1 (ONLY) to ask the validator (us) to calculate the ratios\nof stake in the pools for subsequent token payouts (ie: 2 pools, '100' algo total staked, 60 in pool 1, and 40\nin pool 2) This is done so we have a stable snapshot of stake - taken once per epoch - only triggered by\npool 1 doing payout. pools other than 1 doing payout call pool 1 to ask it do it first.\nIt would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of\ntheir 'current' stake which changes as part of the payouts themselves (and people could be changing stake\nduring the epoch updates across pools)\n\nMultiple pools will call us via pool 1 (pool2->pool1->validator, etc.) so don't assert on pool1 calling multiple\ntimes in same epoch. Just return.", "events": [], "recommendations": {} }, { "name": "stakeUpdatedViaRewards", "args": [ { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "name": "poolKey", "desc": "- ValidatorPoolKey type" }, { "type": "uint64", "name": "algoToAdd", "desc": "- amount this validator's total stake increased via rewards" }, { "type": "uint64", "name": "rewardTokenAmountReserved", "desc": "- amount this validator's total stake increased via rewards (that should be" }, { "type": "uint64", "name": "validatorCommission", "desc": "- the commission amount the validator was paid, if any" }, { "type": "uint64", "name": "saturatedBurnToFeeSink", "desc": "- if the pool was in saturated state, the amount sent back to the fee sink.\nseen as 'accounted for/pending spent')" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "stakeUpdatedViaRewards is called by Staking pools to inform the validator (us) that a particular amount of total\nstake has been added to the specified pool. This is used to update the stats we have in our PoolInfo storage.\nThe calling App id is validated against our pool list as well.", "events": [], "recommendations": {} }, { "name": "stakeRemoved", "args": [ { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "name": "poolKey", "desc": "calling us from which stake was removed" }, { "type": "address", "name": "staker", "desc": "" }, { "type": "uint64", "name": "amountRemoved", "desc": "- algo amount removed" }, { "type": "uint64", "name": "rewardRemoved", "desc": "- if applicable, amount of token reward removed (by pool 1 caller) or TO remove and pay out (via pool 1 from different pool caller)" }, { "type": "bool", "name": "stakerRemoved", "desc": "" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "stakeRemoved is called by Staking pools to inform the validator (us) that a particular amount of total stake has been removed\nfrom the specified pool. This is used to update the stats we have in our PoolInfo storage.\nIf any amount of rewardRemoved is specified, then that amount of reward is sent to the use\nThe calling App id is validated against our pool list as well.", "events": [], "recommendations": {} }, { "name": "findPoolForStaker", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." }, { "type": "address", "name": "staker", "desc": "- The address of the staker." }, { "type": "uint64", "name": "amountToStake", "desc": "- The amount to stake." } ], "returns": { "type": "((uint64,uint64,uint64),bool,bool)", "desc": ", boolean, boolean} - The pool for the staker, true/false on whether the staker is 'new'\nto this VALIDATOR, and true/false if staker is new to the protocol." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.", "events": [], "recommendations": {} }, { "name": "movePoolToNode", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." }, { "type": "uint64", "name": "poolAppId", "desc": "" }, { "type": "uint64", "name": "nodeNum", "desc": "" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Find the specified pool (in any node number) and move it to the specified node.\nThe pool account is forced offline if moved so prior node will still run for 320 rounds but\nnew key goes online on new node soon after (320 rounds after it goes online)\nNo-op if success, asserts if not found or can't move (no space in target)\n[ ONLY OWNER OR MANAGER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "emptyTokenRewards", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." }, { "type": "address", "name": "receiver", "desc": "- the account to send the tokens to (must already be opted-in to the reward token)" } ], "returns": { "type": "uint64", "desc": "the amount of reward token sent" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Sends the reward tokens held in pool 1 to specified receiver.\nThis is intended to be used by the owner when they want to get reward tokens 'back' which they sent to\nthe first pool (likely because validator is sunsetting. Any tokens currently 'reserved' for stakers to claim will\nNOT be sent as they must be held back for stakers to later claim.\n[ ONLY OWNER CAN CALL]", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "ValidatorRegistry is the 'master contract' for the reti pooling protocol.\nA single immutable instance of this is deployed. All state for all validators including information about their\npools and nodes is stored via this contract in global state and box storage. Data in the pools themselves is stored\nwithin the StakingPool contract instance, also in global state and box storage.\nSee the StakingPool contract comments for details on how this contract creates new instances of them.", "networks": {}, "state": { "schema": { "global": { "ints": 5, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "programVersion": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cHJvZ3JhbVZlcnNpb24=" }, "stakingPoolInitialized": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aW5pdA==" }, "numValidators": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnVtVg==" }, "numStakers": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnVtU3Rha2Vycw==" }, "totalAlgoStaked": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3Rha2Vk" } }, "local": {}, "box": { "stakingPoolApprovalProgram": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcw==" } } }, "maps": { "global": {}, "local": {}, "box": { "validatorList": { "keyType": "uint64", "valueType": "ValidatorInfo", "prefix": "dg==" }, "stakerPoolSet": { "keyType": "address", "valueType": "(uint64,uint64,uint64)[6]", "prefix": "c3Bz" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1492, 1507, 1522, 1549, 1629, 1646, 1681, 1713, 1732, 1817, 1897, 2250, 2280, 2323, 2398, 2435, 2502, 2518, 2773, 2810, 2829, 2852, 3163, 3241, 3382, 3417, 3497, 3524, 3540, 3580, 3592, 3626, 3679, 3752, 3782, 3980, 4067, 4113, 4160, 4233, 4242, 4408, 4486, 4549, 4629, 4769, 4785, 4804, 4976, 5107, 5129, 5217 ], "errorMessage": "Box must have value" }, { "pc": [ 3321 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 2186, 2379 ], "errorMessage": "If specifying NFD, account adding validator must be owner" }, { "pc": [ 3456 ], "errorMessage": "No empty slot available in the staker pool set" }, { "pc": [ 4376 ], "errorMessage": "No matching slot found when told to remove a pool from the stakers set" }, { "pc": [ 3140 ], "errorMessage": "No pool available with free stake. Validator needs to add another pool" }, { "pc": [ 262, 286, 310, 337, 368, 399, 419, 453, 487, 520, 539, 565, 589, 608, 644, 660, 680, 700, 719, 744, 765, 784, 809, 829, 849, 869, 889, 906, 922, 970, 979, 991, 1013, 1029 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ 1044 ], "errorMessage": "OnCompletion is not UpdateApplication" }, { "pc": [ 1292 ], "errorMessage": "Temporary: contract is upgradeable but only during testing and only from a development account" }, { "pc": [ 5150 ], "errorMessage": "The passed in app id doesn't match the passed in ids" }, { "pc": [ 2569 ], "errorMessage": "already at max pool size" }, { "pc": [ 3277, 3516, 5023, 5064, 5157 ], "errorMessage": "application exists" }, { "pc": [ 2083, 2548, 2805 ], "errorMessage": "assert target is match for conditions" }, { "pc": [ 2899, 2983 ], "errorMessage": "asset exists" }, { "pc": [ 5073 ], "errorMessage": "balance of remaining reward tokens should match the held back amount" }, { "pc": [ 2530, 4797 ], "errorMessage": "can only be called by owner or manager of validator" }, { "pc": [ 2260, 2290, 2333, 2408, 2445, 4988 ], "errorMessage": "can only be called by validator owner" }, { "pc": [ 1033 ], "errorMessage": "can only call when creating" }, { "pc": [ 265, 289, 313, 340, 371, 402, 422, 456, 490, 523, 542, 568, 592, 611, 647, 663, 683, 703, 722, 747, 768, 787, 812, 832, 852, 872, 892, 909, 925, 973, 982, 994, 1016, 1047 ], "errorMessage": "can only call when not creating" }, { "pc": [ 4887 ], "errorMessage": "can't move to same node" }, { "pc": [ 2783 ], "errorMessage": "can't stake with a validator that is past its sunsetting time" }, { "pc": [ 1354, 1480, 2099, 3406, 3441, 3870, 4051, 4432 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1988 ], "errorMessage": "commission percentage not valid" }, { "pc": [ 4828 ], "errorMessage": "couldn't find pool app id in nodes to move" }, { "pc": [ 1971 ], "errorMessage": "epoch length not in allowable range" }, { "pc": [ 2094 ], "errorMessage": "fee must be 10 ALGO or more to prevent spamming of validators" }, { "pc": [ 1949 ], "errorMessage": "gating type not valid" }, { "pc": [ 1570, 1661, 1699, 1837, 3180, 3260, 3503, 3693, 3804, 4008, 4119, 4172, 4262, 4516, 4567, 4671, 4861, 5015, 5144, 5271 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 2702, 3353, 3727, 3816, 4020, 4897, 5299 ], "errorMessage": "index out of bounds" }, { "pc": [ 1584, 1855 ], "errorMessage": "max array length exceeded" }, { "pc": [ 2889 ], "errorMessage": "must have required minimum balance of validator defined token to add stake" }, { "pc": [ 4640 ], "errorMessage": "must stake at least the minimum for this pool" }, { "pc": [ 5249 ], "errorMessage": "no available space in specified node for this pool" }, { "pc": [ 5239 ], "errorMessage": "node number not in valid range" }, { "pc": [ 4819 ], "errorMessage": "node number out of allowable range" }, { "pc": [ 2033 ], "errorMessage": "number of pools per node exceeds allowed number" }, { "pc": [ 1156, 1214, 1238, 2676, 3345, 4184 ], "errorMessage": "overflow" }, { "pc": [ 1638 ], "errorMessage": "pool id must be between 1 and number of pools for this validator" }, { "pc": [ 5100 ], "errorMessage": "pool id not in valid range" }, { "pc": [ 5120 ], "errorMessage": "pool id outside of range of pools created for this validator" }, { "pc": [ 2215 ], "errorMessage": "provided NFD App id for gating must be valid NFD" }, { "pc": [ 2178 ], "errorMessage": "provided NFD isn't valid" }, { "pc": [ 3001 ], "errorMessage": "provided NFD must be valid" }, { "pc": [ 3025 ], "errorMessage": "provided nfd for entry isn't owned or linked to the staker" }, { "pc": [ 4092 ], "errorMessage": "reward being removed must be covered by hold back amount" }, { "pc": [ 4082 ], "errorMessage": "rewardRemoved can't be set if validator doesn't have reward token!" }, { "pc": [ 2073 ], "errorMessage": "sender must be owner to add new validator" }, { "pc": [ 3963 ], "errorMessage": "should only be called if algo or reward was removed" }, { "pc": [ 2987 ], "errorMessage": "specified asset must be created by creator that is one of the linked addresses in an nfd" }, { "pc": [ 2909 ], "errorMessage": "specified asset must be created by creator that the validator defined as a requirement to stake" }, { "pc": [ 2960 ], "errorMessage": "specified asset must be identical to the asset id defined as a requirement to stake" }, { "pc": [ 3056 ], "errorMessage": "specified nfd must be a segment of the nfd the validator specified as a requirement" }, { "pc": [ 2555, 2758 ], "errorMessage": "specified validator id isn't valid" }, { "pc": [ 1356 ], "errorMessage": "staking pool already initialized" }, { "pc": [ 2011 ], "errorMessage": "staking pool must have minimum entry of 1 algo" }, { "pc": [ 2050 ], "errorMessage": "sunsettingOn must be later than now if set" }, { "pc": [ 1917 ], "errorMessage": "the specified validator id doesn't exist" }, { "pc": [ 5090 ], "errorMessage": "the specified validator id isn't valid" }, { "pc": [ 5007 ], "errorMessage": "this validator doesn't have a reward token defined" }, { "pc": [ 2827 ], "errorMessage": "total staked for all of a validators pools may not exceed hard cap" }, { "pc": [ 432, 466, 621 ], "errorMessage": "transaction type is pay" }, { "pc": [ 2002 ], "errorMessage": "validatorCommissionAddress must be set if percent to validator is not 0" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDE4IDI0IDI2OCA0MzIgMjAwIDcwMCA5MDAgMTkyIFRNUExfTkZEX1JFR0lTVFJZX0FQUF9JRCAxMDAwMDAwIDIyNiAyMDkgNDA5NiAyNzggMjUyIDc0MTAwCiAgICBieXRlY2Jsb2NrICJ2IiAweDE1MWY3Yzc1ICIiICJzdGFrZWQiICJwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzIiAibnVtU3Rha2VycyIgMHgwMCAic3BzIiAiaW5pdCIgIm51bVYiIDB4MDAwMTAwMDAwMDAwMDAwMDAzZTggImkub3duZXIuYSIgMHgwMDAyMDAwNzFhZmQ0OThkMDAwMDAwMDAwMDAwMDAwMDAwOTYgMHgwMDAwICJpc192YWxpZF9uZmRfYXBwaWQiIDB4MDY4MTAxIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMHg2M2YzZjI4YgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VANDEKICAgIHB1c2hieXRlc3MgMHg0NmY3NjUzMyAweGI4NDQ3YjM2IDB4MWI1ZTgyYzYgMHg3OTQ3MmQ4MyAweDVmN2FjZmQ5IDB4MzE3MmNhOWQgMHg4YTg3MTQyZCAweGQxMzY2Y2MzIDB4M2IwNDVjNWMgMHg3NWFmZjYxZCAweDFmMmYwMTA5IDB4MmZhMjJjNGIgMHg5MTBlOTRhYyAweDU3Mjc2N2QxIDB4OWI1MDRhYWYgMHhmYmM2MzE3OCAweDI0NDk4Y2Y0IDB4Zjg0NmRkN2EgMHg4MzA1MDUwMSAweDdiYmI2YzhkIDB4ZjgzOTQxNGEgMHgwYzMxN2NmYiAweDNlMjg4OTcyIDB4ZGQ1ZmFhZGEgMHgxOGFhYzdhNyAweGY5OWVmNTRkIDB4MTA4MDlkNGQgMHhlNzc4ZGQ1YSAweGJmNTI1OWQwIDB4NGRmOGQ4NmUgMHg0MThmY2VmYyAweGEyZGM1MWI1IDB4Mjg3M2Y1MDQgMHgwNTQ3ZjRmZSAweGNiNjY4MzU4IC8vIG1ldGhvZCAidXBkYXRlQXBwbGljYXRpb24oKXZvaWQiLCBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIiwgbWV0aG9kICJpbml0U3Rha2luZ0NvbnRyYWN0KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YSh1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImZpbmFsaXplU3Rha2luZ0NvbnRyYWN0KCl2b2lkIiwgbWV0aG9kICJnYXMoKXZvaWQiLCBtZXRob2QgImdldE1ickFtb3VudHMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRQcm90b2NvbENvbnN0cmFpbnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldE51bVZhbGlkYXRvcnMoKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0VmFsaWRhdG9yQ29uZmlnKHVpbnQ2NCkodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldFZhbGlkYXRvclN0YXRlKHVpbnQ2NCkodWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyKHVpbnQ2NCkoYWRkcmVzcyxhZGRyZXNzKSIsIG1ldGhvZCAiZ2V0UG9vbHModWludDY0KSh1aW50NjQsdWludDE2LHVpbnQ2NClbXSIsIG1ldGhvZCAiZ2V0UG9vbEFwcElkKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRQb29sSW5mbygodWludDY0LHVpbnQ2NCx1aW50NjQpKSh1aW50NjQsdWludDE2LHVpbnQ2NCkiLCBtZXRob2QgImdldEN1ck1heFN0YWtlUGVyUG9vbCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJnZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpIiwgbWV0aG9kICJnZXROb2RlUG9vbEFzc2lnbm1lbnRzKHVpbnQ2NCkoKHVpbnQ2NFszXSlbOF0pIiwgbWV0aG9kICJnZXRORkRSZWdpc3RyeUlEKCl1aW50NjQiLCBtZXRob2QgImFkZFZhbGlkYXRvcihwYXksc3RyaW5nLCh1aW50NjQsYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50OCxhZGRyZXNzLHVpbnQ2NFs0XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50MzIsdWludDMyLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0KSl1aW50NjQiLCBtZXRob2QgImNoYW5nZVZhbGlkYXRvck1hbmFnZXIodWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JORkQodWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3ModWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbyh1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRQb29sKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFkZFN0YWtlKHBheSx1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInNldFRva2VuUGF5b3V0UmF0aW8odWludDY0KSh1aW50NjRbMjRdLHVpbnQ2NCkiLCBtZXRob2QgInN0YWtlVXBkYXRlZFZpYVJld2FyZHMoKHVpbnQ2NCx1aW50NjQsdWludDY0KSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3Rha2VSZW1vdmVkKCh1aW50NjQsdWludDY0LHVpbnQ2NCksYWRkcmVzcyx1aW50NjQsdWludDY0LGJvb2wpdm9pZCIsIG1ldGhvZCAiZmluZFBvb2xGb3JTdGFrZXIodWludDY0LGFkZHJlc3MsdWludDY0KSgodWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wsYm9vbCkiLCBtZXRob2QgIm1vdmVQb29sVG9Ob2RlKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImVtcHR5VG9rZW5SZXdhcmRzKHVpbnQ2NCxhZGRyZXNzKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdXBkYXRlQXBwbGljYXRpb25fcm91dGVAMyBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDQgbWFpbl9pbml0U3Rha2luZ0NvbnRyYWN0X3JvdXRlQDUgbWFpbl9sb2FkU3Rha2luZ0NvbnRyYWN0RGF0YV9yb3V0ZUA2IG1haW5fZmluYWxpemVTdGFraW5nQ29udHJhY3Rfcm91dGVANyBtYWluX2dhc19yb3V0ZUA4IG1haW5fZ2V0TWJyQW1vdW50c19yb3V0ZUA5IG1haW5fZ2V0UHJvdG9jb2xDb25zdHJhaW50c19yb3V0ZUAxMCBtYWluX2dldE51bVZhbGlkYXRvcnNfcm91dGVAMTEgbWFpbl9nZXRWYWxpZGF0b3JDb25maWdfcm91dGVAMTIgbWFpbl9nZXRWYWxpZGF0b3JTdGF0ZV9yb3V0ZUAxMyBtYWluX2dldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcl9yb3V0ZUAxNCBtYWluX2dldFBvb2xzX3JvdXRlQDE1IG1haW5fZ2V0UG9vbEFwcElkX3JvdXRlQDE2IG1haW5fZ2V0UG9vbEluZm9fcm91dGVAMTcgbWFpbl9nZXRDdXJNYXhTdGFrZVBlclBvb2xfcm91dGVAMTggbWFpbl9kb2VzU3Rha2VyTmVlZFRvUGF5TUJSX3JvdXRlQDE5IG1haW5fZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X3JvdXRlQDIwIG1haW5fZ2V0VG9rZW5QYXlvdXRSYXRpb19yb3V0ZUAyMSBtYWluX2dldE5vZGVQb29sQXNzaWdubWVudHNfcm91dGVAMjIgbWFpbl9nZXRORkRSZWdpc3RyeUlEX3JvdXRlQDIzIG1haW5fYWRkVmFsaWRhdG9yX3JvdXRlQDI0IG1haW5fY2hhbmdlVmFsaWRhdG9yTWFuYWdlcl9yb3V0ZUAyNSBtYWluX2NoYW5nZVZhbGlkYXRvclN1bnNldEluZm9fcm91dGVAMjYgbWFpbl9jaGFuZ2VWYWxpZGF0b3JORkRfcm91dGVAMjcgbWFpbl9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzc19yb3V0ZUAyOCBtYWluX2NoYW5nZVZhbGlkYXRvclJld2FyZEluZm9fcm91dGVAMjkgbWFpbl9hZGRQb29sX3JvdXRlQDMwIG1haW5fYWRkU3Rha2Vfcm91dGVAMzEgbWFpbl9zZXRUb2tlblBheW91dFJhdGlvX3JvdXRlQDMyIG1haW5fc3Rha2VVcGRhdGVkVmlhUmV3YXJkc19yb3V0ZUAzMyBtYWluX3N0YWtlUmVtb3ZlZF9yb3V0ZUAzNCBtYWluX2ZpbmRQb29sRm9yU3Rha2VyX3JvdXRlQDM1IG1haW5fbW92ZVBvb2xUb05vZGVfcm91dGVAMzYgbWFpbl9lbXB0eVRva2VuUmV3YXJkc19yb3V0ZUAzNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZW1wdHlUb2tlblJld2FyZHNfcm91dGVAMzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODYKICAgIC8vIGVtcHR5VG9rZW5SZXdhcmRzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHJlY2VpdmVyOiBBZGRyZXNzKTogdWludDY0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4NgogICAgLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQgewogICAgY2FsbHN1YiBlbXB0eVRva2VuUmV3YXJkcwogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9tb3ZlUG9vbFRvTm9kZV9yb3V0ZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0MwogICAgLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQzCiAgICAvLyBtb3ZlUG9vbFRvTm9kZSh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBwb29sQXBwSWQ6IHVpbnQ2NCwgbm9kZU51bTogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIG1vdmVQb29sVG9Ob2RlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2ZpbmRQb29sRm9yU3Rha2VyX3JvdXRlQDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NzAtOTc0CiAgICAvLyBmaW5kUG9vbEZvclN0YWtlcigKICAgIC8vICAgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwKICAgIC8vICAgc3Rha2VyOiBBZGRyZXNzLAogICAgLy8gICBhbW91bnRUb1N0YWtlOiB1aW50NjQsCiAgICAvLyApOiBbVmFsaWRhdG9yUG9vbEtleSwgYm9vbGVhbiwgYm9vbGVhbl0gewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NzAtOTc0CiAgICAvLyBmaW5kUG9vbEZvclN0YWtlcigKICAgIC8vICAgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwKICAgIC8vICAgc3Rha2VyOiBBZGRyZXNzLAogICAgLy8gICBhbW91bnRUb1N0YWtlOiB1aW50NjQsCiAgICAvLyApOiBbVmFsaWRhdG9yUG9vbEtleSwgYm9vbGVhbiwgYm9vbGVhbl0gewogICAgY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFrZVJlbW92ZWRfcm91dGVAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NC04ODAKICAgIC8vIHN0YWtlUmVtb3ZlZCgKICAgIC8vICAgcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSwKICAgIC8vICAgc3Rha2VyOiBBZGRyZXNzLAogICAgLy8gICBhbW91bnRSZW1vdmVkOiB1aW50NjQsCiAgICAvLyAgIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NCwKICAgIC8vICAgc3Rha2VyUmVtb3ZlZDogYm9vbGVhbiwKICAgIC8vICk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NzQtODgwCiAgICAvLyBzdGFrZVJlbW92ZWQoCiAgICAvLyAgIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksCiAgICAvLyAgIHN0YWtlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50UmVtb3ZlZDogdWludDY0LAogICAgLy8gICByZXdhcmRSZW1vdmVkOiB1aW50NjQsCiAgICAvLyAgIHN0YWtlclJlbW92ZWQ6IGJvb2xlYW4sCiAgICAvLyApOiB2b2lkIHsKICAgIGNhbGxzdWIgc3Rha2VSZW1vdmVkCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0YWtlVXBkYXRlZFZpYVJld2FyZHNfcm91dGVAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzMi04MzgKICAgIC8vIHN0YWtlVXBkYXRlZFZpYVJld2FyZHMoCiAgICAvLyAgIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksCiAgICAvLyAgIGFsZ29Ub0FkZDogdWludDY0LAogICAgLy8gICByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQsCiAgICAvLyAgIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NCwKICAgIC8vICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzMi04MzgKICAgIC8vIHN0YWtlVXBkYXRlZFZpYVJld2FyZHMoCiAgICAvLyAgIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksCiAgICAvLyAgIGFsZ29Ub0FkZDogdWludDY0LAogICAgLy8gICByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQsCiAgICAvLyAgIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NCwKICAgIC8vICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICBjYWxsc3ViIHN0YWtlVXBkYXRlZFZpYVJld2FyZHMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0VG9rZW5QYXlvdXRSYXRpb19yb3V0ZUAzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzc2CiAgICAvLyBzZXRUb2tlblBheW91dFJhdGlvKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sVG9rZW5QYXlvdXRSYXRpbyB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3NgogICAgLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8gewogICAgY2FsbHN1YiBzZXRUb2tlblBheW91dFJhdGlvCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZFN0YWtlX3JvdXRlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2ODktNjkzCiAgICAvLyBhZGRTdGFrZSgKICAgIC8vICAgc3Rha2VkQW1vdW50UGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLAogICAgLy8gICB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQsCiAgICAvLyApOiBWYWxpZGF0b3JQb29sS2V5IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2ODktNjkzCiAgICAvLyBhZGRTdGFrZSgKICAgIC8vICAgc3Rha2VkQW1vdW50UGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLAogICAgLy8gICB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQsCiAgICAvLyApOiBWYWxpZGF0b3JQb29sS2V5IHsKICAgIGNhbGxzdWIgYWRkU3Rha2UKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkUG9vbF9yb3V0ZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIyCiAgICAvLyBhZGRQb29sKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgbm9kZU51bTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjIyCiAgICAvLyBhZGRQb29sKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgbm9kZU51bTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleSB7CiAgICBjYWxsc3ViIGFkZFBvb2wKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mb19yb3V0ZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTkxLTU5OAogICAgLy8gY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbygKICAgIC8vICAgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwKICAgIC8vICAgRW50cnlHYXRpbmdUeXBlOiBVaW50OCwKICAgIC8vICAgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLAogICAgLy8gICBFbnRyeUdhdGluZ0Fzc2V0czogRml4ZWRBcnJheTx1aW50NjQsIDQ+LAogICAgLy8gICBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NCwKICAgIC8vICAgUmV3YXJkUGVyUGF5b3V0OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTkxLTU5OAogICAgLy8gY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbygKICAgIC8vICAgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwKICAgIC8vICAgRW50cnlHYXRpbmdUeXBlOiBVaW50OCwKICAgIC8vICAgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLAogICAgLy8gICBFbnRyeUdhdGluZ0Fzc2V0czogRml4ZWRBcnJheTx1aW50NjQsIDQ+LAogICAgLy8gICBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NCwKICAgIC8vICAgUmV3YXJkUGVyUGF5b3V0OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzc19yb3V0ZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc4CiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcyk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NzgKICAgIC8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZVZhbGlkYXRvck5GRF9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU0CiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JORkQodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgbmZkQXBwSUQ6IHVpbnQ2NCwgbmZkTmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTQKICAgIC8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTkZECiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZVZhbGlkYXRvclN1bnNldEluZm9fcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzNwogICAgLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTM3CiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN1bnNldHRpbmdPbjogdWludDY0LCBzdW5zZXR0aW5nVG86IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQgewogICAgY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZVZhbGlkYXRvck1hbmFnZXJfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMQogICAgLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMQogICAgLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkVmFsaWRhdG9yX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzAKICAgIC8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzAKICAgIC8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQgewogICAgY2FsbHN1YiBhZGRWYWxpZGF0b3IKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0TkZEUmVnaXN0cnlJRF9yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU4CiAgICAvLyBnZXRORkRSZWdpc3RyeUlEKCk6IHVpbnQ2NCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDU5CiAgICAvLyByZXR1cm4gVGVtcGxhdGVWYXI8dWludDY0PignTkZEX1JFR0lTVFJZX0FQUF9JRCcpCiAgICBpbnRjIDEwIC8vIFRNUExfTkZEX1JFR0lTVFJZX0FQUF9JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTgKICAgIC8vIGdldE5GRFJlZ2lzdHJ5SUQoKTogdWludDY0IHsKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0Tm9kZVBvb2xBc3NpZ25tZW50c19yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUyCiAgICAvLyBnZXROb2RlUG9vbEFzc2lnbm1lbnRzKHZhbGlkYXRvcklkOiB1aW50NjQpOiBOb2RlUG9vbEFzc2lnbm1lbnRDb25maWcgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTIKICAgIC8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZyB7CiAgICBjYWxsc3ViIGdldE5vZGVQb29sQXNzaWdubWVudHMKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VG9rZW5QYXlvdXRSYXRpb19yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDQ3CiAgICAvLyBnZXRUb2tlblBheW91dFJhdGlvKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sVG9rZW5QYXlvdXRSYXRpbyB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ0NwogICAgLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8gewogICAgY2FsbHN1YiBnZXRUb2tlblBheW91dFJhdGlvCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldFN0YWtlZFBvb2xzRm9yQWNjb3VudF9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI1CiAgICAvLyBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoc3Rha2VyOiBBZGRyZXNzKTogVmFsaWRhdG9yUG9vbEtleVtdIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI1CiAgICAvLyBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQoc3Rha2VyOiBBZGRyZXNzKTogVmFsaWRhdG9yUG9vbEtleVtdIHsKICAgIGNhbGxzdWIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlJfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQxNQogICAgLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDE1CiAgICAvLyBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSKHN0YWtlcjogQWRkcmVzcyk6IGJvb2xlYW4gewogICAgY2FsbHN1YiBkb2VzU3Rha2VyTmVlZFRvUGF5TUJSCiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRDdXJNYXhTdGFrZVBlclBvb2xfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM5NwogICAgLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTcKICAgIC8vIGdldEN1ck1heFN0YWtlUGVyUG9vbCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogdWludDY0IHsKICAgIGNhbGxzdWIgZ2V0Q3VyTWF4U3Rha2VQZXJQb29sCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldFBvb2xJbmZvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODYKICAgIC8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbyB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4NgogICAgLy8gZ2V0UG9vbEluZm8ocG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSk6IFBvb2xJbmZvIHsKICAgIGNhbGxzdWIgZ2V0UG9vbEluZm8KICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0UG9vbEFwcElkX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzcKICAgIC8vIGdldFBvb2xBcHBJZCh2YWxpZGF0b3JJZDogdWludDY0LCBwb29sSWQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM3NwogICAgLy8gZ2V0UG9vbEFwcElkKHZhbGlkYXRvcklkOiB1aW50NjQsIHBvb2xJZDogdWludDY0KTogdWludDY0IHsKICAgIGNhbGxzdWIgZ2V0UG9vbEFwcElkCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldFBvb2xzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjAKICAgIC8vIGdldFBvb2xzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sSW5mb1tdIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzYwCiAgICAvLyBnZXRQb29scyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbEluZm9bXSB7CiAgICBjYWxsc3ViIGdldFBvb2xzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcl9yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQ5CiAgICAvLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFtBZGRyZXNzLCBBZGRyZXNzXSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjAzCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0OQogICAgLy8gZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBbQWRkcmVzcywgQWRkcmVzc10gewogICAgY2FsbHN1YiBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VmFsaWRhdG9yU3RhdGVfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NAogICAgLy8gZ2V0VmFsaWRhdG9yU3RhdGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFZhbGlkYXRvckN1clN0YXRlIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQ0CiAgICAvLyBnZXRWYWxpZGF0b3JTdGF0ZSh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ3VyU3RhdGUgewogICAgY2FsbHN1YiBnZXRWYWxpZGF0b3JTdGF0ZQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRWYWxpZGF0b3JDb25maWdfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMzOQogICAgLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDb25maWcgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMzkKICAgIC8vIGdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ29uZmlnIHsKICAgIGNhbGxzdWIgZ2V0VmFsaWRhdG9yQ29uZmlnCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldE51bVZhbGlkYXRvcnNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMzNAogICAgLy8gZ2V0TnVtVmFsaWRhdG9ycygpOiB1aW50NjQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldE51bVZhbGlkYXRvcnMKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0UHJvdG9jb2xDb25zdHJhaW50c19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE0CiAgICAvLyBnZXRQcm90b2NvbENvbnN0cmFpbnRzKCk6IENvbnN0cmFpbnRzIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRQcm90b2NvbENvbnN0cmFpbnRzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldE1ickFtb3VudHNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjgwCiAgICAvLyBnZXRNYnJBbW91bnRzKCk6IE1ickFtb3VudHMgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAwMDAwMDAwNmMyMTQwMDAwMDAwMDAwMGViM2FjMDAwMDAwMDAwMDRmYmI1NDAwMDAwMDAwMDAwMTIxNzQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nYXNfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjY5CiAgICAvLyBnYXMoKTogdm9pZCB7fQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0X3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MgogICAgLy8gZmluYWxpemVTdGFraW5nQ29udHJhY3QoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZmluYWxpemVTdGFraW5nQ29udHJhY3QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fbG9hZFN0YWtpbmdDb250cmFjdERhdGFfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjU3CiAgICAvLyBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YShvZmZzZXQ6IHVpbnQ2NCwgZGF0YTogYnl0ZXMpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDMKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1NwogICAgLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICBjYWxsc3ViIGxvYWRTdGFraW5nQ29udHJhY3REYXRhCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2luaXRTdGFraW5nQ29udHJhY3Rfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjUyCiAgICAvLyBpbml0U3Rha2luZ0NvbnRyYWN0KGFwcHJvdmFsUHJvZ3JhbVNpemU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMwogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNTIKICAgIC8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIGluaXRTdGFraW5nQ29udHJhY3QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlQXBwbGljYXRpb25fcm91dGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ0CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbigpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBjYWxsc3ViIGNyZWF0ZUFwcGxpY2F0aW9uCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZUFwcGxpY2F0aW9uX3JvdXRlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNAogICAgLy8gdXBkYXRlQXBwbGljYXRpb24oKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBVcGRhdGVBcHBsaWNhdGlvbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHVwZGF0ZUFwcGxpY2F0aW9uCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMTUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAxNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6OndpZGVSYXRpbyhudW1lcmF0b3JGYWN0b3JzOiBieXRlcywgZGVub21pbmF0b3JGYWN0b3JzOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CndpZGVSYXRpbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHdpZGVSYXRpbyhudW1lcmF0b3JGYWN0b3JzOiB1aW50NjRbXSwgZGVub21pbmF0b3JGYWN0b3JzOiB1aW50NjRbXSk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6NQogICAgLy8gbGV0IG51bWVyYXRvciA9IG5ldyBVaW50MTI4KDFuKQogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdXRpbHMuYWxnby50czo2CiAgICAvLyBmb3IgKGNvbnN0IGZhY3RvciBvZiBudW1lcmF0b3JGYWN0b3JzKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCndpZGVSYXRpb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS91dGlscy5hbGdvLnRzOjYKICAgIC8vIGZvciAoY29uc3QgZmFjdG9yIG9mIG51bWVyYXRvckZhY3RvcnMpIHsKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogd2lkZVJhdGlvX2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6NwogICAgLy8gbnVtZXJhdG9yID0gbmV3IFVpbnQxMjgoQmlnVWludChmYWN0b3IpICogbnVtZXJhdG9yLm5hdGl2ZSkKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBiKgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGJ6ZXJvCiAgICBifAogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1CiAgICBiIHdpZGVSYXRpb19mb3JfaGVhZGVyQDEKCndpZGVSYXRpb19hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6MTAKICAgIC8vIGxldCBkZW5vbWluYXRvciA9IG5ldyBVaW50MTI4KDFuKQogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS91dGlscy5hbGdvLnRzOjExCiAgICAvLyBmb3IgKGNvbnN0IGZhY3RvciBvZiBkZW5vbWluYXRvckZhY3RvcnMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCndpZGVSYXRpb19mb3JfaGVhZGVyQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS91dGlscy5hbGdvLnRzOjExCiAgICAvLyBmb3IgKGNvbnN0IGZhY3RvciBvZiBkZW5vbWluYXRvckZhY3RvcnMpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogd2lkZVJhdGlvX2FmdGVyX2ZvckA4CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3V0aWxzLmFsZ28udHM6MTIKICAgIC8vIGRlbm9taW5hdG9yID0gbmV3IFVpbnQxMjgoQmlnVWludChmYWN0b3IpICogZGVub21pbmF0b3IubmF0aXZlKQogICAgaXRvYgogICAgZnJhbWVfZGlnIDAKICAgIGIqCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCAxNiAvLyAxNgogICAgYnplcm8KICAgIGJ8CiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgd2lkZVJhdGlvX2Zvcl9oZWFkZXJANQoKd2lkZVJhdGlvX2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdXRpbHMuYWxnby50czoxNQogICAgLy8gY29uc3QgcmF0aW86IGJpZ3VpbnQgPSBudW1lcmF0b3IubmF0aXZlIC8gZGVub21pbmF0b3IubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIGIvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS91dGlscy5hbGdvLnRzOjE2CiAgICAvLyByZXR1cm4gbmV3IFVpbnQ2NChyYXRpbykubmF0aXZlCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBiemVybwogICAgYnwKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS51cGRhdGVBcHBsaWNhdGlvbigpIC0+IHZvaWQ6CnVwZGF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzYKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFjY291bnQoJ0xaNFYySVJWTENYRkpLNFJFSlY0VEFHRUtFWVRBMkdNUjZUQzIzNDRPQjNMM0FGM01XWFo2WkFGSVEnKSwKICAgIHR4biBTZW5kZXIKICAgIHB1c2hieXRlcyBiYXNlMzIoTFo0VjJJUlZMQ1hGSks0UkVKVjRUQUdFS0VZVEEyR01SNlRDMjM0NE9CM0wzQUYzTVdYUSkgLy8gYWRkciBMWjRWMklSVkxDWEZKSzRSRUpWNFRBR0VLRVlUQTJHTVI2VEMyMzQ0T0IzTDNBRjNNV1haNlpBRklRCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzUtMjM4CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IEFjY291bnQoJ0xaNFYySVJWTENYRkpLNFJFSlY0VEFHRUtFWVRBMkdNUjZUQzIzNDRPQjNMM0FGM01XWFo2WkFGSVEnKSwKICAgIC8vICAgJ1RlbXBvcmFyeTogY29udHJhY3QgaXMgdXBncmFkZWFibGUgYnV0IG9ubHkgZHVyaW5nIHRlc3RpbmcgYW5kIG9ubHkgZnJvbSBhIGRldmVsb3BtZW50IGFjY291bnQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIFRlbXBvcmFyeTogY29udHJhY3QgaXMgdXBncmFkZWFibGUgYnV0IG9ubHkgZHVyaW5nIHRlc3RpbmcgYW5kIG9ubHkgZnJvbSBhIGRldmVsb3BtZW50IGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA5CiAgICAvLyBzdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbSA9IEJveDxieXRlcz4oeyBrZXk6ICdwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzJyB9KQogICAgYnl0ZWMgNCAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQwCiAgICAvLyB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjExCiAgICAvLyBzdGFraW5nUG9vbEluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6ICdpbml0JyB9KQogICAgYnl0ZWMgOCAvLyAiaW5pdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQxCiAgICAvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5jcmVhdGVBcHBsaWNhdGlvbigpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTEKICAgIC8vIHN0YWtpbmdQb29sSW5pdGlhbGl6ZWQgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGtleTogJ2luaXQnIH0pCiAgICBieXRlYyA4IC8vICJpbml0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDUKICAgIC8vIHRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSA9IGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjEzCiAgICAvLyBudW1WYWxpZGF0b3JzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVYnIH0pCiAgICBieXRlYyA5IC8vICJudW1WIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDYKICAgIC8vIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTYKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDUgLy8gIm51bVN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI0NwogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIxOQogICAgLy8gdG90YWxBbGdvU3Rha2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3N0YWtlZCcgfSkKICAgIGJ5dGVjXzMgLy8gInN0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ4CiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDQKICAgIC8vIHByb2dyYW1WZXJzaW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Byb2dyYW1WZXJzaW9uJyB9KQogICAgcHVzaGJ5dGVzICJwcm9ncmFtVmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQ5CiAgICAvLyB0aGlzLnByb2dyYW1WZXJzaW9uLnZhbHVlID0gMTAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5pbml0U3Rha2luZ0NvbnRyYWN0KGFwcHJvdmFsUHJvZ3JhbVNpemU6IHVpbnQ2NCkgLT4gdm9pZDoKaW5pdFN0YWtpbmdDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjUyCiAgICAvLyBpbml0U3Rha2luZ0NvbnRyYWN0KGFwcHJvdmFsUHJvZ3JhbVNpemU6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwOQogICAgLy8gc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0gPSBCb3g8Ynl0ZXM+KHsga2V5OiAncG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcycgfSkKICAgIGJ5dGVjIDQgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1NAogICAgLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5jcmVhdGUoeyBzaXplOiBhcHByb3ZhbFByb2dyYW1TaXplIH0pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkubG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKSAtPiB2b2lkOgpsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjU3CiAgICAvLyBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YShvZmZzZXQ6IHVpbnQ2NCwgZGF0YTogYnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNTgKICAgIC8vIGFzc2VydCghdGhpcy5zdGFraW5nUG9vbEluaXRpYWxpemVkLnZhbHVlLCAnc3Rha2luZyBwb29sIGFscmVhZHkgaW5pdGlhbGl6ZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjExCiAgICAvLyBzdGFraW5nUG9vbEluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6ICdpbml0JyB9KQogICAgYnl0ZWMgOCAvLyAiaW5pdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjU4CiAgICAvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSwgJ3N0YWtpbmcgcG9vbCBhbHJlYWR5IGluaXRpYWxpemVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gc3Rha2luZyBwb29sIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjA5CiAgICAvLyBzdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbSA9IEJveDxieXRlcz4oeyBrZXk6ICdwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzJyB9KQogICAgYnl0ZWMgNCAvLyAicG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjU5CiAgICAvLyB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnJlZi5yZXBsYWNlKG9mZnNldCwgZGF0YSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZmluYWxpemVTdGFraW5nQ29udHJhY3QoKSAtPiB2b2lkOgpmaW5hbGl6ZVN0YWtpbmdDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjExCiAgICAvLyBzdGFraW5nUG9vbEluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6ICdpbml0JyB9KQogICAgYnl0ZWMgOCAvLyAiaW5pdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjYzCiAgICAvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmdldFByb3RvY29sQ29uc3RyYWludHMoKSAtPiBieXRlczoKZ2V0UHJvdG9jb2xDb25zdHJhaW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTU1NQogICAgLy8gcmV0dXJuIHdpZGVSYXRpbyhbb25saW5lLCBNQVhfVkFMSURBVE9SX0hBUkRfUENUX09GX09OTElORV8xREVDSU1BTF0sIFsxMDAwXSkKICAgIGJ5dGVjIDEyIC8vIDB4MDAwMjAwMDcxYWZkNDk4ZDAwMDAwMDAwMDAwMDAwMDAwMDk2CiAgICBieXRlYyAxMCAvLyAweDAwMDEwMDAwMDAwMDAwMDAwM2U4CiAgICBjYWxsc3ViIHdpZGVSYXRpbwogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE1NDUKICAgIC8vIHJldHVybiB3aWRlUmF0aW8oW29ubGluZSwgTUFYX1ZBTElEQVRPUl9TT0ZUX1BDVF9PRl9PTkxJTkVfMURFQ0lNQUxdLCBbMTAwMF0pCiAgICBwdXNoYnl0ZXMgMHgwMDAyMDAwNzFhZmQ0OThkMDAwMDAwMDAwMDAwMDAwMDAwNjQKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMTAwMDAwMDAwMDAwMDAzZTgKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE1LTMyNwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZXBvY2hQYXlvdXRSb3VuZHNNaW46IE1JTl9FUE9DSF9MRU5HVEgsCiAgICAvLyAgIGVwb2NoUGF5b3V0Um91bmRzTWF4OiBNQVhfRVBPQ0hfTEVOR1RILAogICAgLy8gICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAogICAgLy8gICBtYXhQY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAogICAgLy8gICBtaW5FbnRyeVN0YWtlOiBNSU5fQUxHT19TVEFLRV9QRVJfUE9PTCwKICAgIC8vICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCiAgICAvLyAgIG1heEFsZ29QZXJWYWxpZGF0b3I6IHRoaXMubWF4QWxsb3dlZFN0YWtlKCksCiAgICAvLyAgIGFtdENvbnNpZGVyZWRTYXR1cmF0ZWQ6IHRoaXMuYWxnb1NhdHVyYXRpb25MZXZlbCgpLAogICAgLy8gICBtYXhOb2RlczogTUFYX05PREVTLAogICAgLy8gICBtYXhQb29sc1Blck5vZGU6IE1BWF9QT09MU19QRVJfTk9ERSwKICAgIC8vICAgbWF4U3Rha2Vyc1BlclBvb2w6IE1BWF9TVEFLRVJTX1BFUl9QT09MLAogICAgLy8gfQogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwZjQyNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmNDI0MDAwMDAwMDAwMDAwZjQyNDAwMDAwM2ZhYTI1MjI2MDAwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjQKICAgIC8vIG1heE5vZGVzOiBNQVhfTk9ERVMsCiAgICBwdXNoaW50IDggLy8gOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTUtMzI3CiAgICAvLyByZXR1cm4gewogICAgLy8gICBlcG9jaFBheW91dFJvdW5kc01pbjogTUlOX0VQT0NIX0xFTkdUSCwKICAgIC8vICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCiAgICAvLyAgIG1pblBjdFRvVmFsaWRhdG9yV0ZvdXJEZWNpbWFsczogTUlOX1BDVF9UT19WQUxJREFUT1IsCiAgICAvLyAgIG1heFBjdFRvVmFsaWRhdG9yV0ZvdXJEZWNpbWFsczogTUFYX1BDVF9UT19WQUxJREFUT1IsCiAgICAvLyAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAogICAgLy8gICBtYXhBbGdvUGVyUG9vbDogdGhpcy5tYXhBbGdvQWxsb3dlZFBlclBvb2woKSwKICAgIC8vICAgbWF4QWxnb1BlclZhbGlkYXRvcjogdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKICAgIC8vICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCiAgICAvLyAgIG1heE5vZGVzOiBNQVhfTk9ERVMsCiAgICAvLyAgIG1heFBvb2xzUGVyTm9kZTogTUFYX1BPT0xTX1BFUl9OT0RFLAogICAgLy8gICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI1CiAgICAvLyBtYXhQb29sc1Blck5vZGU6IE1BWF9QT09MU19QRVJfTk9ERSwKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxNS0zMjcKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAogICAgLy8gICBlcG9jaFBheW91dFJvdW5kc01heDogTUFYX0VQT0NIX0xFTkdUSCwKICAgIC8vICAgbWluUGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNSU5fUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgbWluRW50cnlTdGFrZTogTUlOX0FMR09fU1RBS0VfUEVSX1BPT0wsCiAgICAvLyAgIG1heEFsZ29QZXJQb29sOiB0aGlzLm1heEFsZ29BbGxvd2VkUGVyUG9vbCgpLAogICAgLy8gICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAogICAgLy8gICBhbXRDb25zaWRlcmVkU2F0dXJhdGVkOiB0aGlzLmFsZ29TYXR1cmF0aW9uTGV2ZWwoKSwKICAgIC8vICAgbWF4Tm9kZXM6IE1BWF9OT0RFUywKICAgIC8vICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCiAgICAvLyAgIG1heFN0YWtlcnNQZXJQb29sOiBNQVhfU1RBS0VSU19QRVJfUE9PTCwKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjYKICAgIC8vIG1heFN0YWtlcnNQZXJQb29sOiBNQVhfU1RBS0VSU19QRVJfUE9PTCwKICAgIGludGMgNiAvLyAyMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE1LTMyNwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZXBvY2hQYXlvdXRSb3VuZHNNaW46IE1JTl9FUE9DSF9MRU5HVEgsCiAgICAvLyAgIGVwb2NoUGF5b3V0Um91bmRzTWF4OiBNQVhfRVBPQ0hfTEVOR1RILAogICAgLy8gICBtaW5QY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1JTl9QQ1RfVE9fVkFMSURBVE9SLAogICAgLy8gICBtYXhQY3RUb1ZhbGlkYXRvcldGb3VyRGVjaW1hbHM6IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAogICAgLy8gICBtaW5FbnRyeVN0YWtlOiBNSU5fQUxHT19TVEFLRV9QRVJfUE9PTCwKICAgIC8vICAgbWF4QWxnb1BlclBvb2w6IHRoaXMubWF4QWxnb0FsbG93ZWRQZXJQb29sKCksCiAgICAvLyAgIG1heEFsZ29QZXJWYWxpZGF0b3I6IHRoaXMubWF4QWxsb3dlZFN0YWtlKCksCiAgICAvLyAgIGFtdENvbnNpZGVyZWRTYXR1cmF0ZWQ6IHRoaXMuYWxnb1NhdHVyYXRpb25MZXZlbCgpLAogICAgLy8gICBtYXhOb2RlczogTUFYX05PREVTLAogICAgLy8gICBtYXhQb29sc1Blck5vZGU6IE1BWF9QT09MU19QRVJfTk9ERSwKICAgIC8vICAgbWF4U3Rha2Vyc1BlclBvb2w6IE1BWF9TVEFLRVJTX1BFUl9QT09MLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5nZXROdW1WYWxpZGF0b3JzKCkgLT4gdWludDY0OgpnZXROdW1WYWxpZGF0b3JzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMzUKICAgIC8vIHJldHVybiB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIxMwogICAgLy8gbnVtVmFsaWRhdG9ycyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdudW1WJyB9KQogICAgYnl0ZWMgOSAvLyAibnVtViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM1CiAgICAvLyByZXR1cm4gdGhpcy5udW1WYWxpZGF0b3JzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0VmFsaWRhdG9yQ29uZmlnKHZhbGlkYXRvcklkOiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRWYWxpZGF0b3JDb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMzOQogICAgLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDb25maWcgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0MAogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDAKICAgIC8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmdldFZhbGlkYXRvclN0YXRlKHZhbGlkYXRvcklkOiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRWYWxpZGF0b3JTdGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzQ0CiAgICAvLyBnZXRWYWxpZGF0b3JTdGF0ZSh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogVmFsaWRhdG9yQ3VyU3RhdGUgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NQogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjMKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0NQogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDI0MiAyNgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyKHZhbGlkYXRvcklkOiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0OQogICAgLy8gZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBbQWRkcmVzcywgQWRkcmVzc10gewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1MAogICAgLy8gcmV0dXJuIFt0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lciwgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlcl0KICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjMKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1MAogICAgLy8gcmV0dXJuIFt0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lciwgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlcl0KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgMjQyCiAgICBkdXAKICAgIGV4dHJhY3QgOCAzMgogICAgc3dhcAogICAgZXh0cmFjdCA0MCAzMgogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5nZXRQb29scyh2YWxpZGF0b3JJZDogdWludDY0KSAtPiBieXRlczoKZ2V0UG9vbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2MAogICAgLy8gZ2V0UG9vbHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xJbmZvW10gewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjEKICAgIC8vIGNvbnN0IHJldERhdGE6IFBvb2xJbmZvW10gPSBbXQogICAgYnl0ZWMgMTMgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2MgogICAgLy8gY29uc3QgcG9vbFNldCA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjIKICAgIC8vIGNvbnN0IHBvb2xTZXQgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzYzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCmdldFBvb2xzX3doaWxlX3RvcEAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18zIC8vIDI0CiAgICA8CiAgICBieiBnZXRQb29sc19ibG9ja0A2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2NAogICAgLy8gaWYgKHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBnZXRQb29sc19ibG9ja0A2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2OAogICAgLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2MwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIGdldFBvb2xzX3doaWxlX3RvcEAxCgpnZXRQb29sc19ibG9ja0A2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzAKICAgIC8vIHJldHVybiByZXREYXRhCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5nZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0UG9vbEFwcElkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzcKICAgIC8vIGdldFBvb2xBcHBJZCh2YWxpZGF0b3JJZDogdWludDY0LCBwb29sSWQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzc5CiAgICAvLyBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAogICAgZnJhbWVfZGlnIC0xCiAgICBieiBnZXRQb29sQXBwSWRfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzkKICAgIC8vIHBvb2xJZCAhPT0gMCAmJiBwb29sSWQgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scy5sZW5ndGgsCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMyAvLyAyNAogICAgPD0KICAgIGJ6IGdldFBvb2xBcHBJZF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRQb29sQXBwSWRfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzgtMzgxCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHBvb2xJZCAhPT0gMCAmJiBwb29sSWQgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29scy5sZW5ndGgsCiAgICAvLyAgICdwb29sIGlkIG11c3QgYmUgYmV0d2VlbiAxIGFuZCBudW1iZXIgb2YgcG9vbHMgZm9yIHRoaXMgdmFsaWRhdG9yJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBwb29sIGlkIG11c3QgYmUgYmV0d2VlbiAxIGFuZCBudW1iZXIgb2YgcG9vbHMgZm9yIHRoaXMgdmFsaWRhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4MgogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbcG9vbElkIC0gMV0ucG9vbEFwcElkCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODIKICAgIC8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzW3Bvb2xJZCAtIDFdLnBvb2xBcHBJZAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHN3YXAKICAgIGludGMgNCAvLyAyNjgKICAgIGludGMgNSAvLyA0MzIKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHJldHN1YgoKZ2V0UG9vbEFwcElkX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldFBvb2xBcHBJZF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5nZXRQb29sSW5mbyhwb29sS2V5OiBieXRlcykgLT4gYnl0ZXM6CmdldFBvb2xJbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODYKICAgIC8vIGdldFBvb2xJbmZvKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiBQb29sSW5mbyB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzg3CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0KICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzg3CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHN3YXAKICAgIGludGMgNCAvLyAyNjgKICAgIGludGMgNSAvLyA0MzIKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5nZXRDdXJNYXhTdGFrZVBlclBvb2wodmFsaWRhdG9ySWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRDdXJNYXhTdGFrZVBlclBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM5NwogICAgLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBieXRlY18yIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM5OAogICAgLy8gY29uc3QgbnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTgKICAgIC8vIGNvbnN0IG51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAyNDIgMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTU1NQogICAgLy8gcmV0dXJuIHdpZGVSYXRpbyhbb25saW5lLCBNQVhfVkFMSURBVE9SX0hBUkRfUENUX09GX09OTElORV8xREVDSU1BTF0sIFsxMDAwXSkKICAgIGJ5dGVjIDEyIC8vIDB4MDAwMjAwMDcxYWZkNDk4ZDAwMDAwMDAwMDAwMDAwMDAwMDk2CiAgICBieXRlYyAxMCAvLyAweDAwMDEwMDAwMDAwMDAwMDAwM2U4CiAgICBjYWxsc3ViIHdpZGVSYXRpbwogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM5OQogICAgLy8gY29uc3QgaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NCA9IHRoaXMubWF4QWxsb3dlZFN0YWtlKCkgLyBudW1Qb29scy5uYXRpdmUKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk4CiAgICAvLyBjb25zdCBudW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM5OQogICAgLy8gY29uc3QgaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHM6IHVpbnQ2NCA9IHRoaXMubWF4QWxsb3dlZFN0YWtlKCkgLyBudW1Qb29scy5uYXRpdmUKICAgIGV4dHJhY3RfdWludDE2CiAgICAvCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQwMAogICAgLy8gbGV0IG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAwIDI0MgogICAgcHVzaGludCAyMTcgLy8gMjE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQwMQogICAgLy8gaWYgKG1heFBlclBvb2wgPT09IDApIHsKICAgIGJueiBnZXRDdXJNYXhTdGFrZVBlclBvb2xfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE1NjMKICAgIC8vIHJldHVybiA3MF8wMDBfMDAwXzAwMF8wMDAgLy8gNzBtIEFMR08gaW4gbWljcm9BbGdvCiAgICBwdXNoaW50IDcwMDAwMDAwMDAwMDAwIC8vIDcwMDAwMDAwMDAwMDAwCiAgICBmcmFtZV9idXJ5IDIKCmdldEN1ck1heFN0YWtlUGVyUG9vbF9hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDA0CiAgICAvLyBpZiAoaGFyZE1heERpdmlkZWRCZXR3ZWVuUG9vbHMgPCBtYXhQZXJQb29sKSB7CiAgICBmcmFtZV9kaWcgMQogICAgPgogICAgYnogZ2V0Q3VyTWF4U3Rha2VQZXJQb29sX2FmdGVyX2lmX2Vsc2VANAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAoKZ2V0Q3VyTWF4U3Rha2VQZXJQb29sX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDA3CiAgICAvLyByZXR1cm4gbWF4UGVyUG9vbAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IGJ5dGVzKSAtPiB1aW50NjQ6CmRvZXNTdGFrZXJOZWVkVG9QYXlNQlI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQxNQogICAgLy8gZG9lc1N0YWtlck5lZWRUb1BheU1CUihzdGFrZXI6IEFkZHJlc3MpOiBib29sZWFuIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjcKICAgIC8vIHN0YWtlclBvb2xTZXQgPSBCb3hNYXA8QWRkcmVzcywgRml4ZWRBcnJheTxWYWxpZGF0b3JQb29sS2V5LCB0eXBlb2YgTUFYX1BPT0xTX1BFUl9TVEFLRVI+Pih7IGtleVByZWZpeDogJ3NwcycgfSkKICAgIGJ5dGVjIDcgLy8gInNwcyIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQxNgogICAgLy8gcmV0dXJuICF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRTdGFrZWRQb29sc0ZvckFjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyNQogICAgLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXSB7CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjI3CiAgICAvLyBzdGFrZXJQb29sU2V0ID0gQm94TWFwPEFkZHJlc3MsIEZpeGVkQXJyYXk8VmFsaWRhdG9yUG9vbEtleSwgdHlwZW9mIE1BWF9QT09MU19QRVJfU1RBS0VSPj4oeyBrZXlQcmVmaXg6ICdzcHMnIH0pCiAgICBieXRlYyA3IC8vICJzcHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyNgogICAgLy8gaWYgKCF0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI3CiAgICAvLyByZXR1cm4gW10KICAgIGJ5dGVjIDEzIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyOQogICAgLy8gY29uc3QgcmV0RGF0YTogVmFsaWRhdG9yUG9vbEtleVtdID0gW10KICAgIGJ5dGVjIDEzIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzMAogICAgLy8gY29uc3QgcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQogICAgZnJhbWVfZGlnIDUKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X3doaWxlX3RvcEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgNAogICAgcHVzaGludCA2IC8vIDYKICAgIDwKICAgIGJ6IGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudF9hZnRlcl93aGlsZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzMgogICAgLy8gaWYgKHBvb2xTZXRbaV0uaWQgIT09IDApIHsKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzMgLy8gMjQKICAgICoKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzMKICAgIC8vIHJldERhdGEucHVzaChwb29sU2V0W2ldKQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGZyYW1lX2J1cnkgMwoKZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X3doaWxlX3RvcEAzCgpnZXRTdGFrZWRQb29sc0ZvckFjY291bnRfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDM2CiAgICAvLyByZXR1cm4gcmV0RGF0YQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogdWludDY0KSAtPiBieXRlczoKZ2V0VG9rZW5QYXlvdXRSYXRpbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDQ3CiAgICAvLyBnZXRUb2tlblBheW91dFJhdGlvKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBQb29sVG9rZW5QYXlvdXRSYXRpbyB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDQ4CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NDgKICAgIC8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDcgLy8gNzAwCiAgICBpbnRjIDYgLy8gMjAwCiAgICBleHRyYWN0MwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh2YWxpZGF0b3JJZDogdWludDY0KSAtPiBieXRlczoKZ2V0Tm9kZVBvb2xBc3NpZ25tZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUyCiAgICAvLyBnZXROb2RlUG9vbEFzc2lnbm1lbnRzKHZhbGlkYXRvcklkOiB1aW50NjQpOiBOb2RlUG9vbEFzc2lnbm1lbnRDb25maWcgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1MwogICAgLy8gYXNzZXJ0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuZXhpc3RzLCAidGhlIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgZG9lc24ndCBleGlzdCIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTMKICAgIC8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QiKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBkb2Vzbid0IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1NQogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cwogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjIDggLy8gOTAwCiAgICBpbnRjIDkgLy8gMTkyCiAgICBleHRyYWN0MwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuYWRkVmFsaWRhdG9yKG1iclBheW1lbnQ6IHVpbnQ2NCwgbmZkTmFtZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IHVpbnQ2NDoKYWRkVmFsaWRhdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzAKICAgIC8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0OQogICAgLy8gY29uZmlnLmVudHJ5R2F0aW5nVHlwZS5uYXRpdmUgPj0gR0FUSU5HX1RZUEVfTk9ORSAmJiBjb25maWcuZW50cnlHYXRpbmdUeXBlLm5hdGl2ZSA8PSBHQVRJTkdfVFlQRV9DT05TVF9NQVgsCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgODAgMQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBnZXRieXRlCiAgICBwdXNoaW50IDQgLy8gNAogICAgPD0KICAgIGJ6IGFkZFZhbGlkYXRvcl9ib29sX2ZhbHNlQDEwCiAgICBpbnRjXzEgLy8gMQoKYWRkVmFsaWRhdG9yX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDgtMTI1MQogICAgLy8gYXNzZXJ0KAogICAgLy8gICBjb25maWcuZW50cnlHYXRpbmdUeXBlLm5hdGl2ZSA+PSBHQVRJTkdfVFlQRV9OT05FICYmIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUubmF0aXZlIDw9IEdBVElOR19UWVBFX0NPTlNUX01BWCwKICAgIC8vICAgJ2dhdGluZyB0eXBlIG5vdCB2YWxpZCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gZ2F0aW5nIHR5cGUgbm90IHZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTMKICAgIC8vIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoLm5hdGl2ZSA+PSBNSU5fRVBPQ0hfTEVOR1RIICYmIGNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoLm5hdGl2ZSA8PSBNQVhfRVBPQ0hfTEVOR1RILAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2OSAvLyAxNjkKICAgIGV4dHJhY3RfdWludDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYnogYWRkVmFsaWRhdG9yX2Jvb2xfZmFsc2VAMTQKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjIDExIC8vIDEwMDAwMDAKICAgIDw9CiAgICBieiBhZGRWYWxpZGF0b3JfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmFkZFZhbGlkYXRvcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjUyLTEyNTUKICAgIC8vIGFzc2VydCgKICAgIC8vICAgY29uZmlnLmVwb2NoUm91bmRMZW5ndGgubmF0aXZlID49IE1JTl9FUE9DSF9MRU5HVEggJiYgY29uZmlnLmVwb2NoUm91bmRMZW5ndGgubmF0aXZlIDw9IE1BWF9FUE9DSF9MRU5HVEgsCiAgICAvLyAgICdlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZScsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1NwogICAgLy8gY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmUgPj0gTUlOX1BDVF9UT19WQUxJREFUT1IgJiYKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNzMgLy8gMTczCiAgICBleHRyYWN0X3VpbnQzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1OAogICAgLy8gY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmUgPD0gTUFYX1BDVF9UT19WQUxJREFUT1IsCiAgICBpbnRjIDExIC8vIDEwMDAwMDAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTctMTI1OAogICAgLy8gY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmUgPj0gTUlOX1BDVF9UT19WQUxJREFUT1IgJiYKICAgIC8vICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmUgPD0gTUFYX1BDVF9UT19WQUxJREFUT1IsCiAgICBieiBhZGRWYWxpZGF0b3JfYm9vbF9mYWxzZUAxOAogICAgaW50Y18xIC8vIDEKCmFkZFZhbGlkYXRvcl9ib29sX21lcmdlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjU2LTEyNjAKICAgIC8vIGFzc2VydCgKICAgIC8vICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmUgPj0gTUlOX1BDVF9UT19WQUxJREFUT1IgJiYKICAgIC8vICAgICBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yLm5hdGl2ZSA8PSBNQVhfUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgJ2NvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGNvbW1pc3Npb24gcGVyY2VudGFnZSBub3QgdmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2MQogICAgLy8gaWYgKGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IubmF0aXZlICE9PSAwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgYnogYWRkVmFsaWRhdG9yX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2MwogICAgLy8gY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzLm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDE3NyAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjYyLTEyNjUKICAgIC8vIGFzc2VydCgKICAgIC8vICAgY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzLm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICAndmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIHZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzIG11c3QgYmUgc2V0IGlmIHBlcmNlbnQgdG8gdmFsaWRhdG9yIGlzIG5vdCAwCgphZGRWYWxpZGF0b3JfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2NwogICAgLy8gYXNzZXJ0KGNvbmZpZy5taW5FbnRyeVN0YWtlID49IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLCAnc3Rha2luZyBwb29sIG11c3QgaGF2ZSBtaW5pbXVtIGVudHJ5IG9mIDEgYWxnbycpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgMTMgLy8gMjA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50YyAxMSAvLyAxMDAwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIHN0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3MAogICAgLy8gY29uZmlnLnBvb2xzUGVyTm9kZS5uYXRpdmUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUubmF0aXZlIDw9IE1BWF9QT09MU19QRVJfTk9ERSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyMjUgLy8gMjI1CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogYWRkVmFsaWRhdG9yX2Jvb2xfZmFsc2VAMjQKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDMgLy8gMwogICAgPD0KICAgIGJ6IGFkZFZhbGlkYXRvcl9ib29sX2ZhbHNlQDI0CiAgICBpbnRjXzEgLy8gMQoKYWRkVmFsaWRhdG9yX2Jvb2xfbWVyZ2VAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjktMTI3MgogICAgLy8gYXNzZXJ0KAogICAgLy8gICBjb25maWcucG9vbHNQZXJOb2RlLm5hdGl2ZSA+IDAgJiYgY29uZmlnLnBvb2xzUGVyTm9kZS5uYXRpdmUgPD0gTUFYX1BPT0xTX1BFUl9OT0RFLAogICAgLy8gICAnbnVtYmVyIG9mIHBvb2xzIHBlciBub2RlIGV4Y2VlZHMgYWxsb3dlZCBudW1iZXInLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIG51bWJlciBvZiBwb29scyBwZXIgbm9kZSBleGNlZWRzIGFsbG93ZWQgbnVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzMKICAgIC8vIGlmIChjb25maWcuc3Vuc2V0dGluZ09uICE9PSAwKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgMTIgLy8gMjI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGJ6IGFkZFZhbGlkYXRvcl9hZnRlcl9pZl9lbHNlQDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzQKICAgIC8vIGFzc2VydChjb25maWcuc3Vuc2V0dGluZ09uID4gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwgJ3N1bnNldHRpbmdPbiBtdXN0IGJlIGxhdGVyIHRoYW4gbm93IGlmIHNldCcpCiAgICBmcmFtZV9kaWcgNAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPgogICAgYXNzZXJ0IC8vIHN1bnNldHRpbmdPbiBtdXN0IGJlIGxhdGVyIHRoYW4gbm93IGlmIHNldAoKYWRkVmFsaWRhdG9yX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3MgogICAgLy8gYXNzZXJ0KGNvbmZpZy5vd25lci5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCA4IDMyCiAgICBkdXAKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzMKICAgIC8vIGFzc2VydChjb25maWcubWFuYWdlci5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCA0MCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGNvbmZpZy5vd25lci5uYXRpdmUsICdzZW5kZXIgbXVzdCBiZSBvd25lciB0byBhZGQgbmV3IHZhbGlkYXRvcicpCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBtdXN0IGJlIG93bmVyIHRvIGFkZCBuZXcgdmFsaWRhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NgogICAgLy8gYXNzZXJ0TWF0Y2gobWJyUGF5bWVudCwgeyBhbW91bnQ6IHRoaXMuZ2V0TWJyQW1vdW50cygpLmFkZFZhbGlkYXRvck1iciB9KQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgNDQyOTAwIC8vIDQ0MjkwMAogICAgPT0KICAgIGFzc2VydCAvLyBhc3NlcnQgdGFyZ2V0IGlzIG1hdGNoIGZvciBjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3OAogICAgLy8gYXNzZXJ0KG1iclBheW1lbnQuZmVlID4gMTAgKiAxMDAwMDAwLCAnZmVlIG11c3QgYmUgMTAgQUxHTyBvciBtb3JlIHRvIHByZXZlbnQgc3BhbW1pbmcgb2YgdmFsaWRhdG9ycycpCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEZlZQogICAgcHVzaGludCAxMDAwMDAwMCAvLyAxMDAwMDAwMAogICAgPgogICAgYXNzZXJ0IC8vIGZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDgxCiAgICAvLyBjb25zdCB2YWxpZGF0b3JJZDogdWludDY0ID0gdGhpcy5udW1WYWxpZGF0b3JzLnZhbHVlICsgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjEzCiAgICAvLyBudW1WYWxpZGF0b3JzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVYnIH0pCiAgICBieXRlYyA5IC8vICJudW1WIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODEKICAgIC8vIGNvbnN0IHZhbGlkYXRvcklkOiB1aW50NjQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIxMwogICAgLy8gbnVtVmFsaWRhdG9ycyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdudW1WJyB9KQogICAgYnl0ZWMgOSAvLyAibnVtViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDgyCiAgICAvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4NAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5jcmVhdGUoKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjMKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODQKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuY3JlYXRlKCkKICAgIGR1cAogICAgcHVzaGludCAxMDkyIC8vIDEwOTIKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODUKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnID0gY2xvbmUoY29uZmlnKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0ODYKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmlkID0gdmFsaWRhdG9ySWQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ4OQogICAgLy8gaWYgKGNvbmZpZy5uZmRGb3JJbmZvICE9PSAwKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgYnogYWRkVmFsaWRhdG9yX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTEtNDk3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBUZW1wbGF0ZVZhcjx1aW50NjQ+KCdORkRfUkVHSVNUUllfQVBQX0lEJyksCiAgICAvLyAgICAgYXBwQXJnczogW0J5dGVzKCdpc192YWxpZF9uZmRfYXBwaWQnKSwgQnl0ZXMobmZkTmFtZSksIG9wLml0b2IoY29uZmlnLm5mZEZvckluZm8pXSwKICAgIC8vICAgICBhcHBzOiBbQXBwbGljYXRpb24oY29uZmlnLm5mZEZvckluZm8pXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MwogICAgLy8gYXBwSWQ6IFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ05GRF9SRUdJU1RSWV9BUFBfSUQnKSwKICAgIGludGMgMTAgLy8gVE1QTF9ORkRfUkVHSVNUUllfQVBQX0lECiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5NAogICAgLy8gYXBwQXJnczogW0J5dGVzKCdpc192YWxpZF9uZmRfYXBwaWQnKSwgQnl0ZXMobmZkTmFtZSksIG9wLml0b2IoY29uZmlnLm5mZEZvckluZm8pXSwKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwogICAgYnl0ZWMgMTQgLy8gImlzX3ZhbGlkX25mZF9hcHBpZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MS00OTYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ05GRF9SRUdJU1RSWV9BUFBfSUQnKSwKICAgIC8vICAgICBhcHBBcmdzOiBbQnl0ZXMoJ2lzX3ZhbGlkX25mZF9hcHBpZCcpLCBCeXRlcyhuZmROYW1lKSwgb3AuaXRvYihjb25maWcubmZkRm9ySW5mbyldLAogICAgLy8gICAgIGFwcHM6IFtBcHBsaWNhdGlvbihjb25maWcubmZkRm9ySW5mbyldLAogICAgLy8gICB9KQogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTEtNDk3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBUZW1wbGF0ZVZhcjx1aW50NjQ+KCdORkRfUkVHSVNUUllfQVBQX0lEJyksCiAgICAvLyAgICAgYXBwQXJnczogW0J5dGVzKCdpc192YWxpZF9uZmRfYXBwaWQnKSwgQnl0ZXMobmZkTmFtZSksIG9wLml0b2IoY29uZmlnLm5mZEZvckluZm8pXSwKICAgIC8vICAgICBhcHBzOiBbQXBwbGljYXRpb24oY29uZmlnLm5mZEZvckluZm8pXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTgKICAgIC8vIGFzc2VydChvcC5idG9pKG9wLklUeG4ubGFzdExvZykgPT09IDEsICJwcm92aWRlZCBORkQgaXNuJ3QgdmFsaWQiKQogICAgaXR4biBMYXN0TG9nCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBwcm92aWRlZCBORkQgaXNuJ3QgdmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTAwCiAgICAvLyBjb25zdCBbb3duZXJdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoY29uZmlnLm5mZEZvckluZm8sIEJ5dGVzKCdpLm93bmVyLmEnKSkKICAgIGJ5dGVjIDExIC8vICJpLm93bmVyLmEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUwMQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEFjY291bnQob3duZXIpLCAnSWYgc3BlY2lmeWluZyBORkQsIGFjY291bnQgYWRkaW5nIHZhbGlkYXRvciBtdXN0IGJlIG93bmVyJykKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gSWYgc3BlY2lmeWluZyBORkQsIGFjY291bnQgYWRkaW5nIHZhbGlkYXRvciBtdXN0IGJlIG93bmVyCgphZGRWYWxpZGF0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MDQKICAgIC8vIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IG5ldyBVaW50OChHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMpIHx8CiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGJ5dGVzIDB4MDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUwNC01MDUKICAgIC8vIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IG5ldyBVaW50OChHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMpIHx8CiAgICAvLyBjb25maWcuZW50cnlHYXRpbmdUeXBlID09PSBuZXcgVWludDgoR0FUSU5HX1RZUEVfU0VHTUVOVF9PRl9ORkQpCiAgICBibnogYWRkVmFsaWRhdG9yX2lmX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MDUKICAgIC8vIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IG5ldyBVaW50OChHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRCkKICAgIGZyYW1lX2RpZyA1CiAgICBwdXNoYnl0ZXMgMHgwNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTA0LTUwNQogICAgLy8gY29uZmlnLmVudHJ5R2F0aW5nVHlwZSA9PT0gbmV3IFVpbnQ4KEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUykgfHwKICAgIC8vIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPT09IG5ldyBVaW50OChHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRCkKICAgIGJ6IGFkZFZhbGlkYXRvcl9hZnRlcl9pZl9lbHNlQDYKCmFkZFZhbGlkYXRvcl9pZl9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUwOAogICAgLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSksICdwcm92aWRlZCBORkQgQXBwIGlkIGZvciBnYXRpbmcgbXVzdCBiZSB2YWxpZCBORkQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDExMyAzMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIGlzTkZEQXBwSURWYWxpZAogICAgYXNzZXJ0IC8vIHByb3ZpZGVkIE5GRCBBcHAgaWQgZm9yIGdhdGluZyBtdXN0IGJlIHZhbGlkIE5GRAoKYWRkVmFsaWRhdG9yX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTExCiAgICAvLyByZXR1cm4gdmFsaWRhdG9ySWQKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYWRkVmFsaWRhdG9yX2Jvb2xfZmFsc2VAMjQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZGRWYWxpZGF0b3JfYm9vbF9tZXJnZUAyNQoKYWRkVmFsaWRhdG9yX2Jvb2xfZmFsc2VAMTg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZGRWYWxpZGF0b3JfYm9vbF9tZXJnZUAxOQoKYWRkVmFsaWRhdG9yX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZGRWYWxpZGF0b3JfYm9vbF9tZXJnZUAxNQoKYWRkVmFsaWRhdG9yX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZGRWYWxpZGF0b3JfYm9vbF9tZXJnZUAxMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmNoYW5nZVZhbGlkYXRvck1hbmFnZXIodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgbWFuYWdlcjogYnl0ZXMpIC0+IHZvaWQ6CmNoYW5nZVZhbGlkYXRvck1hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMQogICAgLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTIzCiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUsCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MjMKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSwKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgOCAzMgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MjItNTI1CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSwKICAgIC8vICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTI2CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgogICAgcHVzaGludCA0MCAvLyA0MAogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogdWludDY0LCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiB1aW50NjQpIC0+IHZvaWQ6CmNoYW5nZVZhbGlkYXRvclN1bnNldEluZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzNwogICAgLy8gY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkIHsKICAgIHByb3RvIDMgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzkKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSwKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjMKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzOQogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlLAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAwIDI0MgogICAgZXh0cmFjdCA4IDMyCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUzOC01NDEKICAgIC8vIGFzc2VydCgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlLAogICAgLy8gICAnY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHZhbGlkYXRvciBvd25lcicsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHZhbGlkYXRvciBvd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NDIKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50YyAxMiAvLyAyMjYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTQzCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nVG8gPSBzdW5zZXR0aW5nVG8KICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgcHVzaGludCAyMzQgLy8gMjM0CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuY2hhbmdlVmFsaWRhdG9yTkZEKHZhbGlkYXRvcklkOiB1aW50NjQsIG5mZEFwcElEOiB1aW50NjQsIG5mZE5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VWYWxpZGF0b3JORkQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NAogICAgLy8gY2hhbmdlVmFsaWRhdG9yTkZEKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIG5mZEFwcElEOiB1aW50NjQsIG5mZE5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NwogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlLAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU3CiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUsCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgMjQyCiAgICBleHRyYWN0IDggMzIKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU2LTU1OQogICAgLy8gYXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUsCiAgICAvLyAgICdjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2MC01NjcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ05GRF9SRUdJU1RSWV9BUFBfSUQnKSwKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uTm9PcCwKICAgIC8vICAgICBhY2NvdW50czogW1R4bi5zZW5kZXJdLAogICAgLy8gICAgIGFwcEFyZ3M6IFtCeXRlcygnaXNfdmFsaWRfbmZkX2FwcGlkJyksIEJ5dGVzKG5mZE5hbWUpLCBvcC5pdG9iKG5mZEFwcElEKV0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NjIKICAgIC8vIGFwcElkOiBUZW1wbGF0ZVZhcjx1aW50NjQ+KCdORkRfUkVHSVNUUllfQVBQX0lEJyksCiAgICBpbnRjIDEwIC8vIFRNUExfTkZEX1JFR0lTVFJZX0FQUF9JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NjQKICAgIC8vIGFjY291bnRzOiBbVHhuLnNlbmRlcl0sCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2NQogICAgLy8gYXBwQXJnczogW0J5dGVzKCdpc192YWxpZF9uZmRfYXBwaWQnKSwgQnl0ZXMobmZkTmFtZSksIG9wLml0b2IobmZkQXBwSUQpXSwKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYnl0ZWMgMTQgLy8gImlzX3ZhbGlkX25mZF9hcHBpZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2MwogICAgLy8gb25Db21wbGV0aW9uOiBPbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NjAtNTY2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBUZW1wbGF0ZVZhcjx1aW50NjQ+KCdORkRfUkVHSVNUUllfQVBQX0lEJyksCiAgICAvLyAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICAvLyAgICAgYWNjb3VudHM6IFtUeG4uc2VuZGVyXSwKICAgIC8vICAgICBhcHBBcmdzOiBbQnl0ZXMoJ2lzX3ZhbGlkX25mZF9hcHBpZCcpLCBCeXRlcyhuZmROYW1lKSwgb3AuaXRvYihuZmRBcHBJRCldLAogICAgLy8gICB9KQogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NjAtNTY3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBUZW1wbGF0ZVZhcjx1aW50NjQ+KCdORkRfUkVHSVNUUllfQVBQX0lEJyksCiAgICAvLyAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICAvLyAgICAgYWNjb3VudHM6IFtUeG4uc2VuZGVyXSwKICAgIC8vICAgICBhcHBBcmdzOiBbQnl0ZXMoJ2lzX3ZhbGlkX25mZF9hcHBpZCcpLCBCeXRlcyhuZmROYW1lKSwgb3AuaXRvYihuZmRBcHBJRCldLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2OQogICAgLy8gY29uc3QgW293bmVyXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKG5mZEFwcElELCBCeXRlcygnaS5vd25lci5hJykpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjIDExIC8vICJpLm93bmVyLmEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU3MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEFjY291bnQob3duZXIpLCAnSWYgc3BlY2lmeWluZyBORkQsIGFjY291bnQgYWRkaW5nIHZhbGlkYXRvciBtdXN0IGJlIG93bmVyJykKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gSWYgc3BlY2lmeWluZyBORkQsIGFjY291bnQgYWRkaW5nIHZhbGlkYXRvciBtdXN0IGJlIG93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU3MQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubmZkRm9ySW5mbyA9IG5mZEFwcElECiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3ModmFsaWRhdG9ySWQ6IHVpbnQ2NCwgY29tbWlzc2lvbkFkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc4CiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU4MAogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlLAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTgwCiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUsCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgMjQyCiAgICBleHRyYWN0IDggMzIKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc5LTU4MgogICAgLy8gYXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUsCiAgICAvLyAgICdjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgdmFsaWRhdG9yIG93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU4MwogICAgLy8gYXNzZXJ0KGNvbW1pc3Npb25BZGRyZXNzLm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTg0CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy52YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyA9IGNvbW1pc3Npb25BZGRyZXNzCiAgICBwdXNoaW50IDE3NyAvLyAxNzcKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IHVpbnQ2NCwgRW50cnlHYXRpbmdUeXBlOiBieXRlcywgRW50cnlHYXRpbmdBZGRyZXNzOiBieXRlcywgRW50cnlHYXRpbmdBc3NldHM6IGJ5dGVzLCBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NCwgUmV3YXJkUGVyUGF5b3V0OiB1aW50NjQpIC0+IHZvaWQ6CmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5MS01OTgKICAgIC8vIGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8oCiAgICAvLyAgIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsCiAgICAvLyAgIEVudHJ5R2F0aW5nVHlwZTogVWludDgsCiAgICAvLyAgIEVudHJ5R2F0aW5nQWRkcmVzczogQWRkcmVzcywKICAgIC8vICAgRW50cnlHYXRpbmdBc3NldHM6IEZpeGVkQXJyYXk8dWludDY0LCA0PiwKICAgIC8vICAgR2F0aW5nQXNzZXRNaW5CYWxhbmNlOiB1aW50NjQsCiAgICAvLyAgIFJld2FyZFBlclBheW91dDogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA2IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjAwCiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUsCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTYKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDAKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSwKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgOCAzMgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1OTktNjAyCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSwKICAgIC8vICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA0CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKICAgIGR1cAogICAgcHVzaGludCA4MCAvLyA4MAogICAgZnJhbWVfZGlnIC01CiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDUKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcyA9IEVudHJ5R2F0aW5nQWRkcmVzcwogICAgZHVwCiAgICBwdXNoaW50IDgxIC8vIDgxCiAgICBmcmFtZV9kaWcgLTQKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwNgogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBc3NldHMgPSBjbG9uZShFbnRyeUdhdGluZ0Fzc2V0cykKICAgIGR1cAogICAgcHVzaGludCAxMTMgLy8gMTEzCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYwNwogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZ2F0aW5nQXNzZXRNaW5CYWxhbmNlID0gR2F0aW5nQXNzZXRNaW5CYWxhbmNlCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDE0NSAvLyAxNDUKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA4CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5yZXdhcmRQZXJQYXlvdXQgPSBSZXdhcmRQZXJQYXlvdXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgcHVzaGludCAxNjEgLy8gMTYxCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuYWRkUG9vbChtYnJQYXltZW50OiB1aW50NjQsIHZhbGlkYXRvcklkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZFBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyMgogICAgLy8gYWRkUG9vbChtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIG5vZGVOdW06IHVpbnQ2NCk6IFZhbGlkYXRvclBvb2xLZXkgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNQogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlIHx8CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjMKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjI1CiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUgfHwKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgMjQyCiAgICBleHRyYWN0IDggMzIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNS02MjYKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSB8fAogICAgLy8gICBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLm5hdGl2ZSwKICAgIGJueiBhZGRQb29sX2Jvb2xfdHJ1ZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNgogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlci5uYXRpdmUsCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgNDAgMzIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyNS02MjYKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSB8fAogICAgLy8gICBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLm5hdGl2ZSwKICAgIGJ6IGFkZFBvb2xfYm9vbF9mYWxzZUAzCgphZGRQb29sX2Jvb2xfdHJ1ZUAyOgogICAgaW50Y18xIC8vIDEKCmFkZFBvb2xfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjQtNjI4CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSB8fAogICAgLy8gICAgIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1hbmFnZXIubmF0aXZlLAogICAgLy8gICAnY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjMxCiAgICAvLyBhc3NlcnRNYXRjaChtYnJQYXltZW50LCB7IGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkUG9vbE1iciwgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIH0pCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFtb3VudAogICAgcHVzaGludCA5NjM1MDAgLy8gOTYzNTAwCiAgICA9PQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGFzc2VydCB0YXJnZXQgaXMgbWF0Y2ggZm9yIGNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjMzCiAgICAvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS5leGlzdHMsICJzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjM1CiAgICAvLyBsZXQgbnVtUG9vbHM6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBleHRyYWN0IDI0MiAyNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYzNgogICAgLy8gaWYgKChudW1Qb29scyBhcyB1aW50NjQpID49IE1BWF9QT09MUykgewogICAgZHVwCiAgICBpbnRjXzMgLy8gMjQKICAgID49CiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBhdCBtYXggcG9vbCBzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYzOQogICAgLy8gbnVtUG9vbHMgKz0gMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjQyLTY2MgogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uTm9PcCwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFsKICAgIC8vICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmV4dHJhY3QoMCwgNDA5NiksCiAgICAvLyAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnJlZi5leHRyYWN0KDQwOTYsIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmxlbmd0aCAtIDQwOTYpLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IHN0YWtpbmdQb29sKCkuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsTnVtVWludDogc3Rha2luZ1Bvb2woKS5nbG9iYWxVaW50cywKICAgIC8vICAgICBnbG9iYWxOdW1CeXRlczogc3Rha2luZ1Bvb2woKS5nbG9iYWxCeXRlcywKICAgIC8vICAgICBleHRyYVByb2dyYW1QYWdlczogMywKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICAvLyBjcmVhdGluZ0NvbnRyYWN0SUQsIHZhbGlkYXRvcklkLCBwb29sSWQsIG1pbkVudHJ5U3Rha2UKICAgIC8vICAgICAgIG1ldGhvZFNlbGVjdG9yKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAogICAgLy8gICAgICAgb3AuaXRvYihHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQuaWQpLAogICAgLy8gICAgICAgb3AuaXRvYih2YWxpZGF0b3JJZCksCiAgICAvLyAgICAgICBvcC5pdG9iKG51bVBvb2xzIGFzIHVpbnQ2NCksCiAgICAvLyAgICAgICBvcC5pdG9iKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UpLAogICAgLy8gICAgIF0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDkKICAgIC8vIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtID0gQm94PGJ5dGVzPih7IGtleTogJ3Bvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMnIH0pCiAgICBieXRlYyA0IC8vICJwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDYKICAgIC8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmV4dHJhY3QoMCwgNDA5NiksCiAgICBpbnRjXzAgLy8gMAogICAgaW50YyAxNCAvLyA0MDk2CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDkKICAgIC8vIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtID0gQm94PGJ5dGVzPih7IGtleTogJ3Bvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMnIH0pCiAgICBieXRlYyA0IC8vICJwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDcKICAgIC8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZWYubGVuZ3RoIC0gNDA5NiksCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGMgMTQgLy8gNDA5NgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDkKICAgIC8vIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtID0gQm94PGJ5dGVzPih7IGtleTogJ3Bvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMnIH0pCiAgICBieXRlYyA0IC8vICJwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDcKICAgIC8vIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZWYubGVuZ3RoIC0gNDA5NiksCiAgICBpbnRjIDE0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU2CiAgICAvLyBvcC5pdG9iKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCksCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU4CiAgICAvLyBvcC5pdG9iKG51bVBvb2xzIGFzIHVpbnQ2NCksCiAgICBkaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NTkKICAgIC8vIG9wLml0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGludGMgMTMgLy8gMjA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NTUKICAgIC8vIG1ldGhvZFNlbGVjdG9yKCdjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCcpLAogICAgcHVzaGJ5dGVzIDB4NTllOTBhYTYgLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NTIKICAgIC8vIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL2NvbXBpbGVkLmFsZ28udHM6Ny05CiAgICAvLyByZXR1cm4gY29tcGlsZUFyYzQoU3Rha2luZ1Bvb2wsIHsKICAgIC8vICAgdGVtcGxhdGVWYXJzOiB7IE5GRF9SRUdJU1RSWV9BUFBfSUQ6IDAgYXMgdWludDY0LCBGRUVfU0lOS19BRERSOiBuZXcgQWRkcmVzcygpIH0sCiAgICAvLyB9KQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDExIC8vIDExCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIHB1c2hieXRlcyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDQKICAgIC8vIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5Ob09wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY0Mi02NjEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgb25Db21wbGV0aW9uOiBPbkNvbXBsZXRlQWN0aW9uLk5vT3AsCiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBbCiAgICAvLyAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnJlZi5leHRyYWN0KDAsIDQwOTYpLAogICAgLy8gICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZWYuZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnJlZi5sZW5ndGggLSA0MDk2KSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBzdGFraW5nUG9vbCgpLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbE51bVVpbnQ6IHN0YWtpbmdQb29sKCkuZ2xvYmFsVWludHMsCiAgICAvLyAgICAgZ2xvYmFsTnVtQnl0ZXM6IHN0YWtpbmdQb29sKCkuZ2xvYmFsQnl0ZXMsCiAgICAvLyAgICAgZXh0cmFQcm9ncmFtUGFnZXM6IDMsCiAgICAvLyAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCiAgICAvLyAgICAgICBtZXRob2RTZWxlY3RvcignY3JlYXRlQXBwbGljYXRpb24odWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQnKSwKICAgIC8vICAgICAgIG9wLml0b2IoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkKSwKICAgIC8vICAgICAgIG9wLml0b2IodmFsaWRhdG9ySWQpLAogICAgLy8gICAgICAgb3AuaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAogICAgLy8gICAgICAgb3AuaXRvYih0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5taW5FbnRyeVN0YWtlKSwKICAgIC8vICAgICBdLAogICAgLy8gICB9KQogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDItNjYyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5Ob09wLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogWwogICAgLy8gICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZWYuZXh0cmFjdCgwLCA0MDk2KSwKICAgIC8vICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZWYubGVuZ3RoIC0gNDA5NiksCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogc3Rha2luZ1Bvb2woKS5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxOdW1VaW50OiBzdGFraW5nUG9vbCgpLmdsb2JhbFVpbnRzLAogICAgLy8gICAgIGdsb2JhbE51bUJ5dGVzOiBzdGFraW5nUG9vbCgpLmdsb2JhbEJ5dGVzLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIC8vIGNyZWF0aW5nQ29udHJhY3RJRCwgdmFsaWRhdG9ySWQsIHBvb2xJZCwgbWluRW50cnlTdGFrZQogICAgLy8gICAgICAgbWV0aG9kU2VsZWN0b3IoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCiAgICAvLyAgICAgICBvcC5pdG9iKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCksCiAgICAvLyAgICAgICBvcC5pdG9iKHZhbGlkYXRvcklkKSwKICAgIC8vICAgICAgIG9wLml0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKICAgIC8vICAgICAgIG9wLml0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCiAgICAvLyAgICAgXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjQKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMgPSBuZXcgVWludDE2KG51bVBvb2xzKQogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGR1cAogICAgZXh0cmFjdCA2IDIKICAgIGRpZyA0CiAgICBwdXNoaW50IDI0MiAvLyAyNDIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY3CiAgICAvLyBjb25zdCBwb29sQXBwSWQgPSBvcC5JVHhuLmNyZWF0ZWRBcHBsaWNhdGlvbklkLmlkCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2OAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tudW1Qb29scyAtIDFdLnBvb2xBcHBJZCA9IHBvb2xBcHBJZAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMjQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGMgNCAvLyAyNjgKICAgICsKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjkKICAgIC8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWRkUG9vbFRvTm9kZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NzcKICAgIC8vIHJldHVybiB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBudW1Qb29scyBhcyB1aW50NjQsIHBvb2xBcHBJZDogb3AuSVR4bi5jcmVhdGVkQXBwbGljYXRpb25JZC5pZCB9CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFkZFBvb2xfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgYWRkUG9vbF9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5hZGRTdGFrZShzdGFrZWRBbW91bnRQYXltZW50OiB1aW50NjQsIHZhbGlkYXRvcklkOiB1aW50NjQsIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZFN0YWtlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2ODktNjkzCiAgICAvLyBhZGRTdGFrZSgKICAgIC8vICAgc3Rha2VkQW1vdW50UGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLAogICAgLy8gICB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQsCiAgICAvLyApOiBWYWxpZGF0b3JQb29sS2V5IHsKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gNwogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2OTQKICAgIC8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2OTQKICAgIC8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2OTcKICAgIC8vIGlmICh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPiAwKSB7CiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGV4dHJhY3QgMCAyNDIKICAgIGludGMgMTIgLy8gMjI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY5OQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuc3Vuc2V0dGluZ09uIDwgR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIGZyYW1lX2RpZyAyMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGludGMgMTIgLy8gMjI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2OTgtNzAxCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA8IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICAvLyAgICJjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lIiwKICAgIC8vICkKICAgIGFzc2VydCAvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCgphZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwNAogICAgLy8gY29uc3Qgc3Rha2VyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwOC03MTEKICAgIC8vIGFzc2VydE1hdGNoKHN0YWtlZEFtb3VudFBheW1lbnQsIHsKICAgIC8vICAgc2VuZGVyOiBzdGFrZXIubmF0aXZlLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyB9KQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBTZW5kZXIKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICA9PQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTAKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwOC03MTEKICAgIC8vIGFzc2VydE1hdGNoKHN0YWtlZEFtb3VudFBheW1lbnQsIHsKICAgIC8vICAgc2VuZGVyOiBzdGFrZXIubmF0aXZlLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyB9KQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gYXNzZXJ0IHRhcmdldCBpcyBtYXRjaCBmb3IgY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTYKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkIDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKICAgIGZyYW1lX2RpZyAyMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAyNDIgMjYKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE1NTUKICAgIC8vIHJldHVybiB3aWRlUmF0aW8oW29ubGluZSwgTUFYX1ZBTElEQVRPUl9IQVJEX1BDVF9PRl9PTkxJTkVfMURFQ0lNQUxdLCBbMTAwMF0pCiAgICBieXRlYyAxMiAvLyAweDAwMDIwMDA3MWFmZDQ5OGQwMDAwMDAwMDAwMDAwMDAwMDA5NgogICAgYnl0ZWMgMTAgLy8gMHgwMDAxMDAwMDAwMDAwMDAwMDNlOAogICAgY2FsbHN1YiB3aWRlUmF0aW8KICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTYKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkIDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKICAgIDwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzE1LTcxOAogICAgLy8gYXNzZXJ0KAogICAgLy8gICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZCA8IHRoaXMubWF4QWxsb3dlZFN0YWtlKCksCiAgICAvLyAgICd0b3RhbCBzdGFrZWQgZm9yIGFsbCBvZiBhIHZhbGlkYXRvcnMgcG9vbHMgbWF5IG5vdCBleGNlZWQgaGFyZCBjYXAnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIHRvdGFsIHN0YWtlZCBmb3IgYWxsIG9mIGEgdmFsaWRhdG9ycyBwb29scyBtYXkgbm90IGV4Y2VlZCBoYXJkIGNhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDIxCiAgICAvLyBjb25zdCB0eXBlID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdUeXBlLm5hdGl2ZQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDIyCiAgICAvLyBpZiAodHlwZSA9PT0gR0FUSU5HX1RZUEVfTk9ORSkgewogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5kb2VzU3Rha2VyTWVldEdhdGluZ0A1NQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDI1CiAgICAvLyBjb25zdCBzdGFrZXIgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQyNgogICAgLy8gY29uc3QgY29uZmlnID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcpCiAgICBmcmFtZV9kaWcgMjIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQzMAogICAgLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkgfHwKICAgIGZyYW1lX2RpZyAyMAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQzMC0xNDMxCiAgICAvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVFNfQ1JFQVRFRF9CWSB8fAogICAgLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRfSUQgfHwKICAgIGJueiBhZGRTdGFrZV9pZl9ib2R5QDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MzEKICAgIC8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUX0lEIHx8CiAgICBmcmFtZV9kaWcgMjAKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDMwLTE0MzEKICAgIC8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CiAgICAvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAogICAgYm56IGFkZFN0YWtlX2lmX2JvZHlAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQzMgogICAgLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCiAgICBmcmFtZV9kaWcgMjAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDMwLTE0MzIKICAgIC8vIHR5cGUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CiAgICAvLyB0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCB8fAogICAgLy8gdHlwZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDM1CgphZGRTdGFrZV9pZl9ib2R5QDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDM0CiAgICAvLyBhc3NlcnQodmFsdWVUb1ZlcmlmeSAhPT0gMCkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MzkKICAgIC8vIGNvbnN0IFthc3NldEJhbGFuY2VdID0gb3AuQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZShzdGFrZXIsIHZhbHVlVG9WZXJpZnkpCiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDQwCiAgICAvLyBhc3NlcnQoYXNzZXRCYWxhbmNlLCAnbXVzdCBoYXZlIHJlcXVpcmVkIG1pbmltdW0gYmFsYW5jZSBvZiB2YWxpZGF0b3IgZGVmaW5lZCB0b2tlbiB0byBhZGQgc3Rha2UnKQogICAgYXNzZXJ0IC8vIG11c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlCgphZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDQyCiAgICAvLyBpZiAodHlwZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRTX0NSRUFURURfQlkpIHsKICAgIGZyYW1lX2RpZyAxOQogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAzNwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDQ0CiAgICAvLyBBc3NldCh2YWx1ZVRvVmVyaWZ5KS5jcmVhdG9yID09PSBjb25maWcuZW50cnlHYXRpbmdBZGRyZXNzLm5hdGl2ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDAgMjQyCiAgICBleHRyYWN0IDgxIDMyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDQzLTE0NDYKICAgIC8vIGFzc2VydCgKICAgIC8vICAgQXNzZXQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvciA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQWRkcmVzcy5uYXRpdmUsCiAgICAvLyAgICdzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCB0aGUgdmFsaWRhdG9yIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZScsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgdGhlIHZhbGlkYXRvciBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NDgKICAgIC8vIGlmICh0eXBlID09PSBHQVRJTkdfVFlQRV9BU1NFVF9JRCkgewogICAgZnJhbWVfZGlnIDIwCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGJ6IGFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQ0OQogICAgLy8gYXNzZXJ0KHZhbHVlVG9WZXJpZnkgIT09IDApCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDUwCiAgICAvLyBsZXQgZm91bmQgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDE1CgphZGRTdGFrZV9mb3JfaGVhZGVyQDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDUxCiAgICAvLyBmb3IgKGNvbnN0IGFzc2V0SWQgb2YgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzKSB7CiAgICBmcmFtZV9kaWcgMTUKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA8CiAgICBieiBhZGRTdGFrZV9ibG9ja0A0NQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgMTEzIDMyCiAgICBmcmFtZV9kaWcgMTUKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDUyCiAgICAvLyBpZiAodmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZCkgewogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUA0MgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDUzCiAgICAvLyBmb3VuZCA9IHRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDEwCgphZGRTdGFrZV9ibG9ja0A0NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQ1NwogICAgLy8gYXNzZXJ0KGZvdW5kLCAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UnKQogICAgZnJhbWVfZGlnIDEwCiAgICBhc3NlcnQgLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBhc3NldCBpZCBkZWZpbmVkIGFzIGEgcmVxdWlyZW1lbnQgdG8gc3Rha2UKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NTkKICAgIC8vIGlmICh0eXBlID09PSBHQVRJTkdfVFlQRV9DUkVBVEVEX0JZX05GRF9BRERSRVNTRVMpIHsKICAgIGZyYW1lX2RpZyAyMAogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NjMKICAgIC8vIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgbmV3IEFkZHJlc3MoQXNzZXQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvcikpLAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgMTEzIDMyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NjItMTQ2NQogICAgLy8gYXNzZXJ0KAogICAgLy8gICB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChjb25maWcuZW50cnlHYXRpbmdBc3NldHNbMF0sIG5ldyBBZGRyZXNzKEFzc2V0KHZhbHVlVG9WZXJpZnkpLmNyZWF0b3IpKSwKICAgIC8vICAgJ3NwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IGlzIG9uZSBvZiB0aGUgbGlua2VkIGFkZHJlc3NlcyBpbiBhbiBuZmQKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NjcKICAgIC8vIGlmICh0eXBlID09PSBHQVRJTkdfVFlQRV9TRUdNRU5UX09GX05GRCkgewogICAgZnJhbWVfZGlnIDIwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IGFkZFN0YWtlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZG9lc1N0YWtlck1lZXRHYXRpbmdANTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQ3MAogICAgLy8gYXNzZXJ0KHRoaXMuaXNORkRBcHBJRFZhbGlkKHVzZXJPZmZlcmVkTkZEQXBwSUQpLCAncHJvdmlkZWQgTkZEIG11c3QgYmUgdmFsaWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGlzTkZEQXBwSURWYWxpZAogICAgYXNzZXJ0IC8vIHByb3ZpZGVkIE5GRCBtdXN0IGJlIHZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NzMKICAgIC8vIGNvbnN0IFtvd25lckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKHVzZXJPZmZlcmVkTkZEQXBwSUQsIEJ5dGVzKCdpLm93bmVyLmEnKSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgMTEgLy8gImkub3duZXIuYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQ3NQogICAgLy8gbmV3IEFkZHJlc3Mob3duZXJCeXRlcykgPT09IG5ldyBBZGRyZXNzKHN0YWtlcikgfHwKICAgIGZyYW1lX2RpZyA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDc1LTE0NzYKICAgIC8vIG5ldyBBZGRyZXNzKG93bmVyQnl0ZXMpID09PSBuZXcgQWRkcmVzcyhzdGFrZXIpIHx8CiAgICAvLyAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KHVzZXJPZmZlcmVkTkZEQXBwSUQsIG5ldyBBZGRyZXNzKHN0YWtlcikpLAogICAgYm56IGFkZFN0YWtlX2Jvb2xfdHJ1ZUA1MQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDc2CiAgICAvLyB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBuZXcgQWRkcmVzcyhzdGFrZXIpKSwKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDYKICAgIGNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0NzUtMTQ3NgogICAgLy8gbmV3IEFkZHJlc3Mob3duZXJCeXRlcykgPT09IG5ldyBBZGRyZXNzKHN0YWtlcikgfHwKICAgIC8vICAgdGhpcy5pc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QodXNlck9mZmVyZWRORkRBcHBJRCwgbmV3IEFkZHJlc3Moc3Rha2VyKSksCiAgICBieiBhZGRTdGFrZV9ib29sX2ZhbHNlQDUyCgphZGRTdGFrZV9ib29sX3RydWVANTE6CiAgICBpbnRjXzEgLy8gMQoKYWRkU3Rha2VfYm9vbF9tZXJnZUA1MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQ3NC0xNDc4CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIG5ldyBBZGRyZXNzKG93bmVyQnl0ZXMpID09PSBuZXcgQWRkcmVzcyhzdGFrZXIpIHx8CiAgICAvLyAgICAgdGhpcy5pc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QodXNlck9mZmVyZWRORkRBcHBJRCwgbmV3IEFkZHJlc3Moc3Rha2VyKSksCiAgICAvLyAgICJwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyIiwKICAgIC8vICkKICAgIGFzc2VydCAvLyBwcm92aWRlZCBuZmQgZm9yIGVudHJ5IGlzbid0IG93bmVkIG9yIGxpbmtlZCB0byB0aGUgc3Rha2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0ODEKICAgIC8vIGNvbnN0IFtwYXJlbnRBcHBJZF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodXNlck9mZmVyZWRORkRBcHBJRCwgQnl0ZXMoJ2kucGFyZW50QXBwSUQnKSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzICJpLnBhcmVudEFwcElEIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNDgzCiAgICAvLyBwYXJlbnRBcHBJZCA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgMTEzIDMyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0ODItMTQ4NQogICAgLy8gYXNzZXJ0KAogICAgLy8gICBwYXJlbnRBcHBJZCA9PT0gY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAogICAgLy8gICAnc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIHNwZWNpZmllZCBuZmQgbXVzdCBiZSBhIHNlZ21lbnQgb2YgdGhlIG5mZCB0aGUgdmFsaWRhdG9yIHNwZWNpZmllZCBhcyBhIHJlcXVpcmVtZW50CgphZGRTdGFrZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmRvZXNTdGFrZXJNZWV0R2F0aW5nQDU1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MjQKICAgIC8vIGxldCByZWFsQW1vdW50ID0gc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzI1CiAgICAvLyBsZXQgbWJyQW10TGVmdEJlaGluZDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjI3CiAgICAvLyBzdGFrZXJQb29sU2V0ID0gQm94TWFwPEFkZHJlc3MsIEZpeGVkQXJyYXk8VmFsaWRhdG9yUG9vbEtleSwgdHlwZW9mIE1BWF9QT09MU19QRVJfU1RBS0VSPj4oeyBrZXlQcmVmaXg6ICdzcHMnIH0pCiAgICBieXRlYyA3IC8vICJzcHMiCiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MjgKICAgIC8vIGlmICghdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMTgKICAgIGJueiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzMxCiAgICAvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCiAgICBpbnRjIDE3IC8vIDc0MTAwCiAgICBmcmFtZV9idXJ5IDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMgogICAgLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCiAgICBmcmFtZV9kaWcgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzMxCiAgICAvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCiAgICBpbnRjIDE3IC8vIDc0MTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMgogICAgLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCiAgICAtCiAgICBmcmFtZV9idXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjczMwogICAgLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuY3JlYXRlKCkKICAgIGZyYW1lX2RpZyAyCiAgICBwdXNoaW50IDE0NCAvLyAxNDQKICAgIGJveF9jcmVhdGUKICAgIHBvcAoKYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzcKICAgIC8vIGNvbnN0IGZpbmRSZXQgPSB0aGlzLmZpbmRQb29sRm9yU3Rha2VyKHZhbGlkYXRvcklkLCBzdGFrZXIsIHJlYWxBbW91bnQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgMTgKICAgIGNhbGxzdWIgZmluZFBvb2xGb3JTdGFrZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzM4CiAgICAvLyBjb25zdCBwb29sS2V5ID0gY2xvbmUoZmluZFJldFswXSkKICAgIGR1cAogICAgZXh0cmFjdCAwIDI0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MzkKICAgIC8vIGNvbnN0IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmaW5kUmV0WzFdCiAgICBkdXAKICAgIGludGMgOSAvLyAxOTIKICAgIGdldGJpdAogICAgZnJhbWVfYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NDAKICAgIC8vIGNvbnN0IGlzTmV3U3Rha2VyVG9Qcm90b2NvbCA9IGZpbmRSZXRbMl0KICAgIHB1c2hpbnQgMTkzIC8vIDE5MwogICAgZ2V0Yml0CiAgICBmcmFtZV9idXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc0MQogICAgLy8gaWYgKHBvb2xLZXkucG9vbElkID09PSAwKSB7CiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMQogICAgIQogICAgIQogICAgYXNzZXJ0IC8vIE5vIHBvb2wgYXZhaWxhYmxlIHdpdGggZnJlZSBzdGFrZS4gIFZhbGlkYXRvciBuZWVkcyB0byBhZGQgYW5vdGhlciBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDEKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQzCiAgICAvLyBjb25zdCBwb29sU2V0ID0gY2xvbmUodGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUpCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ0CiAgICAvLyBsZXQgZmlyc3RFbXB0eTogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzQ1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDExCgphZGRTdGFrZV93aGlsZV90b3BAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIDExCiAgICBwdXNoaW50IDYgLy8gNgogICAgPAogICAgYnogYWRkU3Rha2VfYWZ0ZXJfd2hpbGVAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0NgogICAgLy8gaWYgKGVuY29kZUFyYzQocG9vbFNldFtpXSkgPT09IGVuY29kZUFyYzQocG9vbEtleSkpIHsKICAgIGZyYW1lX2RpZyAxMQogICAgaW50Y18zIC8vIDI0CiAgICAqCiAgICBmcmFtZV9kaWcgNAogICAgc3dhcAogICAgaW50Y18zIC8vIDI0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgMwogICAgPT0KICAgIGJueiBhZGRTdGFrZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LnVwZGF0ZVN0YWtlclBvb2xTZXRAMTgKICAgIGZyYW1lX2RpZyA4CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzUwCiAgICAvLyBpZiAoZmlyc3RFbXB0eSA9PT0gMCAmJiBwb29sU2V0W2ldLmlkID09PSAwKSB7CiAgICBibnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNAogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDgKICAgIGZyYW1lX2J1cnkgOQogICAgYm56IGFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1MQogICAgLy8gZmlyc3RFbXB0eSA9IGkgKyAxCiAgICBmcmFtZV9kaWcgMTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDkKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxMQogICAgYiBhZGRTdGFrZV93aGlsZV90b3BAOAoKYWRkU3Rha2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS51cGRhdGVTdGFrZXJQb29sU2V0QDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjk2CiAgICAvLyBjb25zdCBwb29sQXBwSWQgPSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS5wb29sQXBwSWQKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyOTYKICAgIC8vIGNvbnN0IHBvb2xBcHBJZCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnBvb2xBcHBJZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIDIxCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMTAtMTMxOQogICAgLy8gYWJpQ2FsbChTdGFraW5nUG9vbC5wcm90b3R5cGUuYWRkU3Rha2UsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xBcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIC8vID09PT09PT0KICAgIC8vICAgICAvLyBUSElTIElTIEEgU0VORCBvZiB0aGUgYW1vdW50IHJlY2VpdmVkIHJpZ2h0IGJhY2sgb3V0IGFuZCBpbnRvIHRoZSBzdGFraW5nIHBvb2wgY29udHJhY3QgYWNjb3VudC4KICAgIC8vICAgICAvLyA9PT09PT09CiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sQXBwSWQpLmFkZHJlc3MgfSksCiAgICAvLyAgICAgbmV3IEFkZHJlc3Moc3Rha2VkQW1vdW50UGF5bWVudC5zZW5kZXIpLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMxNgogICAgLy8gaXR4bi5wYXltZW50KHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sQXBwSWQpLmFkZHJlc3MgfSksCiAgICBmcmFtZV9kaWcgMTcKICAgIGZyYW1lX2RpZyAxNgogICAgLQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDEyCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMTAtMTMxOQogICAgLy8gYWJpQ2FsbChTdGFraW5nUG9vbC5wcm90b3R5cGUuYWRkU3Rha2UsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xBcHBJZCwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIC8vID09PT09PT0KICAgIC8vICAgICAvLyBUSElTIElTIEEgU0VORCBvZiB0aGUgYW1vdW50IHJlY2VpdmVkIHJpZ2h0IGJhY2sgb3V0IGFuZCBpbnRvIHRoZSBzdGFraW5nIHBvb2wgY29udHJhY3QgYWNjb3VudC4KICAgIC8vICAgICAvLyA9PT09PT09CiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sQXBwSWQpLmFkZHJlc3MgfSksCiAgICAvLyAgICAgbmV3IEFkZHJlc3Moc3Rha2VkQW1vdW50UGF5bWVudC5zZW5kZXIpLAogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fbmV4dAogICAgcHVzaGJ5dGVzIDB4ZjljNzBjYmQgLy8gbWV0aG9kICJhZGRTdGFrZShwYXksYWRkcmVzcyl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDEgTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjAKICAgIC8vIGVuc3VyZUJ1ZGdldCg1MDApCiAgICBwdXNoaW50IDUwMCAvLyA1MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyMwogICAgLy8gY29uc3QgW3Bvb2xOdW1TdGFrZXJzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChwb29sQXBwSWQsIEJ5dGVzKCdudW1TdGFrZXJzJykpCiAgICBkdXAKICAgIGJ5dGVjIDUgLy8gIm51bVN0YWtlcnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjQKICAgIC8vIGNvbnN0IFtwb29sQWxnb1N0YWtlZF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQocG9vbEFwcElkLCBCeXRlcygnc3Rha2VkJykpCiAgICBieXRlY18zIC8vICJzdGFrZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjYKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IG5ldyBVaW50MTYocG9vbE51bVN0YWtlcnMpCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgaW50Y18zIC8vIDI0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIHB1c2hpbnQgMjc2IC8vIDI3NgogICAgKwogICAgZGlnIDQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNwogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkID0gcG9vbEFsZ29TdGFrZWQKICAgIGl0b2IKICAgIHN3YXAKICAgIGludGMgMTUgLy8gMjc4CiAgICArCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzMwCiAgICAvLyBpZiAoaXNOZXdTdGFrZXJUb1ZhbGlkYXRvcikgewogICAgZnJhbWVfZGlnIDE0CiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzEKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbFN0YWtlcnMgKz0gMQogICAgZnJhbWVfZGlnIDIyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDI0MiAyNgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgcHVzaGludCAyNDQgLy8gMjQ0CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQoKYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzMwogICAgLy8gaWYgKGlzTmV3U3Rha2VyVG9Qcm90b2NvbCkgewogICAgZnJhbWVfZGlnIDEzCiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzQKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTYKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDUgLy8gIm51bVN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzQKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSArPSAxCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE2CiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyA1IC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzM0CiAgICAvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzYKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQgLSBtYnJBbXRQYWlkCiAgICBmcmFtZV9kaWcgMjIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50YyAxNiAvLyAyNTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzNwogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQgLSBtYnJBbXRQYWlkCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTkKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlY18zIC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzcKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICs9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50IC0gbWJyQW10UGFpZAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWNfMyAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzM3CiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc1OAogICAgLy8gcmV0dXJuIHBvb2xLZXkKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYWRkU3Rha2VfYWZ0ZXJfd2hpbGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTQKICAgIC8vIGlmIChmaXJzdEVtcHR5ID09PSAwKSB7CiAgICBmcmFtZV9kaWcgOAogICAgZHVwCiAgICAhCiAgICAhCiAgICBhc3NlcnQgLy8gTm8gZW1wdHkgc2xvdCBhdmFpbGFibGUgaW4gdGhlIHN0YWtlciBwb29sIHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzU3CiAgICAvLyB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZVtmaXJzdEVtcHR5IC0gMV0gPSBjbG9uZShwb29sS2V5KQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyAyNAogICAgKgogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NDYKICAgIC8vIHRoaXMudXBkYXRlU3Rha2VyUG9vbFNldChzdGFrZXIsIHBvb2xLZXkpCiAgICBiIGFkZFN0YWtlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkudXBkYXRlU3Rha2VyUG9vbFNldEAxOAoKYWRkU3Rha2VfYm9vbF9mYWxzZUA1MjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFkZFN0YWtlX2Jvb2xfbWVyZ2VANTMKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANDI6CiAgICBmcmFtZV9kaWcgMTUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDE1CiAgICBiIGFkZFN0YWtlX2Zvcl9oZWFkZXJAMzkKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5zZXRUb2tlblBheW91dFJhdGlvKHZhbGlkYXRvcklkOiB1aW50NjQpIC0+IGJ5dGVzOgpzZXRUb2tlblBheW91dFJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzYKICAgIC8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvIHsKICAgIHByb3RvIDEgMQogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OAogICAgLy8gY29uc3QgcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OAogICAgLy8gY29uc3QgcG9vbDFBcHBJRCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMCAxOCAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3OQogICAgLy8gYXNzZXJ0KHBvb2wxQXBwSUQgIT09IDApCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzgxCiAgICAvLyBpZiAoVHhuLnNlbmRlciAhPT0gQXBwbGljYXRpb24ocG9vbDFBcHBJRCkuYWRkcmVzcykgewogICAgdHhuIFNlbmRlcgogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgIT0KICAgIGJ6IHNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc4MgogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpbwogICAgZnJhbWVfZGlnIDUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDcgLy8gNzAwCiAgICBpbnRjIDYgLy8gMjAwCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3ODgKICAgIC8vIGNvbnN0IGN1clJvdW5kID0gR2xvYmFsLnJvdW5kCiAgICBnbG9iYWwgUm91bmQKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3ODkKICAgIC8vIGNvbnN0IGxhc3RQYXlvdXRVcGRhdGUgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dAogICAgZnJhbWVfZGlnIDUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDcgLy8gNzAwCiAgICBpbnRjIDYgLy8gMjAwCiAgICBleHRyYWN0MwogICAgaW50YyA5IC8vIDE5MgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc5MAogICAgLy8gaWYgKGxhc3RQYXlvdXRVcGRhdGUgIT09IDApIHsKICAgIGJ6IHNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc5MQogICAgLy8gY29uc3QgW2xhc3RQYXlvdXRdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHBvb2wxQXBwSUQsIEJ5dGVzKCdsYXN0UGF5b3V0JykpCiAgICBmcmFtZV9kaWcgNgogICAgcHVzaGJ5dGVzICJsYXN0UGF5b3V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3OTMKICAgIC8vIGlmIChsYXN0UGF5b3V0ID09PSBsYXN0UGF5b3V0VXBkYXRlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgPT0KICAgIGJ6IHNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc5NAogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpbwogICAgZnJhbWVfZGlnIDUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDcgLy8gNzAwCiAgICBpbnRjIDYgLy8gMjAwCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3OTYKICAgIC8vIGNvbnN0IGVwb2NoUm91bmRMZW5ndGggPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lcG9jaFJvdW5kTGVuZ3RoLm5hdGl2ZQogICAgZnJhbWVfZGlnIDUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgMjQyCiAgICBwdXNoaW50IDE2OSAvLyAxNjkKICAgIGV4dHJhY3RfdWludDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc5NwogICAgLy8gY29uc3QgdGhpc0Vwb2NoQmVnaW46IHVpbnQ2NCA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICAlCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzk5CiAgICAvLyBpZiAobGFzdFBheW91dFVwZGF0ZSAtIChsYXN0UGF5b3V0VXBkYXRlICUgZXBvY2hSb3VuZExlbmd0aCkgPT09IHRoaXNFcG9jaEJlZ2luKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDMKICAgICUKICAgIC0KICAgID09CiAgICBieiBzZXRUb2tlblBheW91dFJhdGlvX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDAKICAgIC8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8KICAgIGZyYW1lX2RpZyA1CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50YyA3IC8vIDcwMAogICAgaW50YyA2IC8vIDIwMAogICAgZXh0cmFjdDMKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzZXRUb2tlblBheW91dFJhdGlvX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAzCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA4OTIgLy8gODkyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwNQogICAgLy8gY29uc3QgY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLm5hdGl2ZQogICAgYm94X2dldAogICAgcG9wCiAgICBleHRyYWN0IDI0MiAyNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDYKICAgIC8vIGNvbnN0IHRvdGFsU3Rha2VGb3JWYWxpZGF0b3IgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLnRvdGFsQWxnb1N0YWtlZAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjdXJOdW1Qb29sczsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpzZXRUb2tlblBheW91dFJhdGlvX3doaWxlX3RvcEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjdXJOdW1Qb29sczsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODEzCiAgICAvLyBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1tpXS50b3RhbEFsZ29TdGFrZWQsIDFfMDAwXzAwMF0sCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAxOAogICAgKgogICAgaW50Y18yIC8vIDE4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGludGMgMTEgLy8gMTAwMDAwMAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNAogICAgLy8gW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTItODE1CiAgICAvLyBjb25zdCBvdXJQb29sUGN0T2ZXaG9sZSA9IHdpZGVSYXRpbygKICAgIC8vICAgW3RoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbaV0udG90YWxBbGdvU3Rha2VkLCAxXzAwMF8wMDBdLAogICAgLy8gICBbdG90YWxTdGFrZUZvclZhbGlkYXRvcl0sCiAgICAvLyApCiAgICBjYWxsc3ViIHdpZGVSYXRpbwogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNgogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvLnBvb2xQY3RPZldob2xlW2ldID0gb3VyUG9vbFBjdE9mV2hvbGUKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMjQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIGludGMgNyAvLyA3MDAKICAgICsKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MDcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjdXJOdW1Qb29sczsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHNldFRva2VuUGF5b3V0UmF0aW9fd2hpbGVfdG9wQDkKCnNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxOAogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUudG9rZW5QYXlvdXRSYXRpbwogICAgZnJhbWVfZGlnIDUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDcgLy8gNzAwCiAgICBpbnRjIDYgLy8gMjAwCiAgICBleHRyYWN0MwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKHBvb2xLZXk6IGJ5dGVzLCBhbGdvVG9BZGQ6IHVpbnQ2NCwgcmV3YXJkVG9rZW5BbW91bnRSZXNlcnZlZDogdWludDY0LCB2YWxpZGF0b3JDb21taXNzaW9uOiB1aW50NjQsIHNhdHVyYXRlZEJ1cm5Ub0ZlZVNpbms6IHVpbnQ2NCkgLT4gdm9pZDoKc3Rha2VVcGRhdGVkVmlhUmV3YXJkczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODMyLTgzOAogICAgLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygKICAgIC8vICAgcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSwKICAgIC8vICAgYWxnb1RvQWRkOiB1aW50NjQsCiAgICAvLyAgIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NCwKICAgIC8vICAgdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0LAogICAgLy8gICBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDUgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM5CiAgICAvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKICAgIGZyYW1lX2RpZyAtNQogICAgY2FsbHN1YiB2ZXJpZnlQb29sS2V5Q2FsbGVyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQyCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbEFsZ29TdGFrZWQgKz0gYWxnb1RvQWRkCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0MgogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkICs9IGFsZ29Ub0FkZAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtNQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtNAogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMjQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjIDE1IC8vIDI3OAogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQzCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkICs9IGFsZ29Ub0FkZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC00CiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50YyAxNiAvLyAyNTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODQ0CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayArPSByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZXh0cmFjdCAyNDIgMjYKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMwogICAgKwogICAgaXRvYgogICAgZGlnIDEKICAgIHB1c2hpbnQgMjYwIC8vIDI2MAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NDYKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICs9IGFsZ29Ub0FkZAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWNfMyAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NDYKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICs9IGFsZ29Ub0FkZAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtNAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTkKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlY18zIC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg0NgogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMyCiAgICAvLyBjb25zdCB2YWxpZGF0b3JDb25maWcgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZykKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMyLTEyMzMKICAgIC8vIGNvbnN0IHZhbGlkYXRvckNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQogICAgLy8gaWYgKHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwKSB7CiAgICBleHRyYWN0IDAgMjQyCiAgICBkdXAKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIzMwogICAgLy8gaWYgKHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBieiBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjM2CiAgICAvLyBjb25zdCBbbmZkT3duZXJCeXRlc10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyh2YWxpZGF0b3JDb25maWcubmZkRm9ySW5mbywgQnl0ZXMoJ2kub3duZXIuYScpKQogICAgZnJhbWVfZGlnIDMKICAgIGJ5dGVjIDExIC8vICJpLm93bmVyLmEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjM5CiAgICAvLyBpZiAodmFsaWRhdG9yQ29uZmlnLm93bmVyICE9PSBuZmRPd25lciAmJiB2YWxpZGF0b3JDb25maWcubWFuYWdlciAhPT0gbmZkT3duZXIpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDggMzIKICAgICE9CiAgICBieiBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANgogICAgZnJhbWVfZGlnIDIKICAgIGV4dHJhY3QgNDAgMzIKICAgIGZyYW1lX2RpZyAwCiAgICAhPQogICAgYnogc3Rha2VVcGRhdGVkVmlhUmV3YXJkc19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubmZkRm9ySW5mbyA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA3MiAvLyA3MgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQoKc3Rha2VVcGRhdGVkVmlhUmV3YXJkc19hZnRlcl9pZl9lbHNlQDY6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5zdGFrZVJlbW92ZWQocG9vbEtleTogYnl0ZXMsIHN0YWtlcjogYnl0ZXMsIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwgcmV3YXJkUmVtb3ZlZDogdWludDY0LCBzdGFrZXJSZW1vdmVkOiB1aW50NjQpIC0+IHZvaWQ6CnN0YWtlUmVtb3ZlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc0LTg4MAogICAgLy8gc3Rha2VSZW1vdmVkKAogICAgLy8gICBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LAogICAgLy8gICBzdGFrZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcmV3YXJkUmVtb3ZlZDogdWludDY0LAogICAgLy8gICBzdGFrZXJSZW1vdmVkOiBib29sZWFuLAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA1IDAKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDUKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgxCiAgICAvLyBlbnN1cmVCdWRnZXQoMzAwKQogICAgcHVzaGludCAzMDAgLy8gMzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4MwogICAgLy8gdGhpcy52ZXJpZnlQb29sS2V5Q2FsbGVyKHBvb2xLZXkpCiAgICBmcmFtZV9kaWcgLTUKICAgIGNhbGxzdWIgdmVyaWZ5UG9vbEtleUNhbGxlcgogICAgZnJhbWVfYnVyeSAtNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4ODcKICAgIC8vIGFzc2VydChhbW91bnRSZW1vdmVkID4gMCB8fCByZXdhcmRSZW1vdmVkID4gMCwgJ3Nob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBhbGdvIG9yIHJld2FyZCB3YXMgcmVtb3ZlZCcpCiAgICBmcmFtZV9kaWcgLTMKICAgIGJueiBzdGFrZVJlbW92ZWRfYm9vbF90cnVlQDIKICAgIGZyYW1lX2RpZyAtMgogICAgYnogc3Rha2VSZW1vdmVkX2Jvb2xfZmFsc2VAMwoKc3Rha2VSZW1vdmVkX2Jvb2xfdHJ1ZUAyOgogICAgaW50Y18xIC8vIDEKCnN0YWtlUmVtb3ZlZF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NwogICAgLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKICAgIGFzc2VydCAvLyBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgYWxnbyBvciByZXdhcmQgd2FzIHJlbW92ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODkwCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbEFsZ29TdGFrZWQgLT0gYW1vdW50UmVtb3ZlZAogICAgZnJhbWVfZGlnIC01CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg5MAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkIC09IGFtb3VudFJlbW92ZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtNQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBzd2FwCiAgICBpbnRjIDQgLy8gMjY4CiAgICBpbnRjIDUgLy8gNDMyCiAgICBleHRyYWN0MwogICAgZGlnIDEKICAgIGludGNfMiAvLyAxOAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMjQKICAgIDwKICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjIDE1IC8vIDI3OAogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODkxCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkIC09IGFtb3VudFJlbW92ZWQKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBleHRyYWN0IDI0MiAyNgogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgaXRvYgogICAgaW50YyAxNiAvLyAyNTIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg5MgogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgLT0gYW1vdW50UmVtb3ZlZAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWNfMyAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTIKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC09IGFtb3VudFJlbW92ZWQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE5CiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWNfMyAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTIKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC09IGFtb3VudFJlbW92ZWQKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg5NAogICAgLy8gaWYgKHJld2FyZFJlbW92ZWQgPiAwKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6IHN0YWtlUmVtb3ZlZF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg5NQogICAgLy8gY29uc3QgcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgZXh0cmFjdCAwIDI0MgogICAgZHVwCiAgICBleHRyYWN0IDE1MyA4CiAgICBmcmFtZV9idXJ5IDEKICAgIHB1c2hpbnQgMTUzIC8vIDE1MwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODk2CiAgICAvLyBhc3NlcnQocmV3YXJkVG9rZW5JRCAhPT0gMCwgInJld2FyZFJlbW92ZWQgY2FuJ3QgYmUgc2V0IGlmIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgcmV3YXJkIHRva2VuISIpCiAgICBhc3NlcnQgLy8gcmV3YXJkUmVtb3ZlZCBjYW4ndCBiZSBzZXQgaWYgdmFsaWRhdG9yIGRvZXNuJ3QgaGF2ZSByZXdhcmQgdG9rZW4hCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg5OAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgPj0gcmV3YXJkUmVtb3ZlZCwKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODk3LTkwMAogICAgLy8gYXNzZXJ0KAogICAgLy8gICB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUucmV3YXJkVG9rZW5IZWxkQmFjayA+PSByZXdhcmRSZW1vdmVkLAogICAgLy8gICAncmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIHJld2FyZCBiZWluZyByZW1vdmVkIG11c3QgYmUgY292ZXJlZCBieSBob2xkIGJhY2sgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwMwogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgLT0gcmV3YXJkUmVtb3ZlZAogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpdG9iCiAgICBwdXNoaW50IDI2MCAvLyAyNjAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOAogICAgLy8gaWYgKHBvb2xLZXkucG9vbElkICE9PSAxKSB7CiAgICBmcmFtZV9kaWcgMTYKICAgIGludGNfMSAvLyAxCiAgICAhPQogICAgYnogc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA5LTkxMgogICAgLy8gYWJpQ2FsbChTdGFraW5nUG9vbEFCSS5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1swXS5wb29sQXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtzdGFrZXIsIHJld2FyZFRva2VuSUQsIHJld2FyZFJlbW92ZWRdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEwCiAgICAvLyBhcHBJZDogdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCwKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMCAxOCAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTEKICAgIC8vIGFyZ3M6IFtzdGFrZXIsIHJld2FyZFRva2VuSUQsIHJld2FyZFJlbW92ZWRdLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOS05MTIKICAgIC8vIGFiaUNhbGwoU3Rha2luZ1Bvb2xBQkkucHJvdG90eXBlLnBheVRva2VuUmV3YXJkLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkLAogICAgLy8gICBhcmdzOiBbc3Rha2VyLCByZXdhcmRUb2tlbklELCByZXdhcmRSZW1vdmVkXSwKICAgIC8vIH0pCiAgICBieXRlYyAxNyAvLyBtZXRob2QgInBheVRva2VuUmV3YXJkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCnN0YWtlUmVtb3ZlZF9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MzYKICAgIC8vIGlmIChzdGFrZXJSZW1vdmVkKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IHN0YWtlUmVtb3ZlZF9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkzOAogICAgLy8gY29uc3QgdG90YWxTdGFrZXJzID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxTdGFrZXJzLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGMgNCAvLyAyNjgKICAgIGludGMgNSAvLyA0MzIKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkzOQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxTdGFrZXJzID0gbmV3IFVpbnQxNih0b3RhbFN0YWtlcnMgLSAxKQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgcHVzaGludCAyNzYgLy8gMjc2CiAgICArCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NDQKICAgIC8vIHBvb2xBcHBJZDogcG9vbEtleS5wb29sQXBwSWQsCiAgICBmcmFtZV9kaWcgLTUKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0MS05NDUKICAgIC8vIGNvbnN0IHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCB7CiAgICAvLyAgIGlkOiBwb29sS2V5LmlkLAogICAgLy8gICBwb29sSWQ6IHBvb2xLZXkucG9vbElkLAogICAgLy8gICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAogICAgLy8gfSBhcyBWYWxpZGF0b3JQb29sS2V5KQogICAgZnJhbWVfZGlnIDE2CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgNAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgLTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM3MAogICAgLy8gbGV0IGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM3MQogICAgLy8gbGV0IGluQW55UG9vbENvdW50OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzcyCiAgICAvLyBsZXQgZm91bmQgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjcKICAgIC8vIHN0YWtlclBvb2xTZXQgPSBCb3hNYXA8QWRkcmVzcywgRml4ZWRBcnJheTxWYWxpZGF0b3JQb29sS2V5LCB0eXBlb2YgTUFYX1BPT0xTX1BFUl9TVEFLRVI+Pih7IGtleVByZWZpeDogJ3NwcycgfSkKICAgIGJ5dGVjIDcgLy8gInNwcyIKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc0CiAgICAvLyBjb25zdCBwb29sU2V0ID0gY2xvbmUodGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTAKCnN0YWtlUmVtb3ZlZF93aGlsZV90b3BAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA2IC8vIDYKICAgIDwKICAgIGJ6IHN0YWtlUmVtb3ZlZF9hZnRlcl93aGlsZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc2CiAgICAvLyBpZiAocG9vbFNldFtpXS5pZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIDEwCiAgICBpbnRjXzMgLy8gMjQKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgaW50Y18zIC8vIDI0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNQogICAgYnogc3Rha2VSZW1vdmVkX2Jsb2NrQDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNzkKICAgIC8vIGluQW55UG9vbENvdW50ICs9IDEKICAgIGZyYW1lX2RpZyAxMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM4MAogICAgLy8gaWYgKHBvb2xTZXRbaV0uaWQgPT09IHBvb2xLZXkuaWQpIHsKICAgIGZyYW1lX2RpZyAtNQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMTUKICAgID09CiAgICBmcmFtZV9kaWcgOAogICAgZnJhbWVfYnVyeSA5CiAgICBmcmFtZV9kaWcgMTIKICAgIGZyYW1lX2J1cnkgMTMKICAgIGJ6IHN0YWtlUmVtb3ZlZF9hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzODEKICAgIC8vIGlmIChlbmNvZGVBcmM0KHBvb2xTZXRbaV0pID09PSBlbmNvZGVBcmM0KHBvb2xLZXkpKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC01CiAgICA9PQogICAgYnogc3Rha2VSZW1vdmVkX2Vsc2VfYm9keUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzgyCiAgICAvLyBmb3VuZCA9IHRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM4NAogICAgLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWVbaV0gPSB7IGlkOiAwLCBwb29sSWQ6IDAsIHBvb2xBcHBJZDogMCB9CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDcKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYm94X3JlcGxhY2UKCnN0YWtlUmVtb3ZlZF9hZnRlcl9pZl9lbHNlQDI1OgogICAgZnJhbWVfZGlnIDgKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfZGlnIDEyCiAgICBmcmFtZV9idXJ5IDEzCgpzdGFrZVJlbW92ZWRfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGZyYW1lX2RpZyA5CiAgICBmcmFtZV9idXJ5IDgKICAgIGZyYW1lX2RpZyAxMwogICAgZnJhbWVfYnVyeSAxMgoKc3Rha2VSZW1vdmVkX2Jsb2NrQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzc1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAxMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMTAKICAgIGIgc3Rha2VSZW1vdmVkX3doaWxlX3RvcEAxOAoKc3Rha2VSZW1vdmVkX2Vsc2VfYm9keUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM4NgogICAgLy8gaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50ICs9IDEKICAgIGZyYW1lX2RpZyAxMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMTIKICAgIGIgc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMjUKCnN0YWtlUmVtb3ZlZF9hZnRlcl93aGlsZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM5MAogICAgLy8gaWYgKCFmb3VuZCkgewogICAgZnJhbWVfZGlnIDgKICAgIGFzc2VydCAvLyBObyBtYXRjaGluZyBzbG90IGZvdW5kIHdoZW4gdG9sZCB0byByZW1vdmUgYSBwb29sIGZyb20gdGhlIHN0YWtlcnMgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTQKICAgIC8vIHJldHVybiBbaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50ID09PSAwLCBpbkFueVBvb2xDb3VudCA9PT0gMF0KICAgIGZyYW1lX2RpZyAxMgogICAgIQogICAgZnJhbWVfZGlnIDExCiAgICAhCiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0NgogICAgLy8gY29uc3Qgc3Rha2VyT3V0T2ZUaGlzVmFsaWRhdG9yID0gcmVtb3ZlUmV0WzBdCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTQ3CiAgICAvLyBjb25zdCBzdGFrZXJPdXRPZlByb3RvY29sID0gcmVtb3ZlUmV0WzFdCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgZ2V0Yml0CiAgICBmcmFtZV9idXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0OQogICAgLy8gaWYgKHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcikgewogICAgYnogc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTUwCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzIC09IDEKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDI0MiAyNgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgcHVzaGludCAyNDQgLy8gMjQ0CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQoKc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk1MwogICAgLy8gaWYgKHN0YWtlck91dE9mUHJvdG9jb2wpIHsKICAgIGZyYW1lX2RpZyAxNAogICAgYnogc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTU0CiAgICAvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgLT0gMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE2CiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyA1IC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NTQKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSAtPSAxCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE2CiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyA1IC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NTQKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSAtPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICByZXRzdWIKCnN0YWtlUmVtb3ZlZF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzdGFrZVJlbW92ZWRfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgc3Rha2VyOiBieXRlcywgYW1vdW50VG9TdGFrZTogdWludDY0KSAtPiBieXRlczoKZmluZFBvb2xGb3JTdGFrZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk3MC05NzQKICAgIC8vIGZpbmRQb29sRm9yU3Rha2VyKAogICAgLy8gICB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLAogICAgLy8gICBzdGFrZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudFRvU3Rha2U6IHVpbnQ2NCwKICAgIC8vICk6IFtWYWxpZGF0b3JQb29sS2V5LCBib29sZWFuLCBib29sZWFuXSB7CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NzUKICAgIC8vIGxldCBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTc1LTk3NgogICAgLy8gbGV0IGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSB0cnVlCiAgICAvLyBsZXQgaXNOZXdTdGFrZXJUb1Byb3RvY29sID0gdHJ1ZQogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk4NAogICAgLy8gY29uc3QgbWF4UGVyUG9vbCA9IHRoaXMuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkKQogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIGdldEN1ck1heFN0YWtlUGVyUG9vbAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjcKICAgIC8vIHN0YWtlclBvb2xTZXQgPSBCb3hNYXA8QWRkcmVzcywgRml4ZWRBcnJheTxWYWxpZGF0b3JQb29sS2V5LCB0eXBlb2YgTUFYX1BPT0xTX1BFUl9TVEFLRVI+Pih7IGtleVByZWZpeDogJ3NwcycgfSkKICAgIGJ5dGVjIDcgLy8gInNwcyIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTg3CiAgICAvLyBpZiAodGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGJ6IGZpbmRQb29sRm9yU3Rha2VyX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTg4CiAgICAvLyBjb25zdCBwb29sU2V0ID0gY2xvbmUodGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUpCiAgICBmcmFtZV9kaWcgMTIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTg5CiAgICAvLyBhc3NlcnQodmFsaWRhdG9ySWQgIT09IDApCiAgICBmcmFtZV9kaWcgLTMKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5OTAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2CgpmaW5kUG9vbEZvclN0YWtlcl93aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTkwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDYKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA8CiAgICBieiBmaW5kUG9vbEZvclN0YWtlcl9hZnRlcl93aGlsZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5OTEKICAgIC8vIGVuc3VyZUJ1ZGdldCgzMDApCiAgICBwdXNoaW50IDMwMCAvLyAzMDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTkzCiAgICAvLyBpZiAocG9vbFNldFtpXS5pZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMyAvLyAyNAogICAgKgogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGludGNfMyAvLyAyNAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgYnogZmluZFBvb2xGb3JTdGFrZXJfYmxvY2tAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTk2CiAgICAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTk3CiAgICAvLyBpZiAocG9vbFNldFtpXS5pZCA9PT0gdmFsaWRhdG9ySWQpIHsKICAgIGZyYW1lX2RpZyA4CiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBieiBmaW5kUG9vbEZvclN0YWtlcl9ibG9ja0AxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5OTkKICAgIC8vIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDAxCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzW3Bvb2xTZXRbaV0ucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkICsgYW1vdW50VG9TdGFrZSA8PQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAwMQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArIGFtb3VudFRvU3Rha2UgPD0KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGludGNfMiAvLyAxOAogICAgKgogICAgaW50Y18yIC8vIDE4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAwMS0xMDAyCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzW3Bvb2xTZXRbaV0ucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkICsgYW1vdW50VG9TdGFrZSA8PQogICAgLy8gbWF4UGVyUG9vbAogICAgZnJhbWVfZGlnIDExCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDAwLTEwMDMKICAgIC8vIGlmICgKICAgIC8vICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sU2V0W2ldLnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArIGFtb3VudFRvU3Rha2UgPD0KICAgIC8vICAgbWF4UGVyUG9vbAogICAgLy8gKSB7CiAgICBieiBmaW5kUG9vbEZvclN0YWtlcl9ibG9ja0AxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDA0CiAgICAvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmZpbmRQb29sRm9yU3Rha2VyX2Jsb2NrQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5OTAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiBmaW5kUG9vbEZvclN0YWtlcl93aGlsZV90b3BAMgoKZmluZFBvb2xGb3JTdGFrZXJfYWZ0ZXJfd2hpbGVAMTE6CiAgICBmcmFtZV9kaWcgMTAKICAgIGZyYW1lX2J1cnkgMTMKICAgIGZyYW1lX2RpZyA5CiAgICBmcmFtZV9idXJ5IDE0CgpmaW5kUG9vbEZvclN0YWtlcl9hZnRlcl9pZl9lbHNlQDEyOgogICAgZnJhbWVfZGlnIDEzCiAgICBmcmFtZV9idXJ5IDEwCiAgICBmcmFtZV9kaWcgMTQKICAgIGZyYW1lX2J1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDEyCiAgICAvLyBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAxMgogICAgLy8gYW1vdW50VG9TdGFrZSA+PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5taW5FbnRyeVN0YWtlLAogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIGV4dHJhY3QgMCAyNDIKICAgIGludGMgMTMgLy8gMjA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDExLTEwMTQKICAgIC8vIGFzc2VydCgKICAgIC8vICAgYW1vdW50VG9TdGFrZSA+PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5taW5FbnRyeVN0YWtlLAogICAgLy8gICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtdXN0IHN0YWtlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIGZvciB0aGlzIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAxOAogICAgLy8gY29uc3QgY3VyTnVtUG9vbHMgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLm5hdGl2ZQogICAgZXh0cmFjdCAyNDIgMjYKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjdXJOdW1Qb29sczsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA3CgpmaW5kUG9vbEZvclN0YWtlcl93aGlsZV90b3BAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjdXJOdW1Qb29sczsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgNwogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IGZpbmRQb29sRm9yU3Rha2VyX2FmdGVyX3doaWxlQDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMjAKICAgIC8vIGlmIChwb29sc1tpXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9IG1heFBlclBvb2wpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjIDQgLy8gMjY4CiAgICBpbnRjIDUgLy8gNDMyCiAgICBleHRyYWN0MwogICAgZnJhbWVfZGlnIDcKICAgIGludGNfMiAvLyAxOAogICAgKgogICAgaW50Y18yIC8vIDE4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9kaWcgMTEKICAgIDw9CiAgICBieiBmaW5kUG9vbEZvclN0YWtlcl9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMjIKICAgIC8vIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IGkgKyAxLCBwb29sQXBwSWQ6IHBvb2xzW2ldLnBvb2xBcHBJZCB9LAogICAgZnJhbWVfZGlnIDcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAyMS0xMDI1CiAgICAvLyByZXR1cm4gWwogICAgLy8gICB7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiBpICsgMSwgcG9vbEFwcElkOiBwb29sc1tpXS5wb29sQXBwSWQgfSwKICAgIC8vICAgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwKICAgIC8vICAgaXNOZXdTdGFrZXJUb1Byb3RvY29sLAogICAgLy8gXQogICAgYnl0ZWMgNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIDkKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2RpZyAxMAogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpmaW5kUG9vbEZvclN0YWtlcl9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDE5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDcKICAgIGIgZmluZFBvb2xGb3JTdGFrZXJfd2hpbGVfdG9wQDEzCgpmaW5kUG9vbEZvclN0YWtlcl9hZnRlcl93aGlsZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAyOQogICAgLy8gcmV0dXJuIFt7IGlkOiB2YWxpZGF0b3JJZCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfSwgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciwgaXNOZXdTdGFrZXJUb1Byb3RvY29sXQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyA5CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9kaWcgMTAKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5Lm1vdmVQb29sVG9Ob2RlKHZhbGlkYXRvcklkOiB1aW50NjQsIHBvb2xBcHBJZDogdWludDY0LCBub2RlTnVtOiB1aW50NjQpIC0+IHZvaWQ6Cm1vdmVQb29sVG9Ob2RlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQzCiAgICAvLyBtb3ZlUG9vbFRvTm9kZSh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBwb29sQXBwSWQ6IHVpbnQ2NCwgbm9kZU51bTogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAzIDAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0NgogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlIHx8CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDYKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSB8fAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgOCAzMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0Ni0xMDQ3CiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUgfHwKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlci5uYXRpdmUsCiAgICBibnogbW92ZVBvb2xUb05vZGVfYm9vbF90cnVlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA0NwogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlci5uYXRpdmUsCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgNDAgMzIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDYtMTA0NwogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlIHx8CiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1hbmFnZXIubmF0aXZlLAogICAgYnogbW92ZVBvb2xUb05vZGVfYm9vbF9mYWxzZUAzCgptb3ZlUG9vbFRvTm9kZV9ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgptb3ZlUG9vbFRvTm9kZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDUtMTA0OQogICAgLy8gYXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUgfHwKICAgIC8vICAgICBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLm5hdGl2ZSwKICAgIC8vICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcicsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IG93bmVyIG9yIG1hbmFnZXIgb2YgdmFsaWRhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTEKICAgIC8vIGNvbnN0IG5vZGVQb29sQXNzaWdubWVudHMgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMpCiAgICBmcmFtZV9kaWcgNgogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDUyCiAgICAvLyBhc3NlcnQobm9kZU51bSA+PSAxICYmIG5vZGVOdW0gPD0gTUFYX05PREVTLCAnbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZScpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IG1vdmVQb29sVG9Ob2RlX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGJ6IG1vdmVQb29sVG9Ob2RlX2Jvb2xfZmFsc2VANwogICAgaW50Y18xIC8vIDEKCm1vdmVQb29sVG9Ob2RlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1MgogICAgLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG91dCBvZiBhbGxvd2FibGUgcmFuZ2UnKQogICAgYXNzZXJ0IC8vIG5vZGUgbnVtYmVyIG91dCBvZiBhbGxvd2FibGUgcmFuZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NAogICAgLy8gZm9yIChsZXQgc3JjTm9kZUlkeDogdWludDY0ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0Cgptb3ZlUG9vbFRvTm9kZV93aGlsZV90b3BAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NAogICAgLy8gZm9yIChsZXQgc3JjTm9kZUlkeDogdWludDY0ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKSB7CiAgICBmcmFtZV9kaWcgNAogICAgcHVzaGludCA4IC8vIDgKICAgIDwKICAgIGFzc2VydCAvLyBjb3VsZG4ndCBmaW5kIHBvb2wgYXBwIGlkIGluIG5vZGVzIHRvIG1vdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IE1BWF9QT09MU19QRVJfTk9ERTsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgptb3ZlUG9vbFRvTm9kZV93aGlsZV90b3BAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgYnogbW92ZVBvb2xUb05vZGVfYWZ0ZXJfd2hpbGVAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NgogICAgLy8gaWYgKG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9PT0gcG9vbEFwcElkKSB7CiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA4IC8vIDkwMAogICAgaW50YyA5IC8vIDE5MgogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMCAxOTIKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzMgLy8gMjQKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzMgLy8gMjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAwIDI0CiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYnogbW92ZVBvb2xUb05vZGVfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDU3CiAgICAvLyBhc3NlcnQobm9kZU51bSAtIDEgIT09IHNyY05vZGVJZHgsICJjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZSIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBmcmFtZV9kaWcgNAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDU5CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBpbnRjIDggLy8gOTAwCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfZGlnIDUKICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgZnJhbWVfZGlnIDYKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA2Mi0xMDY0CiAgICAvLyBhYmlDYWxsKFN0YWtpbmdQb29sQUJJLnByb3RvdHlwZS5nb09mZmxpbmUsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xBcHBJZCwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoYnl0ZXMgMHg1MWVmM2IyMSAvLyBtZXRob2QgImdvT2ZmbGluZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA2NwogICAgLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkZFBvb2xUb05vZGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA2OAogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCm1vdmVQb29sVG9Ob2RlX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBNQVhfUE9PTFNfUEVSX05PREU7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgbW92ZVBvb2xUb05vZGVfd2hpbGVfdG9wQDExCgptb3ZlUG9vbFRvTm9kZV9hZnRlcl93aGlsZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NAogICAgLy8gZm9yIChsZXQgc3JjTm9kZUlkeDogdWludDY0ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKSB7CiAgICBmcmFtZV9kaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBtb3ZlUG9vbFRvTm9kZV93aGlsZV90b3BAOQoKbW92ZVBvb2xUb05vZGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgbW92ZVBvb2xUb05vZGVfYm9vbF9tZXJnZUA4Cgptb3ZlUG9vbFRvTm9kZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBtb3ZlUG9vbFRvTm9kZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5lbXB0eVRva2VuUmV3YXJkcyh2YWxpZGF0b3JJZDogdWludDY0LCByZWNlaXZlcjogYnl0ZXMpIC0+IHVpbnQ2NDoKZW1wdHlUb2tlblJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwODYKICAgIC8vIGVtcHR5VG9rZW5SZXdhcmRzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHJlY2VpdmVyOiBBZGRyZXNzKTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg4CiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUsCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIzCiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg4CiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUsCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZHVwCiAgICBleHRyYWN0IDAgMjQyCiAgICBkdXAKICAgIGV4dHJhY3QgOCAzMgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDg3LTEwOTAKICAgIC8vIGFzc2VydCgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlLAogICAgLy8gICAnY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHZhbGlkYXRvciBvd25lcicsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHZhbGlkYXRvciBvd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDkxCiAgICAvLyBjb25zdCByZXdhcmRUb2tlbklkID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAogICAgZHVwCiAgICBleHRyYWN0IDE1MyA4CiAgICBzd2FwCiAgICBwdXNoaW50IDE1MyAvLyAxNTMKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTIKICAgIC8vIGNvbnN0IHJld2FyZFRva2VuSGVsZEJhY2sgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sKICAgIGRpZyAyCiAgICBleHRyYWN0IDI0MiAyNgogICAgaW50Y18yIC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDkzCiAgICAvLyBhc3NlcnQocmV3YXJkVG9rZW5JZCAhPT0gMCwgInRoaXMgdmFsaWRhdG9yIGRvZXNuJ3QgaGF2ZSBhIHJld2FyZCB0b2tlbiBkZWZpbmVkIikKICAgIGRpZyAxCiAgICBhc3NlcnQgLy8gdGhpcyB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIGEgcmV3YXJkIHRva2VuIGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5NAogICAgLy8gY29uc3QgcG9vbE9uZUFwcElkID0gQXBwbGljYXRpb24odGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1swXS5wb29sQXBwSWQpCiAgICB1bmNvdmVyIDMKICAgIGludGMgNCAvLyAyNjgKICAgIGludGMgNSAvLyA0MzIKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDAgMTggLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5NgogICAgLy8gbGV0IFt0b2tlblJld2FyZEJhbF0gPSBvcC5Bc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKHBvb2xPbmVBcHBJZC5hZGRyZXNzLCByZXdhcmRUb2tlbklkKQogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBkaWcgMwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA5NwogICAgLy8gdG9rZW5SZXdhcmRCYWwgPSB0b2tlblJld2FyZEJhbCAtIHJld2FyZFRva2VuSGVsZEJhY2sKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTktMTEwMgogICAgLy8gYWJpQ2FsbChTdGFraW5nUG9vbEFCSS5wcm90b3R5cGUucGF5VG9rZW5SZXdhcmQsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xPbmVBcHBJZC5pZCwKICAgIC8vICAgYXJnczogW3JlY2VpdmVyLCByZXdhcmRUb2tlbklkLCB0b2tlblJld2FyZEJhbF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTAxCiAgICAvLyBhcmdzOiBbcmVjZWl2ZXIsIHJld2FyZFRva2VuSWQsIHRva2VuUmV3YXJkQmFsXSwKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDk5LTExMDIKICAgIC8vIGFiaUNhbGwoU3Rha2luZ1Bvb2xBQkkucHJvdG90eXBlLnBheVRva2VuUmV3YXJkLCB7CiAgICAvLyAgIGFwcElkOiBwb29sT25lQXBwSWQuaWQsCiAgICAvLyAgIGFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE3IC8vIG1ldGhvZCAicGF5VG9rZW5SZXdhcmQoYWRkcmVzcyx1aW50NjQsdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDQKICAgIC8vIGNvbnN0IFtiYWxhbmNlXSA9IG9wLkFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UocG9vbE9uZUFwcElkLmFkZHJlc3MsIHJld2FyZFRva2VuSWQpCiAgICBzd2FwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDUKICAgIC8vIGFzc2VydChiYWxhbmNlID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLCAnYmFsYW5jZSBvZiByZW1haW5pbmcgcmV3YXJkIHRva2VucyBzaG91bGQgbWF0Y2ggdGhlIGhlbGQgYmFjayBhbW91bnQnKQogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDYKICAgIC8vIHJldHVybiB0b2tlblJld2FyZEJhbAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeVBvb2xLZXlDYWxsZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDMKICAgIC8vIHByaXZhdGUgdmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5KTogdm9pZCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwNAogICAgLy8gYXNzZXJ0KHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZCIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjMKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwNAogICAgLy8gYXNzZXJ0KHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZCIpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA1CiAgICAvLyBhc3NlcnQocG9vbEtleS5wb29sSWQgPD0gTUFYX1BPT0xTLCAncG9vbCBpZCBub3QgaW4gdmFsaWQgcmFuZ2UnKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cG4gMgogICAgaW50Y18zIC8vIDI0CiAgICA8PQogICAgYXNzZXJ0IC8vIHBvb2wgaWQgbm90IGluIHZhbGlkIHJhbmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMDcKICAgIC8vIHBvb2xLZXkucG9vbElkID4gMCAmJiBwb29sS2V5LnBvb2xJZCA8PSB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUubnVtUG9vbHMubmF0aXZlLAogICAgYnogdmVyaWZ5UG9vbEtleUNhbGxlcl9ib29sX2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAyNDIgMjYKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDEKICAgID49CiAgICBieiB2ZXJpZnlQb29sS2V5Q2FsbGVyX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCnZlcmlmeVBvb2xLZXlDYWxsZXJfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjA2LTEyMDkKICAgIC8vIGFzc2VydCgKICAgIC8vICAgcG9vbEtleS5wb29sSWQgPiAwICYmIHBvb2xLZXkucG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5udW1Qb29scy5uYXRpdmUsCiAgICAvLyAgICdwb29sIGlkIG91dHNpZGUgb2YgcmFuZ2Ugb2YgcG9vbHMgY3JlYXRlZCBmb3IgdGhpcyB2YWxpZGF0b3InLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIHBvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjEzCiAgICAvLyBwb29sS2V5LnBvb2xBcHBJZCA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHN3YXAKICAgIGludGMgNCAvLyAyNjgKICAgIGludGMgNSAvLyA0MzIKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjEyLTEyMTUKICAgIC8vIGFzc2VydCgKICAgIC8vICAgcG9vbEtleS5wb29sQXBwSWQgPT09IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnBvb2xBcHBJZCwKICAgIC8vICAgIlRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMiLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIFRoZSBwYXNzZWQgaW4gYXBwIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhc3NlZCBpbiBpZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIxNwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEFwcGxpY2F0aW9uKHBvb2xLZXkucG9vbEFwcElkKS5hZGRyZXNzKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIxOQogICAgLy8gY29uc3QgW3ZhbGlkYXRvcklkXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCwgQnl0ZXMoJ3ZhbGlkYXRvcklkJykpCiAgICBkdXAKICAgIHB1c2hieXRlcyAidmFsaWRhdG9ySWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjAKICAgIC8vIGNvbnN0IFtwb29sSWRdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHBvb2xLZXkucG9vbEFwcElkLCBCeXRlcygncG9vbElkJykpCiAgICBwdXNoYnl0ZXMgInBvb2xJZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMQogICAgLy8gYXNzZXJ0KHZhbGlkYXRvcklkKQogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjIKICAgIC8vIGFzc2VydChwb29sSWQpCiAgICBhc3NlcnQKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnZlcmlmeVBvb2xLZXlDYWxsZXJfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgdmVyaWZ5UG9vbEtleUNhbGxlcl9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkOiB1aW50NjQsIHBvb2xBcHBJZDogdWludDY0LCBub2RlTnVtOiB1aW50NjQpIC0+IHZvaWQ6CmFkZFBvb2xUb05vZGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTcKICAgIC8vIHByaXZhdGUgYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBwb29sQXBwSWQ6IHVpbnQ2NCwgbm9kZU51bTogdWludDY0KSB7CiAgICBwcm90byAzIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzk4CiAgICAvLyBjb25zdCBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzk4CiAgICAvLyBjb25zdCBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzOTkKICAgIC8vIGNvbnN0IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3IgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5wb29sc1Blck5vZGUubmF0aXZlCiAgICBleHRyYWN0IDAgMjQyCiAgICBwdXNoaW50IDIyNSAvLyAyMjUKICAgIGdldGJ5dGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMQogICAgLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGFkZFBvb2xUb05vZGVfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYnogYWRkUG9vbFRvTm9kZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgphZGRQb29sVG9Ob2RlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMQogICAgLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCiAgICBhc3NlcnQgLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmFkZFBvb2xUb05vZGVfd2hpbGVfdG9wQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBtYXhQb29sc1Blck5vZGVGb3JUaGlzVmFsaWRhdG9yOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBhc3NlcnQgLy8gbm8gYXZhaWxhYmxlIHNwYWNlIGluIHNwZWNpZmllZCBub2RlIGZvciB0aGlzIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwNAogICAgLy8gaWYgKG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjIDggLy8gOTAwCiAgICBpbnRjIDkgLy8gMTkyCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAwIDE5MgogICAgc3dhcAogICAgaW50Y18zIC8vIDI0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18zIC8vIDI0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMCAyNAogICAgc3dhcAogICAgcHVzaGludCA4IC8vIDgKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IGFkZFBvb2xUb05vZGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDYKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUubm9kZVBvb2xBc3NpZ25tZW50cy5ub2Rlc1tub2RlTnVtIC0gMV0ucG9vbEFwcElkc1tpXSA9IHBvb2xBcHBJZAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBpbnRjIDggLy8gOTAwCiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgZnJhbWVfZGlnIDIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2RpZyAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE0MDcKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZGRQb29sVG9Ob2RlX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwMwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3I7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgYWRkUG9vbFRvTm9kZV93aGlsZV90b3BANQoKYWRkUG9vbFRvTm9kZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZGRQb29sVG9Ob2RlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmlzTkZEQXBwSURWYWxpZChuZmRBcHBJRDogdWludDY0KSAtPiB1aW50NjQ6CmlzTkZEQXBwSURWYWxpZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQ5OAogICAgLy8gcHJpdmF0ZSBpc05GREFwcElEVmFsaWQobmZkQXBwSUQ6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE1MDAKICAgIC8vIGNvbnN0IFt1c2VyT2ZmZXJlZE5GRE5hbWVdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMobmZkQXBwSUQsIEJ5dGVzKCdpLm5hbWUnKSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzICJpLm5hbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE1MDItMTUwOAogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogVGVtcGxhdGVWYXI8dWludDY0PignTkZEX1JFR0lTVFJZX0FQUF9JRCcpLAogICAgLy8gICAgIGFwcEFyZ3M6IFtCeXRlcygnaXNfdmFsaWRfbmZkX2FwcGlkJyksIEJ5dGVzKHVzZXJPZmZlcmVkTkZETmFtZSksIG9wLml0b2IobmZkQXBwSUQpXSwKICAgIC8vICAgICBhcHBzOiBbbmZkQXBwSURdLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTUwNAogICAgLy8gYXBwSWQ6IFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ05GRF9SRUdJU1RSWV9BUFBfSUQnKSwKICAgIGludGMgMTAgLy8gVE1QTF9ORkRfUkVHSVNUUllfQVBQX0lECiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE1MDUKICAgIC8vIGFwcEFyZ3M6IFtCeXRlcygnaXNfdmFsaWRfbmZkX2FwcGlkJyksIEJ5dGVzKHVzZXJPZmZlcmVkTkZETmFtZSksIG9wLml0b2IobmZkQXBwSUQpXSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwogICAgYnl0ZWMgMTQgLy8gImlzX3ZhbGlkX25mZF9hcHBpZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNTAyLTE1MDcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ05GRF9SRUdJU1RSWV9BUFBfSUQnKSwKICAgIC8vICAgICBhcHBBcmdzOiBbQnl0ZXMoJ2lzX3ZhbGlkX25mZF9hcHBpZCcpLCBCeXRlcyh1c2VyT2ZmZXJlZE5GRE5hbWUpLCBvcC5pdG9iKG5mZEFwcElEKV0sCiAgICAvLyAgICAgYXBwczogW25mZEFwcElEXSwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTUwMi0xNTA4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBUZW1wbGF0ZVZhcjx1aW50NjQ+KCdORkRfUkVHSVNUUllfQVBQX0lEJyksCiAgICAvLyAgICAgYXBwQXJnczogW0J5dGVzKCdpc192YWxpZF9uZmRfYXBwaWQnKSwgQnl0ZXModXNlck9mZmVyZWRORkROYW1lKSwgb3AuaXRvYihuZmRBcHBJRCldLAogICAgLy8gICAgIGFwcHM6IFtuZmRBcHBJRF0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTUwOQogICAgLy8gcmV0dXJuIG9wLmJ0b2kob3AuSVR4bi5sYXN0TG9nKSA9PT0gMQogICAgaXR4biBMYXN0TG9nCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBieXRlcykgLT4gdWludDY0Ogppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE1MjAKICAgIC8vIHByaXZhdGUgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KG5mZEFwcElEOiB1aW50NjQsIGFkZHJUb0ZpbmQ6IEFkZHJlc3MpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTUyMS0xNTI2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBBcHBsaWNhdGlvbihuZmRBcHBJRCksCiAgICAvLyAgICAgYXBwQXJnczogW0J5dGVzKCdyZWFkX3Byb3BlcnR5JyksIEJ5dGVzKCd2LmNhQWxnby4wLmFzJyldLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTUyNAogICAgLy8gYXBwQXJnczogW0J5dGVzKCdyZWFkX3Byb3BlcnR5JyksIEJ5dGVzKCd2LmNhQWxnby4wLmFzJyldLAogICAgcHVzaGJ5dGVzICJyZWFkX3Byb3BlcnR5IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAidi5jYUFsZ28uMC5hcyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNTIxLTE1MjUKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IEFwcGxpY2F0aW9uKG5mZEFwcElEKSwKICAgIC8vICAgICBhcHBBcmdzOiBbQnl0ZXMoJ3JlYWRfcHJvcGVydHknKSwgQnl0ZXMoJ3YuY2FBbGdvLjAuYXMnKV0sCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aS92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE1MjEtMTUyNgogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogQXBwbGljYXRpb24obmZkQXBwSUQpLAogICAgLy8gICAgIGFwcEFyZ3M6IFtCeXRlcygncmVhZF9wcm9wZXJ0eScpLCBCeXRlcygndi5jYUFsZ28uMC5hcycpXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNTI3CiAgICAvLyBjb25zdCBjYUFsZ29EYXRhID0gb3AuSVR4bi5sYXN0TG9nCiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTUyOAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNhQWxnb0RhdGEubGVuZ3RoOyBpICs9IDMyKSB7CiAgICBpbnRjXzAgLy8gMAoKaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNTI4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY2FBbGdvRGF0YS5sZW5ndGg7IGkgKz0gMzIpIHsKICAgIGZyYW1lX2RpZyAxCiAgICBsZW4KICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICBieiBpc0FkZHJlc3NJbk5GRENBQWxnb0xpc3RfYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNTI5CiAgICAvLyBjb25zdCBhZGRyID0gbmV3IEFkZHJlc3Mob3AuZXh0cmFjdChjYUFsZ29EYXRhLCBpLCAzMikpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDIKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNTMwCiAgICAvLyBpZiAoYWRkci5uYXRpdmUgIT09IEdsb2JhbC56ZXJvQWRkcmVzcyAmJiBhZGRyID09PSBhZGRyVG9GaW5kKSB7CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBpc0FkZHJlc3NJbk5GRENBQWxnb0xpc3RfYWZ0ZXJfaWZfZWxzZUA2CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNTMxCiAgICAvLyByZXR1cm4gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3RfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGkvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxNTI4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY2FBbGdvRGF0YS5sZW5ndGg7IGkgKz0gMzIpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0X3doaWxlX3RvcEAyCgppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3RfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTUzNAogICAgLy8gcmV0dXJuIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiASAAESGIwCsAPIAbwFhAfAAQDAhD3iAdEBgCCWAvwB9MIEJhIBdgQVH3x1AAZzdGFrZWQZcG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcwpudW1TdGFrZXJzAQADc3BzBGluaXQEbnVtVgoAAQAAAAAAAAPoCWkub3duZXIuYRIAAgAHGv1JjQAAAAAAAAAAAJYCAAASaXNfdmFsaWRfbmZkX2FwcGlkAwaBARAAAAAAAAAAAAAAAAAAAAABBGPz8osxG0EA/IIjBEb3ZTMEuER7NgQbXoLGBHlHLYMEX3rP2QQxcsqdBIqHFC0E0TZswwQ7BFxcBHWv9h0EHy8BCQQvoixLBJEOlKwEVydn0QSbUEqvBPvGMXgEJEmM9AT4Rt16BIMFBQEEe7tsjQT4OUFKBAwxfPsEPiiJcgTdX6raBBiqx6cE+Z71TQQQgJ1NBOd43VoEv1JZ0ARN+NhuBEGPzvwEotxRtQQoc/UEBAVH9P4Ey2aDWDYaAI4jAw4DAQLxAtsCzwLGApYChgJ1AmECTQI5AiUCDAH5AeQBywG4AaQBkAGAAVwBSQExARcBBADjAMEAnwCLAGwATQAyABoAAiJDMRkURDEYRDYaARc2GgKIElAWKUxQsCNDMRkURDEYRDYaARc2GgIXNhoDF4gRXSNDMRkURDEYRDYaARc2GgI2GgMXiBAUKUxQsCNDMRkURDEYRDYaATYaAjYaAxc2GgQXNhoFIlOIDe4jQzEZFEQxGEQ2GgE2GgIXNhoDFzYaBBc2GgUXiA0nI0MxGRREMRhENhoBF4gMASlMULAjQzEZFEQxGEQxFiMJSTgQIxJENhoBFzYaAheICPYpTFCwI0MxGRREMRhEMRYjCUk4ECMSRDYaARc2GgIXiAfWKUxQsCNDMRkURDEYRDYaARc2GgI2GgM2GgQ2GgUXNhoGF4gHcyNDMRkURDEYRDYaARc2GgKIBzsjQzEZFEQxGEQ2GgEXNhoCFzYaA1cCAIgG1iNDMRkURDEYRDYaARc2GgIXNhoDF4gGkyNDMRkURDEYRDYaARc2GgKIBmIjQzEZFEQxGEQxFiMJSTgQIxJENhoBVwIANhoCiAUMFilMULAjQzEZFEQxGEQhChYpTFCwI0MxGRREMRhENhoBF4gE0SlMULAjQzEZFEQxGEQ2GgEXiASsKUxQsCNDMRkURDEYRDYaAYgEMSlMULAjQzEZFEQxGEQ2GgGIBBEnBiJPAlQpTFCwI0MxGRREMRhENhoBF4gDshYpTFCwI0MxGRREMRhENhoBiAN+KUxQsCNDMRkURDEYRDYaARc2GgIXiAMtFilMULAjQzEZFEQxGEQ2GgEXiALMKUxQsCNDMRkURDEYRDYaAReIAqApTFCwI0MxGRREMRhENhoBF4gCfSlMULAjQzEZFEQxGEQ2GgEXiAJaKUxQsCNDMRkURDEYRIgCRBYpTFCwI0MxGRREMRhEiAHJKUxQsCNDMRkURDEYRIAkFR98dQAAAAAABsIUAAAAAAAOs6wAAAAAAE+7VAAAAAAAASF0sCNDMRkURDEYRCNDMRkURDEYRIgBeyNDMRkURDEYRDYaARc2GgJXAgCIAVMjQzEZFEQxGEQ2GgEXiAE5I0MxGRREMRgURIgBCSNDMRmBBBJEMRhEiADMI0OKAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJw+yHicPsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viYoCAyIqSScQi/4iWSKLBYsEDEEAJYv+VwIAiwVJTgKBCAtbFosDo0kVgRAORIEQr6uMAyMIjAVC/9MnEIwAi/8iWYwBIowCiwKLAQxBACWL/1cCAIsCSU4CgQgLWxaLAKNJFYEQDkSBEK+rjAAjCIwCQv/TiwOLAKJJFYEIDkSBCK+rF4v+i/+MAowBjACJMQCAIF55XSI1WK5Uq5Eia8mAxFExMGjMj6Ytb5xwdr2Au2WvEkQnBLxIJwgiZ4knCCJnJwkiZycFImcrImeADnByb2dyYW1WZXJzaW9ugQpniYoBACcEi/+5SImKAgAiJwhlRBREJwSL/ov/u4knCCNniScMJwqI/vdGAoASAAIABxr9SY0AAAAAAAAAAABkJwqI/txGAkwWgDAAAAAAAAAAAQAAAAAAD0JAAAAAAAAAAAAAAAAAAA9CQAAAAAAAD0JAAAA/qiUiYABMUEwWUIEIFlCBAxZQIQYWUIkiJwllRImKAQGL/xYoTFC+RFcA8omKAQGL/xYoTFC+RFfyGomKAQGL/xYoTFC+RFcA8klXCCBMVyggUImKAQEiJw2L/xYoTFC+RCKLAyUMQQAxiwIhBCEFWIsDJAskWEmMACJbQQAciwFJiwBQTCJZIwgWVwYCXACMAYsDIwiMA0L/yIsBjACJigIBi/9BAC2L/hYoTFC9RQFEi/8lDkEAHCNEi/4WKExQvkSL/yMJTCEEIQVYTCQLJFgiW4kiQv/higEBi/8iWxYoTFC+RIv/gQhbIwlMIQQhBVhMJAskWImKAQEqi/8WKExQSb5EV/IaJwwnCoj9nEYCTCJZCky+RFcA8oHZAVtJQAAKgYDAiami9Q+MAosCSYwAiwENQQAEiwGMAImKAQEnB4v/UL1FARSJigEBIkcDKicHi/9QSb1FAUAABScNjACJJw2MAosFvkyMAUQijASLBIEGDEEANYsEJQuLAUwlWEmMACJbiwKMA0EAE4sCSYsAUEwiWSMIFlcGAlwAjAOLA4wCiwQjCIwEQv/DiwKMAImKAQGL/xYoTFC+RCEHIQZYiYoBAYv/FihMUEm9RQFEvkghCCEJWImKAwEqRwSL/1dQAYv/gVBVgQQOQQEdI0SL/4GpAVpJjAFBAQuLASELDkEBAyNEi/+BrQFaSYwCIQsOQQDuI0SLAkEACYv/V7EgMgMTRIv/IQ1bIQsPRIv/geEBVUmMAEEAxYsAgQMOQQC9I0SL/yEMW0mMBEEABosEMgcNRIv/VwggSTIDE0SL/1coIDIDE0QxABJEi/04CIGUhBsSRIv9OAGBgK3iBA1EIicJZUQjCEmMAycJSwFnFihLAVBJgcQIuUhJIov/uyJPAruL/4FIW0mMBEEALrEhCosESRZLAbIyJw6yGov+shqyGkyyGIEGshAisgGztD4XIxJEJwtlSDEAEkSLBYABAxJAAAmLBYABBBJBAAuL/1dxICJbiAwkRIsDjACJIkL/QCJC/w8iQv76IkL+4IoCADEAi/4WKExQSb5EVwDyVwggTwISRIEoi/+7iYoDADEAi/0WKExQSb5EVwDyVwggTwISRIv+FksBIQxPAruL/xaB6gFMu4mKAwAxAIv9FihMUEm+RFcA8lcIIE8CEkSxIQoxAIv+FicOshqL/7IaSbIaTLIcIrIZTLIYgQayECKyAbOL/icLZUgxABJEgUhMu4mKAgAxAIv+FihMUEm+RFcA8lcIIE8CEkSL/zIDE0SBsQGL/7uJigYAMQCL+hYoTFBJvkRXAPJXCCBPAhJESYFQi/u7SYFRi/y7SYFxi/27i/4WSwGBkQFPAruL/xaBoQFMu4mKAwExAIv+FklOAihMUElOAr5EVwDyVwggEkAAEDEAiwG+RFcA8lcoIBJBAM0jRIv9OAiBrOc6Eov9OAcyChIQRIsBSb1FAURJvkhJV/IaIllJJQ8URCMIsScEIiEOuicEvUghDgknBCEOTwK6MggWSwMWTwVXAPIhDVsWgARZ6QqmshpPArIaiwBJTgayGksBshqyGoEDsjiBA7I1gQuyNIAECoEBQ7JCTwKyQEyyQCKyGYEGshAisgGzSZOBEA5ESVcGAksEgfIBTwK7tD1PAiMJSwEWSwElDERMJAshBAhPBUxPAruL/kyL/4gJrLQ9TgJQTBZQjACJIkL/MIoDASJHBypHDYv+FihMUEcCvUUBRL5IVwDyIQxbQQAOixa+RFcA8iEMWzIHDEQxAEmMBYv9OABJjAcSi/04BzIKEhBEixZJvkRX8hqBClsnDCcKiPlQRgIMRL5EVwDygVBVSYwUQQDXMQCMBosWvkyMAESLFCMSSYwTQAAQixSBAhJAAAiLFIEDEkEAC4v/RIsGi/9wAEhEixNBAA+L/3ELRIsAVwDyV1EgEkSLFIECEkEAK4v/RCKMCiKMD4sPgQQMQQAXiwBXAPJXcSCLD4EIC1uL/xJBAgcjjAqLCkSLFIEDEkEAE4sAVwDyV3EgIluL/3ELRIgJU0SLFIEEEkEAPYv/iAkSRIv/JwtlSIsGEkAACov/iwaICTFBAb4jRIv/gA1pLnBhcmVudEFwcElEZUiLAFcA8ldxICJbEkSL/TgISYwRIowQJweLBVBJjAK9RQFMjBJAABIhEYwQixEhEQmMEosCgZABuUiL/osFixKIBTVJVwAYSU4CjANJIQlTjA6BwQFTjA2BCFtJjBUUFESLAkm9RQFEvkiMBCKMCCKMC4sCvUUBRIsLgQYMQQEXiwslC4sETCVYSYwBiwMSQAAmiwhJjAlAABGLASJbiwiMCUAABosLIwiMCYsJjAiLCyMIjAtC/7qLAyJbFihMUEmMFkm+RIsVIwlMIQQhBVhLASQLTEsBJFgiW7GLEYsQCUlOAowMSXIIRLIHTLIII7IQIrIBtoAE+ccMvbIaiweyGkmyGIEGshAisgGztwE+VwAEKRJEgfQDIoj3HEknBWVITCtlSEwWSZOBEA5EVwYCTwMlDERLAoGUAghLBExPArsWTCEPCEy7iw5BABOLFkm+RFfyGoECWyMIFoH0AUy7iw1BAAsiJwVlRCMIJwVMZ4sWSb5EV/IagQpbiwxJTgIIFk8CIRBPArsiK2VECCtMZ4sDjACJiwhJFBREIwklC4sCTIsDu0L/DiJC/j+LDyMIjA9C/dSKAQEqRwSL/xYoTFBJvkQhBCEFWFcAEiJbRwJEMQBMcghEE0EADIsFvkQhByEGWIwAiTIGjAGLBb5EIQchBlghCVtJjANBAFCLBoAKbGFzdFBheW91dGVIiwMSQQAMiwW+RCEHIQZYjACJiwW+RFcA8oGpAVqLAUlOAksBGE8CTAmLA0lPAxgJEkEADIsFvkQhByEGWIwAiYsBFosFSU4CgfwGTwK7vkhX8hpJIlmMAIEKW4wEIowCiwKLAAxBAEqLBUm+RCEEIQVYiwJJTgIkCyRYgQpbFoACAAJMUCELFlCLBBaAAgABTFCI9dBGAhZLASUMREsBgQgLIQcITwNMTwK7IwiMAkL/rosFvkQhByEGWIwAiYoFACKL+4gFGUmM+yJbFihMUEcCvkSL+4EIWyMJTCEEIQVYSwEkC0xLASRYgQpbi/wIFk8CJQxETCEPCEsCTE8Cu0m+SFfyGoEKW4v8CBZLASEQTwK7Sb5IV/IaJFuL/QgWSwGBhAJPArsiK2VEi/wIK0xnvkhXAPJJgUhbSUEAJosDJwtlSEmMAIsCVwggE0EAFIsCVyggiwATQQAJIhaLAYFITwK7iYoFACJHBSpHCoGsAiKI9LSL+4gEZYz7i/1AAAWL/kEB3iNEi/siWxZJjAQoTFBJjAJJvkSL+4EIW0mMECMJTCEEIQVYSwEkC0mMBkxLASRYgQpbi/0JFk8CJQxETCEPCEsCTE8Cu0m+SFfyGoEKW4v9CRYhEEy7IitlRIv9CStMZ4v+QQBYiwJJvkRJVwDySVeZCIwBgZkBW0RX8hokW0mL/g9Ei/4JFoGEAky7ixAjE0EAKrGLAr5EIQQhBVhXABIiW4v+FicRshqL/LIaiwGyGrIashiBBrIQIrIBs4v/QQEbiwJJvkQhBCEFWIsGSU4CJFiBCFkjCRZJk4EQDkRXBgJMgZQCCEy7i/uBEFuLEBaLBExQTBZQjPsijAwijAsijAgnB4v8UEmMA75MjAVEIowKiwO9RQFEiwqBBgxBAHuLCiULSYwHiwVMJVhJjAAiW0mMD0EAUosLIwiMC4v7IluLDxKLCIwJiwyMDUEAMosAi/sSQQA7I4wIiwOLB4AYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu4sIjAmLDIwNiwmMCIsNjAyLCiMIjApC/4CLDCMIjAxC/96LCESLDBSLCxQnBiJPA1QjTwJUSSJTTCNTjA5BABOLAkm+RFfyGoECWyMJFoH0AUy7iw5BAAsiJwVlRCMJJwVMZ4kiQv4figMBIkcEKkcDI0cDi/2I9ThOAicHi/5QSU4DvUUBTE4CQQB9iwy+TIwERIv9RCKMBosGgQYMQQBggawCIojygYsGJQuLBEwlWEmMASJbSYwIQQA8IowKiwiL/RJBADEijAmL/RYoTFC+RIsBgQhbIwlMIQQhBVhMJAskWIEKW4v/CIsLDkEACIsBJwZQjACJiwYjCIwGQv+YiwqMDYsJjA6LDYwKiw6MCYv9FkmMAyhMUL5MSU4CjABESVcA8iENW4v/DkRX8hoiWYwFIowHiweLBQxBAESLACEEIQVYiwckCyRYSYwCgQpbi/8IiwsOQQAfiwcjCIsCIltMFosDTFBMFlAnBiKLCVQjiwpUUIwAiYsHIwiMB0L/tCIWiwNLAVBMUCcGIosJVCOLClRQjACJigMAIipHBDEAi/0WKExQSU4CvkRXAPJXCCASQAAQMQCLBr5EVwDyVyggEkEApCNEiwa+TIwARIv/QQCSi/+BCA5BAIojRCKMBIsEgQgMRCKMA4sDgQMMSYwFQQBoiwAhCCEJWFcAwIsEJQtJjAElWFcAGIsDgQgLSYwCW4v+EkEAOov/IwmLBBNEIhYhCIsBCIsFRIsCCIsGTE8Cu7GABFHvOyGyGov+shiBBrIQIrIBs4v9i/6L/4gBBomLAyMIjANC/42LBCMIjARC/3siQv9zIkL/WYoCATEAi/4WKExQvkRJVwDySVcIIE8DEkRJV5kITIGZAVtLAlfyGiRbSwFETwMhBCEFWFcAEiJbSXIIREsDcABISwIJsUkWJxGyGov/shpPBbIashpLAbIYgQayECKyAbNMcghETwNwAEhPAhJEiYoBAYv/IlsWKExQSb1FAUSL/4EIW0cCJQ5EQQBbiwC+RFfyGiJZiwEPQQBMI0SL/4EQW4sAvkSLASMJTCEEIQVYTCQLJFgiW0sBEkQxAEsBcghEEkRJgAt2YWxpZGF0b3JJZGVITIAGcG9vbElkZUhMRESL/4wAiSJC/7GKAwAqRwKL/RYoTFBJvkxJTwJEVwDygeEBVYv/QQBZi/+BCA5BAFEjRCKMAosCSYsFDESL/yMJiwQhCCEJWFcAwEwlC0mMACVYVwAYTIEIC0mMAVtAABiL/hYhCIsACIsCgQMMRIsBCIsDTE8Cu4mLAiMIjAJC/7QiQv+sigEBi/+ABmkubmFtZWVIsSEKTIv/Fov/sjInDrIaTLIashqyGIEGshAisgGztD4XIxKJigIBIrGADXJlYWRfcHJvcGVydHmyGoANdi5jYUFsZ28uMC5hc7Iai/6yGIEGshAisgGztD4iiwEViwINQQAmiwGLAoEgWEmMADIDE0EADIsAi/8SQQAEI4wAiYsCgSAIjAJC/9EijACJ", "clear": "CoEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 0, "patch": 0 } }, "events": [], "templateVariables": { "NFD_REGISTRY_APP_ID": { "type": "AVMUint64" } } }