Unagii's old poolmaster contract. Deposits have been disabled but users can still unstake and claim rewards.
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 315 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Rewards Me... | 15956762 | 800 days ago | IN | 0 ETH | 0.00791875 | ||||
Claim Rewards Me... | 15674377 | 839 days ago | IN | 0 ETH | 0.00604488 | ||||
Claim Rewards Me... | 15536822 | 859 days ago | IN | 0 ETH | 0.00915397 | ||||
Claim Rewards Me... | 15402151 | 881 days ago | IN | 0 ETH | 0.00480989 | ||||
Claim Rewards Me... | 14640849 | 1003 days ago | IN | 0 ETH | 0.01326956 | ||||
Claim Rewards Me... | 14421479 | 1038 days ago | IN | 0 ETH | 0.00166142 | ||||
Claim Rewards Me... | 14294972 | 1057 days ago | IN | 0 ETH | 0.01360974 | ||||
Claim Rewards Me... | 14072183 | 1092 days ago | IN | 0 ETH | 0.02354708 | ||||
Claim Rewards Me... | 13913397 | 1116 days ago | IN | 0 ETH | 0.02313655 | ||||
Claim Rewards Me... | 13597124 | 1166 days ago | IN | 0 ETH | 0.09803859 | ||||
Claim Rewards Me... | 13566698 | 1171 days ago | IN | 0 ETH | 0.05530361 | ||||
Claim Rewards Me... | 13312815 | 1211 days ago | IN | 0 ETH | 0.06412412 | ||||
Claim Rewards Me... | 13218670 | 1225 days ago | IN | 0 ETH | 0.04388609 | ||||
Claim Rewards Me... | 13066484 | 1249 days ago | IN | 0 ETH | 0.01936434 | ||||
Claim Rewards Me... | 13053668 | 1251 days ago | IN | 0 ETH | 0.00749229 | ||||
Claim Rewards Me... | 13053593 | 1251 days ago | IN | 0 ETH | 0.01229234 | ||||
Claim Rewards Me... | 13023366 | 1255 days ago | IN | 0 ETH | 0.00900079 | ||||
Claim Rewards Me... | 12930633 | 1270 days ago | IN | 0 ETH | 0.01510971 | ||||
Claim Rewards Me... | 12923301 | 1271 days ago | IN | 0 ETH | 0.00518357 | ||||
Claim Rewards Me... | 12884792 | 1277 days ago | IN | 0 ETH | 0.00811562 | ||||
Claim Rewards Me... | 12872503 | 1279 days ago | IN | 0 ETH | 0.00996118 | ||||
Claim Rewards Me... | 12760866 | 1296 days ago | IN | 0 ETH | 0.00238907 | ||||
Claim Rewards Me... | 12757722 | 1297 days ago | IN | 0 ETH | 0.00376765 | ||||
Claim Rewards Me... | 12755232 | 1297 days ago | IN | 0 ETH | 0.00464914 | ||||
Claim Rewards Me... | 12745096 | 1299 days ago | IN | 0 ETH | 0.00782664 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15956762 | 800 days ago | 0.03626291 ETH | ||||
15674377 | 839 days ago | 0.00430084 ETH | ||||
15536822 | 859 days ago | 0.03789236 ETH | ||||
15402151 | 881 days ago | 0.02522977 ETH | ||||
14640849 | 1003 days ago | 0.02489977 ETH | ||||
14421479 | 1038 days ago | 0.00419789 ETH | ||||
14294972 | 1057 days ago | 0.36434514 ETH | ||||
14072183 | 1092 days ago | 0.03416083 ETH | ||||
13913397 | 1116 days ago | 0.07016202 ETH | ||||
13597124 | 1166 days ago | 0.1583187 ETH | ||||
13566698 | 1171 days ago | 0.19823871 ETH | ||||
13312815 | 1211 days ago | 0.64635201 ETH | ||||
13218670 | 1225 days ago | 0.17546958 ETH | ||||
13066484 | 1249 days ago | 0.11864002 ETH | ||||
13053668 | 1251 days ago | 0.02476351 ETH | ||||
13053593 | 1251 days ago | 0.04307774 ETH | ||||
13023366 | 1255 days ago | 0.02090653 ETH | ||||
12930633 | 1270 days ago | 0.03173172 ETH | ||||
12923301 | 1271 days ago | 0.00079271 ETH | ||||
12884792 | 1277 days ago | 0.00724219 ETH | ||||
12872503 | 1279 days ago | 0.01104762 ETH | ||||
12760866 | 1296 days ago | 0.05438484 ETH | ||||
12757722 | 1297 days ago | 0.01965326 ETH | ||||
12755232 | 1297 days ago | 0.02038543 ETH | ||||
12745096 | 1299 days ago | 0.03751307 ETH |
Loading...
Loading
Contract Name:
KyberPoolMaster
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-11 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/interfaces/IEpochUtils.sol pragma solidity 0.6.6; interface IEpochUtils { function epochPeriodInSeconds() external view returns (uint256); function firstEpochStartTimestamp() external view returns (uint256); function getCurrentEpochNumber() external view returns (uint256); function getEpochNumber(uint256 timestamp) external view returns (uint256); } // File: contracts/interfaces/IKyberDao.sol pragma solidity 0.6.6; interface IKyberDao is IEpochUtils { event Voted( address indexed staker, uint256 indexed epoch, uint256 indexed campaignID, uint256 option ); function getLatestNetworkFeeDataWithCache() external returns (uint256 feeInBps, uint256 expiryTimestamp); function getLatestBRRDataWithCache() external returns ( uint256 burnInBps, uint256 rewardInBps, uint256 rebateInBps, uint256 epoch, uint256 expiryTimestamp ); function handleWithdrawal(address staker, uint256 penaltyAmount) external; function vote(uint256 campaignID, uint256 option) external; function getLatestNetworkFeeData() external view returns (uint256 feeInBps, uint256 expiryTimestamp); function shouldBurnRewardForEpoch(uint256 epoch) external view returns (bool); /** * @dev return staker's reward percentage in precision for a past epoch only * fee handler should call this function when a staker wants to claim reward * return 0 if staker has no votes or stakes */ function getPastEpochRewardPercentageInPrecision( address staker, uint256 epoch ) external view returns (uint256); /** * @dev return staker's reward percentage in precision for the current epoch * reward percentage is not finalized until the current epoch is ended */ function getCurrentEpochRewardPercentageInPrecision(address staker) external view returns (uint256); } // File: contracts/interfaces/IExtendedKyberDao.sol pragma solidity 0.6.6; interface IExtendedKyberDao is IKyberDao { function kncToken() external view returns (address); function staking() external view returns (address); function feeHandler() external view returns (address); } // File: contracts/interfaces/IKyberFeeHandler.sol pragma solidity 0.6.6; interface IKyberFeeHandler { event RewardPaid( address indexed staker, uint256 indexed epoch, IERC20 indexed token, uint256 amount ); event RebatePaid( address indexed rebateWallet, IERC20 indexed token, uint256 amount ); event PlatformFeePaid( address indexed platformWallet, IERC20 indexed token, uint256 amount ); event KncBurned(uint256 kncTWei, IERC20 indexed token, uint256 amount); function handleFees( IERC20 token, address[] calldata eligibleWallets, uint256[] calldata rebatePercentages, address platformWallet, uint256 platformFee, uint256 networkFee ) external payable; function claimReserveRebate(address rebateWallet) external returns (uint256); function claimPlatformFee(address platformWallet) external returns (uint256); function claimStakerReward(address staker, uint256 epoch) external returns (uint256 amount); } // File: contracts/interfaces/IExtendedKyberFeeHandler.sol pragma solidity 0.6.6; interface IExtendedKyberFeeHandler is IKyberFeeHandler { function rewardsPerEpoch(uint256) external view returns (uint256); } // File: contracts/interfaces/IKyberStaking.sol pragma solidity 0.6.6; interface IKyberStaking is IEpochUtils { event Delegated( address indexed staker, address indexed representative, uint256 indexed epoch, bool isDelegated ); event Deposited(uint256 curEpoch, address indexed staker, uint256 amount); event Withdraw( uint256 indexed curEpoch, address indexed staker, uint256 amount ); function initAndReturnStakerDataForCurrentEpoch(address staker) external returns ( uint256 stake, uint256 delegatedStake, address representative ); function deposit(uint256 amount) external; function delegate(address dAddr) external; function withdraw(uint256 amount) external; /** * @notice return combine data (stake, delegatedStake, representative) of a staker * @dev allow to get staker data up to current epoch + 1 */ function getStakerData(address staker, uint256 epoch) external view returns ( uint256 stake, uint256 delegatedStake, address representative ); function getLatestStakerData(address staker) external view returns ( uint256 stake, uint256 delegatedStake, address representative ); /** * @notice return raw data of a staker for an epoch * WARN: should be used only for initialized data * if data has not been initialized, it will return all 0 * pool master shouldn't use this function to compute/distribute rewards of pool members */ function getStakerRawData(address staker, uint256 epoch) external view returns ( uint256 stake, uint256 delegatedStake, address representative ); } // File: contracts/KyberPoolMaster.sol pragma solidity 0.6.6; pragma experimental ABIEncoderV2; /** * @title Kyber PoolMaster contract * @author Protofire * @dev Contract that allows pool masters to let pool members claim their designated rewards trustlessly and update fees * with sufficient notice times while maintaining full trustlessness. */ contract KyberPoolMaster is Ownable { using SafeMath for uint256; uint256 internal constant MINIMUM_EPOCH_NOTICE = 1; uint256 internal constant MAX_DELEGATION_FEE = 10000; uint256 internal constant PRECISION = (10**18); IERC20 internal constant ETH_TOKEN_ADDRESS = IERC20( 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ); // Number of epochs after which a change on delegationFee will be applied uint256 public immutable epochNotice; // Mapping of if staker has claimed reward for Epoch in a feeHandler // epoch -> member -> feeHandler -> true | false mapping(uint256 => mapping(address => mapping(address => bool))) public claimedDelegateReward; struct Claim { bool claimedByPool; uint256 totalRewards; uint256 totalStaked; } //epoch -> feeHandler -> Claim mapping(uint256 => mapping(address => Claim)) public epochFeeHandlerClaims; // Fee charged by poolMasters to poolMembers for services // Denominated in 1e4 units // 100 = 1% struct DFeeData { uint256 fromEpoch; uint256 fee; bool applied; } DFeeData[] public delegationFees; IERC20 public immutable kncToken; IExtendedKyberDao public immutable kyberDao; IKyberStaking public immutable kyberStaking; address[] public feeHandlersList; mapping(address => IERC20) public rewardTokenByFeeHandler; uint256 public immutable firstEpoch; mapping(address => bool) public successfulClaimByFeeHandler; struct RewardInfo { IExtendedKyberFeeHandler kyberFeeHandler; IERC20 rewardToken; uint256 totalRewards; uint256 totalFee; uint256 rewardsAfterFee; uint256 poolMembersShare; uint256 poolMasterShare; } struct UnclaimedRewardData { uint256 epoch; address feeHandler; uint256 rewards; IERC20 rewardToken; } /*** Events ***/ event CommitNewFees(uint256 deadline, uint256 feeRate); event NewFees(uint256 fromEpoch, uint256 feeRate); event MemberClaimReward( uint256 indexed epoch, address indexed poolMember, address indexed feeHandler, IERC20 rewardToken, uint256 reward ); event MasterClaimReward( uint256 indexed epoch, address indexed feeHandler, address indexed poolMaster, IERC20 rewardToken, uint256 totalRewards, uint256 feeApplied, uint256 feeAmount, uint256 poolMasterShare ); event AddFeeHandler(address indexed feeHandler, IERC20 indexed rewardToken); event RemoveFeeHandler(address indexed feeHandler); /** * @notice Address deploying this contract should be able to receive ETH, owner can be changed using transferOwnership method * @param _kyberDao KyberDao contract address * @param _epochNotice Number of epochs after which a change on deledatioFee is will be applied * @param _delegationFee Fee charged by poolMasters to poolMembers for services - Denominated in 1e4 units - 100 = 1% * @param _kyberFeeHandlers Array of FeeHandlers * @param _rewardTokens Array of ERC20 tokens used by FeeHandlers to pay reward. Use zero address if FeeHandler pays ETH */ constructor( address _kyberDao, uint256 _epochNotice, uint256 _delegationFee, address[] memory _kyberFeeHandlers, IERC20[] memory _rewardTokens ) public { require(_kyberDao != address(0), "ctor: kyberDao is missing"); require( _epochNotice >= MINIMUM_EPOCH_NOTICE, "ctor: Epoch Notice too low" ); require( _delegationFee <= MAX_DELEGATION_FEE, "ctor: Delegation Fee greater than 100%" ); require( _kyberFeeHandlers.length > 0, "ctor: at least one _kyberFeeHandlers required" ); require( _kyberFeeHandlers.length == _rewardTokens.length, "ctor: _kyberFeeHandlers and _rewardTokens uneven" ); IExtendedKyberDao _kyberDaoContract = IExtendedKyberDao(_kyberDao); kyberDao = _kyberDaoContract; kncToken = IERC20(_kyberDaoContract.kncToken()); kyberStaking = IKyberStaking(_kyberDaoContract.staking()); epochNotice = _epochNotice; uint256 _firstEpoch = _kyberDaoContract.getCurrentEpochNumber(); firstEpoch = _firstEpoch; delegationFees.push(DFeeData(_firstEpoch, _delegationFee, true)); for (uint256 i = 0; i < _kyberFeeHandlers.length; i++) { require( _kyberFeeHandlers[i] != address(0), "ctor: feeHandler is missing" ); require( rewardTokenByFeeHandler[_kyberFeeHandlers[i]] == IERC20(address(0)), "ctor: repeated feeHandler" ); feeHandlersList.push(_kyberFeeHandlers[i]); rewardTokenByFeeHandler[_kyberFeeHandlers[i]] = _rewardTokens[i]; emit AddFeeHandler( _kyberFeeHandlers[i], rewardTokenByFeeHandler[_kyberFeeHandlers[i]] ); } emit CommitNewFees(_firstEpoch, _delegationFee); emit NewFees(_firstEpoch, _delegationFee); } /** * @dev adds a new FeeHandler * @param _feeHandler FeeHandler address * @param _rewardToken Rewards Token address */ function addFeeHandler(address _feeHandler, IERC20 _rewardToken) external onlyOwner { require( _feeHandler != address(0), "addFeeHandler: _feeHandler is missing" ); require( rewardTokenByFeeHandler[_feeHandler] == IERC20(address(0)), "addFeeHandler: already added" ); feeHandlersList.push(_feeHandler); rewardTokenByFeeHandler[_feeHandler] = _rewardToken; emit AddFeeHandler(_feeHandler, rewardTokenByFeeHandler[_feeHandler]); } /** * @dev removes a FeeHandler * @param _feeHandler FeeHandler address */ function removeFeeHandler(address _feeHandler) external onlyOwner { require( rewardTokenByFeeHandler[_feeHandler] != IERC20(address(0)), "removeFeeHandler: not added" ); require( !successfulClaimByFeeHandler[_feeHandler], "removeFeeHandler: can not remove FeeHandler successfully claimed" ); if (feeHandlersList[feeHandlersList.length - 1] != _feeHandler) { for (uint256 i = 0; i < feeHandlersList.length; i++) { if (feeHandlersList[i] == _feeHandler) { feeHandlersList[i] = feeHandlersList[feeHandlersList .length - 1]; break; } } } feeHandlersList.pop(); delete rewardTokenByFeeHandler[_feeHandler]; emit RemoveFeeHandler(_feeHandler); } /** * @dev call to stake more KNC for poolMaster * @param amount amount of KNC to stake */ function masterDeposit(uint256 amount) external onlyOwner { require( amount > 0, "masterDeposit: amount to deposit should be positive" ); require( kncToken.transferFrom(msg.sender, address(this), amount), "masterDeposit: can not get token" ); // approve kncToken.approve(address(kyberStaking), amount); // deposit in KyberStaking kyberStaking.deposit(amount); } /** * @dev call to withdraw KNC from staking * @param amount amount of KNC to withdraw */ function masterWithdraw(uint256 amount) external onlyOwner { require(amount > 0, "masterWithdraw: amount is 0"); // withdraw from KyberStaking kyberStaking.withdraw(amount); // transfer KNC back to pool master require( kncToken.transfer(msg.sender, amount), "masterWithdraw: can not transfer knc to the pool master" ); } /** * @dev vote for an option of a campaign * options are indexed from 1 to number of options * @param campaignID id of campaign to vote for * @param option id of options to vote for */ function vote(uint256 campaignID, uint256 option) external onlyOwner { kyberDao.vote(campaignID, option); } /** * @dev set a new delegation fee to be applied in current epoch + epochNotice * @param _fee new fee */ function commitNewFee(uint256 _fee) external onlyOwner { require( _fee <= MAX_DELEGATION_FEE, "commitNewFee: Delegation Fee greater than 100%" ); uint256 curEpoch = kyberDao.getCurrentEpochNumber(); uint256 fromEpoch = curEpoch.add(epochNotice); DFeeData storage lastFee = delegationFees[delegationFees.length - 1]; if (lastFee.fromEpoch > curEpoch) { lastFee.fromEpoch = fromEpoch; lastFee.fee = _fee; } else { if (!lastFee.applied) { applyFee(lastFee); } delegationFees.push(DFeeData(fromEpoch, _fee, false)); } emit CommitNewFees(fromEpoch.sub(1), _fee); } /** * @dev Applies the pending new fee */ function applyPendingFee() public { DFeeData storage lastFee = delegationFees[delegationFees.length - 1]; uint256 curEpoch = kyberDao.getCurrentEpochNumber(); if (lastFee.fromEpoch <= curEpoch && !lastFee.applied) { applyFee(lastFee); } } /** * @dev Applies a pending fee * @param fee to be applied */ function applyFee(DFeeData storage fee) internal { fee.applied = true; emit NewFees(fee.fromEpoch, fee.fee); } /** * @dev Gets the id of the delegation fee corresponding to the given epoch * @param _epoch for which epoch is querying delegation fee * @param _from delegationFees starting index */ function getEpochDFeeDataId(uint256 _epoch, uint256 _from) internal view returns (uint256) { if (delegationFees[_from].fromEpoch > _epoch) { return _from; } uint256 left = _from; uint256 right = delegationFees.length; while (left < right) { uint256 m = (left + right).div(2); if (delegationFees[m].fromEpoch > _epoch) { right = m; } else { left = m + 1; } } return right - 1; } /** * @dev Gets the the delegation fee data corresponding to the given epoch * @param epoch for which epoch is querying delegation fee */ function getEpochDFeeData(uint256 epoch) public view returns (DFeeData memory epochDFee) { epochDFee = delegationFees[getEpochDFeeDataId(epoch, 0)]; } /** * @dev Gets the the delegation fee data corresponding to the current epoch */ function delegationFee() public view returns (DFeeData memory) { uint256 curEpoch = kyberDao.getCurrentEpochNumber(); return getEpochDFeeData(curEpoch); } /** * @dev Queries the amount of unclaimed rewards for the pool in a given epoch and feeHandler * return 0 if PoolMaster has calledRewardMaster * return 0 if staker's reward percentage in precision for the epoch is 0 * return 0 if total reward for the epoch is 0 * @param _epoch for which epoch is querying unclaimed reward * @param _feeHandler FeeHandler address */ function getUnclaimedRewards( uint256 _epoch, IExtendedKyberFeeHandler _feeHandler ) public view returns (uint256) { if (epochFeeHandlerClaims[_epoch][address(_feeHandler)].claimedByPool) { return 0; } uint256 perInPrecision = kyberDao .getPastEpochRewardPercentageInPrecision(address(this), _epoch); if (perInPrecision == 0) { return 0; } uint256 rewardsPerEpoch = _feeHandler.rewardsPerEpoch(_epoch); if (rewardsPerEpoch == 0) { return 0; } return rewardsPerEpoch.mul(perInPrecision).div(PRECISION); } /** * @dev Returns data related to all epochs and feeHandlers with unclaimed rewards, for the pool. */ function getUnclaimedRewardsData() external view returns (UnclaimedRewardData[] memory) { uint256 currentEpoch = kyberDao.getCurrentEpochNumber(); uint256 maxEpochNumber = currentEpoch.sub(firstEpoch); uint256[] memory epochGroup = new uint256[](maxEpochNumber); uint256 e = 0; for (uint256 epoch = firstEpoch; epoch < currentEpoch; epoch++) { epochGroup[e] = epoch; e++; } return _getUnclaimedRewardsData(epochGroup, feeHandlersList); } /** * @dev Returns data related to all epochs and feeHandlers, from the given groups, with unclaimed rewards, for the pool. */ function getUnclaimedRewardsData( uint256[] calldata _epochGroup, address[] calldata _feeHandlerGroup ) external view returns (UnclaimedRewardData[] memory) { return _getUnclaimedRewardsData(_epochGroup, _feeHandlerGroup); } function _getUnclaimedRewardsData( uint256[] memory _epochGroup, address[] memory _feeHandlerGroup ) internal view returns (UnclaimedRewardData[] memory) { UnclaimedRewardData[] memory epochFeeHanlderRewards = new UnclaimedRewardData[]( _epochGroup.length.mul(_feeHandlerGroup.length) ); uint256 rewardsCounter = 0; for (uint256 e = 0; e < _epochGroup.length; e++) { for (uint256 f = 0; f < _feeHandlerGroup.length; f++) { uint256 unclaimed = getUnclaimedRewards( _epochGroup[e], IExtendedKyberFeeHandler(_feeHandlerGroup[f]) ); if (unclaimed > 0) { epochFeeHanlderRewards[rewardsCounter] = UnclaimedRewardData( _epochGroup[e], _feeHandlerGroup[f], unclaimed, rewardTokenByFeeHandler[_feeHandlerGroup[f]] ); rewardsCounter++; } } } UnclaimedRewardData[] memory result = new UnclaimedRewardData[]( rewardsCounter ); for (uint256 i = 0; i < (rewardsCounter); i++) { result[i] = epochFeeHanlderRewards[i]; } return result; } /** * @dev Claims rewards for a given group of epochs in all feeHandlers, distribute fees and its share to poolMaster * @param _epochGroup An array of epochs for which rewards are being claimed. Asc order and uniqueness is required. */ function claimRewardsMaster(uint256[] memory _epochGroup) public { claimRewardsMaster(_epochGroup, feeHandlersList); } /** * @dev Claims rewards for a given group of epochs and a given group of feeHandlers, distribute fees and its share to poolMaster * @param _epochGroup An array of epochs for which rewards are being claimed. Asc order and uniqueness is required. * @param _feeHandlerGroup An array of FeeHandlers for which rewards are being claimed. */ function claimRewardsMaster( uint256[] memory _epochGroup, address[] memory _feeHandlerGroup ) public { require(_epochGroup.length > 0, "cRMaster: _epochGroup required"); require( isOrderedSet(_epochGroup), "cRMaster: order and uniqueness required" ); require( _feeHandlerGroup.length > 0, "cRMaster: _feeHandlerGroup required" ); uint256[] memory accruedByFeeHandler = new uint256[]( _feeHandlerGroup.length ); uint256 feeId = 0; for (uint256 j = 0; j < _epochGroup.length; j++) { uint256 _epoch = _epochGroup[j]; feeId = getEpochDFeeDataId(_epoch, feeId); DFeeData storage epochDFee = delegationFees[feeId]; if (!epochDFee.applied) { applyFee(epochDFee); } (uint256 stake, uint256 delegatedStake, ) = kyberStaking .getStakerRawData(address(this), _epoch); for (uint256 i = 0; i < _feeHandlerGroup.length; i++) { RewardInfo memory rewardInfo = _claimRewardsFromKyber( _epoch, _feeHandlerGroup[i], epochDFee, stake, delegatedStake ); if (rewardInfo.totalRewards == 0) { continue; } accruedByFeeHandler[i] = accruedByFeeHandler[i].add( rewardInfo.poolMasterShare ); if (!successfulClaimByFeeHandler[_feeHandlerGroup[i]]) { successfulClaimByFeeHandler[_feeHandlerGroup[i]] = true; } } } address poolMaster = owner(); for (uint256 k = 0; k < accruedByFeeHandler.length; k++) { _sendTokens( rewardTokenByFeeHandler[_feeHandlerGroup[k]], poolMaster, accruedByFeeHandler[k], "cRMaster: poolMaster share transfer failed" ); } } function _claimRewardsFromKyber( uint256 _epoch, address _feeHandlerAddress, DFeeData memory epochDFee, uint256 stake, uint256 delegatedStake ) internal returns (RewardInfo memory rewardInfo) { rewardInfo.kyberFeeHandler = IExtendedKyberFeeHandler( _feeHandlerAddress ); uint256 unclaimed = getUnclaimedRewards( _epoch, rewardInfo.kyberFeeHandler ); if (unclaimed > 0) { rewardInfo .rewardToken = rewardTokenByFeeHandler[_feeHandlerAddress]; rewardInfo.kyberFeeHandler.claimStakerReward(address(this), _epoch); rewardInfo.totalRewards = unclaimed; rewardInfo.totalFee = rewardInfo .totalRewards .mul(epochDFee.fee) .div(MAX_DELEGATION_FEE); rewardInfo.rewardsAfterFee = rewardInfo.totalRewards.sub( rewardInfo.totalFee ); rewardInfo.poolMembersShare = calculateRewardsShare( delegatedStake, stake.add(delegatedStake), rewardInfo.rewardsAfterFee ); rewardInfo.poolMasterShare = rewardInfo.totalRewards.sub( rewardInfo.poolMembersShare ); // fee + poolMaster stake share epochFeeHandlerClaims[_epoch][_feeHandlerAddress] = Claim( true, rewardInfo.poolMembersShare, delegatedStake ); emit MasterClaimReward( _epoch, _feeHandlerAddress, payable(owner()), rewardInfo.rewardToken, rewardInfo.totalRewards, epochDFee.fee, rewardInfo.totalFee, rewardInfo.poolMasterShare.sub(rewardInfo.totalFee) ); } } /** * @dev Helper method to transfer tokens * @param _token address of the token * @param _receiver account that will receive the transfer * @param _value the amount of tokens to transfer * @param _errorMsg error msg in case transfer of native tokens fails */ function _sendTokens( IERC20 _token, address _receiver, uint256 _value, string memory _errorMsg ) internal { if (_value == 0) { return; } if (_token == ETH_TOKEN_ADDRESS) { (bool success, ) = _receiver.call{value: _value}(""); require(success, _errorMsg); } else { SafeERC20.safeTransfer(_token, _receiver, _value); } } /** * @dev Queries the amount of unclaimed rewards for the pool member in a given epoch and feeHandler * return 0 if PoolMaster has not called claimRewardMaster * return 0 if PoolMember has previously claimed reward for the epoch * return 0 if PoolMember has not stake for the epoch * return 0 if PoolMember has not delegated it stake to this contract for the epoch * @param _poolMember address of pool member * @param _epoch for which epoch the member is querying unclaimed reward * @param _feeHandler FeeHandler address */ function getUnclaimedRewardsMember( address _poolMember, uint256 _epoch, address _feeHandler ) public view returns (uint256) { if ( !epochFeeHandlerClaims[_epoch][address(_feeHandler)].claimedByPool ) { return 0; } if (claimedDelegateReward[_epoch][_poolMember][_feeHandler]) { return 0; } (uint256 stake, , address representative) = kyberStaking.getStakerData( _poolMember, _epoch ); if (stake == 0) { return 0; } if (representative != address(this)) { return 0; } Claim memory rewardForEpoch = epochFeeHandlerClaims[_epoch][_feeHandler]; return calculateRewardsShare( stake, rewardForEpoch.totalStaked, rewardForEpoch.totalRewards ); } /** * @dev Returns data related to all epochs and feeHandlers with unclaimed rewards, for a the poolMember. From initial to current epoch. * @param _poolMember address of pool member */ function getAllUnclaimedRewardsDataMember(address _poolMember) external view returns (UnclaimedRewardData[] memory) { uint256 currentEpoch = kyberDao.getCurrentEpochNumber(); return _getAllUnclaimedRewardsDataMember( _poolMember, firstEpoch, currentEpoch ); } /** * @dev Returns data related to all epochs and feeHandlers with unclaimed rewards, for a the poolMember. * @param _poolMember address of pool member * @param _fromEpoch initial epoch parameter * @param _toEpoch end epoch parameter */ function getAllUnclaimedRewardsDataMember( address _poolMember, uint256 _fromEpoch, uint256 _toEpoch ) external view returns (UnclaimedRewardData[] memory) { return _getAllUnclaimedRewardsDataMember( _poolMember, _fromEpoch, _toEpoch ); } /** * @dev Queries data related to epochs and feeHandlers with unclaimed rewards, for a the poolMember * @param _poolMember address of pool member * @param _fromEpoch initial epoch parameter * @param _toEpoch end epoch parameter */ function _getAllUnclaimedRewardsDataMember( address _poolMember, uint256 _fromEpoch, uint256 _toEpoch ) internal view returns (UnclaimedRewardData[] memory) { uint256 maxEpochNumber = _toEpoch.sub(_fromEpoch).add(1); uint256[] memory epochGroup = new uint256[](maxEpochNumber); uint256 e = 0; for (uint256 epoch = _fromEpoch; epoch <= _toEpoch; epoch++) { epochGroup[e] = epoch; e++; } return _getUnclaimedRewardsDataMember( _poolMember, epochGroup, feeHandlersList ); } function _getUnclaimedRewardsDataMember( address _poolMember, uint256[] memory _epochGroup, address[] memory _feeHandlerGroup ) internal view returns (UnclaimedRewardData[] memory) { UnclaimedRewardData[] memory epochFeeHanlderRewards = new UnclaimedRewardData[]( _epochGroup.length.mul(_feeHandlerGroup.length) ); uint256 rewardsCounter = 0; for (uint256 e = 0; e < _epochGroup.length; e++) { for (uint256 f = 0; f < _feeHandlerGroup.length; f++) { uint256 unclaimed = getUnclaimedRewardsMember( _poolMember, _epochGroup[e], _feeHandlerGroup[f] ); if (unclaimed > 0) { epochFeeHanlderRewards[rewardsCounter] = UnclaimedRewardData( _epochGroup[e], _feeHandlerGroup[f], unclaimed, rewardTokenByFeeHandler[_feeHandlerGroup[f]] ); rewardsCounter++; } } } UnclaimedRewardData[] memory result = new UnclaimedRewardData[]( rewardsCounter ); for (uint256 i = 0; i < (rewardsCounter); i++) { result[i] = epochFeeHanlderRewards[i]; } return result; } /** * @dev Someone claims rewards for a PoolMember in a given group of epochs in all feeHandlers. * It will transfer rewards where epoch->feeHandler has been claimed by the pool and not yet by the member. * This contract will keep locked remainings from rounding at a wei level. * @param _epochGroup An array of epochs for which rewards are being claimed * @param _poolMember PoolMember address to claim rewards for */ function claimRewardsMember( address _poolMember, uint256[] memory _epochGroup ) public { _claimRewardsMember(_poolMember, _epochGroup, feeHandlersList); } /** * @dev Someone claims rewards for a PoolMember in a given group of epochs in a given group of feeHandlers. * It will transfer rewards where epoch->feeHandler has been claimed by the pool and not yet by the member. * This contract will keep locked remainings from rounding at a wei level. * @param _epochGroup An array of epochs for which rewards are being claimed * @param _feeHandlerGroup An array of FeeHandlers for which rewards are being claimed * @param _poolMember PoolMember address to claim rewards for */ function claimRewardsMember( address _poolMember, uint256[] memory _epochGroup, address[] memory _feeHandlerGroup ) public { _claimRewardsMember(_poolMember, _epochGroup, _feeHandlerGroup); } function _claimRewardsMember( address _poolMember, uint256[] memory _epochGroup, address[] memory _feeHandlerGroup ) internal { require(_epochGroup.length > 0, "cRMember: _epochGroup required"); require( _feeHandlerGroup.length > 0, "cRMember: _feeHandlerGroup required" ); uint256[] memory accruedByFeeHandler = new uint256[]( _feeHandlerGroup.length ); for (uint256 j = 0; j < _epochGroup.length; j++) { uint256 _epoch = _epochGroup[j]; for (uint256 i = 0; i < _feeHandlerGroup.length; i++) { uint256 poolMemberShare = getUnclaimedRewardsMember( _poolMember, _epoch, _feeHandlerGroup[i] ); IERC20 rewardToken = rewardTokenByFeeHandler[_feeHandlerGroup[i]]; if (poolMemberShare == 0) { continue; } accruedByFeeHandler[i] = accruedByFeeHandler[i].add( poolMemberShare ); claimedDelegateReward[_epoch][_poolMember][_feeHandlerGroup[i]] = true; emit MemberClaimReward( _epoch, _poolMember, _feeHandlerGroup[i], rewardToken, poolMemberShare ); } } // distribute _poolMember rewards share for (uint256 k = 0; k < accruedByFeeHandler.length; k++) { _sendTokens( rewardTokenByFeeHandler[_feeHandlerGroup[k]], _poolMember, accruedByFeeHandler[k], "cRMember: poolMember share transfer failed" ); } } // Utils /** * @dev Calculates rewards share based on the stake over the total stake */ function calculateRewardsShare( uint256 stake, uint256 totalStake, uint256 rewards ) internal pure returns (uint256) { return stake.mul(rewards).div(totalStake); } /** * @dev Queries the number of elements in delegationFees */ function delegationFeesLength() public view returns (uint256) { return delegationFees.length; } /** * @dev Queries the number of elements in feeHandlersList */ function feeHandlersListLength() public view returns (uint256) { return feeHandlersList.length; } /** * @dev Checks if elements in array are ordered and unique */ function isOrderedSet(uint256[] memory numbers) internal pure returns (bool) { bool isOrdered = true; if (numbers.length > 1) { for (uint256 i = 0; i < numbers.length - 1; i++) { // strict inequality ensures both ordering and uniqueness if (numbers[i] >= numbers[i + 1]) { isOrdered = false; break; } } } return isOrdered; } /** * @dev Enables the contract to receive ETH */ receive() external payable { require( rewardTokenByFeeHandler[msg.sender] == ETH_TOKEN_ADDRESS, "only accept ETH from a KyberFeeHandler" ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_kyberDao","type":"address"},{"internalType":"uint256","name":"_epochNotice","type":"uint256"},{"internalType":"uint256","name":"_delegationFee","type":"uint256"},{"internalType":"address[]","name":"_kyberFeeHandlers","type":"address[]"},{"internalType":"contract IERC20[]","name":"_rewardTokens","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeHandler","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"rewardToken","type":"address"}],"name":"AddFeeHandler","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"}],"name":"CommitNewFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":true,"internalType":"address","name":"feeHandler","type":"address"},{"indexed":true,"internalType":"address","name":"poolMaster","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeApplied","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolMasterShare","type":"uint256"}],"name":"MasterClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":true,"internalType":"address","name":"poolMember","type":"address"},{"indexed":true,"internalType":"address","name":"feeHandler","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"MemberClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fromEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"}],"name":"NewFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeHandler","type":"address"}],"name":"RemoveFeeHandler","type":"event"},{"inputs":[{"internalType":"address","name":"_feeHandler","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"}],"name":"addFeeHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyPendingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_epochGroup","type":"uint256[]"},{"internalType":"address[]","name":"_feeHandlerGroup","type":"address[]"}],"name":"claimRewardsMaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_epochGroup","type":"uint256[]"}],"name":"claimRewardsMaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolMember","type":"address"},{"internalType":"uint256[]","name":"_epochGroup","type":"uint256[]"},{"internalType":"address[]","name":"_feeHandlerGroup","type":"address[]"}],"name":"claimRewardsMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolMember","type":"address"},{"internalType":"uint256[]","name":"_epochGroup","type":"uint256[]"}],"name":"claimRewardsMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"claimedDelegateReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"commitNewFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delegationFee","outputs":[{"components":[{"internalType":"uint256","name":"fromEpoch","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"applied","type":"bool"}],"internalType":"struct KyberPoolMaster.DFeeData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"delegationFees","outputs":[{"internalType":"uint256","name":"fromEpoch","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"applied","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegationFeesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"epochFeeHandlerClaims","outputs":[{"internalType":"bool","name":"claimedByPool","type":"bool"},{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochNotice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeHandlersList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeHandlersListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolMember","type":"address"},{"internalType":"uint256","name":"_fromEpoch","type":"uint256"},{"internalType":"uint256","name":"_toEpoch","type":"uint256"}],"name":"getAllUnclaimedRewardsDataMember","outputs":[{"components":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"feeHandler","type":"address"},{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"}],"internalType":"struct KyberPoolMaster.UnclaimedRewardData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolMember","type":"address"}],"name":"getAllUnclaimedRewardsDataMember","outputs":[{"components":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"feeHandler","type":"address"},{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"}],"internalType":"struct KyberPoolMaster.UnclaimedRewardData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"getEpochDFeeData","outputs":[{"components":[{"internalType":"uint256","name":"fromEpoch","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"applied","type":"bool"}],"internalType":"struct KyberPoolMaster.DFeeData","name":"epochDFee","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_epoch","type":"uint256"},{"internalType":"contract IExtendedKyberFeeHandler","name":"_feeHandler","type":"address"}],"name":"getUnclaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnclaimedRewardsData","outputs":[{"components":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"feeHandler","type":"address"},{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"}],"internalType":"struct KyberPoolMaster.UnclaimedRewardData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_epochGroup","type":"uint256[]"},{"internalType":"address[]","name":"_feeHandlerGroup","type":"address[]"}],"name":"getUnclaimedRewardsData","outputs":[{"components":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"feeHandler","type":"address"},{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"}],"internalType":"struct KyberPoolMaster.UnclaimedRewardData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolMember","type":"address"},{"internalType":"uint256","name":"_epoch","type":"uint256"},{"internalType":"address","name":"_feeHandler","type":"address"}],"name":"getUnclaimedRewardsMember","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kncToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberDao","outputs":[{"internalType":"contract IExtendedKyberDao","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberStaking","outputs":[{"internalType":"contract IKyberStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"masterDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"masterWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeHandler","type":"address"}],"name":"removeFeeHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardTokenByFeeHandler","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"successfulClaimByFeeHandler","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"campaignID","type":"uint256"},{"internalType":"uint256","name":"option","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101206040523480156200001257600080fd5b50604051620048d8380380620048d8833981016040819052620000359162000735565b60006200004a6001600160e01b036200067716565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038516620000c65760405162461bcd60e51b8152600401620000bd90620009d0565b60405180910390fd5b6001841015620000ea5760405162461bcd60e51b8152600401620000bd9062000999565b6127108311156200010f5760405162461bcd60e51b8152600401620000bd906200091c565b6000825111620001335760405162461bcd60e51b8152600401620000bd9062000848565b8051825114620001575760405162461bcd60e51b8152600401620000bd9062000895565b6000859050806001600160a01b031660c0816001600160a01b031660601b81525050806001600160a01b031663811c7fe26040518163ffffffff1660e01b815260040160206040518083038186803b158015620001b357600080fd5b505afa158015620001c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ee91906200070f565b6001600160a01b031660a0816001600160a01b031660601b81525050806001600160a01b0316634cf088d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156200024457600080fd5b505afa15801562000259573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027f91906200070f565b6001600160a01b031660e0816001600160a01b031660601b8152505084608081815250506000816001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b158015620002df57600080fd5b505afa158015620002f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031a91906200082f565b61010081905260408051606081018252828152602081018881526001928201838152600380549485018155600081815293517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b959091029485015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c840155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d909201805460ff1916921515929092179091559091505b8451811015620005f35760006001600160a01b0316858281518110620003f657fe5b60200260200101516001600160a01b03161415620004285760405162461bcd60e51b8152600401620000bd90620008e5565b60006001600160a01b0316600560008784815181106200044457fe5b6020908102919091018101516001600160a01b039081168352908201929092526040016000205416146200048c5760405162461bcd60e51b8152600401620000bd9062000962565b60048582815181106200049b57fe5b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558351849082908110620004e557fe5b602002602001015160056000878481518110620004fe57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600560008683815181106200055b57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316858281518110620005ad57fe5b60200260200101516001600160a01b03167fff2847fd2ae19fe4c306a71befdc972f378c04028957c133235dd59d325e236660405160405180910390a3600101620003d4565b507f2803ffe778731e96b0cb4ffdea51f618e2dc70ed59841f65fb6a92296b39606881866040516200062792919062000a07565b60405180910390a17f0aaa05fba10caab20c7dfcd757223e489dbd2313a5e1add54bca74aceaf1781981866040516200066292919062000a07565b60405180910390a15050505050505062000a75565b3390565b8051620006888162000a5c565b92915050565b600082601f8301126200069f578081fd5b8151620006b6620006b08262000a3c565b62000a15565b818152915060208083019084810181840286018201871015620006d857600080fd5b60005b8481101562000704578151620006f18162000a5c565b84529282019290820190600101620006db565b505050505092915050565b60006020828403121562000721578081fd5b81516200072e8162000a5c565b9392505050565b600080600080600060a086880312156200074d578081fd5b85516200075a8162000a5c565b602087810151604089015160608a01519398509096509450906001600160401b038082111562000788578384fd5b8189018a601f8201126200079a578485fd5b80519250620007ad620006b08462000a3c565b83815284810190828601868602840187018e1015620007ca578788fd5b8793505b85841015620007f857620007e38e826200067b565b835260019390930192918601918601620007ce565b5060808c0151909750945050508083111562000812578384fd5b505062000822888289016200068e565b9150509295509295909350565b60006020828403121562000841578081fd5b5051919050565b6020808252602d908201527f63746f723a206174206c65617374206f6e65205f6b7962657246656548616e6460408201526c1b195c9cc81c995c5d5a5c9959609a1b606082015260800190565b60208082526030908201527f63746f723a205f6b7962657246656548616e646c65727320616e64205f72657760408201526f30b9322a37b5b2b739903ab732bb32b760811b606082015260800190565b6020808252601b908201527f63746f723a2066656548616e646c6572206973206d697373696e670000000000604082015260600190565b60208082526026908201527f63746f723a2044656c65676174696f6e204665652067726561746572207468616040820152656e203130302560d01b606082015260800190565b60208082526019908201527f63746f723a2072657065617465642066656548616e646c657200000000000000604082015260600190565b6020808252601a908201527f63746f723a2045706f6368204e6f7469636520746f6f206c6f77000000000000604082015260600190565b60208082526019908201527f63746f723a206b7962657244616f206973206d697373696e6700000000000000604082015260600190565b918252602082015260400190565b6040518181016001600160401b038111828210171562000a3457600080fd5b604052919050565b60006001600160401b0382111562000a52578081fd5b5060209081020190565b6001600160a01b038116811462000a7257600080fd5b50565b60805160a05160601c60c05160601c60e05160601c61010051613dbb62000b1d600039806109b55280610a2a5280610c1a5280611a4052508061080352806108975280610f4e52806112755280611411528061200952508061091c5280610b415280610c3e52806115a8528061189b52806119a95280611a715280611e3352508061071852806107d65280610e1252806112f1525080611641528061197b5250613dbb6000f3fe6080604052600436106102085760003560e01c8063a969b18611610118578063c92d7169116100a0578063de37b7a11161006f578063de37b7a114610608578063dec3655414610637578063e25208e314610657578063f0359d1b14610677578063f2fde38b1461068c57610263565b8063c92d716914610588578063d172d3a3146105a8578063d2f31c39146105c8578063d4b94901146105e857610263565b8063b8a4aeaf116100e7578063b8a4aeaf14610509578063ba2d373c14610529578063c08da7a11461053e578063c5e6e35714610553578063c5f0a58f1461057357610263565b8063a969b1861461047c578063b0cd498b1461049c578063b384abef146104bc578063b3e9ba27146104dc57610263565b80634edd0d671161019b5780638769e3241161016a5780638769e324146103e75780638da5cb5b146104075780639d21ce9c1461041c5780639e3853ec1461043c5780639faf1d511461045c57610263565b80634edd0d6714610388578063715018a61461039d5780637ee1506d146103b2578063811c7fe2146103d257610263565b806335f8aa9b116101d757806335f8aa9b1461030f578063413f92c01461032457806341682744146103515780634d8f51051461037357610263565b8063026625851461026857806309f67b3a1461028857806322b143fb146102be57806329f6ff41146102e057610263565b3661026357336000908152600560205260409020546001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146102615760405162461bcd60e51b8152600401610258906136b4565b60405180910390fd5b005b600080fd5b34801561027457600080fd5b50610261610283366004613478565b6106ac565b34801561029457600080fd5b506102a86102a33660046131e0565b610901565b6040516102b59190613630565b60405180910390f35b3480156102ca57600080fd5b506102d3610916565b6040516102b591906135c0565b3480156102ec57600080fd5b506103006102fb366004613478565b610ae4565b6040516102b593929190613c93565b34801561031b57600080fd5b50610261610b17565b34801561033057600080fd5b5061034461033f3660046131e0565b610bfd565b6040516102b5919061356f565b34801561035d57600080fd5b50610366610c18565b6040516102b59190613c7c565b34801561037f57600080fd5b50610344610c3c565b34801561039457600080fd5b50610366610c60565b3480156103a957600080fd5b50610261610c66565b3480156103be57600080fd5b506102616103cd3660046132bb565b610ce5565b3480156103de57600080fd5b50610344610e10565b3480156103f357600080fd5b50610261610402366004613402565b610e34565b34801561041357600080fd5b506103446111fa565b34801561042857600080fd5b50610261610437366004613478565b611209565b34801561044857600080fd5b506103666104573660046132f3565b61139b565b34801561046857600080fd5b50610261610477366004613478565b61154d565b34801561048857600080fd5b506102616104973660046133d0565b6117c4565b3480156104a857600080fd5b506103446104b7366004613478565b611828565b3480156104c857600080fd5b506102616104d7366004613502565b61184f565b3480156104e857600080fd5b506104fc6104f7366004613478565b611900565b6040516102b59190613c59565b34801561051557600080fd5b506102d3610524366004613334565b611964565b34801561053557600080fd5b50610366611979565b34801561054a57600080fd5b5061036661199d565b34801561055f57600080fd5b506102d361056e3660046131e0565b6119a3565b34801561057f57600080fd5b506104fc611a65565b34801561059457600080fd5b506102a86105a33660046134cc565b611b11565b3480156105b457600080fd5b506102616105c3366004613249565b611b37565b3480156105d457600080fd5b506102616105e33660046131e0565b611b47565b3480156105f457600080fd5b506102616106033660046131fc565b611d53565b34801561061457600080fd5b506106286106233660046134a8565b611db8565b6040516102b59392919061363b565b34801561064357600080fd5b506103666106523660046134a8565b611de6565b34801561066357600080fd5b506102d3610672366004613368565b611f8f565b34801561068357600080fd5b50610344612007565b34801561069857600080fd5b506102616106a73660046131e0565b61202b565b6106b46120e1565b6000546001600160a01b039081169116146106e15760405162461bcd60e51b815260040161025890613b00565b600081116107015760405162461bcd60e51b815260040161025890613a6a565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd9061075190339030908690600401613583565b602060405180830381600087803b15801561076b57600080fd5b505af115801561077f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a39190613458565b6107bf5760405162461bcd60e51b815260040161025890613b35565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b39061082d907f00000000000000000000000000000000000000000000000000000000000000009085906004016135a7565b602060405180830381600087803b15801561084757600080fd5b505af115801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190613458565b5060405163b6b55f2560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b6b55f25906108cc908490600401613c7c565b600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b5050505050565b60066020526000908152604090205460ff1681565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613490565b905060006109df827f000000000000000000000000000000000000000000000000000000000000000063ffffffff6120e516565b90506060816001600160401b03811180156109f957600080fd5b50604051908082528060200260200182016040528015610a23578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000005b84811015610a765780838381518110610a5f57fe5b602090810291909101015260019182019101610a4a565b50610adb826004805480602002602001604051908101604052809291908181526020018280548015610ad157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ab3575b5050505050612127565b94505050505090565b60038181548110610af157fe5b600091825260209091206003909102018054600182015460029092015490925060ff1683565b60038054600091906000198101908110610b2d57fe5b9060005260206000209060030201905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9857600080fd5b505afa158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd09190613490565b905080826000015411158015610beb5750600282015460ff16155b15610bf957610bf98261233a565b5050565b6005602052600090815260409020546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045490565b610c6e6120e1565b6000546001600160a01b03908116911614610c9b5760405162461bcd60e51b815260040161025890613b00565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610ced6120e1565b6000546001600160a01b03908116911614610d1a5760405162461bcd60e51b815260040161025890613b00565b6001600160a01b038216610d405760405162461bcd60e51b81526004016102589061392f565b6001600160a01b038281166000908152600560205260409020541615610d785760405162461bcd60e51b8152600401610258906138aa565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b038085166001600160a01b03199283168117909355600083815260056020526040808220805487851695169490941793849055519290911692917fff2847fd2ae19fe4c306a71befdc972f378c04028957c133235dd59d325e23669190a35050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000825111610e555760405162461bcd60e51b815260040161025890613b6a565b610e5e8261238d565b610e7a5760405162461bcd60e51b815260040161025890613974565b6000815111610e9b5760405162461bcd60e51b815260040161025890613867565b606081516001600160401b0381118015610eb457600080fd5b50604051908082528060200260200182016040528015610ede578160200160208202803683370190505b5090506000805b845181101561114f576000858281518110610efc57fe5b60200260200101519050610f1081846123f5565b9250600060038481548110610f2157fe5b60009182526020909120600390910201600281015490915060ff16610f4957610f498161233a565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166316554d6230866040518363ffffffff1660e01b8152600401610f9a9291906135a7565b60606040518083038186803b158015610fb257600080fd5b505afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea9190613523565b50909250905060005b885181101561113e57611004612ff4565b611050868b848151811061101457fe5b602090810291909101810151604080516060810182528a54815260018b01549381019390935260028a015460ff16151590830152908787612490565b90508060400151600014156110655750611136565b61108f8160c001518a848151811061107957fe5b60200260200101516126c990919063ffffffff16565b89838151811061109b57fe5b602002602001018181525050600660008b84815181106110b757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611134576001600660008c85815181106110f457fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b505b600101610ff3565b505060019093019250610ee5915050565b50600061115a6111fa565b905060005b83518110156111f2576111ea6005600087848151811061117b57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b0316838684815181106111c457fe5b60200260200101516040518060600160405280602a8152602001613d32602a91396126ee565b60010161115f565b505050505050565b6000546001600160a01b031690565b6112116120e1565b6000546001600160a01b0390811691161461123e5760405162461bcd60e51b815260040161025890613b00565b6000811161125e5760405162461bcd60e51b8152600401610258906139f2565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906112aa908490600401613c7c565b600060405180830381600087803b1580156112c457600080fd5b505af11580156112d8573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb915061132a90339085906004016135a7565b602060405180830381600087803b15801561134457600080fd5b505af1158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c9190613458565b6113985760405162461bcd60e51b8152600401610258906137ac565b50565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166113cd57506000611546565b60008381526001602090815260408083206001600160a01b038089168552908352818420908616845290915290205460ff161561140c57506000611546565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342ce39cb87876040518363ffffffff1660e01b815260040161145d9291906135a7565b60606040518083038186803b15801561147557600080fd5b505afa158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ad9190613523565b925050915081600014156114c657600092505050611546565b6001600160a01b03811630146114e157600092505050611546565b6114e9613043565b5060008581526002602081815260408084206001600160a01b03891685528252928390208351606081018552815460ff161515815260018201549281018390529201549282018390529091611540918591906127b4565b93505050505b9392505050565b6115556120e1565b6000546001600160a01b039081169116146115825760405162461bcd60e51b815260040161025890613b00565b6127108111156115a45760405162461bcd60e51b8152600401610258906138e1565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ff57600080fd5b505afa158015611613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116379190613490565b9050600061166b827f000000000000000000000000000000000000000000000000000000000000000063ffffffff6126c916565b60038054919250600091600019810190811061168357fe5b9060005260206000209060030201905082816000015411156116ae5781815560018101849055611775565b600281015460ff166116c3576116c38161233a565b60408051606081018252838152602081018681526000928201838152600380546001810182559481905292517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9490930293840192909255517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c830155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d909101805460ff19169115159190911790555b7f2803ffe778731e96b0cb4ffdea51f618e2dc70ed59841f65fb6a92296b3960686117a783600163ffffffff6120e516565b856040516117b6929190613c85565b60405180910390a150505050565b61139881600480548060200260200160405190810160405280929190818152602001828054801561181e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611800575b5050505050610e34565b6004818154811061183557fe5b6000918252602090912001546001600160a01b0316905081565b6118576120e1565b6000546001600160a01b039081169116146118845760405162461bcd60e51b815260040161025890613b00565b60405163b384abef60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b384abef906118d29085908590600401613c85565b600060405180830381600087803b1580156118ec57600080fd5b505af11580156111f2573d6000803e3d6000fd5b611908613066565b60036119158360006123f5565b8154811061191f57fe5b60009182526020918290206040805160608101825260039093029091018054835260018101549383019390935260029092015460ff1615159181019190915292915050565b60606119718484846127ca565b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60035490565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a389190613490565b9050611546837f0000000000000000000000000000000000000000000000000000000000000000836127ca565b611a6d613066565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac857600080fd5b505afa158015611adc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b009190613490565b9050611b0b81611900565b91505090565b600160209081526000938452604080852082529284528284209052825290205460ff1681565b611b428383836128cb565b505050565b611b4f6120e1565b6000546001600160a01b03908116911614611b7c5760405162461bcd60e51b815260040161025890613b00565b6001600160a01b0381811660009081526005602052604090205416611bb35760405162461bcd60e51b8152600401610258906139bb565b6001600160a01b03811660009081526006602052604090205460ff1615611bec5760405162461bcd60e51b815260040161025890613809565b600480546001600160a01b03831691906000198101908110611c0a57fe5b6000918252602090912001546001600160a01b031614611cd85760005b600454811015611cd657816001600160a01b031660048281548110611c4857fe5b6000918252602090912001546001600160a01b03161415611cce57600480546000198101908110611c7557fe5b600091825260209091200154600480546001600160a01b039092169183908110611c9b57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611cd6565b600101611c27565b505b6004805480611ce357fe5b60008281526020808220830160001990810180546001600160a01b031990811690915593019093556001600160a01b03841680825260059093526040808220805490931690925590517fe5b28609ccc5cc2a3e4736068efad3e54a27ff556e326920df4213a66efbf5ab9190a250565b610bf982826004805480602002602001604051908101604052809291908181526020018280548015611dae57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d90575b50505050506128cb565b6002602081815260009384526040808520909152918352912080546001820154919092015460ff9092169183565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff1615611e1957506000611f89565b60405163133c617560e31b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906399e30ba890611e6a90309088906004016135a7565b60206040518083038186803b158015611e8257600080fd5b505afa158015611e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eba9190613490565b905080611ecb576000915050611f89565b6040516394cee7b360e01b81526000906001600160a01b038516906394cee7b390611efa908890600401613c7c565b60206040518083038186803b158015611f1257600080fd5b505afa158015611f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4a9190613490565b905080611f5c57600092505050611f89565b611f84670de0b6b3a7640000611f78838563ffffffff612b9916565b9063ffffffff612bd316565b925050505b92915050565b6060611ffe8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061212792505050565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6120336120e1565b6000546001600160a01b039081169116146120605760405162461bcd60e51b815260040161025890613b00565b6001600160a01b0381166120865760405162461bcd60e51b8152600401610258906136fa565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b600061154683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c15565b60608061213f83518551612b9990919063ffffffff16565b6001600160401b038111801561215457600080fd5b5060405190808252806020026020018201604052801561218e57816020015b61217b613089565b8152602001906001900390816121735790505b5090506000805b855181101561229c5760005b85518110156122935760006121dc8884815181106121bb57fe5b60200260200101518884815181106121cf57fe5b6020026020010151611de6565b9050801561228a5760405180608001604052808985815181106121fb57fe5b6020026020010151815260200188848151811061221457fe5b60200260200101516001600160a01b03168152602001828152602001600560008a868151811061224057fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002054169052855186908690811061227857fe5b60209081029190910101526001909301925b506001016121a1565b50600101612195565b506060816001600160401b03811180156122b557600080fd5b506040519080825280602002602001820160405280156122ef57816020015b6122dc613089565b8152602001906001900390816122d45790505b50905060005b828110156123305783818151811061230957fe5b602002602001015182828151811061231d57fe5b60209081029190910101526001016122f5565b5095945050505050565b60028101805460ff191660019081179091558154908201546040517f0aaa05fba10caab20c7dfcd757223e489dbd2313a5e1add54bca74aceaf1781992612382929091613c85565b60405180910390a150565b60008060019050600183511115611f895760005b60018451038110156123ee578381600101815181106123bc57fe5b60200260200101518482815181106123d057fe5b6020026020010151106123e657600091506123ee565b6001016123a1565b5092915050565b6000826003838154811061240557fe5b9060005260206000209060030201600001541115612424575080611f89565b60035482905b80821015612484576000612447838301600263ffffffff612bd316565b9050856003828154811061245757fe5b90600052602060002090600302016000015411156124775780915061247e565b8060010192505b5061242a565b60001901949350505050565b612498612ff4565b6001600160a01b0385168082526000906124b3908890611de6565b90508015612330576001600160a01b0380871660009081526005602090815260409182902054831690850152835190516353fa2eb760e01b81529116906353fa2eb7906125069030908b906004016135a7565b602060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125589190613490565b5060408201819052602085015161257e9061271090611f7890849063ffffffff612b9916565b6060830181905260408301516125999163ffffffff6120e516565b60808301526125bc836125b2868263ffffffff6126c916565b84608001516127b4565b60a0830181905260408301516125d79163ffffffff6120e516565b60c083015260408051606081018252600180825260a0850151602080840191825283850188815260008d815260028084528782206001600160a01b038f168352909352959095209351845460ff191690151517845590519183019190915591519101556126426111fa565b6001600160a01b0316866001600160a01b0316887f42d462aded8303289cfe9efdb997119f4921308595d9db5dd7d500236d523d21856020015186604001518a6020015188606001516126a68a606001518b60c001516120e590919063ffffffff16565b6040516126b7959493929190613653565b60405180910390a45095945050505050565b6000828201838110156115465760405162461bcd60e51b815260040161025890613740565b816126f8576127ae565b6001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156127a3576000836001600160a01b0316836040516127369061356c565b60006040518083038185875af1925050503d8060008114612773576040519150601f19603f3d011682016040523d82523d6000602084013e612778565b606091505b5050905080829061279c5760405162461bcd60e51b81526004016102589190613681565b50506127ae565b6127ae848484612c41565b50505050565b600061197183611f78868563ffffffff612b9916565b606060006127ef60016127e3858763ffffffff6120e516565b9063ffffffff6126c916565b90506060816001600160401b038111801561280957600080fd5b50604051908082528060200260200182016040528015612833578160200160208202803683370190505b5090506000855b858111612865578083838151811061284e57fe5b60209081029190910101526001918201910161283a565b50611540878360048054806020026020016040519081016040528092919081815260200182805480156128c157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116128a3575b5050505050612c97565b60008251116128ec5760405162461bcd60e51b815260040161025890613ba1565b600081511161290d5760405162461bcd60e51b815260040161025890613abd565b606081516001600160401b038111801561292657600080fd5b50604051908082528060200260200182016040528015612950578160200160208202803683370190505b50905060005b8351811015612b0257600084828151811061296d57fe5b6020026020010151905060008090505b8451811015612af85760006129a6888488858151811061299957fe5b602002602001015161139b565b90506000600560008885815181106129ba57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002054169050816129f0575050612af0565b612a008287858151811061107957fe5b868481518110612a0c57fe5b6020908102919091018101919091526000858152600180835260408083206001600160a01b038e16845290935291812089519091908a9087908110612a4d57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550868381518110612a9857fe5b60200260200101516001600160a01b0316896001600160a01b0316857fd2bf01930193426d917e596a306efa79f82bfc800d1edfa31468cf0a2a7454e78486604051612ae59291906135a7565b60405180910390a450505b60010161297d565b5050600101612956565b5060005b81518110156108fa57612b9160056000858481518110612b2257fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031686848481518110612b6b57fe5b60200260200101516040518060600160405280602a8152602001613d5c602a91396126ee565b600101612b06565b600082612ba857506000611f89565b82820282848281612bb557fe5b04146115465760405162461bcd60e51b815260040161025890613a29565b600061154683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e9f565b60008184841115612c395760405162461bcd60e51b81526004016102589190613681565b505050900390565b611b428363a9059cbb60e01b8484604051602401612c609291906135a7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ed6565b606080612caf83518551612b9990919063ffffffff16565b6001600160401b0381118015612cc457600080fd5b50604051908082528060200260200182016040528015612cfe57816020015b612ceb613089565b815260200190600190039081612ce35790505b5090506000805b8551811015612e005760005b8551811015612df7576000612d4089898581518110612d2c57fe5b602002602001015189858151811061299957fe5b90508015612dee576040518060800160405280898581518110612d5f57fe5b60200260200101518152602001888481518110612d7857fe5b60200260200101516001600160a01b03168152602001828152602001600560008a8681518110612da457fe5b6020908102919091018101516001600160a01b03908116835290820192909252604001600020541690528551869086908110612ddc57fe5b60209081029190910101526001909301925b50600101612d11565b50600101612d05565b506060816001600160401b0381118015612e1957600080fd5b50604051908082528060200260200182016040528015612e5357816020015b612e40613089565b815260200190600190039081612e385790505b50905060005b82811015612e9457838181518110612e6d57fe5b6020026020010151828281518110612e8157fe5b6020908102919091010152600101612e59565b509695505050505050565b60008183612ec05760405162461bcd60e51b81526004016102589190613681565b506000838581612ecc57fe5b0495945050505050565b612ee8826001600160a01b0316612fbb565b612f045760405162461bcd60e51b815260040161025890613c22565b60006060836001600160a01b031683604051612f209190613550565b6000604051808303816000865af19150503d8060008114612f5d576040519150601f19603f3d011682016040523d82523d6000602084013e612f62565b606091505b509150915081612f845760405162461bcd60e51b815260040161025890613777565b8051156127ae5780806020019051810190612f9f9190613458565b6127ae5760405162461bcd60e51b815260040161025890613bd8565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611971575050151592915050565b6040518060e0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806060016040528060001515815260200160008152602001600081525090565b604051806060016040528060008152602001600081526020016000151581525090565b60405180608001604052806000815260200160006001600160a01b031681526020016000815260200160006001600160a01b031681525090565b60008083601f8401126130d4578182fd5b5081356001600160401b038111156130ea578182fd5b602083019150836020808302850101111561310457600080fd5b9250929050565b600082601f83011261311b578081fd5b813561312e61312982613cd1565b613cab565b81815291506020808301908481018184028601820187101561314f57600080fd5b60005b8481101561317757813561316581613d1c565b84529282019290820190600101613152565b505050505092915050565b600082601f830112613192578081fd5b81356131a061312982613cd1565b8181529150602080830190848101818402860182018710156131c157600080fd5b60005b84811015613177578135845292820192908201906001016131c4565b6000602082840312156131f1578081fd5b813561154681613d1c565b6000806040838503121561320e578081fd5b823561321981613d1c565b915060208301356001600160401b03811115613233578182fd5b61323f85828601613182565b9150509250929050565b60008060006060848603121561325d578081fd5b833561326881613d1c565b925060208401356001600160401b0380821115613283578283fd5b61328f87838801613182565b935060408601359150808211156132a4578283fd5b506132b18682870161310b565b9150509250925092565b600080604083850312156132cd578182fd5b82356132d881613d1c565b915060208301356132e881613d1c565b809150509250929050565b600080600060608486031215613307578283fd5b833561331281613d1c565b925060208401359150604084013561332981613d1c565b809150509250925092565b600080600060608486031215613348578283fd5b833561335381613d1c565b95602085013595506040909401359392505050565b6000806000806040858703121561337d578081fd5b84356001600160401b0380821115613393578283fd5b61339f888389016130c3565b909650945060208701359150808211156133b7578283fd5b506133c4878288016130c3565b95989497509550505050565b6000602082840312156133e1578081fd5b81356001600160401b038111156133f6578182fd5b61197184828501613182565b60008060408385031215613414578182fd5b82356001600160401b038082111561342a578384fd5b61343686838701613182565b9350602085013591508082111561344b578283fd5b5061323f8582860161310b565b600060208284031215613469578081fd5b81518015158114611546578182fd5b600060208284031215613489578081fd5b5035919050565b6000602082840312156134a1578081fd5b5051919050565b600080604083850312156134ba578182fd5b8235915060208301356132e881613d1c565b6000806000606084860312156134e0578081fd5b8335925060208401356134f281613d1c565b9150604084013561332981613d1c565b60008060408385031215613514578182fd5b50508035926020909101359150565b600080600060608486031215613537578081fd5b8351925060208401519150604084015161332981613d1c565b60008251613562818460208701613cf0565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561362357815180518552868101516001600160a01b039081168887015286820151878701526060918201511690850152608090930192908501906001016135dd565b5091979650505050505050565b901515815260200190565b92151583526020830191909152604082015260600190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b60006020825282518060208401526136a0816040850160208701613cf0565b601f01601f19169190910160400192915050565b60208082526026908201527f6f6e6c7920616363657074204554482066726f6d2061204b796265724665654860408201526530b7323632b960d11b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b60208082526037908201527f6d617374657257697468647261773a2063616e206e6f74207472616e7366657260408201527f206b6e6320746f2074686520706f6f6c206d6173746572000000000000000000606082015260800190565b602080825260409082018190527f72656d6f766546656548616e646c65723a2063616e206e6f742072656d6f7665908201527f2046656548616e646c6572207375636365737366756c6c7920636c61696d6564606082015260800190565b60208082526023908201527f63524d61737465723a205f66656548616e646c657247726f75702072657175696040820152621c995960ea1b606082015260800190565b6020808252601c908201527f61646446656548616e646c65723a20616c726561647920616464656400000000604082015260600190565b6020808252602e908201527f636f6d6d69744e65774665653a2044656c65676174696f6e204665652067726560408201526d61746572207468616e203130302560901b606082015260800190565b60208082526025908201527f61646446656548616e646c65723a205f66656548616e646c6572206973206d696040820152647373696e6760d81b606082015260800190565b60208082526027908201527f63524d61737465723a206f7264657220616e6420756e697175656e6573732072604082015266195c5d5a5c995960ca1b606082015260800190565b6020808252601b908201527f72656d6f766546656548616e646c65723a206e6f742061646465640000000000604082015260600190565b6020808252601b908201527f6d617374657257697468647261773a20616d6f756e7420697320300000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526033908201527f6d61737465724465706f7369743a20616d6f756e7420746f206465706f7369746040820152722073686f756c6420626520706f73697469766560681b606082015260800190565b60208082526023908201527f63524d656d6265723a205f66656548616e646c657247726f75702072657175696040820152621c995960ea1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f6d61737465724465706f7369743a2063616e206e6f742067657420746f6b656e604082015260600190565b6020808252601e908201527f63524d61737465723a205f65706f636847726f75702072657175697265640000604082015260600190565b6020808252601e908201527f63524d656d6265723a205f65706f636847726f75702072657175697265640000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b815181526020808301519082015260409182015115159181019190915260600190565b90815260200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b6040518181016001600160401b0381118282101715613cc957600080fd5b604052919050565b60006001600160401b03821115613ce6578081fd5b5060209081020190565b60005b83811015613d0b578181015183820152602001613cf3565b838111156127ae5750506000910152565b6001600160a01b038116811461139857600080fdfe63524d61737465723a20706f6f6c4d6173746572207368617265207472616e73666572206661696c656463524d656d6265723a20706f6f6c4d656d626572207368617265207472616e73666572206661696c6564a2646970667358221220a31e73993b3a8aaa643e42d87d72b52f539766643d1d9da1e76205c2c983341a64736f6c6343000606003300000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d3d2b5643e506c6d9b7099e9116d7aaa941114fe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Deployed Bytecode
0x6080604052600436106102085760003560e01c8063a969b18611610118578063c92d7169116100a0578063de37b7a11161006f578063de37b7a114610608578063dec3655414610637578063e25208e314610657578063f0359d1b14610677578063f2fde38b1461068c57610263565b8063c92d716914610588578063d172d3a3146105a8578063d2f31c39146105c8578063d4b94901146105e857610263565b8063b8a4aeaf116100e7578063b8a4aeaf14610509578063ba2d373c14610529578063c08da7a11461053e578063c5e6e35714610553578063c5f0a58f1461057357610263565b8063a969b1861461047c578063b0cd498b1461049c578063b384abef146104bc578063b3e9ba27146104dc57610263565b80634edd0d671161019b5780638769e3241161016a5780638769e324146103e75780638da5cb5b146104075780639d21ce9c1461041c5780639e3853ec1461043c5780639faf1d511461045c57610263565b80634edd0d6714610388578063715018a61461039d5780637ee1506d146103b2578063811c7fe2146103d257610263565b806335f8aa9b116101d757806335f8aa9b1461030f578063413f92c01461032457806341682744146103515780634d8f51051461037357610263565b8063026625851461026857806309f67b3a1461028857806322b143fb146102be57806329f6ff41146102e057610263565b3661026357336000908152600560205260409020546001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146102615760405162461bcd60e51b8152600401610258906136b4565b60405180910390fd5b005b600080fd5b34801561027457600080fd5b50610261610283366004613478565b6106ac565b34801561029457600080fd5b506102a86102a33660046131e0565b610901565b6040516102b59190613630565b60405180910390f35b3480156102ca57600080fd5b506102d3610916565b6040516102b591906135c0565b3480156102ec57600080fd5b506103006102fb366004613478565b610ae4565b6040516102b593929190613c93565b34801561031b57600080fd5b50610261610b17565b34801561033057600080fd5b5061034461033f3660046131e0565b610bfd565b6040516102b5919061356f565b34801561035d57600080fd5b50610366610c18565b6040516102b59190613c7c565b34801561037f57600080fd5b50610344610c3c565b34801561039457600080fd5b50610366610c60565b3480156103a957600080fd5b50610261610c66565b3480156103be57600080fd5b506102616103cd3660046132bb565b610ce5565b3480156103de57600080fd5b50610344610e10565b3480156103f357600080fd5b50610261610402366004613402565b610e34565b34801561041357600080fd5b506103446111fa565b34801561042857600080fd5b50610261610437366004613478565b611209565b34801561044857600080fd5b506103666104573660046132f3565b61139b565b34801561046857600080fd5b50610261610477366004613478565b61154d565b34801561048857600080fd5b506102616104973660046133d0565b6117c4565b3480156104a857600080fd5b506103446104b7366004613478565b611828565b3480156104c857600080fd5b506102616104d7366004613502565b61184f565b3480156104e857600080fd5b506104fc6104f7366004613478565b611900565b6040516102b59190613c59565b34801561051557600080fd5b506102d3610524366004613334565b611964565b34801561053557600080fd5b50610366611979565b34801561054a57600080fd5b5061036661199d565b34801561055f57600080fd5b506102d361056e3660046131e0565b6119a3565b34801561057f57600080fd5b506104fc611a65565b34801561059457600080fd5b506102a86105a33660046134cc565b611b11565b3480156105b457600080fd5b506102616105c3366004613249565b611b37565b3480156105d457600080fd5b506102616105e33660046131e0565b611b47565b3480156105f457600080fd5b506102616106033660046131fc565b611d53565b34801561061457600080fd5b506106286106233660046134a8565b611db8565b6040516102b59392919061363b565b34801561064357600080fd5b506103666106523660046134a8565b611de6565b34801561066357600080fd5b506102d3610672366004613368565b611f8f565b34801561068357600080fd5b50610344612007565b34801561069857600080fd5b506102616106a73660046131e0565b61202b565b6106b46120e1565b6000546001600160a01b039081169116146106e15760405162461bcd60e51b815260040161025890613b00565b600081116107015760405162461bcd60e51b815260040161025890613a6a565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd20016906323b872dd9061075190339030908690600401613583565b602060405180830381600087803b15801561076b57600080fd5b505af115801561077f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a39190613458565b6107bf5760405162461bcd60e51b815260040161025890613b35565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200169063095ea7b39061082d907f000000000000000000000000ecf0bdb7b3f349abfd68c3563678124c5e8aaea39085906004016135a7565b602060405180830381600087803b15801561084757600080fd5b505af115801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190613458565b5060405163b6b55f2560e01b81526001600160a01b037f000000000000000000000000ecf0bdb7b3f349abfd68c3563678124c5e8aaea3169063b6b55f25906108cc908490600401613c7c565b600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b5050505050565b60066020526000908152604090205460ff1681565b606060007f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e96001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613490565b905060006109df827f000000000000000000000000000000000000000000000000000000000000000363ffffffff6120e516565b90506060816001600160401b03811180156109f957600080fd5b50604051908082528060200260200182016040528015610a23578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000035b84811015610a765780838381518110610a5f57fe5b602090810291909101015260019182019101610a4a565b50610adb826004805480602002602001604051908101604052809291908181526020018280548015610ad157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ab3575b5050505050612127565b94505050505090565b60038181548110610af157fe5b600091825260209091206003909102018054600182015460029092015490925060ff1683565b60038054600091906000198101908110610b2d57fe5b9060005260206000209060030201905060007f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e96001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9857600080fd5b505afa158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd09190613490565b905080826000015411158015610beb5750600282015460ff16155b15610bf957610bf98261233a565b5050565b6005602052600090815260409020546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000381565b7f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e981565b60045490565b610c6e6120e1565b6000546001600160a01b03908116911614610c9b5760405162461bcd60e51b815260040161025890613b00565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610ced6120e1565b6000546001600160a01b03908116911614610d1a5760405162461bcd60e51b815260040161025890613b00565b6001600160a01b038216610d405760405162461bcd60e51b81526004016102589061392f565b6001600160a01b038281166000908152600560205260409020541615610d785760405162461bcd60e51b8152600401610258906138aa565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b038085166001600160a01b03199283168117909355600083815260056020526040808220805487851695169490941793849055519290911692917fff2847fd2ae19fe4c306a71befdc972f378c04028957c133235dd59d325e23669190a35050565b7f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd20081565b6000825111610e555760405162461bcd60e51b815260040161025890613b6a565b610e5e8261238d565b610e7a5760405162461bcd60e51b815260040161025890613974565b6000815111610e9b5760405162461bcd60e51b815260040161025890613867565b606081516001600160401b0381118015610eb457600080fd5b50604051908082528060200260200182016040528015610ede578160200160208202803683370190505b5090506000805b845181101561114f576000858281518110610efc57fe5b60200260200101519050610f1081846123f5565b9250600060038481548110610f2157fe5b60009182526020909120600390910201600281015490915060ff16610f4957610f498161233a565b6000807f000000000000000000000000ecf0bdb7b3f349abfd68c3563678124c5e8aaea36001600160a01b03166316554d6230866040518363ffffffff1660e01b8152600401610f9a9291906135a7565b60606040518083038186803b158015610fb257600080fd5b505afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea9190613523565b50909250905060005b885181101561113e57611004612ff4565b611050868b848151811061101457fe5b602090810291909101810151604080516060810182528a54815260018b01549381019390935260028a015460ff16151590830152908787612490565b90508060400151600014156110655750611136565b61108f8160c001518a848151811061107957fe5b60200260200101516126c990919063ffffffff16565b89838151811061109b57fe5b602002602001018181525050600660008b84815181106110b757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611134576001600660008c85815181106110f457fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b505b600101610ff3565b505060019093019250610ee5915050565b50600061115a6111fa565b905060005b83518110156111f2576111ea6005600087848151811061117b57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b0316838684815181106111c457fe5b60200260200101516040518060600160405280602a8152602001613d32602a91396126ee565b60010161115f565b505050505050565b6000546001600160a01b031690565b6112116120e1565b6000546001600160a01b0390811691161461123e5760405162461bcd60e51b815260040161025890613b00565b6000811161125e5760405162461bcd60e51b8152600401610258906139f2565b604051632e1a7d4d60e01b81526001600160a01b037f000000000000000000000000ecf0bdb7b3f349abfd68c3563678124c5e8aaea31690632e1a7d4d906112aa908490600401613c7c565b600060405180830381600087803b1580156112c457600080fd5b505af11580156112d8573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd20016925063a9059cbb915061132a90339085906004016135a7565b602060405180830381600087803b15801561134457600080fd5b505af1158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c9190613458565b6113985760405162461bcd60e51b8152600401610258906137ac565b50565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff166113cd57506000611546565b60008381526001602090815260408083206001600160a01b038089168552908352818420908616845290915290205460ff161561140c57506000611546565b6000807f000000000000000000000000ecf0bdb7b3f349abfd68c3563678124c5e8aaea36001600160a01b03166342ce39cb87876040518363ffffffff1660e01b815260040161145d9291906135a7565b60606040518083038186803b15801561147557600080fd5b505afa158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ad9190613523565b925050915081600014156114c657600092505050611546565b6001600160a01b03811630146114e157600092505050611546565b6114e9613043565b5060008581526002602081815260408084206001600160a01b03891685528252928390208351606081018552815460ff161515815260018201549281018390529201549282018390529091611540918591906127b4565b93505050505b9392505050565b6115556120e1565b6000546001600160a01b039081169116146115825760405162461bcd60e51b815260040161025890613b00565b6127108111156115a45760405162461bcd60e51b8152600401610258906138e1565b60007f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e96001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ff57600080fd5b505afa158015611613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116379190613490565b9050600061166b827f000000000000000000000000000000000000000000000000000000000000000263ffffffff6126c916565b60038054919250600091600019810190811061168357fe5b9060005260206000209060030201905082816000015411156116ae5781815560018101849055611775565b600281015460ff166116c3576116c38161233a565b60408051606081018252838152602081018681526000928201838152600380546001810182559481905292517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9490930293840192909255517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c830155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d909101805460ff19169115159190911790555b7f2803ffe778731e96b0cb4ffdea51f618e2dc70ed59841f65fb6a92296b3960686117a783600163ffffffff6120e516565b856040516117b6929190613c85565b60405180910390a150505050565b61139881600480548060200260200160405190810160405280929190818152602001828054801561181e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611800575b5050505050610e34565b6004818154811061183557fe5b6000918252602090912001546001600160a01b0316905081565b6118576120e1565b6000546001600160a01b039081169116146118845760405162461bcd60e51b815260040161025890613b00565b60405163b384abef60e01b81526001600160a01b037f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e9169063b384abef906118d29085908590600401613c85565b600060405180830381600087803b1580156118ec57600080fd5b505af11580156111f2573d6000803e3d6000fd5b611908613066565b60036119158360006123f5565b8154811061191f57fe5b60009182526020918290206040805160608101825260039093029091018054835260018101549383019390935260029092015460ff1615159181019190915292915050565b60606119718484846127ca565b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000281565b60035490565b606060007f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e96001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0057600080fd5b505afa158015611a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a389190613490565b9050611546837f0000000000000000000000000000000000000000000000000000000000000003836127ca565b611a6d613066565b60007f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e96001600160a01b0316634408d2ba6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac857600080fd5b505afa158015611adc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b009190613490565b9050611b0b81611900565b91505090565b600160209081526000938452604080852082529284528284209052825290205460ff1681565b611b428383836128cb565b505050565b611b4f6120e1565b6000546001600160a01b03908116911614611b7c5760405162461bcd60e51b815260040161025890613b00565b6001600160a01b0381811660009081526005602052604090205416611bb35760405162461bcd60e51b8152600401610258906139bb565b6001600160a01b03811660009081526006602052604090205460ff1615611bec5760405162461bcd60e51b815260040161025890613809565b600480546001600160a01b03831691906000198101908110611c0a57fe5b6000918252602090912001546001600160a01b031614611cd85760005b600454811015611cd657816001600160a01b031660048281548110611c4857fe5b6000918252602090912001546001600160a01b03161415611cce57600480546000198101908110611c7557fe5b600091825260209091200154600480546001600160a01b039092169183908110611c9b57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611cd6565b600101611c27565b505b6004805480611ce357fe5b60008281526020808220830160001990810180546001600160a01b031990811690915593019093556001600160a01b03841680825260059093526040808220805490931690925590517fe5b28609ccc5cc2a3e4736068efad3e54a27ff556e326920df4213a66efbf5ab9190a250565b610bf982826004805480602002602001604051908101604052809291908181526020018280548015611dae57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d90575b50505050506128cb565b6002602081815260009384526040808520909152918352912080546001820154919092015460ff9092169183565b60008281526002602090815260408083206001600160a01b038516845290915281205460ff1615611e1957506000611f89565b60405163133c617560e31b81526000906001600160a01b037f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e916906399e30ba890611e6a90309088906004016135a7565b60206040518083038186803b158015611e8257600080fd5b505afa158015611e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eba9190613490565b905080611ecb576000915050611f89565b6040516394cee7b360e01b81526000906001600160a01b038516906394cee7b390611efa908890600401613c7c565b60206040518083038186803b158015611f1257600080fd5b505afa158015611f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4a9190613490565b905080611f5c57600092505050611f89565b611f84670de0b6b3a7640000611f78838563ffffffff612b9916565b9063ffffffff612bd316565b925050505b92915050565b6060611ffe8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525061212792505050565b95945050505050565b7f000000000000000000000000ecf0bdb7b3f349abfd68c3563678124c5e8aaea381565b6120336120e1565b6000546001600160a01b039081169116146120605760405162461bcd60e51b815260040161025890613b00565b6001600160a01b0381166120865760405162461bcd60e51b8152600401610258906136fa565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b600061154683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c15565b60608061213f83518551612b9990919063ffffffff16565b6001600160401b038111801561215457600080fd5b5060405190808252806020026020018201604052801561218e57816020015b61217b613089565b8152602001906001900390816121735790505b5090506000805b855181101561229c5760005b85518110156122935760006121dc8884815181106121bb57fe5b60200260200101518884815181106121cf57fe5b6020026020010151611de6565b9050801561228a5760405180608001604052808985815181106121fb57fe5b6020026020010151815260200188848151811061221457fe5b60200260200101516001600160a01b03168152602001828152602001600560008a868151811061224057fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002054169052855186908690811061227857fe5b60209081029190910101526001909301925b506001016121a1565b50600101612195565b506060816001600160401b03811180156122b557600080fd5b506040519080825280602002602001820160405280156122ef57816020015b6122dc613089565b8152602001906001900390816122d45790505b50905060005b828110156123305783818151811061230957fe5b602002602001015182828151811061231d57fe5b60209081029190910101526001016122f5565b5095945050505050565b60028101805460ff191660019081179091558154908201546040517f0aaa05fba10caab20c7dfcd757223e489dbd2313a5e1add54bca74aceaf1781992612382929091613c85565b60405180910390a150565b60008060019050600183511115611f895760005b60018451038110156123ee578381600101815181106123bc57fe5b60200260200101518482815181106123d057fe5b6020026020010151106123e657600091506123ee565b6001016123a1565b5092915050565b6000826003838154811061240557fe5b9060005260206000209060030201600001541115612424575080611f89565b60035482905b80821015612484576000612447838301600263ffffffff612bd316565b9050856003828154811061245757fe5b90600052602060002090600302016000015411156124775780915061247e565b8060010192505b5061242a565b60001901949350505050565b612498612ff4565b6001600160a01b0385168082526000906124b3908890611de6565b90508015612330576001600160a01b0380871660009081526005602090815260409182902054831690850152835190516353fa2eb760e01b81529116906353fa2eb7906125069030908b906004016135a7565b602060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125589190613490565b5060408201819052602085015161257e9061271090611f7890849063ffffffff612b9916565b6060830181905260408301516125999163ffffffff6120e516565b60808301526125bc836125b2868263ffffffff6126c916565b84608001516127b4565b60a0830181905260408301516125d79163ffffffff6120e516565b60c083015260408051606081018252600180825260a0850151602080840191825283850188815260008d815260028084528782206001600160a01b038f168352909352959095209351845460ff191690151517845590519183019190915591519101556126426111fa565b6001600160a01b0316866001600160a01b0316887f42d462aded8303289cfe9efdb997119f4921308595d9db5dd7d500236d523d21856020015186604001518a6020015188606001516126a68a606001518b60c001516120e590919063ffffffff16565b6040516126b7959493929190613653565b60405180910390a45095945050505050565b6000828201838110156115465760405162461bcd60e51b815260040161025890613740565b816126f8576127ae565b6001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156127a3576000836001600160a01b0316836040516127369061356c565b60006040518083038185875af1925050503d8060008114612773576040519150601f19603f3d011682016040523d82523d6000602084013e612778565b606091505b5050905080829061279c5760405162461bcd60e51b81526004016102589190613681565b50506127ae565b6127ae848484612c41565b50505050565b600061197183611f78868563ffffffff612b9916565b606060006127ef60016127e3858763ffffffff6120e516565b9063ffffffff6126c916565b90506060816001600160401b038111801561280957600080fd5b50604051908082528060200260200182016040528015612833578160200160208202803683370190505b5090506000855b858111612865578083838151811061284e57fe5b60209081029190910101526001918201910161283a565b50611540878360048054806020026020016040519081016040528092919081815260200182805480156128c157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116128a3575b5050505050612c97565b60008251116128ec5760405162461bcd60e51b815260040161025890613ba1565b600081511161290d5760405162461bcd60e51b815260040161025890613abd565b606081516001600160401b038111801561292657600080fd5b50604051908082528060200260200182016040528015612950578160200160208202803683370190505b50905060005b8351811015612b0257600084828151811061296d57fe5b6020026020010151905060008090505b8451811015612af85760006129a6888488858151811061299957fe5b602002602001015161139b565b90506000600560008885815181106129ba57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002054169050816129f0575050612af0565b612a008287858151811061107957fe5b868481518110612a0c57fe5b6020908102919091018101919091526000858152600180835260408083206001600160a01b038e16845290935291812089519091908a9087908110612a4d57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550868381518110612a9857fe5b60200260200101516001600160a01b0316896001600160a01b0316857fd2bf01930193426d917e596a306efa79f82bfc800d1edfa31468cf0a2a7454e78486604051612ae59291906135a7565b60405180910390a450505b60010161297d565b5050600101612956565b5060005b81518110156108fa57612b9160056000858481518110612b2257fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031686848481518110612b6b57fe5b60200260200101516040518060600160405280602a8152602001613d5c602a91396126ee565b600101612b06565b600082612ba857506000611f89565b82820282848281612bb557fe5b04146115465760405162461bcd60e51b815260040161025890613a29565b600061154683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e9f565b60008184841115612c395760405162461bcd60e51b81526004016102589190613681565b505050900390565b611b428363a9059cbb60e01b8484604051602401612c609291906135a7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ed6565b606080612caf83518551612b9990919063ffffffff16565b6001600160401b0381118015612cc457600080fd5b50604051908082528060200260200182016040528015612cfe57816020015b612ceb613089565b815260200190600190039081612ce35790505b5090506000805b8551811015612e005760005b8551811015612df7576000612d4089898581518110612d2c57fe5b602002602001015189858151811061299957fe5b90508015612dee576040518060800160405280898581518110612d5f57fe5b60200260200101518152602001888481518110612d7857fe5b60200260200101516001600160a01b03168152602001828152602001600560008a8681518110612da457fe5b6020908102919091018101516001600160a01b03908116835290820192909252604001600020541690528551869086908110612ddc57fe5b60209081029190910101526001909301925b50600101612d11565b50600101612d05565b506060816001600160401b0381118015612e1957600080fd5b50604051908082528060200260200182016040528015612e5357816020015b612e40613089565b815260200190600190039081612e385790505b50905060005b82811015612e9457838181518110612e6d57fe5b6020026020010151828281518110612e8157fe5b6020908102919091010152600101612e59565b509695505050505050565b60008183612ec05760405162461bcd60e51b81526004016102589190613681565b506000838581612ecc57fe5b0495945050505050565b612ee8826001600160a01b0316612fbb565b612f045760405162461bcd60e51b815260040161025890613c22565b60006060836001600160a01b031683604051612f209190613550565b6000604051808303816000865af19150503d8060008114612f5d576040519150601f19603f3d011682016040523d82523d6000602084013e612f62565b606091505b509150915081612f845760405162461bcd60e51b815260040161025890613777565b8051156127ae5780806020019051810190612f9f9190613458565b6127ae5760405162461bcd60e51b815260040161025890613bd8565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611971575050151592915050565b6040518060e0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806060016040528060001515815260200160008152602001600081525090565b604051806060016040528060008152602001600081526020016000151581525090565b60405180608001604052806000815260200160006001600160a01b031681526020016000815260200160006001600160a01b031681525090565b60008083601f8401126130d4578182fd5b5081356001600160401b038111156130ea578182fd5b602083019150836020808302850101111561310457600080fd5b9250929050565b600082601f83011261311b578081fd5b813561312e61312982613cd1565b613cab565b81815291506020808301908481018184028601820187101561314f57600080fd5b60005b8481101561317757813561316581613d1c565b84529282019290820190600101613152565b505050505092915050565b600082601f830112613192578081fd5b81356131a061312982613cd1565b8181529150602080830190848101818402860182018710156131c157600080fd5b60005b84811015613177578135845292820192908201906001016131c4565b6000602082840312156131f1578081fd5b813561154681613d1c565b6000806040838503121561320e578081fd5b823561321981613d1c565b915060208301356001600160401b03811115613233578182fd5b61323f85828601613182565b9150509250929050565b60008060006060848603121561325d578081fd5b833561326881613d1c565b925060208401356001600160401b0380821115613283578283fd5b61328f87838801613182565b935060408601359150808211156132a4578283fd5b506132b18682870161310b565b9150509250925092565b600080604083850312156132cd578182fd5b82356132d881613d1c565b915060208301356132e881613d1c565b809150509250929050565b600080600060608486031215613307578283fd5b833561331281613d1c565b925060208401359150604084013561332981613d1c565b809150509250925092565b600080600060608486031215613348578283fd5b833561335381613d1c565b95602085013595506040909401359392505050565b6000806000806040858703121561337d578081fd5b84356001600160401b0380821115613393578283fd5b61339f888389016130c3565b909650945060208701359150808211156133b7578283fd5b506133c4878288016130c3565b95989497509550505050565b6000602082840312156133e1578081fd5b81356001600160401b038111156133f6578182fd5b61197184828501613182565b60008060408385031215613414578182fd5b82356001600160401b038082111561342a578384fd5b61343686838701613182565b9350602085013591508082111561344b578283fd5b5061323f8582860161310b565b600060208284031215613469578081fd5b81518015158114611546578182fd5b600060208284031215613489578081fd5b5035919050565b6000602082840312156134a1578081fd5b5051919050565b600080604083850312156134ba578182fd5b8235915060208301356132e881613d1c565b6000806000606084860312156134e0578081fd5b8335925060208401356134f281613d1c565b9150604084013561332981613d1c565b60008060408385031215613514578182fd5b50508035926020909101359150565b600080600060608486031215613537578081fd5b8351925060208401519150604084015161332981613d1c565b60008251613562818460208701613cf0565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561362357815180518552868101516001600160a01b039081168887015286820151878701526060918201511690850152608090930192908501906001016135dd565b5091979650505050505050565b901515815260200190565b92151583526020830191909152604082015260600190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b60006020825282518060208401526136a0816040850160208701613cf0565b601f01601f19169190910160400192915050565b60208082526026908201527f6f6e6c7920616363657074204554482066726f6d2061204b796265724665654860408201526530b7323632b960d11b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b60208082526037908201527f6d617374657257697468647261773a2063616e206e6f74207472616e7366657260408201527f206b6e6320746f2074686520706f6f6c206d6173746572000000000000000000606082015260800190565b602080825260409082018190527f72656d6f766546656548616e646c65723a2063616e206e6f742072656d6f7665908201527f2046656548616e646c6572207375636365737366756c6c7920636c61696d6564606082015260800190565b60208082526023908201527f63524d61737465723a205f66656548616e646c657247726f75702072657175696040820152621c995960ea1b606082015260800190565b6020808252601c908201527f61646446656548616e646c65723a20616c726561647920616464656400000000604082015260600190565b6020808252602e908201527f636f6d6d69744e65774665653a2044656c65676174696f6e204665652067726560408201526d61746572207468616e203130302560901b606082015260800190565b60208082526025908201527f61646446656548616e646c65723a205f66656548616e646c6572206973206d696040820152647373696e6760d81b606082015260800190565b60208082526027908201527f63524d61737465723a206f7264657220616e6420756e697175656e6573732072604082015266195c5d5a5c995960ca1b606082015260800190565b6020808252601b908201527f72656d6f766546656548616e646c65723a206e6f742061646465640000000000604082015260600190565b6020808252601b908201527f6d617374657257697468647261773a20616d6f756e7420697320300000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526033908201527f6d61737465724465706f7369743a20616d6f756e7420746f206465706f7369746040820152722073686f756c6420626520706f73697469766560681b606082015260800190565b60208082526023908201527f63524d656d6265723a205f66656548616e646c657247726f75702072657175696040820152621c995960ea1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f6d61737465724465706f7369743a2063616e206e6f742067657420746f6b656e604082015260600190565b6020808252601e908201527f63524d61737465723a205f65706f636847726f75702072657175697265640000604082015260600190565b6020808252601e908201527f63524d656d6265723a205f65706f636847726f75702072657175697265640000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b815181526020808301519082015260409182015115159181019190915260600190565b90815260200190565b918252602082015260400190565b92835260208301919091521515604082015260600190565b6040518181016001600160401b0381118282101715613cc957600080fd5b604052919050565b60006001600160401b03821115613ce6578081fd5b5060209081020190565b60005b83811015613d0b578181015183820152602001613cf3565b838111156127ae5750506000910152565b6001600160a01b038116811461139857600080fdfe63524d61737465723a20706f6f6c4d6173746572207368617265207472616e73666572206661696c656463524d656d6265723a20706f6f6c4d656d626572207368617265207472616e73666572206661696c6564a2646970667358221220a31e73993b3a8aaa643e42d87d72b52f539766643d1d9da1e76205c2c983341a64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d3d2b5643e506c6d9b7099e9116d7aaa941114fe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
-----Decoded View---------------
Arg [0] : _kyberDao (address): 0x49bdd8854481005bBa4aCEbaBF6e06cD5F6312e9
Arg [1] : _epochNotice (uint256): 2
Arg [2] : _delegationFee (uint256): 100
Arg [3] : _kyberFeeHandlers (address[]): 0xd3d2b5643e506c6d9B7099E9116D7aAa941114fe
Arg [4] : _rewardTokens (address[]): 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e9
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 000000000000000000000000d3d2b5643e506c6d9b7099e9116d7aaa941114fe
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Deployed Bytecode Sourcemap
24454:31313:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55658:10;55634:35;;;;:23;:35;;;;;;-1:-1:-1;;;;;55634:35:0;24763:42;55634:56;55612:144;;;;-1:-1:-1;;;55612:144:0;;;;;;;;;;;;;;;;;24454:31313;;12:1:-1;9;2:12;31831:496:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;31831:496:0;;;;;;;;:::i;25969:59::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;25969:59:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37393:565;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37393:565:0;;;:::i;:::-;;;;;;;;25638:32;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;25638:32:0;;;;;;;;:::i;:::-;;;;;;;;;;34180:294;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34180:294:0;;;:::i;25859:57::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;25859:57:0;;;;;;;;:::i;:::-;;;;;;;;25925:35;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25925:35:0;;;:::i;:::-;;;;;;;;25718:43;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25718:43:0;;;:::i;54778:111::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54778:111:0;;;:::i;17612:148::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17612:148:0;;;:::i;30118:575::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;30118:575:0;;;;;;;;:::i;25679:32::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25679:32:0;;;:::i;40553:2186::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;40553:2186:0;;;;;;;;:::i;16970:79::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16970:79:0;;;:::i;32448:409::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;32448:409:0;;;;;;;;:::i;46116:987::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;46116:987:0;;;;;;;;:::i;33352:761::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;33352:761:0;;;;;;;;:::i;40046:132::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;40046:132:0;;;;;;;;:::i;25820:32::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;25820:32:0;;;;;;;;:::i;33093:121::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;33093:121:0;;;;;;;;:::i;35674:196::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;35674:196:0;;;;;;;;:::i;:::-;;;;;;;;47992:361;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;47992:361:0;;;;;;;;:::i;24900:36::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24900:36:0;;;:::i;54580:109::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54580:109:0;;;:::i;47321:391::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;47321:391:0;;;;;;;;:::i;35977:177::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35977:177:0;;;:::i;25073:102::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;25073:102:0;;;;;;;;:::i;52006:237::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;52006:237:0;;;;;;;;:::i;30799:910::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;30799:910:0;;;;;;;;:::i;51231:192::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;51231:192:0;;;;;;;;:::i;25337:74::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;25337:74:0;;;;;;;;:::i;:::-;;;;;;;;;;36595:670;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;36595:670:0;;;;;;;;:::i;38110:261::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;38110:261:0;;;;;;;;:::i;25768:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25768:43:0;;;:::i;17915:244::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;17915:244:0;;;;;;;;:::i;31831:496::-;17192:12;:10;:12::i;:::-;17182:6;;-1:-1:-1;;;;;17182:6:0;;;:22;;;17174:67;;;;-1:-1:-1;;;17174:67:0;;;;;;;;;31931:1:::1;31922:6;:10;31900:111;;;;-1:-1:-1::0;;;31900:111:0::1;;;;;;;;;32046:56;::::0;-1:-1:-1;;;32046:56:0;;-1:-1:-1;;;;;32046:8:0::1;:21;::::0;::::1;::::0;:56:::1;::::0;32068:10:::1;::::0;32088:4:::1;::::0;32095:6;;32046:56:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32046:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32046:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32046:56:0;;;;;;;;;32024:138;;;;-1:-1:-1::0;;;32024:138:0::1;;;;;;;;;32195:47;::::0;-1:-1:-1;;;32195:47:0;;-1:-1:-1;;;;;32195:8:0::1;:16;::::0;::::1;::::0;:47:::1;::::0;32220:12:::1;::::0;32235:6;;32195:47:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32195:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32195:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32195:47:0;;;;;;;;;-1:-1:-1::0;32291:28:0::1;::::0;-1:-1:-1;;;32291:28:0;;-1:-1:-1;;;;;32291:12:0::1;:20;::::0;::::1;::::0;:28:::1;::::0;32312:6;;32291:28:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32291:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32291:28:0;;;;31831:496:::0;:::o;25969:59::-;;;;;;;;;;;;;;;:::o;37393:565::-;37478:28;37524:20;37547:8;-1:-1:-1;;;;;37547:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37547:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37547:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37547:32:0;;;;;;;;;37524:55;-1:-1:-1;37590:22:0;37615:28;37524:55;37632:10;37615:28;:16;:28;:::i;:::-;37590:53;;37654:27;37698:14;-1:-1:-1;;;;;37684:29:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37684:29:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;37684:29:0;-1:-1:-1;37654:59:0;-1:-1:-1;37724:9:0;37769:10;37748:130;37789:12;37781:5;:20;37748:130;;;37843:5;37827:10;37838:1;37827:13;;;;;;;;;;;;;;;;;:21;37863:3;;;;;37803:7;37748:130;;;;37897:53;37922:10;37934:15;37897:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37897:53:0;;;;;;;;;;;;;;;;;;;;;:24;:53::i;:::-;37890:60;;;;;;37393:565;:::o;25638:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25638:32:0;;;:::o;34180:294::-;34252:14;34267:21;;34225:24;;34252:14;-1:-1:-1;;34267:25:0;;;34252:41;;;;;;;;;;;;;;;;34225:68;;34304:16;34323:8;-1:-1:-1;;;;;34323:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34323:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34323:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34323:32:0;;;;;;;;;34304:51;;34393:8;34372:7;:17;;;:29;;:49;;;;-1:-1:-1;34406:15:0;;;;;;34405:16;34372:49;34368:99;;;34438:17;34447:7;34438:8;:17::i;:::-;34180:294;;:::o;25859:57::-;;;;;;;;;;;;-1:-1:-1;;;;;25859:57:0;;:::o;25925:35::-;;;:::o;25718:43::-;;;:::o;54778:111::-;54859:15;:22;54778:111;:::o;17612:148::-;17192:12;:10;:12::i;:::-;17182:6;;-1:-1:-1;;;;;17182:6:0;;;:22;;;17174:67;;;;-1:-1:-1;;;17174:67:0;;;;;;;;;17719:1:::1;17703:6:::0;;17682:40:::1;::::0;-1:-1:-1;;;;;17703:6:0;;::::1;::::0;17682:40:::1;::::0;17719:1;;17682:40:::1;17750:1;17733:19:::0;;-1:-1:-1;;;;;;17733:19:0::1;::::0;;17612:148::o;30118:575::-;17192:12;:10;:12::i;:::-;17182:6;;-1:-1:-1;;;;;17182:6:0;;;:22;;;17174:67;;;;-1:-1:-1;;;17174:67:0;;;;;;;;;-1:-1:-1;;;;;30258:25:0;::::1;30236:112;;;;-1:-1:-1::0;;;30236:112:0::1;;;;;;;;;-1:-1:-1::0;;;;;30381:36:0;;::::1;30436:1;30381:36:::0;;;:23:::1;:36;::::0;;;;;::::1;:58:::0;30359:136:::1;;;;-1:-1:-1::0;;;30359:136:0::1;;;;;;;;;30508:15;27:10:-1::0;;39:1:::1;23:18:::0;::::1;45:23:::0;;;30508:33:0;::::1;::::0;;-1:-1:-1;;;;;30508:33:0;;::::1;-1:-1:-1::0;;;;;;30508:33:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;30552:36:0;;;:23:::1;30508:33;30552:36:::0;;;;;:51;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;30621:64;30648:36;;;::::1;::::0;30508:33;30621:64:::1;::::0;-1:-1:-1;30621:64:0::1;30118:575:::0;;:::o;25679:32::-;;;:::o;40553:2186::-;40718:1;40697:11;:18;:22;40689:65;;;;-1:-1:-1;;;40689:65:0;;;;;;;;;40787:25;40800:11;40787:12;:25::i;:::-;40765:114;;;;-1:-1:-1;;;40765:114:0;;;;;;;;;40938:1;40912:16;:23;:27;40890:112;;;;-1:-1:-1;;;40890:112:0;;;;;;;;;41015:36;41082:16;:23;-1:-1:-1;;;;;41054:62:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41054:62:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;41054:62:0;-1:-1:-1;41015:101:0;-1:-1:-1;41129:13:0;;41159:1216;41183:11;:18;41179:1;:22;41159:1216;;;41223:14;41240:11;41252:1;41240:14;;;;;;;;;;;;;;41223:31;;41277:33;41296:6;41304:5;41277:18;:33::i;:::-;41269:41;;41325:26;41354:14;41369:5;41354:21;;;;;;;;;;;;;;;;;;;;;41397:17;;;;41354:21;;-1:-1:-1;41397:17:0;;41392:78;;41435:19;41444:9;41435:8;:19::i;:::-;41487:13;41502:22;41530:12;-1:-1:-1;;;;;41530:47:0;;41586:4;41593:6;41530:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41530:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41530:70:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41530:70:0;;;;;;;;;-1:-1:-1;41486:114:0;;-1:-1:-1;41486:114:0;-1:-1:-1;41622:9:0;41617:747;41641:16;:23;41637:1;:27;41617:747;;;41690:28;;:::i;:::-;41721:209;41766:6;41795:16;41812:1;41795:19;;;;;;;;;;;;;;;;;;;41721:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41795:19;41869:5;41897:14;41721:22;:209::i;:::-;41690:240;;41955:10;:23;;;41982:1;41955:28;41951:85;;;42008:8;;;41951:85;42081:94;42130:10;:26;;;42081:19;42101:1;42081:22;;;;;;;;;;;;;;:26;;:94;;;;:::i;:::-;42056:19;42076:1;42056:22;;;;;;;;;;;;;:119;;;;;42201:27;:48;42229:16;42246:1;42229:19;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42201:48:0;;;;;;;;;;;-1:-1:-1;42201:48:0;;;;42196:153;;42325:4;42274:27;:48;42302:16;42319:1;42302:19;;;;;;;;;;;;;;-1:-1:-1;;;;;42274:48:0;-1:-1:-1;;;;;42274:48:0;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;42196:153;41617:747;;41666:3;;41617:747;;;-1:-1:-1;;41203:3:0;;;;;-1:-1:-1;41159:1216:0;;-1:-1:-1;;41159:1216:0;;;42387:18;42408:7;:5;:7::i;:::-;42387:28;-1:-1:-1;42431:9:0;42426:306;42450:19;:26;42446:1;:30;42426:306;;;42498:222;42528:23;:44;42552:16;42569:1;42552:19;;;;;;;;;;;;;;-1:-1:-1;;;;;42528:44:0;-1:-1:-1;;;;;42528:44:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42528:44:0;42591:10;42620:19;42640:1;42620:22;;;;;;;;;;;;;;42498:222;;;;;;;;;;;;;;;;;:11;:222::i;:::-;42478:3;;42426:306;;;;40553:2186;;;;;:::o;16970:79::-;17008:7;17035:6;-1:-1:-1;;;;;17035:6:0;16970:79;:::o;32448:409::-;17192:12;:10;:12::i;:::-;17182:6;;-1:-1:-1;;;;;17182:6:0;;;:22;;;17174:67;;;;-1:-1:-1;;;17174:67:0;;;;;;;;;32535:1:::1;32526:6;:10;32518:50;;;;-1:-1:-1::0;;;32518:50:0::1;;;;;;;;;32620:29;::::0;-1:-1:-1;;;32620:29:0;;-1:-1:-1;;;;;32620:12:0::1;:21;::::0;::::1;::::0;:29:::1;::::0;32642:6;;32620:29:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32620:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;32729:37:0::1;::::0;-1:-1:-1;;;32729:37:0;;-1:-1:-1;;;;;32729:8:0::1;:17;::::0;-1:-1:-1;32729:17:0::1;::::0;-1:-1:-1;32729:37:0::1;::::0;32747:10:::1;::::0;32759:6;;32729:37:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32729:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32729:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32729:37:0;;;;;;;;;32707:142;;;;-1:-1:-1::0;;;32707:142:0::1;;;;;;;;;32448:409:::0;:::o;46116:987::-;46264:7;46303:29;;;:21;:29;;;;;;;;-1:-1:-1;;;;;46303:51:0;;;;;;;;;:65;;;46284:131;;-1:-1:-1;46402:1:0;46395:8;;46284:131;46431:29;;;;:21;:29;;;;;;;;-1:-1:-1;;;;;46431:42:0;;;;;;;;;;;:55;;;;;;;;;;;;;46427:96;;;-1:-1:-1;46510:1:0;46503:8;;46427:96;46536:13;46553:22;46579:12;-1:-1:-1;;;;;46579:26:0;;46620:11;46646:6;46579:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46579:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46579:84:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46579:84:0;;;;;;;;;46535:128;;;;;46680:5;46689:1;46680:10;46676:51;;;46714:1;46707:8;;;;;;46676:51;-1:-1:-1;;;;;46743:31:0;;46769:4;46743:31;46739:72;;46798:1;46791:8;;;;;;46739:72;46829:27;;:::i;:::-;-1:-1:-1;46869:29:0;;;;:21;:29;;;;;;;;-1:-1:-1;;;;;46869:42:0;;;;;;;;;;46829:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46944:151;;46984:5;;46829:82;46944:21;:151::i;:::-;46924:171;;;;;46116:987;;;;;;:::o;33352:761::-;17192:12;:10;:12::i;:::-;17182:6;;-1:-1:-1;;;;;17182:6:0;;;:22;;;17174:67;;;;-1:-1:-1;;;17174:67:0;;;;;;;;;24636:5:::1;33440:4;:26;;33418:122;;;;-1:-1:-1::0;;;33418:122:0::1;;;;;;;;;33553:16;33572:8;-1:-1:-1::0;;;;;33572:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33572:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33572:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;33572:32:0;;;;;;;;;33553:51:::0;-1:-1:-1;33615:17:0::1;33635:25;33553:51:::0;33648:11:::1;33635:25;:12;:25;:::i;:::-;33700:14;33715:21:::0;;33615:45;;-1:-1:-1;33673:24:0::1;::::0;-1:-1:-1;;33715:25:0;;;33700:41;::::1;;;;;;;;;;;;;;;33673:68;;33778:8;33758:7;:17;;;:28;33754:299;;;33803:29:::0;;;33847:11:::1;::::0;::::1;:18:::0;;;33754:299:::1;;;33903:15;::::0;::::1;::::0;::::1;;33898:74;;33939:17;33948:7;33939:8;:17::i;:::-;34008:32;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;-1:-1:-1;34008:32:0;;;;;;33988:14:::1;27:10:-1::0;;34008:32:0;23:18:-1;::::1;45:23:::0;;33988:53:0;;;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;33988:53:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33754:299:::1;34068:37;34082:16;:9:::0;34096:1:::1;34082:16;:13;:16;:::i;:::-;34100:4;34068:37;;;;;;;;;;;;;;;;17252:1;;;33352:761:::0;:::o;40046:132::-;40122:48;40141:11;40154:15;40122:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40122:48:0;;;;;;;;;;;;;;;;;;;;;:18;:48::i;25820:32::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25820:32:0;;-1:-1:-1;25820:32:0;:::o;33093:121::-;17192:12;:10;:12::i;:::-;17182:6;;-1:-1:-1;;;;;17182:6:0;;;:22;;;17174:67;;;;-1:-1:-1;;;17174:67:0;;;;;;;;;33173:33:::1;::::0;-1:-1:-1;;;33173:33:0;;-1:-1:-1;;;;;33173:8:0::1;:13;::::0;::::1;::::0;:33:::1;::::0;33187:10;;33199:6;;33173:33:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33173:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;35674:196:0::0;35763:25;;:::i;:::-;35818:14;35833:28;35852:5;35859:1;35833:18;:28::i;:::-;35818:44;;;;;;;;;;;;;;;;;35806:56;;;;;;;;35818:44;;;;;;;35806:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35674:196;-1:-1:-1;;35674:196:0:o;47992:361::-;48150:28;48211:134;48263:11;48293:10;48322:8;48211:33;:134::i;:::-;48191:154;47992:361;-1:-1:-1;;;;47992:361:0:o;24900:36::-;;;:::o;54580:109::-;54660:14;:21;54580:109;:::o;47321:391::-;47434:28;47480:20;47503:8;-1:-1:-1;;;;;47503:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47503:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47503:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47503:32:0;;;;;;;;;47480:55;;47566:138;47618:11;47648:10;47677:12;47566:33;:138::i;35977:177::-;36023:15;;:::i;:::-;36051:16;36070:8;-1:-1:-1;;;;;36070:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36070:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36070:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36070:32:0;;;;;;;;;36051:51;;36120:26;36137:8;36120:16;:26::i;:::-;36113:33;;;35977:177;:::o;25073:102::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52006:237::-;52172:63;52192:11;52205;52218:16;52172:19;:63::i;:::-;52006:237;;;:::o;30799:910::-;17192:12;:10;:12::i;:::-;17182:6;;-1:-1:-1;;;;;17182:6:0;;;:22;;;17174:67;;;;-1:-1:-1;;;17174:67:0;;;;;;;;;-1:-1:-1;;;;;30898:36:0;;::::1;30953:1;30898:36:::0;;;:23:::1;:36;::::0;;;;;::::1;30876:135;;;;-1:-1:-1::0;;;30876:135:0::1;;;;;;;;;-1:-1:-1::0;;;;;31045:40:0;::::1;;::::0;;;:27:::1;:40;::::0;;;;;::::1;;31044:41;31022:155;;;;-1:-1:-1::0;;;31022:155:0::1;;;;;;;;;31194:15;31210:22:::0;;-1:-1:-1;;;;;31194:58:0;::::1;::::0;:15;-1:-1:-1;;31210:26:0;;;31194:43;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;31194:43:0::1;:58;31190:377;;31274:9;31269:287;31293:15;:22:::0;31289:26;::::1;31269:287;;;31367:11;-1:-1:-1::0;;;;;31345:33:0::1;:15;31361:1;31345:18;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;31345:18:0::1;:33;31341:200;;;31424:15;31440:48:::0;;-1:-1:-1;;31440:52:0;;;31424:69;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;31403:15:::1;:18:::0;;-1:-1:-1;;;;;31424:69:0;;::::1;::::0;31419:1;;31403:18;::::1;;;;;;;;;;;;;:90;;;;;-1:-1:-1::0;;;;;31403:90:0::1;;;;;-1:-1:-1::0;;;;;31403:90:0::1;;;;;;31516:5;;31341:200;31317:3;;31269:287;;;;31190:377;31579:15;:21;;;;;;;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;31579:21:0;;;;;-1:-1:-1;;;;;;31579:21:0;;::::1;::::0;;;;;;;;-1:-1:-1;;;;;31618:36:0;::::1;::::0;;;:23:::1;:36:::0;;;;;;;31611:43;;;;::::1;::::0;;;31672:29;;::::1;::::0;31579:21;31672:29:::1;30799:910:::0;:::o;51231:192::-;51353:62;51373:11;51386;51399:15;51353:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51353:62:0;;;;;;;;;;;;;;;;;;;;;:19;:62::i;25337:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36595:670::-;36724:7;36748:29;;;:21;:29;;;;;;;;-1:-1:-1;;;;;36748:51:0;;;;;;;;;:65;;;36744:106;;;-1:-1:-1;36837:1:0;36830:8;;36744:106;36887:85;;-1:-1:-1;;;36887:85:0;;36862:22;;-1:-1:-1;;;;;36887:8:0;:62;;;;:85;;36958:4;;36965:6;;36887:85;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36887:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36887:85:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36887:85:0;;;;;;;;;36862:110;-1:-1:-1;36987:19:0;36983:60;;37030:1;37023:8;;;;;36983:60;37081:35;;-1:-1:-1;;;37081:35:0;;37055:23;;-1:-1:-1;;;;;37081:27:0;;;;;:35;;37109:6;;37081:35;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37081:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37081:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37081:35:0;;;;;;;;;37055:61;-1:-1:-1;37131:20:0;37127:61;;37175:1;37168:8;;;;;;37127:61;37207:50;24687:6;37207:35;:15;37227:14;37207:35;:19;:35;:::i;:::-;:39;:50;:39;:50;:::i;:::-;37200:57;;;;36595:670;;;;;:::o;38110:261::-;38260:28;38308:55;38333:11;;38308:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;38308:55:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38346:16:0;;-1:-1:-1;38346:16:0;;;;38308:55;;;38346:16;;38308:55;38346:16;38308:55;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;38308:24:0;;-1:-1:-1;;;38308:55:0:i;:::-;38301:62;38110:261;-1:-1:-1;;;;;38110:261:0:o;25768:43::-;;;:::o;17915:244::-;17192:12;:10;:12::i;:::-;17182:6;;-1:-1:-1;;;;;17182:6:0;;;:22;;;17174:67;;;;-1:-1:-1;;;17174:67:0;;;;;;;;;-1:-1:-1;;;;;18004:22:0;::::1;17996:73;;;;-1:-1:-1::0;;;17996:73:0::1;;;;;;;;;18106:6;::::0;;18085:38:::1;::::0;-1:-1:-1;;;;;18085:38:0;;::::1;::::0;18106:6;::::1;::::0;18085:38:::1;::::0;::::1;18134:6;:17:::0;;-1:-1:-1;;;;;;18134:17:0::1;-1:-1:-1::0;;;;;18134:17:0;;;::::1;::::0;;;::::1;::::0;;17915:244::o;15526:106::-;15614:10;15526:106;:::o;4168:136::-;4226:7;4253:43;4257:1;4260;4253:43;;;;;;;;;;;;;;;;;:3;:43::i;38379:1399::-;38526:28;38573:51;38677:47;38700:16;:23;38677:11;:18;:22;;:47;;;;:::i;:::-;-1:-1:-1;;;;;38637:98:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38637:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;38573:162:0;-1:-1:-1;38746:22:0;;38783:725;38807:11;:18;38803:1;:22;38783:725;;;38852:9;38847:650;38871:16;:23;38867:1;:27;38847:650;;;38920:17;38940:143;38982:11;38994:1;38982:14;;;;;;;;;;;;;;39044:16;39061:1;39044:19;;;;;;;;;;;;;;38940;:143::i;:::-;38920:163;-1:-1:-1;39108:13:0;;39104:378;;39187:236;;;;;;;;39233:11;39245:1;39233:14;;;;;;;;;;;;;;39187:236;;;;39274:16;39291:1;39274:19;;;;;;;;;;;;;;-1:-1:-1;;;;;39187:236:0;;;;;39320:9;39187:236;;;;39356:23;:44;39380:16;39397:1;39380:19;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39356:44:0;;;;;;;;;;;;;;-1:-1:-1;39356:44:0;;;39187:236;;39146:38;;:22;;39169:14;;39146:38;;;;;;;;;;;;;;;:277;39446:16;;;;;39104:378;-1:-1:-1;38896:3:0;;38847:650;;;-1:-1:-1;38827:3:0;;38783:725;;;;39520:35;39598:14;-1:-1:-1;;;;;39558:65:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39558:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;39520:103:0;-1:-1:-1;39639:9:0;39634:111;39659:14;39654:1;:20;39634:111;;;39708:22;39731:1;39708:25;;;;;;;;;;;;;;39696:6;39703:1;39696:9;;;;;;;;;;;;;;;;;:37;39676:3;;39634:111;;;-1:-1:-1;39764:6:0;38379:1399;-1:-1:-1;;;;;38379:1399:0:o;34568:133::-;34628:11;;;:18;;-1:-1:-1;;34628:18:0;34642:4;34628:18;;;;;;34670:13;;34685:7;;;;34662:31;;;;;;34670:13;;34662:31;;;;;;;;;;34568:133;:::o;54979:520::-;55077:4;55099:14;55116:4;55099:21;;55154:1;55137:7;:14;:18;55133:330;;;55177:9;55172:280;55213:1;55196:7;:14;:18;55192:1;:22;55172:280;;;55333:7;55341:1;55345;55341:5;55333:14;;;;;;;;;;;;;;55319:7;55327:1;55319:10;;;;;;;;;;;;;;:28;55315:122;;55384:5;55372:17;;55412:5;;55315:122;55216:3;;55172:280;;;;55482:9;54979:520;-1:-1:-1;;54979:520:0:o;34923:582::-;35032:7;35095:6;35061:14;35076:5;35061:21;;;;;;;;;;;;;;;;;;:31;;;:40;35057:85;;;-1:-1:-1;35125:5:0;35118:12;;35057:85;35201:14;:21;35169:5;;35235:234;35249:5;35242:4;:12;35235:234;;;35271:9;35283:21;35284:12;;;35302:1;35283:21;:18;:21;:::i;:::-;35271:33;;35353:6;35323:14;35338:1;35323:17;;;;;;;;;;;;;;;;;;:27;;;:36;35319:139;;;35388:1;35380:9;;35319:139;;;35437:1;35441;35437:5;35430:12;;35319:139;35235:234;;;;-1:-1:-1;;35488:9:0;;34923:582;-1:-1:-1;;;;34923:582:0:o;42747:1978::-;42959:28;;:::i;:::-;-1:-1:-1;;;;;43000:97:0;;;;;:26;;43128:92;;43162:6;;43128:19;:92::i;:::-;43108:112;-1:-1:-1;43237:13:0;;43233:1485;;-1:-1:-1;;;;;43310:43:0;;;;;;;:23;:43;;;;;;;;;;;;43267:40;;;:86;43370:26;;:67;;-1:-1:-1;;;43370:67:0;;:44;;;;;:67;;43423:4;;43430:6;;43370:67;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43370:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43370:67:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43370:67:0;;;;;;;;;-1:-1:-1;43454:23:0;;;:35;;;43592:13;;;;43528:120;;24636:5;;43528:78;;43480:9;;43528:78;:63;:78;:::i;:120::-;43506:19;;;:142;;;43692:23;;;;:80;;;:27;:80;:::i;:::-;43663:26;;;:109;43819:158;43859:14;43892:25;:5;43859:14;43892:25;:9;:25;:::i;:::-;43936:10;:26;;;43819:21;:158::i;:::-;43789:27;;;:188;;;44021:23;;;;:88;;;:27;:88;:::i;:::-;43992:26;;;:117;44210:122;;;;;;;;44234:4;44210:122;;;44257:27;;;;44210:122;;;;;;;;;;;;;-1:-1:-1;44158:29:0;;;:21;:29;;;;;;-1:-1:-1;;;;;44158:49:0;;;;;;;;;;;:174;;;;-1:-1:-1;;44158:174:0;;;;;;;;;;;;;;;;;;;;;44460:7;:5;:7::i;:::-;-1:-1:-1;;;;;44354:352:0;44415:18;-1:-1:-1;;;;;44354:352:0;44390:6;44354:352;44487:10;:22;;;44528:10;:23;;;44570:9;:13;;;44602:10;:19;;;44640:51;44671:10;:19;;;44640:10;:26;;;:30;;:51;;;;:::i;:::-;44354:352;;;;;;;;;;;;;;;;;;;42747:1978;;;;;;;;:::o;3712:181::-;3770:7;3802:5;;;3826:6;;;;3818:46;;;;-1:-1:-1;;;3818:46:0;;;;;;;;45035:464;45198:11;45194:50;;45226:7;;45194:50;-1:-1:-1;;;;;45260:27:0;;24763:42;45260:27;45256:236;;;45305:12;45323:9;-1:-1:-1;;;;;45323:14:0;45345:6;45323:33;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;45304:52:0;;;45379:7;45388:9;45371:27;;;;;-1:-1:-1;;;45371:27:0;;;;;;;;;;;45256:236;;;;45431:49;45454:6;45462:9;45473:6;45431:22;:49::i;:::-;45035:464;;;;:::o;54283:209::-;54423:7;54450:34;54473:10;54450:18;:5;54460:7;54450:18;:9;:18;:::i;48628:666::-;48787:28;48828:22;48853:31;48882:1;48853:24;:8;48866:10;48853:24;:12;:24;:::i;:::-;:28;:31;:28;:31;:::i;:::-;48828:56;;48895:27;48939:14;-1:-1:-1;;;;;48925:29:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48925:29:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;48925:29:0;-1:-1:-1;48895:59:0;-1:-1:-1;48965:9:0;49010:10;48989:127;49031:8;49022:5;:17;48989:127;;49081:5;49065:10;49076:1;49065:13;;;;;;;;;;;;;;;;;:21;49101:3;;;;;49041:7;48989:127;;;;49148:138;49197:11;49227:10;49256:15;49148:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49148:138:0;;;;;;;;;;;;;;;;;;;;;:30;:138::i;52251:1912::-;52449:1;52428:11;:18;:22;52420:65;;;;-1:-1:-1;;;52420:65:0;;;;;;;;;52544:1;52518:16;:23;:27;52496:112;;;;-1:-1:-1;;;52496:112:0;;;;;;;;;52621:36;52688:16;:23;-1:-1:-1;;;;;52660:62:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52660:62:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;52660:62:0;-1:-1:-1;52621:101:0;-1:-1:-1;52740:9:0;52735:1053;52759:11;:18;52755:1;:22;52735:1053;;;52799:14;52816:11;52828:1;52816:14;;;;;;;;;;;;;;52799:31;;52852:9;52864:1;52852:13;;52847:930;52871:16;:23;52867:1;:27;52847:930;;;52920:23;52946:149;52994:11;53028:6;53057:16;53074:1;53057:19;;;;;;;;;;;;;;52946:25;:149::i;:::-;52920:175;;53122:18;53161:23;:44;53185:16;53202:1;53185:19;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53161:44:0;;;;;;;;;;;;;;-1:-1:-1;53161:44:0;;;;-1:-1:-1;53230:20:0;53226:77;;53275:8;;;;53226:77;53348:83;53397:15;53348:19;53368:1;53348:22;;;;;;;:83;53323:19;53343:1;53323:22;;;;;;;;;;;;;;;;;;:108;;;;53452:29;;;;53518:4;53452:29;;;;;;;-1:-1:-1;;;;;53452:42:0;;;;;;;;;;53495:19;;53452:42;;:29;53495:16;;53512:1;;53495:19;;;;;;;;;;;;-1:-1:-1;;;;;53452:63:0;-1:-1:-1;;;;;53452:63:0;;;;;;;;;;;;;:70;;;;;;;;;;;;;;;;;;53651:16;53668:1;53651:19;;;;;;;;;;;;;;-1:-1:-1;;;;;53548:213:0;53617:11;-1:-1:-1;;;;;53548:213:0;53588:6;53548:213;53693:11;53727:15;53548:213;;;;;;;;;;;;;;;;52847:930;;;52896:3;;52847:930;;;-1:-1:-1;;52779:3:0;;52735:1053;;;-1:-1:-1;53854:9:0;53849:307;53873:19;:26;53869:1;:30;53849:307;;;53921:223;53951:23;:44;53975:16;53992:1;53975:19;;;;;;;;;;;;;;-1:-1:-1;;;;;53951:44:0;-1:-1:-1;;;;;53951:44:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53951:44:0;54014:11;54044:19;54064:1;54044:22;;;;;;;;;;;;;;53921:223;;;;;;;;;;;;;;;;;:11;:223::i;:::-;53901:3;;53849:307;;5042:471;5100:7;5345:6;5341:47;;-1:-1:-1;5375:1:0;5368:8;;5341:47;5412:5;;;5416:1;5412;:5;:1;5436:5;;;;;:10;5428:56;;;;-1:-1:-1;;;5428:56:0;;;;;;;;5981:132;6039:7;6066:39;6070:1;6073;6066:39;;;;;;;;;;;;;;;;;:3;:39::i;4599:192::-;4685:7;4721:12;4713:6;;;;4705:29;;;;-1:-1:-1;;;4705:29:0;;;;;;;;;;-1:-1:-1;;;4757:5:0;;;4599:192::o;11556:177::-;11639:86;11659:5;11689:23;;;11714:2;11718:5;11666:58;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;11666:58:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;11666:58:0;;;179:29:-1;;;;160:49;;;11639:19:0;:86::i;49302:1451::-;49485:28;49532:51;49636:47;49659:16;:23;49636:11;:18;:22;;:47;;;;:::i;:::-;-1:-1:-1;;;;;49596:98:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49596:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;49532:162:0;-1:-1:-1;49707:22:0;;49744:739;49768:11;:18;49764:1;:22;49744:739;;;49813:9;49808:664;49832:16;:23;49828:1;:27;49808:664;;;49881:17;49901:157;49949:11;49983;49995:1;49983:14;;;;;;;;;;;;;;50020:16;50037:1;50020:19;;;;;;;49901:157;49881:177;-1:-1:-1;50083:13:0;;50079:378;;50162:236;;;;;;;;50208:11;50220:1;50208:14;;;;;;;;;;;;;;50162:236;;;;50249:16;50266:1;50249:19;;;;;;;;;;;;;;-1:-1:-1;;;;;50162:236:0;;;;;50295:9;50162:236;;;;50331:23;:44;50355:16;50372:1;50355:19;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50331:44:0;;;;;;;;;;;;;;-1:-1:-1;50331:44:0;;;50162:236;;50121:38;;:22;;50144:14;;50121:38;;;;;;;;;;;;;;;:277;50421:16;;;;;50079:378;-1:-1:-1;49857:3:0;;49808:664;;;-1:-1:-1;49788:3:0;;49744:739;;;;50495:35;50573:14;-1:-1:-1;;;;;50533:65:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50533:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;50495:103:0;-1:-1:-1;50614:9:0;50609:111;50634:14;50629:1;:20;50609:111;;;50683:22;50706:1;50683:25;;;;;;;;;;;;;;50671:6;50678:1;50671:9;;;;;;;;;;;;;;;;;:37;50651:3;;50609:111;;;-1:-1:-1;50739:6:0;49302:1451;-1:-1:-1;;;;;;49302:1451:0:o;6601:345::-;6687:7;6789:12;6782:5;6774:28;;;;-1:-1:-1;;;6774:28:0;;;;;;;;;;;6813:9;6829:1;6825;:5;;;;;;;6601:345;-1:-1:-1;;;;;6601:345:0:o;13600:1115::-;14205:27;14213:5;-1:-1:-1;;;;;14205:25:0;;:27::i;:::-;14197:71;;;;-1:-1:-1;;;14197:71:0;;;;;;;;;14342:12;14356:23;14391:5;-1:-1:-1;;;;;14383:19:0;14403:4;14383:25;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14341:67:0;;;;14427:7;14419:52;;;;-1:-1:-1;;;14419:52:0;;;;;;;;;14488:17;;:21;14484:224;;14630:10;14619:30;;;;;;;;;;;;;;14611:85;;;;-1:-1:-1;;;14611:85:0;;;;;;;;8945:619;9005:4;9473:20;;9316:66;9513:23;;;;;;:42;;-1:-1:-1;;9540:15:0;;;9505:51;-1:-1:-1;;8945:619:0:o;24454:31313::-;;;;;;;;;;-1:-1:-1;;;;;24454:31313:0;;;;;;-1:-1:-1;;;;;24454:31313:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;24454:31313:0;;;;;;;;;;;-1:-1:-1;;;;;24454:31313:0;;;;;:::o;301:352:-1:-;;;431:3;424:4;416:6;412:17;408:27;398:2;;-1:-1;;439:12;398:2;-1:-1;469:20;;-1:-1;;;;;498:30;;495:2;;;-1:-1;;531:12;495:2;575:4;567:6;563:17;551:29;;626:3;575:4;;610:6;606:17;567:6;592:32;;589:41;586:2;;;643:1;;633:12;586:2;391:262;;;;;;679:707;;796:3;789:4;781:6;777:17;773:27;763:2;;-1:-1;;804:12;763:2;851:6;838:20;873:80;888:64;945:6;888:64;;;873:80;;;981:21;;;864:89;-1:-1;1025:4;1038:14;;;;1013:17;;;1127;;;1118:27;;;;1115:36;-1:-1;1112:2;;;1164:1;;1154:12;1112:2;1189:1;1174:206;1199:6;1196:1;1193:13;1174:206;;;85:6;72:20;97:33;124:5;97:33;;;1267:50;;1331:14;;;;1359;;;;1221:1;1214:9;1174:206;;;1178:14;;;;;756:630;;;;;1790:707;;1907:3;1900:4;1892:6;1888:17;1884:27;1874:2;;-1:-1;;1915:12;1874:2;1962:6;1949:20;1984:80;1999:64;2056:6;1999:64;;1984:80;2092:21;;;1975:89;-1:-1;2136:4;2149:14;;;;2124:17;;;2238;;;2229:27;;;;2226:36;-1:-1;2223:2;;;2275:1;;2265:12;2223:2;2300:1;2285:206;2310:6;2307:1;2304:13;2285:206;;;3071:20;;2378:50;;2442:14;;;;2470;;;;2332:1;2325:9;2285:206;;3282:241;;3386:2;3374:9;3365:7;3361:23;3357:32;3354:2;;;-1:-1;;3392:12;3354:2;85:6;72:20;97:33;124:5;97:33;;3530:502;;;3676:2;3664:9;3655:7;3651:23;3647:32;3644:2;;;-1:-1;;3682:12;3644:2;85:6;72:20;97:33;124:5;97:33;;;3734:63;-1:-1;3862:2;3847:18;;3834:32;-1:-1;;;;;3875:30;;3872:2;;;-1:-1;;3908:12;3872:2;3938:78;4008:7;3999:6;3988:9;3984:22;3938:78;;;3928:88;;;3638:394;;;;;;4039:763;;;;4227:2;4215:9;4206:7;4202:23;4198:32;4195:2;;;-1:-1;;4233:12;4195:2;85:6;72:20;97:33;124:5;97:33;;;4285:63;-1:-1;4413:2;4398:18;;4385:32;-1:-1;;;;;4426:30;;;4423:2;;;-1:-1;;4459:12;4423:2;4489:78;4559:7;4550:6;4539:9;4535:22;4489:78;;;4479:88;;4632:2;4621:9;4617:18;4604:32;4590:46;;4437:18;4648:6;4645:30;4642:2;;;-1:-1;;4678:12;4642:2;;4708:78;4778:7;4769:6;4758:9;4754:22;4708:78;;;4698:88;;;4189:613;;;;;;4809:392;;;4943:2;4931:9;4922:7;4918:23;4914:32;4911:2;;;-1:-1;;4949:12;4911:2;85:6;72:20;97:33;124:5;97:33;;;5001:63;-1:-1;5101:2;5153:22;;2720:20;2745:46;2720:20;2745:46;;;5109:76;;;;4905:296;;;;;;5208:491;;;;5346:2;5334:9;5325:7;5321:23;5317:32;5314:2;;;-1:-1;;5352:12;5314:2;85:6;72:20;97:33;124:5;97:33;;;5404:63;-1:-1;5504:2;5543:22;;3071:20;;-1:-1;5612:2;5651:22;;72:20;97:33;72:20;97:33;;;5620:63;;;;5308:391;;;;;;5706:491;;;;5844:2;5832:9;5823:7;5819:23;5815:32;5812:2;;;-1:-1;;5850:12;5812:2;85:6;72:20;97:33;124:5;97:33;;;5902:63;6002:2;6041:22;;3071:20;;-1:-1;6110:2;6149:22;;;3071:20;;5806:391;-1:-1;;;5806:391;6204:678;;;;;6395:2;6383:9;6374:7;6370:23;6366:32;6363:2;;;-1:-1;;6401:12;6363:2;6459:17;6446:31;-1:-1;;;;;6497:18;6489:6;6486:30;6483:2;;;-1:-1;;6519:12;6483:2;6557:80;6629:7;6620:6;6609:9;6605:22;6557:80;;;6547:90;;-1:-1;6547:90;-1:-1;6702:2;6687:18;;6674:32;;-1:-1;6715:30;;;6712:2;;;-1:-1;;6748:12;6712:2;;6786:80;6858:7;6849:6;6838:9;6834:22;6786:80;;;6357:525;;;;-1:-1;6776:90;-1:-1;;;;6357:525;6889:377;;7018:2;7006:9;6997:7;6993:23;6989:32;6986:2;;;-1:-1;;7024:12;6986:2;7082:17;7069:31;-1:-1;;;;;7112:6;7109:30;7106:2;;;-1:-1;;7142:12;7106:2;7172:78;7242:7;7233:6;7222:9;7218:22;7172:78;;7273:638;;;7444:2;7432:9;7423:7;7419:23;7415:32;7412:2;;;-1:-1;;7450:12;7412:2;7508:17;7495:31;-1:-1;;;;;7546:18;7538:6;7535:30;7532:2;;;-1:-1;;7568:12;7532:2;7598:78;7668:7;7659:6;7648:9;7644:22;7598:78;;;7588:88;;7741:2;7730:9;7726:18;7713:32;7699:46;;7546:18;7757:6;7754:30;7751:2;;;-1:-1;;7787:12;7751:2;;7817:78;7887:7;7878:6;7867:9;7863:22;7817:78;;7918:257;;8030:2;8018:9;8009:7;8005:23;8001:32;7998:2;;;-1:-1;;8036:12;7998:2;2586:6;2580:13;45000:5;42654:13;42647:21;44978:5;44975:32;44965:2;;-1:-1;;45011:12;8182:241;;8286:2;8274:9;8265:7;8261:23;8257:32;8254:2;;;-1:-1;;8292:12;8254:2;-1:-1;3071:20;;8248:175;-1:-1;8248:175;8430:263;;8545:2;8533:9;8524:7;8520:23;8516:32;8513:2;;;-1:-1;;8551:12;8513:2;-1:-1;3219:13;;8507:186;-1:-1;8507:186;8700:366;;;8821:2;8809:9;8800:7;8796:23;8792:32;8789:2;;;-1:-1;;8827:12;8789:2;3084:6;3071:20;8879:63;;8979:2;9022:9;9018:22;72:20;97:33;124:5;97:33;;9073:491;;;;9211:2;9199:9;9190:7;9186:23;9182:32;9179:2;;;-1:-1;;9217:12;9179:2;3084:6;3071:20;9269:63;;9369:2;9412:9;9408:22;72:20;97:33;124:5;97:33;;;9377:63;-1:-1;9477:2;9516:22;;72:20;97:33;72:20;97:33;;10008:366;;;10129:2;10117:9;10108:7;10104:23;10100:32;10097:2;;;-1:-1;;10135:12;10097:2;-1:-1;;3071:20;;;10287:2;10326:22;;;3071:20;;-1:-1;10091:283;10381:535;;;;10530:2;10518:9;10509:7;10505:23;10501:32;10498:2;;;-1:-1;;10536:12;10498:2;3225:6;3219:13;10588:74;;10699:2;10753:9;10749:22;3219:13;10707:74;;10818:2;10872:9;10868:22;220:13;238:33;265:5;238:33;;24551:262;;13099:5;41491:12;13210:52;13255:6;13250:3;13243:4;13236:5;13232:16;13210:52;;;13274:16;;;;;24676:137;-1:-1;;24676:137;24820:370;25175:10;24999:191;25197:213;-1:-1;;;;;42983:54;;;;11463:37;;25315:2;25300:18;;25286:124;25417:467;-1:-1;;;;;42983:54;;;11332:58;;42983:54;;;;25787:2;25772:18;;11332:58;25870:2;25855:18;;24382:37;;;;25607:2;25592:18;;25578:306;25891:340;-1:-1;;;;;42983:54;;;;11332:58;;26217:2;26202:18;;24382:37;26045:2;26030:18;;26016:215;26569:509;26811:2;26825:47;;;41491:12;;26796:18;;;42097:19;;;26569:509;;26811:2;42137:14;;;;;;41308;;;26569:509;12326:371;12351:6;12348:1;12345:13;12326:371;;;12412:13;;23710:23;;24382:37;;23876:16;;;23870:23;-1:-1;;;;;42983:54;;;23947:14;;;11463:37;24033:16;;;24027:23;24104:14;;;24382:37;24205:4;24194:16;;;24188:23;42983:54;24278:14;;;13376:63;11234:4;11225:14;;;;41915;;;;509:18;12366:9;12326:371;;;-1:-1;26878:190;;26782:296;-1:-1;;;;;;;26782:296;27085:201;42654:13;;42647:21;12782:34;;27197:2;27182:18;;27168:118;27293:423;42654:13;;42647:21;12782:34;;27619:2;27604:18;;24382:37;;;;27702:2;27687:18;;24382:37;27461:2;27446:18;;27432:284;28326:685;-1:-1;;;;;42983:54;;;;13376:63;;28747:2;28732:18;;24382:37;;;;28830:2;28815:18;;24382:37;;;;28913:2;28898:18;;24382:37;28996:3;28981:19;;24382:37;28569:3;28554:19;;28540:471;29550:301;;29688:2;29709:17;29702:47;14113:5;41491:12;42109:6;29688:2;29677:9;29673:18;42097:19;14207:52;14252:6;42137:14;29677:9;42137:14;29688:2;14233:5;14229:16;14207:52;;;44774:7;44758:14;-1:-1;;44754:28;14271:39;;;;42137:14;14271:39;;29659:192;-1:-1;;29659:192;29858:407;30049:2;30063:47;;;14547:2;30034:18;;;42097:19;14583:34;42137:14;;;14563:55;-1:-1;;;14638:12;;;14631:30;14680:12;;;30020:245;30272:407;30463:2;30477:47;;;14931:2;30448:18;;;42097:19;14967:34;42137:14;;;14947:55;-1:-1;;;15022:12;;;15015:30;15064:12;;;30434:245;30686:407;30877:2;30891:47;;;15315:2;30862:18;;;42097:19;15351:29;42137:14;;;15331:50;15400:12;;;30848:245;31100:407;31291:2;31305:47;;;31276:18;;;42097:19;15687:34;42137:14;;;15667:55;15741:12;;;31262:245;31514:407;31705:2;31719:47;;;15992:2;31690:18;;;42097:19;16028:34;42137:14;;;16008:55;16097:25;16083:12;;;16076:47;16142:12;;;31676:245;31928:407;32119:2;32133:47;;;16393:2;32104:18;;;42097:19;;;16429:34;42137:14;;;16409:55;16498:34;16484:12;;;16477:56;16552:12;;;32090:245;32342:407;32533:2;32547:47;;;16803:2;32518:18;;;42097:19;16839:34;42137:14;;;16819:55;-1:-1;;;16894:12;;;16887:27;16933:12;;;32504:245;32756:407;32947:2;32961:47;;;17184:2;32932:18;;;42097:19;17220:30;42137:14;;;17200:51;17270:12;;;32918:245;33170:407;33361:2;33375:47;;;17521:2;33346:18;;;42097:19;17557:34;42137:14;;;17537:55;-1:-1;;;17612:12;;;17605:38;17662:12;;;33332:245;33584:407;33775:2;33789:47;;;17913:2;33760:18;;;42097:19;17949:34;42137:14;;;17929:55;-1:-1;;;18004:12;;;17997:29;18045:12;;;33746:245;33998:407;34189:2;34203:47;;;18296:2;34174:18;;;42097:19;18332:34;42137:14;;;18312:55;-1:-1;;;18387:12;;;18380:31;18430:12;;;34160:245;34412:407;34603:2;34617:47;;;18681:2;34588:18;;;42097:19;18717:29;42137:14;;;18697:50;18766:12;;;34574:245;34826:407;35017:2;35031:47;;;19017:2;35002:18;;;42097:19;19053:29;42137:14;;;19033:50;19102:12;;;34988:245;35240:407;35431:2;35445:47;;;19353:2;35416:18;;;42097:19;19389:34;42137:14;;;19369:55;-1:-1;;;19444:12;;;19437:25;19481:12;;;35402:245;35654:407;35845:2;35859:47;;;19732:2;35830:18;;;42097:19;19768:34;42137:14;;;19748:55;-1:-1;;;19823:12;;;19816:43;19878:12;;;35816:245;36068:407;36259:2;36273:47;;;20129:2;36244:18;;;42097:19;20165:34;42137:14;;;20145:55;-1:-1;;;20220:12;;;20213:27;20259:12;;;36230:245;36482:407;36673:2;36687:47;;;36658:18;;;42097:19;20546:34;42137:14;;;20526:55;20600:12;;;36644:245;36896:407;37087:2;37101:47;;;37072:18;;;42097:19;20887:34;42137:14;;;20867:55;20941:12;;;37058:245;37310:407;37501:2;37515:47;;;21497:2;37486:18;;;42097:19;21533:32;42137:14;;;21513:53;21585:12;;;37472:245;37724:407;37915:2;37929:47;;;21836:2;37900:18;;;42097:19;21872:32;42137:14;;;21852:53;21924:12;;;37886:245;38138:407;38329:2;38343:47;;;22175:2;38314:18;;;42097:19;22211:34;42137:14;;;22191:55;-1:-1;;;22266:12;;;22259:34;22312:12;;;38300:245;38552:407;38743:2;38757:47;;;22563:2;38728:18;;;42097:19;22599:33;42137:14;;;22579:54;22652:12;;;38714:245;38966:317;22967:23;;24382:37;;23137:4;23126:16;;;23120:23;23197:14;;;24382:37;23294:4;23283:16;;;23277:23;42654:13;42647:21;23348:14;;;12782:34;;;;39136:2;39121:18;;39107:176;39290:213;24382:37;;;39408:2;39393:18;;39379:124;39510:324;24382:37;;;39820:2;39805:18;;24382:37;39656:2;39641:18;;39627:207;39841:423;24382:37;;;40173:2;40158:18;;24382:37;;;;42654:13;42647:21;40250:2;40235:18;;12782:34;40009:2;39994:18;;39980:284;40271:256;40333:2;40327:9;40359:17;;;-1:-1;;;;;40419:34;;40455:22;;;40416:62;40413:2;;;40491:1;;40481:12;40413:2;40333;40500:22;40311:216;;-1:-1;40311:216;40534:304;;-1:-1;;;;;40685:6;40682:30;40679:2;;;-1:-1;;40715:12;40679:2;-1:-1;40760:4;40748:17;;;40813:15;;40616:222;44414:268;44479:1;44486:101;44500:6;44497:1;44494:13;44486:101;;;44567:11;;;44561:18;44548:11;;;44541:39;44522:2;44515:10;44486:101;;;44602:6;44599:1;44596:13;44593:2;;;-1:-1;;44479:1;44649:16;;44642:27;44463:219;44795:117;-1:-1;;;;;42983:54;;44854:35;;44844:2;;44903:1;;44893:12
Swarm Source
ipfs://a31e73993b3a8aaa643e42d87d72b52f539766643d1d9da1e76205c2c983341a
Loading...
Loading
Loading...
Loading
OVERVIEW
unagii.com's KNC staking pool.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,293.77 | 20.7201 | $68,247.17 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.