Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- Executor
- Optimization enabled
- true
- Compiler version
- v0.8.14+commit.80d49f37
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2026-07-01T14:39:54.179985Z
Constructor Arguments
50524f504f534954494f4e5f5448524553484f4c445f43414e5f4e4f545f4245000000000000000000000000ec568fffba86c094cf06b22134b23074dfe2252c0000000000000000000000000000000000000000000000000000000000093a8000000000000000000000000000000000000000000000000000000000000697800000000000000000000000000000000000000000000000000000000000093a8000000000000000000000000000000000000000000000000000000000000d2f00000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028a
Arg [0] (address) : 0x5448524553484f4c445f43414e5f4e4f545f4245
Arg [1] (uint256) : 1349252230078327648871294141585809259488115565868
Arg [2] (uint256) : 604800
Arg [3] (uint256) : 432000
Arg [4] (uint256) : 604800
Arg [5] (uint256) : 864000
Arg [6] (uint256) : 125
Arg [7] (uint256) : 64000
Arg [8] (uint256) : 650
src/contracts/Executor.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
import {IGovernanceStrategy} from './interfaces/IGovernanceStrategy.sol';
import {IAaveGovernanceV2} from './interfaces/IAaveGovernanceV2.sol';
import {IExecutor} from './interfaces/IExecutor.sol';
/**
* @title Executor
* @author BGD Labs
* @notice Time Locked, Validator, Executor Contract that:
* - Validates Proposal creations/ cancellation
* - Validates Vote Quorum and Vote success on proposal
* - Allows queueing, execution and cancellation of proposals' transactions.
**/
contract Executor is IExecutor {
address private _admin;
address private _pendingAdmin;
uint256 private _delay;
// uppercase is kept even not being constant/immutables,
// in order to keep interface compatibility with a previous version of the Executor
uint256 public PROPOSITION_THRESHOLD;
uint256 public VOTING_DURATION;
uint256 public VOTE_DIFFERENTIAL;
uint256 public MINIMUM_QUORUM;
mapping(bytes32 => bool) private _queuedTransactions;
uint256 public immutable GRACE_PERIOD;
uint256 public immutable MINIMUM_DELAY;
uint256 public immutable MAXIMUM_DELAY;
uint256 public constant ONE_HUNDRED_WITH_PRECISION = 10000; // Equivalent to 100%, but scaled for precision
/**
* @dev Constructor
* @param admin admin address, that can call the main functions, (Governance)
* @param delay minimum time between queueing and execution of proposal, in seconds
* @param gracePeriod time after `delay` while a proposal can be executed, in seconds
* @param minimumDelay lower threshold of `delay`, in seconds
* @param maximumDelay upper threshold of `delay`, in seconds
* @param propositionThreshold minimum percentage of supply needed to submit a proposal
* - In ONE_HUNDRED_WITH_PRECISION units
* @param voteDuration duration in blocks of the voting period
* @param voteDifferential percentage of supply that `for` votes need to be over `against`
* in order for the proposal to pass
* - In ONE_HUNDRED_WITH_PRECISION units
* @param minimumQuorum minimum percentage of the supply in FOR-voting-power need for a proposal to pass
* - In ONE_HUNDRED_WITH_PRECISION units
**/
constructor(
address admin,
uint256 delay,
uint256 gracePeriod,
uint256 minimumDelay,
uint256 maximumDelay,
uint256 propositionThreshold,
uint256 voteDuration,
uint256 voteDifferential,
uint256 minimumQuorum
)
{
require(delay >= minimumDelay, 'DELAY_SHORTER_THAN_MINIMUM');
require(delay <= maximumDelay, 'DELAY_LONGER_THAN_MAXIMUM');
_delay = delay;
_admin = admin;
require(gracePeriod > 0, 'GRACE_PERIOD_LESS_THAN_0');
GRACE_PERIOD = gracePeriod;
MINIMUM_DELAY = minimumDelay;
MAXIMUM_DELAY = maximumDelay;
emit NewDelay(delay);
emit NewAdmin(admin);
_updateVotingDuration(voteDuration);
_updateVoteDifferential(voteDifferential);
_updateMinimumQuorum(minimumQuorum);
_updatePropositionThreshold(propositionThreshold);
}
/**
* -------------------------------------------------------------
* --------------- IExecutorWithTimelock -----------------------
* @dev logic for queue, execute, cancel transactions voted by Governance
* Queued transactions can be executed after a delay and until
* Grace period is not over.
* -------------------------------------------------------------
*/
modifier onlyAdmin() {
require(msg.sender == _admin, 'ONLY_BY_ADMIN');
_;
}
modifier onlyPendingAdmin() {
require(msg.sender == _pendingAdmin, 'ONLY_BY_PENDING_ADMIN');
_;
}
modifier onlyExecutor {
require(msg.sender == address(this), 'CALLER_NOT_EXECUTOR');
_;
}
/// @inheritdoc IExecutor
function setDelay(uint256 delay) external onlyExecutor {
_validateDelay(delay);
_delay = delay;
emit NewDelay(delay);
}
/// @inheritdoc IExecutor
function acceptAdmin() external onlyPendingAdmin {
_admin = msg.sender;
_pendingAdmin = address(0);
emit NewAdmin(msg.sender);
}
/// @inheritdoc IExecutor
function setPendingAdmin(address newPendingAdmin) external onlyExecutor {
_pendingAdmin = newPendingAdmin;
emit NewPendingAdmin(newPendingAdmin);
}
/// @inheritdoc IExecutor
function queueTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external onlyAdmin returns (bytes32) {
require(executionTime >= block.timestamp + _delay, 'EXECUTION_TIME_UNDERESTIMATED');
bytes32 actionHash = keccak256(
abi.encode(target, value, signature, data, executionTime, withDelegatecall)
);
_queuedTransactions[actionHash] = true;
emit QueuedAction(actionHash, target, value, signature, data, executionTime, withDelegatecall);
return actionHash;
}
/// @inheritdoc IExecutor
function cancelTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external onlyAdmin returns (bytes32) {
bytes32 actionHash = keccak256(
abi.encode(target, value, signature, data, executionTime, withDelegatecall)
);
_queuedTransactions[actionHash] = false;
emit CancelledAction(
actionHash,
target,
value,
signature,
data,
executionTime,
withDelegatecall
);
return actionHash;
}
/// @inheritdoc IExecutor
function executeTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external payable onlyAdmin returns (bytes memory) {
bytes32 actionHash = keccak256(
abi.encode(target, value, signature, data, executionTime, withDelegatecall)
);
require(_queuedTransactions[actionHash], 'ACTION_NOT_QUEUED');
require(block.timestamp >= executionTime, 'TIMELOCK_NOT_FINISHED');
require(block.timestamp <= executionTime + GRACE_PERIOD, 'GRACE_PERIOD_FINISHED');
_queuedTransactions[actionHash] = false;
bytes memory callData;
if (bytes(signature).length == 0) {
callData = data;
} else {
callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
}
bool success;
bytes memory resultData;
if (withDelegatecall) {
require(msg.value >= value, 'NOT_ENOUGH_MSG_VALUE');
// solium-disable-next-line security/no-call-value
(success, resultData) = target.delegatecall(callData);
} else {
// solium-disable-next-line security/no-call-value
(success, resultData) = target.call{value: value}(callData);
}
require(success, 'FAILED_ACTION_EXECUTION');
emit ExecutedAction(
actionHash,
target,
value,
signature,
data,
executionTime,
withDelegatecall,
resultData
);
return resultData;
}
/// @inheritdoc IExecutor
function getAdmin() external view returns (address) {
return _admin;
}
/// @inheritdoc IExecutor
function getPendingAdmin() external view returns (address) {
return _pendingAdmin;
}
/// @inheritdoc IExecutor
function getDelay() external view returns (uint256) {
return _delay;
}
/// @inheritdoc IExecutor
function isActionQueued(bytes32 actionHash) external view returns (bool) {
return _queuedTransactions[actionHash];
}
/// @inheritdoc IExecutor
function isProposalOverGracePeriod(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool)
{
IAaveGovernanceV2.ProposalWithoutVotes memory proposal = governance.getProposalById(proposalId);
return (block.timestamp > proposal.executionTime + GRACE_PERIOD);
}
receive() external payable {}
/**
* --------------------------------------------------------
* ---------- Proposal Validation -------------------------
* @dev Validates/Invalidations propositions state modifications.
* Proposition Power functions: Validates proposition creations/ cancellation
* Voting Power functions: Validates success of propositions.
* --------------------------------------------------------
*/
/// @inheritdoc IExecutor
function updateVotingDuration(uint256 votingDuration) external onlyExecutor {
_updateVotingDuration(votingDuration);
}
/// @inheritdoc IExecutor
function updateVoteDifferential(uint256 voteDifferential) external onlyExecutor {
_updateVoteDifferential(voteDifferential);
}
/// @inheritdoc IExecutor
function updateMinimumQuorum(uint256 minimumQuorum) external onlyExecutor {
_updateMinimumQuorum(minimumQuorum);
}
/// @inheritdoc IExecutor
function updatePropositionThreshold(uint256 propositionThreshold) external onlyExecutor {
_updatePropositionThreshold(propositionThreshold);
}
/// @inheritdoc IExecutor
function validateCreatorOfProposal(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) external view returns (bool) {
return isPropositionPowerEnough(governance, user, blockNumber);
}
/// @inheritdoc IExecutor
function validateProposalCancellation(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) external view returns (bool) {
return !isPropositionPowerEnough(governance, user, blockNumber);
}
/// @inheritdoc IExecutor
function isPropositionPowerEnough(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) public view returns (bool) {
IGovernanceStrategy currentGovernanceStrategy = IGovernanceStrategy(
governance.getGovernanceStrategy()
);
return
currentGovernanceStrategy.getPropositionPowerAt(user, blockNumber) >=
getMinimumPropositionPowerNeeded(governance, blockNumber);
}
/// @inheritdoc IExecutor
function getMinimumPropositionPowerNeeded(IAaveGovernanceV2 governance, uint256 blockNumber)
public
view
returns (uint256)
{
IGovernanceStrategy currentGovernanceStrategy = IGovernanceStrategy(
governance.getGovernanceStrategy()
);
return
currentGovernanceStrategy
.getTotalPropositionSupplyAt(blockNumber)
* PROPOSITION_THRESHOLD
/ ONE_HUNDRED_WITH_PRECISION;
}
/// @inheritdoc IExecutor
function isProposalPassed(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool)
{
return (isQuorumValid(governance, proposalId) &&
isVoteDifferentialValid(governance, proposalId));
}
/// @inheritdoc IExecutor
function getMinimumVotingPowerNeeded(uint256 votingSupply)
public
view
returns (uint256)
{
return votingSupply * MINIMUM_QUORUM / ONE_HUNDRED_WITH_PRECISION;
}
/// @inheritdoc IExecutor
function isQuorumValid(IAaveGovernanceV2 governance, uint256 proposalId)
public
view
returns (bool)
{
IAaveGovernanceV2.ProposalWithoutVotes memory proposal = governance.getProposalById(proposalId);
uint256 votingSupply = IGovernanceStrategy(proposal.strategy).getTotalVotingSupplyAt(
proposal.startBlock
);
return proposal.forVotes >= getMinimumVotingPowerNeeded(votingSupply);
}
/// @inheritdoc IExecutor
function isVoteDifferentialValid(IAaveGovernanceV2 governance, uint256 proposalId)
public
view
returns (bool)
{
IAaveGovernanceV2.ProposalWithoutVotes memory proposal = governance.getProposalById(proposalId);
uint256 votingSupply = IGovernanceStrategy(proposal.strategy).getTotalVotingSupplyAt(
proposal.startBlock
);
return (proposal.forVotes * ONE_HUNDRED_WITH_PRECISION / votingSupply) >
((proposal.againstVotes * ONE_HUNDRED_WITH_PRECISION / votingSupply) +
VOTE_DIFFERENTIAL);
}
/// updates voting duration
function _updateVotingDuration(uint256 votingDuration) internal {
require(votingDuration > 0, 'VOTING_DURATION_CAN_NOT_BE_0');
VOTING_DURATION = votingDuration;
emit VotingDurationUpdated(votingDuration);
}
/// updates vote differential
function _updateVoteDifferential(uint256 voteDifferential) internal {
require(voteDifferential <= ONE_HUNDRED_WITH_PRECISION, 'VOTE_DIFFERENTIAL_CAN_NOT_BE_GREATER_THAN_100%');
require(voteDifferential > 0, 'VOTE_DIFFERENTIAL_CAN_NOT_BE_LESS_THAN_0');
VOTE_DIFFERENTIAL = voteDifferential;
emit VoteDifferentialUpdated(voteDifferential);
}
/// updates minimum quorum
function _updateMinimumQuorum(uint256 minimumQuorum) internal {
require(minimumQuorum <= ONE_HUNDRED_WITH_PRECISION, 'MINIMUM_QUORUM_CAN_NOT_BE_GREATER_THAN_100%');
require(minimumQuorum > 0, 'MINIMUM_QUORUM_CAN_NOT_BE_LESS_THAN_0');
MINIMUM_QUORUM = minimumQuorum;
emit MinimumQuorumUpdated(minimumQuorum);
}
/// updates proposition threshold
function _updatePropositionThreshold(uint256 propositionThreshold) internal {
require(propositionThreshold <= ONE_HUNDRED_WITH_PRECISION, 'PROPOSITION_THRESHOLD_CAN_NOT_BE_GREATER_THAN_100%');
require(propositionThreshold > 0, 'PROPOSITION_THRESHOLD_CAN_NOT_BE_LESS_THAN_0');
PROPOSITION_THRESHOLD = propositionThreshold;
emit PropositionThresholdUpdated(propositionThreshold);
}
/// validates that a delay is correct
function _validateDelay(uint256 delay) internal view {
require(delay >= MINIMUM_DELAY, 'DELAY_SHORTER_THAN_MINIMUM');
require(delay <= MAXIMUM_DELAY, 'DELAY_LONGER_THAN_MAXIMUM');
}
}
/IAaveGovernanceV2.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity ^0.8.0;
interface IAaveGovernanceV2 {
struct ProposalWithoutVotes {
uint256 id;
address creator;
address executor;
address[] targets;
uint256[] values;
string[] signatures;
bytes[] calldatas;
bool[] withDelegatecalls;
uint256 startBlock;
uint256 endBlock;
uint256 executionTime;
uint256 forVotes;
uint256 againstVotes;
bool executed;
bool canceled;
address strategy;
bytes32 ipfsHash;
}
/**
* @dev Set new Voting Delay (delay before a newly created proposal can be voted on)
* Note: owner should be a timelocked executor, so needs to make a proposal
* @param votingDelay new voting delay in seconds
**/
function setVotingDelay(uint256 votingDelay) external;
/**
* @dev Add new addresses to the list of authorized executors
* @param executors list of new addresses to be authorized executors
**/
function authorizeExecutors(address[] memory executors) external;
/**
* @dev Remove addresses to the list of authorized executors
* @param executors list of addresses to be removed as authorized executors
**/
function unauthorizeExecutors(address[] memory executors) external;
/**
* @dev Getter of the current Voting Delay (delay before a created proposal can be voted on)
* Different from the voting duration
* @return The voting delay in seconds
**/
function getVotingDelay() external view returns (uint256);
/**
* @dev Returns whether an address is an authorized executor
* @param executor address to evaluate as authorized executor
* @return true if authorized
**/
function isExecutorAuthorized(address executor) external view returns (bool);
/**
* @dev Getter of the current GovernanceStrategy address
* @return The address of the current GovernanceStrategy contracts
**/
function getGovernanceStrategy() external view returns (address);
/**
* @dev Getter of a proposal by id
* @param proposalId id of the proposal to get
* @return the proposal as ProposalWithoutVotes memory object
**/
function getProposalById(uint256 proposalId) external view returns (ProposalWithoutVotes memory);
}
/IGovernanceStrategy.sol
pragma solidity ^0.8.0;
interface IGovernanceStrategy {
/**
* @dev Returns the Proposition Power of a user at a specific block number.
* @param user Address of the user.
* @param blockNumber Blocknumber at which to fetch Proposition Power
* @return Power number
**/
function getPropositionPowerAt(address user, uint256 blockNumber) external view returns (uint256);
/**
* @dev Returns the total supply of Outstanding Proposition Tokens
* @param blockNumber Blocknumber at which to evaluate
* @return total supply at blockNumber
**/
function getTotalPropositionSupplyAt(uint256 blockNumber) external view returns (uint256);
/**
* @dev Returns the total supply of Outstanding Voting Tokens
* @param blockNumber Blocknumber at which to evaluate
* @return total supply at blockNumber
**/
function getTotalVotingSupplyAt(uint256 blockNumber) external view returns (uint256);
/**
* @dev Returns the Vote Power of a user at a specific block number.
* @param user Address of the user.
* @param blockNumber Blocknumber at which to fetch Vote Power
* @return Vote number
**/
function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256);
}
/IExecutor.sol
pragma solidity ^0.8.0;
import {IAaveGovernanceV2} from './IAaveGovernanceV2.sol';
interface IExecutor {
/**
* -------------------------------------------------------------
* --------------- IExecutorWithTimelock --------------------------
* -------------------------------------------------------------
*/
/**
* @dev emitted when a new pending admin is set
* @param newPendingAdmin address of the new pending admin
**/
event NewPendingAdmin(address newPendingAdmin);
/**
* @dev emitted when a new admin is set
* @param newAdmin address of the new admin
**/
event NewAdmin(address newAdmin);
/**
* @dev emitted when a new delay (between queueing and execution) is set
* @param delay new delay
**/
event NewDelay(uint256 delay);
/**
* @dev emitted when a new (trans)action is Queued.
* @param actionHash hash of the action
* @param target address of the targeted contract
* @param value wei value of the transaction
* @param signature function signature of the transaction
* @param data function arguments of the transaction or callData if signature empty
* @param executionTime time at which to execute the transaction
* @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
**/
event QueuedAction(
bytes32 actionHash,
address indexed target,
uint256 value,
string signature,
bytes data,
uint256 executionTime,
bool withDelegatecall
);
/**
* @dev emitted when an action is Cancelled
* @param actionHash hash of the action
* @param target address of the targeted contract
* @param value wei value of the transaction
* @param signature function signature of the transaction
* @param data function arguments of the transaction or callData if signature empty
* @param executionTime time at which to execute the transaction
* @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
**/
event CancelledAction(
bytes32 actionHash,
address indexed target,
uint256 value,
string signature,
bytes data,
uint256 executionTime,
bool withDelegatecall
);
/**
* @dev emitted when an action is Cancelled
* @param actionHash hash of the action
* @param target address of the targeted contract
* @param value wei value of the transaction
* @param signature function signature of the transaction
* @param data function arguments of the transaction or callData if signature empty
* @param executionTime time at which to execute the transaction
* @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
* @param resultData the actual callData used on the target
**/
event ExecutedAction(
bytes32 actionHash,
address indexed target,
uint256 value,
string signature,
bytes data,
uint256 executionTime,
bool withDelegatecall,
bytes resultData
);
/**
* @dev Getter of the current admin address (should be governance)
* @return The address of the current admin
**/
function getAdmin() external view returns (address);
/**
* @dev Getter of the current pending admin address
* @return The address of the pending admin
**/
function getPendingAdmin() external view returns (address);
/**
* @dev Getter of the delay between queuing and execution
* @return The delay in seconds
**/
function getDelay() external view returns (uint256);
/**
* @dev Returns whether an action (via actionHash) is queued
* @param actionHash hash of the action to be checked
* keccak256(abi.encode(target, value, signature, data, executionTime, withDelegatecall))
* @return true if underlying action of actionHash is queued
**/
function isActionQueued(bytes32 actionHash) external view returns (bool);
/**
* @dev Checks whether a proposal is over its grace period
* @param governance Governance contract
* @param proposalId Id of the proposal against which to test
* @return true of proposal is over grace period
**/
function isProposalOverGracePeriod(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool);
/**
* @dev Getter of grace period constant
* @return grace period in seconds
**/
function GRACE_PERIOD() external view returns (uint256);
/**
* @dev Getter of minimum delay constant
* @return minimum delay in seconds
**/
function MINIMUM_DELAY() external view returns (uint256);
/**
* @dev Getter of maximum delay constant
* @return maximum delay in seconds
**/
function MAXIMUM_DELAY() external view returns (uint256);
/**
* @dev Set the delay
* @param delay time in seconds between queue and execution of proposal
**/
function setDelay(uint256 delay) external;
/**
* @dev Function enabling pending admin to become admin
**/
function acceptAdmin() external;
/**
* @dev Setting a new pending admin (that can then become admin)
* Can only be called by this executor (i.e via proposal)
* @param newPendingAdmin address of the new admin
**/
function setPendingAdmin(address newPendingAdmin) external;
/**
* @dev Function, called by Governance, that queue a transaction, returns action hash
* @param target smart contract target
* @param value wei value of the transaction
* @param signature function signature of the transaction
* @param data function arguments of the transaction or callData if signature empty
* @param executionTime time at which to execute the transaction
* @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
**/
function queueTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external returns (bytes32);
/**
* @dev Function, called by Governance, that cancels a transaction, returns the callData executed
* @param target smart contract target
* @param value wei value of the transaction
* @param signature function signature of the transaction
* @param data function arguments of the transaction or callData if signature empty
* @param executionTime time at which to execute the transaction
* @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
**/
function executeTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external payable returns (bytes memory);
/**
* @dev Function, called by Governance, that cancels a transaction, returns action hash
* @param target smart contract target
* @param value wei value of the transaction
* @param signature function signature of the transaction
* @param data function arguments of the transaction or callData if signature empty
* @param executionTime time at which to execute the transaction
* @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
**/
function cancelTransaction(
address target,
uint256 value,
string memory signature,
bytes memory data,
uint256 executionTime,
bool withDelegatecall
) external returns (bytes32);
/**
* -------------------------------------------------------------
* --------------- Proposal Validator --------------------------
* -------------------------------------------------------------
*/
// event triggered when voting duration gets updated by the admin
event VotingDurationUpdated(uint256 newVotingDuration);
// event triggered when vote differential gets updated by the admin
event VoteDifferentialUpdated(uint256 newVoteDifferential);
// event triggered when minimum quorum gets updated by the admin
event MinimumQuorumUpdated(uint256 newMinimumQuorum);
// event triggered when proposition threshold gets updated by the admin
event PropositionThresholdUpdated(uint256 newPropositionThreshold);
/**
* @dev method tu update the voting duration of the proposal. Only callable by admin.
* @param votingDuration duration of the vote, in blocks
*/
function updateVotingDuration(uint256 votingDuration) external;
/**
* @dev method to update the vote differential needed to pass the proposal. Only callable by admin.
* @param voteDifferential differential needed on the votes to pass the proposal
*/
function updateVoteDifferential(uint256 voteDifferential) external;
/**
* @dev method to update the minimum quorum needed to pass the proposal. Only callable by admin.
* @param minimumQuorum quorum needed to pass the proposal
*/
function updateMinimumQuorum(uint256 minimumQuorum) external;
/**
* @dev method to update the propositionThreshold. Only callable by admin.
* @param propositionThreshold new proposition threshold
**/
function updatePropositionThreshold(uint256 propositionThreshold) external;
/**
* @dev Called to validate a proposal (e.g when creating new proposal in Governance)
* @param governance Governance Contract
* @param user Address of the proposal creator
* @param blockNumber Block Number against which to make the test (e.g proposal creation block -1).
* @return boolean, true if can be created
**/
function validateCreatorOfProposal(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) external view returns (bool);
/**
* @dev Called to validate the cancellation of a proposal
* @param governance Governance Contract
* @param user Address of the proposal creator
* @param blockNumber Block Number against which to make the test (e.g proposal creation block -1).
* @return boolean, true if can be cancelled
**/
function validateProposalCancellation(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) external view returns (bool);
/**
* @dev Returns whether a user has enough Proposition Power to make a proposal.
* @param governance Governance Contract
* @param user Address of the user to be challenged.
* @param blockNumber Block Number against which to make the challenge.
* @return true if user has enough power
**/
function isPropositionPowerEnough(
IAaveGovernanceV2 governance,
address user,
uint256 blockNumber
) external view returns (bool);
/**
* @dev Returns the minimum Proposition Power needed to create a proposition.
* @param governance Governance Contract
* @param blockNumber Blocknumber at which to evaluate
* @return minimum Proposition Power needed
**/
function getMinimumPropositionPowerNeeded(IAaveGovernanceV2 governance, uint256 blockNumber)
external
view
returns (uint256);
/**
* @dev Returns whether a proposal passed or not
* @param governance Governance Contract
* @param proposalId Id of the proposal to set
* @return true if proposal passed
**/
function isProposalPassed(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool);
/**
* @dev Check whether a proposal has reached quorum, ie has enough FOR-voting-power
* Here quorum is not to understand as number of votes reached, but number of for-votes reached
* @param governance Governance Contract
* @param proposalId Id of the proposal to verify
* @return voting power needed for a proposal to pass
**/
function isQuorumValid(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool);
/**
* @dev Check whether a proposal has enough extra FOR-votes than AGAINST-votes
* FOR VOTES - AGAINST VOTES > VOTE_DIFFERENTIAL * voting supply
* @param governance Governance Contract
* @param proposalId Id of the proposal to verify
* @return true if enough For-Votes
**/
function isVoteDifferentialValid(IAaveGovernanceV2 governance, uint256 proposalId)
external
view
returns (bool);
/**
* @dev Calculates the minimum amount of Voting Power needed for a proposal to Pass
* @param votingSupply Total number of oustanding voting tokens
* @return voting power needed for a proposal to pass
**/
function getMinimumVotingPowerNeeded(uint256 votingSupply) external view returns (uint256);
/**
* @dev Get proposition threshold constant value
* @return the proposition threshold value (100 <=> 1%)
**/
function PROPOSITION_THRESHOLD() external view returns (uint256);
/**
* @dev Get voting duration constant value
* @return the voting duration value in blocks
**/
function VOTING_DURATION() external view returns (uint256);
/**
* @dev Get the vote differential threshold constant value
* to compare with % of for votes/total supply - % of against votes/total supply
* @return the vote differential threshold value (100 <=> 1%)
**/
function VOTE_DIFFERENTIAL() external view returns (uint256);
/**
* @dev Get quorum threshold constant value
* to compare with % of for votes/total supply
* @return the quorum threshold value (100 <=> 1%)
**/
function MINIMUM_QUORUM() external view returns (uint256);
/**
* @dev precision helper: 100% = 10000
* @return one hundred percents with our chosen precision
**/
function ONE_HUNDRED_WITH_PRECISION() external view returns (uint256);
}
Compiler Settings
{"remappings":[":aave-address-book/=lib/aave-address-book/src/",":aave-helpers/=lib/aave-helpers/src/",":ds-test/=lib/forge-std/lib/ds-test/src/",":forge-std/=lib/forge-std/src/"],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"london","compilationTarget":{"src/contracts/Executor.sol":"Executor"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"admin","internalType":"address"},{"type":"uint256","name":"delay","internalType":"uint256"},{"type":"uint256","name":"gracePeriod","internalType":"uint256"},{"type":"uint256","name":"minimumDelay","internalType":"uint256"},{"type":"uint256","name":"maximumDelay","internalType":"uint256"},{"type":"uint256","name":"propositionThreshold","internalType":"uint256"},{"type":"uint256","name":"voteDuration","internalType":"uint256"},{"type":"uint256","name":"voteDifferential","internalType":"uint256"},{"type":"uint256","name":"minimumQuorum","internalType":"uint256"}]},{"type":"event","name":"CancelledAction","inputs":[{"type":"bytes32","name":"actionHash","internalType":"bytes32","indexed":false},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"executionTime","internalType":"uint256","indexed":false},{"type":"bool","name":"withDelegatecall","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"ExecutedAction","inputs":[{"type":"bytes32","name":"actionHash","internalType":"bytes32","indexed":false},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"executionTime","internalType":"uint256","indexed":false},{"type":"bool","name":"withDelegatecall","internalType":"bool","indexed":false},{"type":"bytes","name":"resultData","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"MinimumQuorumUpdated","inputs":[{"type":"uint256","name":"newMinimumQuorum","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewAdmin","inputs":[{"type":"address","name":"newAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewDelay","inputs":[{"type":"uint256","name":"delay","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"PropositionThresholdUpdated","inputs":[{"type":"uint256","name":"newPropositionThreshold","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"QueuedAction","inputs":[{"type":"bytes32","name":"actionHash","internalType":"bytes32","indexed":false},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"executionTime","internalType":"uint256","indexed":false},{"type":"bool","name":"withDelegatecall","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"VoteDifferentialUpdated","inputs":[{"type":"uint256","name":"newVoteDifferential","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VotingDurationUpdated","inputs":[{"type":"uint256","name":"newVotingDuration","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"GRACE_PERIOD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAXIMUM_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MINIMUM_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MINIMUM_QUORUM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"ONE_HUNDRED_WITH_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PROPOSITION_THRESHOLD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"VOTE_DIFFERENTIAL","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"VOTING_DURATION","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"cancelTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"executionTime","internalType":"uint256"},{"type":"bool","name":"withDelegatecall","internalType":"bool"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"executeTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"executionTime","internalType":"uint256"},{"type":"bool","name":"withDelegatecall","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getDelay","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMinimumPropositionPowerNeeded","inputs":[{"type":"address","name":"governance","internalType":"contract IAaveGovernanceV2"},{"type":"uint256","name":"blockNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMinimumVotingPowerNeeded","inputs":[{"type":"uint256","name":"votingSupply","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getPendingAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isActionQueued","inputs":[{"type":"bytes32","name":"actionHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isProposalOverGracePeriod","inputs":[{"type":"address","name":"governance","internalType":"contract IAaveGovernanceV2"},{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isProposalPassed","inputs":[{"type":"address","name":"governance","internalType":"contract IAaveGovernanceV2"},{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isPropositionPowerEnough","inputs":[{"type":"address","name":"governance","internalType":"contract IAaveGovernanceV2"},{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"blockNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isQuorumValid","inputs":[{"type":"address","name":"governance","internalType":"contract IAaveGovernanceV2"},{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isVoteDifferentialValid","inputs":[{"type":"address","name":"governance","internalType":"contract IAaveGovernanceV2"},{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"queueTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"executionTime","internalType":"uint256"},{"type":"bool","name":"withDelegatecall","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDelay","inputs":[{"type":"uint256","name":"delay","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMinimumQuorum","inputs":[{"type":"uint256","name":"minimumQuorum","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePropositionThreshold","inputs":[{"type":"uint256","name":"propositionThreshold","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateVoteDifferential","inputs":[{"type":"uint256","name":"voteDifferential","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateVotingDuration","inputs":[{"type":"uint256","name":"votingDuration","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"validateCreatorOfProposal","inputs":[{"type":"address","name":"governance","internalType":"contract IAaveGovernanceV2"},{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"blockNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"validateProposalCancellation","inputs":[{"type":"address","name":"governance","internalType":"contract IAaveGovernanceV2"},{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"blockNumber","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60e06040523480156200001157600080fd5b506040516200273f3803806200273f83398101604081905262000034916200057e565b858810156200008a5760405162461bcd60e51b815260206004820152601a60248201527f44454c41595f53484f525445525f5448414e5f4d494e494d554d00000000000060448201526064015b60405180910390fd5b84881115620000dc5760405162461bcd60e51b815260206004820152601960248201527f44454c41595f4c4f4e4745525f5448414e5f4d4158494d554d00000000000000604482015260640162000081565b6002889055600080546001600160a01b0319166001600160a01b038b16179055866200014b5760405162461bcd60e51b815260206004820152601860248201527f47524143455f504552494f445f4c4553535f5448414e5f300000000000000000604482015260640162000081565b608087905260a086905260c08590526040518881527f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c9060200160405180910390a16040516001600160a01b038a1681527f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c9060200160405180910390a1620001d48362000204565b620001df8262000292565b620001ea8162000396565b620001f58462000494565b50505050505050505062000600565b60008111620002565760405162461bcd60e51b815260206004820152601c60248201527f564f54494e475f4455524154494f4e5f43414e5f4e4f545f42455f3000000000604482015260640162000081565b60048190556040518181527f8bfdfd03860750d17bbdb52e09d863153c6b782f8b752a66ada6e614c34f4ce3906020015b60405180910390a150565b612710811115620002fd5760405162461bcd60e51b815260206004820152602e60248201527f564f54455f444946464552454e5449414c5f43414e5f4e4f545f42455f47524560448201526d415445525f5448414e5f3130302560901b606482015260840162000081565b60008111620003605760405162461bcd60e51b815260206004820152602860248201527f564f54455f444946464552454e5449414c5f43414e5f4e4f545f42455f4c45536044820152670535f5448414e5f360c41b606482015260840162000081565b60058190556040518181527f3a3da96c3e601956f5a618d63dad401eab0dc6c602a86730e1d196021bcefbb79060200162000287565b612710811115620003fe5760405162461bcd60e51b815260206004820152602b60248201527f4d494e494d554d5f51554f52554d5f43414e5f4e4f545f42455f47524541544560448201526a525f5448414e5f3130302560a81b606482015260840162000081565b600081116200045e5760405162461bcd60e51b815260206004820152602560248201527f4d494e494d554d5f51554f52554d5f43414e5f4e4f545f42455f4c4553535f54604482015264048414e5f360dc1b606482015260840162000081565b60068190556040518181527fb94d2157c6c3af3d465b88f21ee649dfa2092e1ff1066f31e6c8f23377804e4b9060200162000287565b612710811115620004f25760405162461bcd60e51b815260206004820152603260248201526000805160206200271f8339815191526044820152715f475245415445525f5448414e5f3130302560701b606482015260840162000081565b60008111620005485760405162461bcd60e51b815260206004820152602c60248201526000805160206200271f83398151915260448201526b05f4c4553535f5448414e5f360a41b606482015260840162000081565b60038190556040518181527f0346c7a8706e9e3041f6e76cbc27112b3623a6049d4f822d90eafb204028c4e19060200162000287565b60008060008060008060008060006101208a8c0312156200059e57600080fd5b89516001600160a01b0381168114620005b657600080fd5b8099505060208a0151975060408a0151965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b60805160a05160c0516120d36200064c6000396000818161035c01526116c701526000818161047201526116570152600081816104d601528181610b88015261129801526120d36000f3fe6080604052600436106101dc5760003560e01c8063995c8bb811610102578063cebc9a8211610095578063e50f840011610064578063e50f84001461058b578063f48cb134146105ab578063f670a5f9146105cb578063fd58afd4146105eb57600080fd5b8063cebc9a8214610518578063d04681561461052d578063d0d902981461054b578063e177246e1461056b57600080fd5b8063b1b43ae5116100d1578063b1b43ae514610460578063b1fc879614610494578063c1a287e2146104c4578063c2732daf146104f857600080fd5b8063995c8bb8146103f4578063a438d20814610414578063ace432091461042a578063b159beac1461044a57600080fd5b8063661210421161017a5780638902ab65116101495780638902ab651461037e5780638d8fe2e31461039e5780639125fb58146103be57806397e34acd146103d457600080fd5b806366121042146102d85780636e9960c3146102f85780637aa500801461032a5780637d645fab1461034a57600080fd5b80631d73fd6d116101b65780631d73fd6d146102545780631dc40b511461027857806331a7bc41146102985780634dd18bf5146102b857600080fd5b806302a18f4a146101e857806306fbb3ab1461020a5780630e18b6811461023f57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610208610203366004611735565b610601565b005b34801561021657600080fd5b5061022a610225366004611763565b610635565b60405190151581526020015b60405180910390f35b34801561024b57600080fd5b50610208610659565b34801561026057600080fd5b5061026a61271081565b604051908152602001610236565b34801561028457600080fd5b5061026a610293366004611884565b6106ff565b3480156102a457600080fd5b5061022a6102b3366004611948565b6107cb565b3480156102c457600080fd5b506102086102d3366004611989565b6107e1565b3480156102e457600080fd5b5061022a6102f3366004611948565b610855565b34801561030457600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610236565b34801561033657600080fd5b5061022a610345366004611763565b610942565b34801561035657600080fd5b5061026a7f000000000000000000000000000000000000000000000000000000000000000081565b61039161038c366004611884565b610a86565b6040516102369190611a02565b3480156103aa57600080fd5b5061026a6103b9366004611884565b610e05565b3480156103ca57600080fd5b5061026a60055481565b3480156103e057600080fd5b506102086103ef366004611735565b610f1d565b34801561040057600080fd5b5061020861040f366004611735565b610f45565b34801561042057600080fd5b5061026a60045481565b34801561043657600080fd5b5061022a610445366004611763565b610f6d565b34801561045657600080fd5b5061026a60065481565b34801561046c57600080fd5b5061026a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a057600080fd5b5061022a6104af366004611735565b60009081526007602052604090205460ff1690565b3480156104d057600080fd5b5061026a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050457600080fd5b50610208610513366004611735565b611079565b34801561052457600080fd5b5060025461026a565b34801561053957600080fd5b506001546001600160a01b0316610312565b34801561055757600080fd5b5061022a610566366004611948565b6110a1565b34801561057757600080fd5b50610208610586366004611735565b6110b6565b34801561059757600080fd5b5061026a6105a6366004611735565b611113565b3480156105b757600080fd5b5061026a6105c6366004611763565b611136565b3480156105d757600080fd5b5061022a6105e6366004611763565b611222565b3480156105f757600080fd5b5061026a60035481565b3330146106295760405162461bcd60e51b815260040161062090611a15565b60405180910390fd5b610632816112d1565b50565b60006106418383610f6d565b801561065257506106528383610942565b9392505050565b6001546001600160a01b031633146106ab5760405162461bcd60e51b815260206004820152601560248201527427a7262cafa12cafa822a72224a723afa0a226a4a760591b6044820152606401610620565b60008054336001600160a01b031991821681179092556001805490911690556040519081527f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c9060200160405180910390a1565b600080546001600160a01b0316331461072a5760405162461bcd60e51b815260040161062090611a42565b600087878787878760405160200161074796959493929190611a69565b60408051601f19818403018152828252805160209182012060008181526007909252919020805460ff1916905591506001600160a01b038916907f87c481aa909c37502caa37394ab791c26b68fa4fa5ae56de104de36444ae9069906107b89084908b908b908b908b908b90611abd565b60405180910390a2979650505050505050565b60006107d8848484610855565b15949350505050565b3330146108005760405162461bcd60e51b815260040161062090611a15565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a756906020015b60405180910390a150565b600080846001600160a01b03166306be3e8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ba9190611ae7565b90506108c68584611136565b604051631420edcb60e31b81526001600160a01b0386811660048301526024820186905283169063a1076e5890604401602060405180830381865afa158015610913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109379190611b04565b101595945050505050565b604051633656de2160e01b81526004810182905260009081906001600160a01b03851690633656de2190602401600060405180830381865afa15801561098c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109b49190810190611dd4565b90506000816101e001516001600160a01b0316637a71f9d78361010001516040518263ffffffff1660e01b81526004016109f091815260200190565b602060405180830381865afa158015610a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a319190611b04565b905060055481612710846101800151610a4a9190611f96565b610a549190611fb5565b610a5e9190611fd7565b81612710846101600151610a729190611f96565b610a7c9190611fb5565b1195945050505050565b6000546060906001600160a01b03163314610ab35760405162461bcd60e51b815260040161062090611a42565b6000878787878787604051602001610ad096959493929190611a69565b60408051601f1981840301815291815281516020928301206000818152600790935291205490915060ff16610b3b5760405162461bcd60e51b81526020600482015260116024820152701050d51253d397d393d517d45551555151607a1b6044820152606401610620565b83421015610b835760405162461bcd60e51b8152602060048201526015602482015274151253515313d0d2d7d393d517d192539254d21151605a1b6044820152606401610620565b610bad7f000000000000000000000000000000000000000000000000000000000000000085611fd7565b421115610bf45760405162461bcd60e51b815260206004820152601560248201527411d49050d157d411549253d117d192539254d21151605a1b6044820152606401610620565b6000818152600760205260408120805460ff19169055865160609103610c1b575084610c47565b868051906020012086604051602001610c35929190611fef565b60405160208183030381529060405290505b600060608515610cfb5789341015610c985760405162461bcd60e51b81526020600482015260146024820152734e4f545f454e4f5547485f4d53475f56414c554560601b6044820152606401610620565b8a6001600160a01b031683604051610cb09190612020565b600060405180830381855af49150503d8060008114610ceb576040519150601f19603f3d011682016040523d82523d6000602084013e610cf0565b606091505b509092509050610d5d565b8a6001600160a01b03168a84604051610d149190612020565b60006040518083038185875af1925050503d8060008114610d51576040519150601f19603f3d011682016040523d82523d6000602084013e610d56565b606091505b5090925090505b81610daa5760405162461bcd60e51b815260206004820152601760248201527f4641494c45445f414354494f4e5f455845435554494f4e0000000000000000006044820152606401610620565b8a6001600160a01b03167f97825080b472fa91fe888b62ec128814d60dec546a2dafb955e50923f4a1b7e7858c8c8c8c8c88604051610def979695949392919061203c565b60405180910390a29a9950505050505050505050565b600080546001600160a01b03163314610e305760405162461bcd60e51b815260040161062090611a42565b600254610e3d9042611fd7565b831015610e8c5760405162461bcd60e51b815260206004820152601d60248201527f455845435554494f4e5f54494d455f554e444552455354494d415445440000006044820152606401610620565b6000878787878787604051602001610ea996959493929190611a69565b60408051601f19818403018152828252805160209182012060008181526007909252919020805460ff1916600117905591506001600160a01b038916907f2191aed4c4733c76e08a9e7e1da0b8d87fa98753f22df49231ddc66e0f05f022906107b89084908b908b908b908b908b90611abd565b333014610f3c5760405162461bcd60e51b815260040161062090611a15565b61063281611356565b333014610f645760405162461bcd60e51b815260040161062090611a15565b6106328161144f565b604051633656de2160e01b81526004810182905260009081906001600160a01b03851690633656de2190602401600060405180830381865afa158015610fb7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fdf9190810190611dd4565b90506000816101e001516001600160a01b0316637a71f9d78361010001516040518263ffffffff1660e01b815260040161101b91815260200190565b602060405180830381865afa158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c9190611b04565b905061106781611113565b82610160015110159250505092915050565b3330146110985760405162461bcd60e51b815260040161062090611a15565b61063281611556565b60006110ae848484610855565b949350505050565b3330146110d55760405162461bcd60e51b815260040161062090611a15565b6110de81611655565b60028190556040518181527f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c9060200161084a565b6000612710600654836111269190611f96565b6111309190611fb5565b92915050565b600080836001600160a01b03166306be3e8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119b9190611ae7565b60035460405163f6b5020360e01b815260048101869052919250612710916001600160a01b0384169063f6b5020390602401602060405180830381865afa1580156111ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120e9190611b04565b6112189190611f96565b6110ae9190611fb5565b604051633656de2160e01b81526004810182905260009081906001600160a01b03851690633656de2190602401600060405180830381865afa15801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190611dd4565b90507f00000000000000000000000000000000000000000000000000000000000000008161014001516112c79190611fd7565b4211949350505050565b600081116113215760405162461bcd60e51b815260206004820152601c60248201527f564f54494e475f4455524154494f4e5f43414e5f4e4f545f42455f30000000006044820152606401610620565b60048190556040518181527f8bfdfd03860750d17bbdb52e09d863153c6b782f8b752a66ada6e614c34f4ce39060200161084a565b6127108111156113bc5760405162461bcd60e51b815260206004820152602b60248201527f4d494e494d554d5f51554f52554d5f43414e5f4e4f545f42455f47524541544560448201526a525f5448414e5f3130302560a81b6064820152608401610620565b6000811161141a5760405162461bcd60e51b815260206004820152602560248201527f4d494e494d554d5f51554f52554d5f43414e5f4e4f545f42455f4c4553535f54604482015264048414e5f360dc1b6064820152608401610620565b60068190556040518181527fb94d2157c6c3af3d465b88f21ee649dfa2092e1ff1066f31e6c8f23377804e4b9060200161084a565b6127108111156114bc5760405162461bcd60e51b815260206004820152603260248201527f50524f504f534954494f4e5f5448524553484f4c445f43414e5f4e4f545f42456044820152715f475245415445525f5448414e5f3130302560701b6064820152608401610620565b600081116115215760405162461bcd60e51b815260206004820152602c60248201527f50524f504f534954494f4e5f5448524553484f4c445f43414e5f4e4f545f424560448201526b05f4c4553535f5448414e5f360a41b6064820152608401610620565b60038190556040518181527f0346c7a8706e9e3041f6e76cbc27112b3623a6049d4f822d90eafb204028c4e19060200161084a565b6127108111156115bf5760405162461bcd60e51b815260206004820152602e60248201527f564f54455f444946464552454e5449414c5f43414e5f4e4f545f42455f47524560448201526d415445525f5448414e5f3130302560901b6064820152608401610620565b600081116116205760405162461bcd60e51b815260206004820152602860248201527f564f54455f444946464552454e5449414c5f43414e5f4e4f545f42455f4c45536044820152670535f5448414e5f360c41b6064820152608401610620565b60058190556040518181527f3a3da96c3e601956f5a618d63dad401eab0dc6c602a86730e1d196021bcefbb79060200161084a565b7f00000000000000000000000000000000000000000000000000000000000000008110156116c55760405162461bcd60e51b815260206004820152601a60248201527f44454c41595f53484f525445525f5448414e5f4d494e494d554d0000000000006044820152606401610620565b7f00000000000000000000000000000000000000000000000000000000000000008111156106325760405162461bcd60e51b815260206004820152601960248201527f44454c41595f4c4f4e4745525f5448414e5f4d4158494d554d000000000000006044820152606401610620565b60006020828403121561174757600080fd5b5035919050565b6001600160a01b038116811461063257600080fd5b6000806040838503121561177657600080fd5b82356117818161174e565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051610220810167ffffffffffffffff811182821017156117c9576117c961178f565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156117f8576117f861178f565b604052919050565b600067ffffffffffffffff82111561181a5761181a61178f565b50601f01601f191660200190565b600061183b61183684611800565b6117cf565b905082815283838301111561184f57600080fd5b828260208301376000602084830101529392505050565b801515811461063257600080fd5b803561187f81611866565b919050565b60008060008060008060c0878903121561189d57600080fd5b86356118a88161174e565b955060208701359450604087013567ffffffffffffffff808211156118cc57600080fd5b818901915089601f8301126118e057600080fd5b6118ef8a833560208501611828565b9550606089013591508082111561190557600080fd5b508701601f8101891361191757600080fd5b61192689823560208401611828565b9350506080870135915061193c60a08801611874565b90509295509295509295565b60008060006060848603121561195d57600080fd5b83356119688161174e565b925060208401356119788161174e565b929592945050506040919091013590565b60006020828403121561199b57600080fd5b81356106528161174e565b60005b838110156119c15781810151838201526020016119a9565b838111156119d0576000848401525b50505050565b600081518084526119ee8160208601602086016119a6565b601f01601f19169290920160200192915050565b60208152600061065260208301846119d6565b60208082526013908201527221a0a62622a92fa727aa2fa2ac22a1aaaa27a960691b604082015260600190565b6020808252600d908201526c27a7262cafa12cafa0a226a4a760991b604082015260600190565b60018060a01b038716815285602082015260c060408201526000611a9060c08301876119d6565b8281036060840152611aa281876119d6565b6080840195909552505090151560a090910152949350505050565b86815285602082015260c060408201526000611a9060c08301876119d6565b805161187f8161174e565b600060208284031215611af957600080fd5b81516106528161174e565b600060208284031215611b1657600080fd5b5051919050565b600067ffffffffffffffff821115611b3757611b3761178f565b5060051b60200190565b600082601f830112611b5257600080fd5b81516020611b6261183683611b1d565b82815260059290921b84018101918181019086841115611b8157600080fd5b8286015b84811015611ba5578051611b988161174e565b8352918301918301611b85565b509695505050505050565b600082601f830112611bc157600080fd5b81516020611bd161183683611b1d565b82815260059290921b84018101918181019086841115611bf057600080fd5b8286015b84811015611ba55780518352918301918301611bf4565b6000611c1961183684611800565b9050828152838383011115611c2d57600080fd5b6106528360208301846119a6565b600082601f830112611c4c57600080fd5b81516020611c5c61183683611b1d565b82815260059290921b84018101918181019086841115611c7b57600080fd5b8286015b84811015611ba557805167ffffffffffffffff811115611c9f5760008081fd5b8701603f81018913611cb15760008081fd5b611cc2898683015160408401611c0b565b845250918301918301611c7f565b600082601f830112611ce157600080fd5b81516020611cf161183683611b1d565b82815260059290921b84018101918181019086841115611d1057600080fd5b8286015b84811015611ba557805167ffffffffffffffff811115611d345760008081fd5b8701603f81018913611d465760008081fd5b611d57898683015160408401611c0b565b845250918301918301611d14565b805161187f81611866565b600082601f830112611d8157600080fd5b81516020611d9161183683611b1d565b82815260059290921b84018101918181019086841115611db057600080fd5b8286015b84811015611ba5578051611dc781611866565b8352918301918301611db4565b600060208284031215611de657600080fd5b815167ffffffffffffffff80821115611dfe57600080fd5b908301906102208286031215611e1357600080fd5b611e1b6117a5565b82518152611e2b60208401611adc565b6020820152611e3c60408401611adc565b6040820152606083015182811115611e5357600080fd5b611e5f87828601611b41565b606083015250608083015182811115611e7757600080fd5b611e8387828601611bb0565b60808301525060a083015182811115611e9b57600080fd5b611ea787828601611c3b565b60a08301525060c083015182811115611ebf57600080fd5b611ecb87828601611cd0565b60c08301525060e083015182811115611ee357600080fd5b611eef87828601611d70565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018080840151908201526101a09150611f3c828401611d65565b828201526101c09150611f50828401611d65565b828201526101e09150611f64828401611adc565b9181019190915261020091820151918101919091529392505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611fb057611fb0611f80565b500290565b600082611fd257634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115611fea57611fea611f80565b500190565b6001600160e01b03198316815281516000906120128160048501602087016119a6565b919091016004019392505050565b600082516120328184602087016119a6565b9190910192915050565b87815286602082015260e06040820152600061205b60e08301886119d6565b828103606084015261206d81886119d6565b905085608084015284151560a084015282810360c084015261208f81856119d6565b9a995050505050505050505056fea26469706673582212205e86450ceb044d7b0224d0407de34a2d0991005ac965a5697c0b6a877efb789f64736f6c634300080e003350524f504f534954494f4e5f5448524553484f4c445f43414e5f4e4f545f4245000000000000000000000000ec568fffba86c094cf06b22134b23074dfe2252c0000000000000000000000000000000000000000000000000000000000093a8000000000000000000000000000000000000000000000000000000000000697800000000000000000000000000000000000000000000000000000000000093a8000000000000000000000000000000000000000000000000000000000000d2f00000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028a
Deployed ByteCode
0x6080604052600436106101dc5760003560e01c8063995c8bb811610102578063cebc9a8211610095578063e50f840011610064578063e50f84001461058b578063f48cb134146105ab578063f670a5f9146105cb578063fd58afd4146105eb57600080fd5b8063cebc9a8214610518578063d04681561461052d578063d0d902981461054b578063e177246e1461056b57600080fd5b8063b1b43ae5116100d1578063b1b43ae514610460578063b1fc879614610494578063c1a287e2146104c4578063c2732daf146104f857600080fd5b8063995c8bb8146103f4578063a438d20814610414578063ace432091461042a578063b159beac1461044a57600080fd5b8063661210421161017a5780638902ab65116101495780638902ab651461037e5780638d8fe2e31461039e5780639125fb58146103be57806397e34acd146103d457600080fd5b806366121042146102d85780636e9960c3146102f85780637aa500801461032a5780637d645fab1461034a57600080fd5b80631d73fd6d116101b65780631d73fd6d146102545780631dc40b511461027857806331a7bc41146102985780634dd18bf5146102b857600080fd5b806302a18f4a146101e857806306fbb3ab1461020a5780630e18b6811461023f57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610208610203366004611735565b610601565b005b34801561021657600080fd5b5061022a610225366004611763565b610635565b60405190151581526020015b60405180910390f35b34801561024b57600080fd5b50610208610659565b34801561026057600080fd5b5061026a61271081565b604051908152602001610236565b34801561028457600080fd5b5061026a610293366004611884565b6106ff565b3480156102a457600080fd5b5061022a6102b3366004611948565b6107cb565b3480156102c457600080fd5b506102086102d3366004611989565b6107e1565b3480156102e457600080fd5b5061022a6102f3366004611948565b610855565b34801561030457600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610236565b34801561033657600080fd5b5061022a610345366004611763565b610942565b34801561035657600080fd5b5061026a7f00000000000000000000000000000000000000000000000000000000000d2f0081565b61039161038c366004611884565b610a86565b6040516102369190611a02565b3480156103aa57600080fd5b5061026a6103b9366004611884565b610e05565b3480156103ca57600080fd5b5061026a60055481565b3480156103e057600080fd5b506102086103ef366004611735565b610f1d565b34801561040057600080fd5b5061020861040f366004611735565b610f45565b34801561042057600080fd5b5061026a60045481565b34801561043657600080fd5b5061022a610445366004611763565b610f6d565b34801561045657600080fd5b5061026a60065481565b34801561046c57600080fd5b5061026a7f0000000000000000000000000000000000000000000000000000000000093a8081565b3480156104a057600080fd5b5061022a6104af366004611735565b60009081526007602052604090205460ff1690565b3480156104d057600080fd5b5061026a7f000000000000000000000000000000000000000000000000000000000006978081565b34801561050457600080fd5b50610208610513366004611735565b611079565b34801561052457600080fd5b5060025461026a565b34801561053957600080fd5b506001546001600160a01b0316610312565b34801561055757600080fd5b5061022a610566366004611948565b6110a1565b34801561057757600080fd5b50610208610586366004611735565b6110b6565b34801561059757600080fd5b5061026a6105a6366004611735565b611113565b3480156105b757600080fd5b5061026a6105c6366004611763565b611136565b3480156105d757600080fd5b5061022a6105e6366004611763565b611222565b3480156105f757600080fd5b5061026a60035481565b3330146106295760405162461bcd60e51b815260040161062090611a15565b60405180910390fd5b610632816112d1565b50565b60006106418383610f6d565b801561065257506106528383610942565b9392505050565b6001546001600160a01b031633146106ab5760405162461bcd60e51b815260206004820152601560248201527427a7262cafa12cafa822a72224a723afa0a226a4a760591b6044820152606401610620565b60008054336001600160a01b031991821681179092556001805490911690556040519081527f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c9060200160405180910390a1565b600080546001600160a01b0316331461072a5760405162461bcd60e51b815260040161062090611a42565b600087878787878760405160200161074796959493929190611a69565b60408051601f19818403018152828252805160209182012060008181526007909252919020805460ff1916905591506001600160a01b038916907f87c481aa909c37502caa37394ab791c26b68fa4fa5ae56de104de36444ae9069906107b89084908b908b908b908b908b90611abd565b60405180910390a2979650505050505050565b60006107d8848484610855565b15949350505050565b3330146108005760405162461bcd60e51b815260040161062090611a15565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a756906020015b60405180910390a150565b600080846001600160a01b03166306be3e8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ba9190611ae7565b90506108c68584611136565b604051631420edcb60e31b81526001600160a01b0386811660048301526024820186905283169063a1076e5890604401602060405180830381865afa158015610913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109379190611b04565b101595945050505050565b604051633656de2160e01b81526004810182905260009081906001600160a01b03851690633656de2190602401600060405180830381865afa15801561098c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109b49190810190611dd4565b90506000816101e001516001600160a01b0316637a71f9d78361010001516040518263ffffffff1660e01b81526004016109f091815260200190565b602060405180830381865afa158015610a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a319190611b04565b905060055481612710846101800151610a4a9190611f96565b610a549190611fb5565b610a5e9190611fd7565b81612710846101600151610a729190611f96565b610a7c9190611fb5565b1195945050505050565b6000546060906001600160a01b03163314610ab35760405162461bcd60e51b815260040161062090611a42565b6000878787878787604051602001610ad096959493929190611a69565b60408051601f1981840301815291815281516020928301206000818152600790935291205490915060ff16610b3b5760405162461bcd60e51b81526020600482015260116024820152701050d51253d397d393d517d45551555151607a1b6044820152606401610620565b83421015610b835760405162461bcd60e51b8152602060048201526015602482015274151253515313d0d2d7d393d517d192539254d21151605a1b6044820152606401610620565b610bad7f000000000000000000000000000000000000000000000000000000000006978085611fd7565b421115610bf45760405162461bcd60e51b815260206004820152601560248201527411d49050d157d411549253d117d192539254d21151605a1b6044820152606401610620565b6000818152600760205260408120805460ff19169055865160609103610c1b575084610c47565b868051906020012086604051602001610c35929190611fef565b60405160208183030381529060405290505b600060608515610cfb5789341015610c985760405162461bcd60e51b81526020600482015260146024820152734e4f545f454e4f5547485f4d53475f56414c554560601b6044820152606401610620565b8a6001600160a01b031683604051610cb09190612020565b600060405180830381855af49150503d8060008114610ceb576040519150601f19603f3d011682016040523d82523d6000602084013e610cf0565b606091505b509092509050610d5d565b8a6001600160a01b03168a84604051610d149190612020565b60006040518083038185875af1925050503d8060008114610d51576040519150601f19603f3d011682016040523d82523d6000602084013e610d56565b606091505b5090925090505b81610daa5760405162461bcd60e51b815260206004820152601760248201527f4641494c45445f414354494f4e5f455845435554494f4e0000000000000000006044820152606401610620565b8a6001600160a01b03167f97825080b472fa91fe888b62ec128814d60dec546a2dafb955e50923f4a1b7e7858c8c8c8c8c88604051610def979695949392919061203c565b60405180910390a29a9950505050505050505050565b600080546001600160a01b03163314610e305760405162461bcd60e51b815260040161062090611a42565b600254610e3d9042611fd7565b831015610e8c5760405162461bcd60e51b815260206004820152601d60248201527f455845435554494f4e5f54494d455f554e444552455354494d415445440000006044820152606401610620565b6000878787878787604051602001610ea996959493929190611a69565b60408051601f19818403018152828252805160209182012060008181526007909252919020805460ff1916600117905591506001600160a01b038916907f2191aed4c4733c76e08a9e7e1da0b8d87fa98753f22df49231ddc66e0f05f022906107b89084908b908b908b908b908b90611abd565b333014610f3c5760405162461bcd60e51b815260040161062090611a15565b61063281611356565b333014610f645760405162461bcd60e51b815260040161062090611a15565b6106328161144f565b604051633656de2160e01b81526004810182905260009081906001600160a01b03851690633656de2190602401600060405180830381865afa158015610fb7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fdf9190810190611dd4565b90506000816101e001516001600160a01b0316637a71f9d78361010001516040518263ffffffff1660e01b815260040161101b91815260200190565b602060405180830381865afa158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c9190611b04565b905061106781611113565b82610160015110159250505092915050565b3330146110985760405162461bcd60e51b815260040161062090611a15565b61063281611556565b60006110ae848484610855565b949350505050565b3330146110d55760405162461bcd60e51b815260040161062090611a15565b6110de81611655565b60028190556040518181527f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c9060200161084a565b6000612710600654836111269190611f96565b6111309190611fb5565b92915050565b600080836001600160a01b03166306be3e8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119b9190611ae7565b60035460405163f6b5020360e01b815260048101869052919250612710916001600160a01b0384169063f6b5020390602401602060405180830381865afa1580156111ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120e9190611b04565b6112189190611f96565b6110ae9190611fb5565b604051633656de2160e01b81526004810182905260009081906001600160a01b03851690633656de2190602401600060405180830381865afa15801561126c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112949190810190611dd4565b90507f00000000000000000000000000000000000000000000000000000000000697808161014001516112c79190611fd7565b4211949350505050565b600081116113215760405162461bcd60e51b815260206004820152601c60248201527f564f54494e475f4455524154494f4e5f43414e5f4e4f545f42455f30000000006044820152606401610620565b60048190556040518181527f8bfdfd03860750d17bbdb52e09d863153c6b782f8b752a66ada6e614c34f4ce39060200161084a565b6127108111156113bc5760405162461bcd60e51b815260206004820152602b60248201527f4d494e494d554d5f51554f52554d5f43414e5f4e4f545f42455f47524541544560448201526a525f5448414e5f3130302560a81b6064820152608401610620565b6000811161141a5760405162461bcd60e51b815260206004820152602560248201527f4d494e494d554d5f51554f52554d5f43414e5f4e4f545f42455f4c4553535f54604482015264048414e5f360dc1b6064820152608401610620565b60068190556040518181527fb94d2157c6c3af3d465b88f21ee649dfa2092e1ff1066f31e6c8f23377804e4b9060200161084a565b6127108111156114bc5760405162461bcd60e51b815260206004820152603260248201527f50524f504f534954494f4e5f5448524553484f4c445f43414e5f4e4f545f42456044820152715f475245415445525f5448414e5f3130302560701b6064820152608401610620565b600081116115215760405162461bcd60e51b815260206004820152602c60248201527f50524f504f534954494f4e5f5448524553484f4c445f43414e5f4e4f545f424560448201526b05f4c4553535f5448414e5f360a41b6064820152608401610620565b60038190556040518181527f0346c7a8706e9e3041f6e76cbc27112b3623a6049d4f822d90eafb204028c4e19060200161084a565b6127108111156115bf5760405162461bcd60e51b815260206004820152602e60248201527f564f54455f444946464552454e5449414c5f43414e5f4e4f545f42455f47524560448201526d415445525f5448414e5f3130302560901b6064820152608401610620565b600081116116205760405162461bcd60e51b815260206004820152602860248201527f564f54455f444946464552454e5449414c5f43414e5f4e4f545f42455f4c45536044820152670535f5448414e5f360c41b6064820152608401610620565b60058190556040518181527f3a3da96c3e601956f5a618d63dad401eab0dc6c602a86730e1d196021bcefbb79060200161084a565b7f0000000000000000000000000000000000000000000000000000000000093a808110156116c55760405162461bcd60e51b815260206004820152601a60248201527f44454c41595f53484f525445525f5448414e5f4d494e494d554d0000000000006044820152606401610620565b7f00000000000000000000000000000000000000000000000000000000000d2f008111156106325760405162461bcd60e51b815260206004820152601960248201527f44454c41595f4c4f4e4745525f5448414e5f4d4158494d554d000000000000006044820152606401610620565b60006020828403121561174757600080fd5b5035919050565b6001600160a01b038116811461063257600080fd5b6000806040838503121561177657600080fd5b82356117818161174e565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051610220810167ffffffffffffffff811182821017156117c9576117c961178f565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156117f8576117f861178f565b604052919050565b600067ffffffffffffffff82111561181a5761181a61178f565b50601f01601f191660200190565b600061183b61183684611800565b6117cf565b905082815283838301111561184f57600080fd5b828260208301376000602084830101529392505050565b801515811461063257600080fd5b803561187f81611866565b919050565b60008060008060008060c0878903121561189d57600080fd5b86356118a88161174e565b955060208701359450604087013567ffffffffffffffff808211156118cc57600080fd5b818901915089601f8301126118e057600080fd5b6118ef8a833560208501611828565b9550606089013591508082111561190557600080fd5b508701601f8101891361191757600080fd5b61192689823560208401611828565b9350506080870135915061193c60a08801611874565b90509295509295509295565b60008060006060848603121561195d57600080fd5b83356119688161174e565b925060208401356119788161174e565b929592945050506040919091013590565b60006020828403121561199b57600080fd5b81356106528161174e565b60005b838110156119c15781810151838201526020016119a9565b838111156119d0576000848401525b50505050565b600081518084526119ee8160208601602086016119a6565b601f01601f19169290920160200192915050565b60208152600061065260208301846119d6565b60208082526013908201527221a0a62622a92fa727aa2fa2ac22a1aaaa27a960691b604082015260600190565b6020808252600d908201526c27a7262cafa12cafa0a226a4a760991b604082015260600190565b60018060a01b038716815285602082015260c060408201526000611a9060c08301876119d6565b8281036060840152611aa281876119d6565b6080840195909552505090151560a090910152949350505050565b86815285602082015260c060408201526000611a9060c08301876119d6565b805161187f8161174e565b600060208284031215611af957600080fd5b81516106528161174e565b600060208284031215611b1657600080fd5b5051919050565b600067ffffffffffffffff821115611b3757611b3761178f565b5060051b60200190565b600082601f830112611b5257600080fd5b81516020611b6261183683611b1d565b82815260059290921b84018101918181019086841115611b8157600080fd5b8286015b84811015611ba5578051611b988161174e565b8352918301918301611b85565b509695505050505050565b600082601f830112611bc157600080fd5b81516020611bd161183683611b1d565b82815260059290921b84018101918181019086841115611bf057600080fd5b8286015b84811015611ba55780518352918301918301611bf4565b6000611c1961183684611800565b9050828152838383011115611c2d57600080fd5b6106528360208301846119a6565b600082601f830112611c4c57600080fd5b81516020611c5c61183683611b1d565b82815260059290921b84018101918181019086841115611c7b57600080fd5b8286015b84811015611ba557805167ffffffffffffffff811115611c9f5760008081fd5b8701603f81018913611cb15760008081fd5b611cc2898683015160408401611c0b565b845250918301918301611c7f565b600082601f830112611ce157600080fd5b81516020611cf161183683611b1d565b82815260059290921b84018101918181019086841115611d1057600080fd5b8286015b84811015611ba557805167ffffffffffffffff811115611d345760008081fd5b8701603f81018913611d465760008081fd5b611d57898683015160408401611c0b565b845250918301918301611d14565b805161187f81611866565b600082601f830112611d8157600080fd5b81516020611d9161183683611b1d565b82815260059290921b84018101918181019086841115611db057600080fd5b8286015b84811015611ba5578051611dc781611866565b8352918301918301611db4565b600060208284031215611de657600080fd5b815167ffffffffffffffff80821115611dfe57600080fd5b908301906102208286031215611e1357600080fd5b611e1b6117a5565b82518152611e2b60208401611adc565b6020820152611e3c60408401611adc565b6040820152606083015182811115611e5357600080fd5b611e5f87828601611b41565b606083015250608083015182811115611e7757600080fd5b611e8387828601611bb0565b60808301525060a083015182811115611e9b57600080fd5b611ea787828601611c3b565b60a08301525060c083015182811115611ebf57600080fd5b611ecb87828601611cd0565b60c08301525060e083015182811115611ee357600080fd5b611eef87828601611d70565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018080840151908201526101a09150611f3c828401611d65565b828201526101c09150611f50828401611d65565b828201526101e09150611f64828401611adc565b9181019190915261020091820151918101919091529392505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611fb057611fb0611f80565b500290565b600082611fd257634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115611fea57611fea611f80565b500190565b6001600160e01b03198316815281516000906120128160048501602087016119a6565b919091016004019392505050565b600082516120328184602087016119a6565b9190910192915050565b87815286602082015260e06040820152600061205b60e08301886119d6565b828103606084015261206d81886119d6565b905085608084015284151560a084015282810360c084015261208f81856119d6565b9a995050505050505050505056fea26469706673582212205e86450ceb044d7b0224d0407de34a2d0991005ac965a5697c0b6a877efb789f64736f6c634300080e0033