Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add | 5601820 | 14 days ago | IN | 0 S | 0.00821749 | ||||
Add | 5601603 | 14 days ago | IN | 0 S | 0.00916795 | ||||
Add | 5601344 | 14 days ago | IN | 0 S | 0.00792808 | ||||
Update Pool | 5599381 | 14 days ago | IN | 0 S | 0.00157305 | ||||
Set | 5596442 | 14 days ago | IN | 0 S | 0.00235444 | ||||
Set | 5596381 | 14 days ago | IN | 0 S | 0.0026191 | ||||
Set | 5592155 | 14 days ago | IN | 0 S | 0.00235576 | ||||
Add | 5591779 | 14 days ago | IN | 0 S | 0.0107602 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Masterchef
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-27 */ pragma solidity ^0.8.7; // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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 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. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @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. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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://consensys.net/diligence/blog/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.8.0/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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } interface IBoringERC20 { function mint(address to, uint256 amount) external; function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); /// @notice EIP 2612 function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } interface IComplexRewarder { function onBasedReward( uint256 pid, address user, uint256 newLpAmount ) external; function pendingTokens(uint256 pid, address user) external view returns (uint256 pending); function rewardToken() external view returns (IBoringERC20); function poolRewardsPerSec(uint256 pid) external view returns (uint256); } // solhint-disable avoid-low-level-calls library BoringERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_SYMBOL) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_NAME) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IBoringERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_DECIMALS) ); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransfer( IBoringERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed" ); } /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param from Transfer tokens from. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransferFrom( IBoringERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed" ); } } interface IUniswapV2Pair { function initialize(address, address) external; function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } contract Masterchef is Ownable, ReentrancyGuard { using BoringERC20 for IBoringERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardLockedUp; // Reward locked up. uint256 nextHarvestUntil; // When can the user harvest again. } // Info of each pool. struct PoolInfo { IBoringERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. STATIC to distribute per block. uint256 lastRewardTimestamp; // Last block number that based distribution occurs. uint256 accStatixPerShare; // Accumulated Statix per share, times 1e18. See below. uint16 depositFeeBP; // Deposit fee in basis points uint256 harvestInterval; // Harvest interval in seconds uint256 totalLp; // Total token in Pool IComplexRewarder[] rewarders; // Array of rewarder contract for pools with incentives } IBoringERC20 public statix; // Statix tokens created per second uint256 public statixPerSec; // Max harvest interval: 14 days uint256 public constant MAXIMUM_HARVEST_INTERVAL = 14 days; // Maximum deposit fee rate: 5% uint16 public constant MAXIMUM_DEPOSIT_FEE_RATE = 500; // Info of each pool PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The timestamp when Statix mining starts. uint256 public startTimestamp; // Total locked up rewards uint256 public totalLockedUpRewards; // Total Statix in Statix Pools (can be multiple pools) uint256 public totalStatixInPools = 0; // Team address. address public teamAddress; // Treasury address. address public treasuryAddress; // Investor address. address public investorAddress; // Percentage of pool rewards that goto the team. uint256 public teamPercent; // Percentage of pool rewards that goes to the treasury. uint256 public treasuryPercent; // Percentage of pool rewards that goes to the investor. uint256 public investorPercent; // The precision factor uint256 private immutable ACC_TOKEN_PRECISION = 1e12; modifier validatePoolByPid(uint256 _pid) { require(_pid < poolInfo.length, "Pool does not exist"); _; } event Add( uint256 indexed pid, uint256 allocPoint, IBoringERC20 indexed lpToken, uint16 depositFeeBP, uint256 harvestInterval, IComplexRewarder[] indexed rewarders ); event Set( uint256 indexed pid, uint256 allocPoint, uint16 depositFeeBP, uint256 harvestInterval, IComplexRewarder[] indexed rewarders ); event UpdatePool( uint256 indexed pid, uint256 lastRewardTimestamp, uint256 lpSupply, uint256 accStatixPerShare ); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event EmissionRateUpdated( address indexed caller, uint256 previousValue, uint256 newValue ); event RewardLockedUp( address indexed user, uint256 indexed pid, uint256 amountLockedUp ); event AllocPointsUpdated( address indexed caller, uint256 previousAmount, uint256 newAmount ); event SetTeamAddress( address indexed oldAddress, address indexed newAddress ); event SetTreasuryAddress( address indexed oldAddress, address indexed newAddress ); event SetInvestorAddress( address indexed oldAddress, address indexed newAddress ); event SetTeamPercent(uint256 oldPercent, uint256 newPercent); event SetTreasuryPercent(uint256 oldPercent, uint256 newPercent); event SetInvestorPercent(uint256 oldPercent, uint256 newPercent); constructor( IBoringERC20 _statix, uint256 _statixPerSec, address _teamAddress, address _treasuryAddress, address _investorAddress, uint256 _teamPercent, uint256 _treasuryPercent, uint256 _investorPercent ) { require( _teamPercent <= 500, "constructor: invalid team percent value" ); require( _treasuryPercent <= 500, "constructor: invalid treasury percent value" ); require( _investorPercent <= 500, "constructor: invalid investor percent value" ); require( _teamPercent + _treasuryPercent + _investorPercent <= 500, "constructor: total percent over max" ); //StartBlock always many years later from contract construct, will be set later in StartFarming function startTimestamp = block.timestamp + (60 * 60 * 24 * 365); statix = _statix; statixPerSec = _statixPerSec; teamAddress = _teamAddress; treasuryAddress = _treasuryAddress; investorAddress = _investorAddress; teamPercent = _teamPercent; treasuryPercent = _treasuryPercent; investorPercent = _investorPercent; } // Set farming start, can call only once function startFarming() public onlyOwner { require( block.timestamp < startTimestamp, "start farming: farm started already" ); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardTimestamp = block.timestamp; } startTimestamp = block.timestamp; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // Can add multiple pool with same lp token without messing up rewards, because each pool's balance is tracked using its own totalLp function add( uint256 _allocPoint, IBoringERC20 _lpToken, uint16 _depositFeeBP, uint256 _harvestInterval, IComplexRewarder[] calldata _rewarders ) public onlyOwner { require(_rewarders.length <= 10, "add: too many rewarders"); require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "add: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "add: invalid harvest interval" ); require( Address.isContract(address(_lpToken)), "add: LP token must be a valid contract" ); for ( uint256 rewarderId = 0; rewarderId < _rewarders.length; ++rewarderId ) { require( Address.isContract(address(_rewarders[rewarderId])), "add: rewarder must be contract" ); } _massUpdatePools(); uint256 lastRewardTimestamp = block.timestamp > startTimestamp ? block.timestamp : startTimestamp; totalAllocPoint += _allocPoint; poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardTimestamp: lastRewardTimestamp, accStatixPerShare: 0, depositFeeBP: _depositFeeBP, harvestInterval: _harvestInterval, totalLp: 0, rewarders: _rewarders }) ); emit Add( poolInfo.length - 1, _allocPoint, _lpToken, _depositFeeBP, _harvestInterval, _rewarders ); } // Update the given pool's Statix allocation point and deposit fee. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, uint256 _harvestInterval, IComplexRewarder[] calldata _rewarders ) public onlyOwner validatePoolByPid(_pid) { require(_rewarders.length <= 10, "set: too many rewarders"); require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "set: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "set: invalid harvest interval" ); for ( uint256 rewarderId = 0; rewarderId < _rewarders.length; ++rewarderId ) { require( Address.isContract(address(_rewarders[rewarderId])), "set: rewarder must be contract" ); } _massUpdatePools(); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeBP = _depositFeeBP; poolInfo[_pid].harvestInterval = _harvestInterval; poolInfo[_pid].rewarders = _rewarders; emit Set( _pid, _allocPoint, _depositFeeBP, _harvestInterval, _rewarders ); } // View function to see pending rewards on frontend. function pendingTokens(uint256 _pid, address _user) external view validatePoolByPid(_pid) returns ( address[] memory addresses, string[] memory symbols, uint256[] memory decimals, uint256[] memory amounts ) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accStatixPerShare = pool.accStatixPerShare; uint256 lpSupply = pool.totalLp; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 multiplier = block.timestamp - pool.lastRewardTimestamp; uint256 total = 1000; uint256 lpPercent = total - teamPercent - treasuryPercent - investorPercent; uint256 statixReward = (multiplier * statixPerSec * pool.allocPoint * lpPercent) / totalAllocPoint / total; accStatixPerShare += ( ((statixReward * ACC_TOKEN_PRECISION) / lpSupply) ); } uint256 pendingStatix = (((user.amount * accStatixPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt) + user.rewardLockedUp; addresses = new address[](pool.rewarders.length + 1); symbols = new string[](pool.rewarders.length + 1); amounts = new uint256[](pool.rewarders.length + 1); decimals = new uint256[](pool.rewarders.length + 1); addresses[0] = address(statix); symbols[0] = IBoringERC20(statix).safeSymbol(); decimals[0] = IBoringERC20(statix).safeDecimals(); amounts[0] = pendingStatix; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { addresses[rewarderId + 1] = address( pool.rewarders[rewarderId].rewardToken() ); symbols[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeSymbol(); decimals[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeDecimals(); amounts[rewarderId + 1] = pool.rewarders[rewarderId].pendingTokens( _pid, _user ); } } /// @notice View function to see pool rewards per sec function poolRewardsPerSec(uint256 _pid) external view validatePoolByPid(_pid) returns ( address[] memory addresses, string[] memory symbols, uint256[] memory decimals, uint256[] memory rewardsPerSec ) { PoolInfo storage pool = poolInfo[_pid]; addresses = new address[](pool.rewarders.length + 1); symbols = new string[](pool.rewarders.length + 1); decimals = new uint256[](pool.rewarders.length + 1); rewardsPerSec = new uint256[](pool.rewarders.length + 1); addresses[0] = address(statix); symbols[0] = IBoringERC20(statix).safeSymbol(); decimals[0] = IBoringERC20(statix).safeDecimals(); uint256 total = 1000; uint256 lpPercent = total - teamPercent - treasuryPercent - investorPercent; rewardsPerSec[0] = (pool.allocPoint * statixPerSec * lpPercent) / totalAllocPoint / total; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { addresses[rewarderId + 1] = address( pool.rewarders[rewarderId].rewardToken() ); symbols[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeSymbol(); decimals[rewarderId + 1] = IBoringERC20( pool.rewarders[rewarderId].rewardToken() ).safeDecimals(); rewardsPerSec[rewarderId + 1] = pool .rewarders[rewarderId] .poolRewardsPerSec(_pid); } } // View function to see rewarders for a pool function poolRewarders(uint256 _pid) external view validatePoolByPid(_pid) returns (address[] memory rewarders) { PoolInfo storage pool = poolInfo[_pid]; rewarders = new address[](pool.rewarders.length); for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { rewarders[rewarderId] = address(pool.rewarders[rewarderId]); } } // View function to see if user can harvest Statix. function canHarvest(uint256 _pid, address _user) public view validatePoolByPid(_pid) returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.timestamp >= startTimestamp && block.timestamp >= user.nextHarvestUntil; } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() external nonReentrant { _massUpdatePools(); } // Internal method for massUpdatePools function _massUpdatePools() internal { for (uint256 pid = 0; pid < poolInfo.length; ++pid) { _updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) external nonReentrant { _updatePool(_pid); } // Internal method for _updatePool function _updatePool(uint256 _pid) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = pool.totalLp; if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 multiplier = block.timestamp - pool.lastRewardTimestamp; uint256 statixReward = ((multiplier * statixPerSec) * pool.allocPoint) / totalAllocPoint; uint256 total = 1000; uint256 lpPercent = total - teamPercent - treasuryPercent - investorPercent; statix.mint(teamAddress, (statixReward * teamPercent) / total); statix.mint(treasuryAddress, (statixReward * treasuryPercent) / total); statix.mint(investorAddress, (statixReward * investorPercent) / total); statix.mint(address(this), (statixReward * lpPercent) / total); pool.accStatixPerShare += (statixReward * ACC_TOKEN_PRECISION * lpPercent) / pool.totalLp / total; pool.lastRewardTimestamp = block.timestamp; emit UpdatePool( _pid, pool.lastRewardTimestamp, lpSupply, pool.accStatixPerShare ); } function depositWithPermit( uint256 pid, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public nonReentrant validatePoolByPid(pid) { PoolInfo storage pool = poolInfo[pid]; IUniswapV2Pair pair = IUniswapV2Pair(address(pool.lpToken)); pair.permit(msg.sender, address(this), amount, deadline, v, r, s); _deposit(pid, amount); } // Deposit tokens for Statix allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { _deposit(_pid, _amount); } // Deposit tokens for Statix allocation. function _deposit(uint256 _pid, uint256 _amount) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; _updatePool(_pid); payOrLockupPendingStatix(_pid); if (_amount > 0) { uint256 beforeDeposit = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(msg.sender, address(this), _amount); uint256 afterDeposit = pool.lpToken.balanceOf(address(this)); _amount = afterDeposit - beforeDeposit; if (pool.depositFeeBP > 0) { uint256 depositFee = (_amount * pool.depositFeeBP) / 10000; pool.lpToken.safeTransfer(treasuryAddress, depositFee); _amount = _amount - depositFee; } user.amount += _amount; if (address(pool.lpToken) == address(statix)) { totalStatixInPools += _amount; } } user.rewardDebt = (user.amount * pool.accStatixPerShare) / ACC_TOKEN_PRECISION; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onBasedReward( _pid, msg.sender, user.amount ); } if (_amount > 0) { pool.totalLp += _amount; } emit Deposit(msg.sender, _pid, _amount); } //withdraw tokens function withdraw(uint256 _pid, uint256 _amount) public nonReentrant validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; //this will make sure that user can only withdraw from his pool require(user.amount >= _amount, "withdraw: user amount not enough"); //cannot withdraw more than pool's balance require(pool.totalLp >= _amount, "withdraw: pool total not enough"); _updatePool(_pid); payOrLockupPendingStatix(_pid); if (_amount > 0) { user.amount -= _amount; if (address(pool.lpToken) == address(statix)) { totalStatixInPools -= _amount; } pool.lpToken.safeTransfer(msg.sender, _amount); } user.rewardDebt = (user.amount * pool.accStatixPerShare) / ACC_TOKEN_PRECISION; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onBasedReward( _pid, msg.sender, user.amount ); } if (_amount > 0) { pool.totalLp -= _amount; } emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; //Cannot withdraw more than pool's balance require( pool.totalLp >= amount, "emergency withdraw: pool total not enough" ); user.amount = 0; user.rewardDebt = 0; user.rewardLockedUp = 0; user.nextHarvestUntil = 0; pool.totalLp -= amount; for ( uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId ) { pool.rewarders[rewarderId].onBasedReward(_pid, msg.sender, 0); } if (address(pool.lpToken) == address(statix)) { totalStatixInPools -= amount; } pool.lpToken.safeTransfer(msg.sender, amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } // Pay or lockup pending Statix. function payOrLockupPendingStatix(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (user.nextHarvestUntil == 0 && block.timestamp >= startTimestamp) { user.nextHarvestUntil = block.timestamp + pool.harvestInterval; } uint256 pending = ((user.amount * pool.accStatixPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt; if (canHarvest(_pid, msg.sender)) { if (pending > 0 || user.rewardLockedUp > 0) { uint256 pendingRewards = pending + user.rewardLockedUp; // reset lockup totalLockedUpRewards -= user.rewardLockedUp; user.rewardLockedUp = 0; user.nextHarvestUntil = block.timestamp + pool.harvestInterval; // send rewards safeStatixTransfer(msg.sender, pendingRewards); } } else if (pending > 0) { totalLockedUpRewards += pending; user.rewardLockedUp += pending; emit RewardLockedUp(msg.sender, _pid, pending); } } // Safe Statix transfer function, just in case if rounding error causes pool do not have enough Statix. function safeStatixTransfer(address _to, uint256 _amount) internal { if (statix.balanceOf(address(this)) > totalStatixInPools) { //statixBal = total Statix in BasedDistributor - total Statix in Statix pools, this will make sure that BasedDistributor never transfer rewards from deposited Statix pools uint256 statixBal = statix.balanceOf(address(this)) - totalStatixInPools; if (_amount >= statixBal) { statix.safeTransfer(_to, statixBal); } else if (_amount > 0) { statix.safeTransfer(_to, _amount); } } } function updateEmissionRate(uint256 _statixPerSec) public onlyOwner { _massUpdatePools(); emit EmissionRateUpdated(msg.sender, statixPerSec, _statixPerSec); statixPerSec = _statixPerSec; } function updateAllocPoint(uint256 _pid, uint256 _allocPoint) public onlyOwner { _massUpdatePools(); emit AllocPointsUpdated( msg.sender, poolInfo[_pid].allocPoint, _allocPoint ); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; } function poolTotalLp(uint256 pid) external view returns (uint256) { return poolInfo[pid].totalLp; } // Function to harvest many pools in a single transaction function harvestMany(uint256[] calldata _pids) public nonReentrant { require(_pids.length <= 30, "harvest many: too many pool ids"); for (uint256 index = 0; index < _pids.length; ++index) { _deposit(_pids[index], 0); } } // Update team address by the previous team address. function setTeamAddress(address _teamAddress) public { require( msg.sender == teamAddress, "set team address: only previous team address can call this method" ); require( _teamAddress != address(0), "set team address: invalid new team address" ); teamAddress = _teamAddress; emit SetTeamAddress(msg.sender, _teamAddress); } function setTeamPercent(uint256 _newTeamPercent) public onlyOwner { require( _newTeamPercent <= 500, "set team percent: invalid percent value" ); require( treasuryPercent + _newTeamPercent + investorPercent <= 500, "set team percent: total percent over max" ); emit SetTeamPercent(teamPercent, _newTeamPercent); teamPercent = _newTeamPercent; } // Update treasury address by the previous treasury. function setTreasuryAddress(address _treasuryAddress) public { require( msg.sender == treasuryAddress, "set treasury address: only previous treasury address can call this method" ); require( _treasuryAddress != address(0), "set treasury address: invalid new treasury address" ); treasuryAddress = _treasuryAddress; emit SetTreasuryAddress(msg.sender, _treasuryAddress); } function setTreasuryPercent(uint256 _newTreasuryPercent) public onlyOwner { require( _newTreasuryPercent <= 500, "set treasury percent: invalid percent value" ); require( teamPercent + _newTreasuryPercent + investorPercent <= 500, "set treasury percent: total percent over max" ); emit SetTreasuryPercent(treasuryPercent, _newTreasuryPercent); treasuryPercent = _newTreasuryPercent; } // Update the investor address by the previous investor. function setInvestorAddress(address _investorAddress) public { require( msg.sender == investorAddress, "set investor address: only previous investor can call this method" ); require( _investorAddress != address(0), "set investor address: invalid new investor address" ); investorAddress = _investorAddress; emit SetInvestorAddress(msg.sender, _investorAddress); } function setInvestorPercent(uint256 _newInvestorPercent) public onlyOwner { require( _newInvestorPercent <= 500, "set investor percent: invalid percent value" ); require( teamPercent + _newInvestorPercent + treasuryPercent <= 500, "set investor percent: total percent over max" ); emit SetInvestorPercent(investorPercent, _newInvestorPercent); investorPercent = _newInvestorPercent; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IBoringERC20","name":"_statix","type":"address"},{"internalType":"uint256","name":"_statixPerSec","type":"uint256"},{"internalType":"address","name":"_teamAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_investorAddress","type":"address"},{"internalType":"uint256","name":"_teamPercent","type":"uint256"},{"internalType":"uint256","name":"_treasuryPercent","type":"uint256"},{"internalType":"uint256","name":"_investorPercent","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IBoringERC20","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":true,"internalType":"contract IComplexRewarder[]","name":"rewarders","type":"address[]"}],"name":"Add","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"AllocPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"EmissionRateUpdated","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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLockedUp","type":"uint256"}],"name":"RewardLockedUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":true,"internalType":"contract IComplexRewarder[]","name":"rewarders","type":"address[]"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetInvestorAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetInvestorPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetTeamAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetTeamPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetTreasuryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetTreasuryPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accStatixPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAXIMUM_DEPOSIT_FEE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IBoringERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"contract IComplexRewarder[]","name":"_rewarders","type":"address[]"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"}],"name":"harvestMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"investorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBoringERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accStatixPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"totalLp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewarders","outputs":[{"internalType":"address[]","name":"rewarders","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardsPerSec","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"poolTotalLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"contract IComplexRewarder[]","name":"_rewarders","type":"address[]"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investorAddress","type":"address"}],"name":"setInvestorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newInvestorPercent","type":"uint256"}],"name":"setInvestorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_teamAddress","type":"address"}],"name":"setTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTeamPercent","type":"uint256"}],"name":"setTeamPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTreasuryPercent","type":"uint256"}],"name":"setTreasuryPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"statix","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"statixPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStatixInPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_statixPerSec","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040525f600681905560095564e8d4a51000608052348015610021575f5ffd5b506040516145b43803806145b4833981016040819052610040916102ce565b61004933610268565b600180556101f48311156100b45760405162461bcd60e51b815260206004820152602760248201527f636f6e7374727563746f723a20696e76616c6964207465616d2070657263656e604482015266742076616c756560c81b60648201526084015b60405180910390fd5b6101f482111561011a5760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420747265617375727920706560448201526a7263656e742076616c756560a81b60648201526084016100ab565b6101f48111156101805760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420696e766573746f7220706560448201526a7263656e742076616c756560a81b60648201526084016100ab565b6101f48161018e848661034f565b610198919061034f565b11156101f25760405162461bcd60e51b815260206004820152602360248201527f636f6e7374727563746f723a20746f74616c2070657263656e74206f766572206044820152620dac2f60eb1b60648201526084016100ab565b610200426301e1338061034f565b600755600280546001600160a01b03199081166001600160a01b039a8b1617909155600397909755600a8054881696891696909617909555600b8054871694881694909417909355600c80549095169190951617909255600d92909255600e55600f55610374565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146102cb575f5ffd5b50565b5f5f5f5f5f5f5f5f610100898b0312156102e6575f5ffd5b88516102f1816102b7565b60208a015160408b01519199509750610309816102b7565b60608a015190965061031a816102b7565b60808a015190955061032b816102b7565b60a08a015160c08b015160e0909b0151999c989b5096999598909790945092505050565b8082018082111561036e57634e487b7160e01b5f52601160045260245ffd5b92915050565b6080516142056103af5f395f8181610d10015281816126340152818161268101528181612ef10152818161301301526135f501526142055ff3fe608060405234801561000f575f5ffd5b5060043610610260575f3560e01c8063654c9ece1161014b578063afbcfea1116100bf578063e2bbb15811610084578063e2bbb1581461058a578063e6fd48bc1461059d578063eddf9652146105a6578063eff8976b146105b9578063f2fde38b146105d9578063ffcd4263146105ec575f5ffd5b8063afbcfea114610549578063c5f956af14610551578063dc640ac914610564578063de73149d14610577578063e164ac5014610581575f5ffd5b8063876d3c9c11610110578063876d3c9c1461049857806389a2bc25146104ab5780638da5cb5b146104be57806393f1a40b146104ce578063949e63021461052d578063aad5255514610540575f5ffd5b8063654c9ece1461043b5780636605bfda1461044e5780636690864e14610461578063715018a614610474578063812c64f11461047c575f5ffd5b80632e6c998d116101e25780634d370a64116101a75780634d370a64146103de578063508593ab146103e7578063515bc323146103fa57806351eb05a61461040d5780635312ea8e14610420578063630b5ba114610433575f5ffd5b80632e6c998d1461036957806342602f1e1461038c578063441a3e701461039f578063465e81ec146103b2578063474fa630146103d5575f5ffd5b80631526fe27116102285780631526fe27146102d157806317caf6f1146103275780631b9084ca146103305780631c75f085146103435780632081ccc414610356575f5ffd5b806304ef9d58146102645780630735b20814610280578063081e3eda146102895780630ba84cd21461029157806312e228fd146102a6575b5f5ffd5b61026d600e5481565b6040519081526020015b60405180910390f35b61026d600f5481565b60045461026d565b6102a461029f366004613c10565b6105ff565b005b600c546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610277565b6102e46102df366004613c10565b610652565b604080516001600160a01b039098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e001610277565b61026d60065481565b6002546102b9906001600160a01b031681565b600a546102b9906001600160a01b031681565b6102a4610364366004613c7f565b6106ad565b61037c610377366004613cfe565b6109de565b6040519015158152602001610277565b6102a461039a366004613d2c565b610a43565b6102a46103ad366004613d47565b610b89565b6103c56103c0366004613c10565b610e4e565b6040516102779493929190613dda565b61026d60085481565b61026d60035481565b6102a46103f5366004613e97565b61141e565b6102a4610408366004613eda565b6117d0565b6102a461041b366004613c10565b6118c1565b6102a461042e366004613c10565b6118de565b6102a4611ae0565b61026d610449366004613c10565b611afb565b6102a461045c366004613d2c565b611b26565b6102a461046f366004613d2c565b611c74565b6102a4611db2565b6104856101f481565b60405161ffff9091168152602001610277565b6102a46104a6366004613c10565b611dc3565b6102a46104b9366004613c10565b611ef3565b5f546001600160a01b03166102b9565b61050d6104dc366004613cfe565b600560209081525f928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b6102a461053b366004613c10565b612023565b61026d60095481565b6102a461214b565b600b546102b9906001600160a01b031681565b6102a4610572366004613f29565b6121f6565b61026d6212750081565b61026d600d5481565b6102a4610598366004613d47565b61228d565b61026d60075481565b6102a46105b4366004613d47565b6122a8565b6105cc6105c7366004613c10565b612392565b6040516102779190613f67565b6102a46105e7366004613d2c565b61249d565b6103c56105fa366004613cfe565b612513565b610607612aff565b61060f612b58565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b60048181548110610661575f80fd5b5f91825260209091206008909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b03909516965092949193909261ffff16919087565b6106b5612aff565b600454869081106106e15760405162461bcd60e51b81526004016106d890613f79565b60405180910390fd5b600a8211156107325760405162461bcd60e51b815260206004820152601760248201527f7365743a20746f6f206d616e792072657761726465727300000000000000000060448201526064016106d8565b6101f461ffff861611156107885760405162461bcd60e51b815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064016106d8565b621275008411156107db5760405162461bcd60e51b815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016106d8565b5f5b828110156108725761081e8484838181106107fa576107fa613fa6565b905060200201602081019061080f9190613d2c565b6001600160a01b03163b151590565b61086a5760405162461bcd60e51b815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e7472616374000060448201526064016106d8565b6001016107dd565b5061087b612b58565b856004888154811061088f5761088f613fa6565b905f5260205f209060080201600101546006546108ac9190613fce565b6108b69190613fe1565b60068190555085600488815481106108d0576108d0613fa6565b905f5260205f2090600802016001018190555084600488815481106108f7576108f7613fa6565b905f5260205f2090600802016004015f6101000a81548161ffff021916908361ffff160217905550836004888154811061093357610933613fa6565b905f5260205f2090600802016005018190555082826004898154811061095b5761095b613fa6565b905f5260205f2090600802016007019190610977929190613b48565b508282604051610988929190613ff4565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b6004545f9083908110610a035760405162461bcd60e51b81526004016106d890613f79565b5f8481526005602090815260408083206001600160a01b038716845290915290206007544210801590610a3a575080600301544210155b95945050505050565b600c546001600160a01b03163314610acd5760405162461bcd60e51b815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f6064820152601960fa1b608482015260a4016106d8565b6001600160a01b038116610b3e5760405162461bcd60e51b815260206004820152603260248201527f73657420696e766573746f7220616464726573733a20696e76616c6964206e656044820152717720696e766573746f72206164647265737360701b60648201526084016106d8565b600c80546001600160a01b0319166001600160a01b03831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b6791905f90a350565b610b91612b75565b60045482908110610bb45760405162461bcd60e51b81526004016106d890613f79565b5f60048481548110610bc857610bc8613fa6565b5f91825260208083208784526005825260408085203386529092529220805460089092029092019250841115610c405760405162461bcd60e51b815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f75676860448201526064016106d8565b8382600601541015610c945760405162461bcd60e51b815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f7567680060448201526064016106d8565b610c9d85612bce565b610ca685612fa2565b8315610d075783815f015f828254610cbe9190613fce565b909155505060025482546001600160a01b03918216911603610cf1578360095f828254610ceb9190613fce565b90915550505b8154610d07906001600160a01b0316338661314c565b600382015481547f000000000000000000000000000000000000000000000000000000000000000091610d3991614035565b610d43919061404c565b60018201555f5b6007830154811015610de757826007018181548110610d6b57610d6b613fa6565b5f918252602090912001548254604051632eef144760e01b81526004810189905233602482015260448101919091526001600160a01b0390911690632eef1447906064015f604051808303815f87803b158015610dc6575f5ffd5b505af1158015610dd8573d5f5f3e3d5ffd5b50505050806001019050610d4a565b508315610e075783826006015f828254610e019190613fce565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505050610e4a60018055565b5050565b606080606080846004805490508110610e795760405162461bcd60e51b81526004016106d890613f79565b5f60048781548110610e8d57610e8d613fa6565b905f5260205f209060080201905080600701805490506001610eaf9190613fe1565b6001600160401b03811115610ec657610ec661406b565b604051908082528060200260200182016040528015610eef578160200160208202803683370190505b506007820154909650610f03906001613fe1565b6001600160401b03811115610f1a57610f1a61406b565b604051908082528060200260200182016040528015610f4d57816020015b6060815260200190600190039081610f385790505b506007820154909550610f61906001613fe1565b6001600160401b03811115610f7857610f7861406b565b604051908082528060200260200182016040528015610fa1578160200160208202803683370190505b506007820154909450610fb5906001613fe1565b6001600160401b03811115610fcc57610fcc61406b565b604051908082528060200260200182016040528015610ff5578160200160208202803683370190505b5060025487519194506001600160a01b03169087905f9061101857611018613fa6565b6001600160a01b03928316602091820292909201015260025461103b9116613262565b855f8151811061104d5761104d613fa6565b602090810291909101015260025461106d906001600160a01b0316613321565b60ff16845f8151811061108257611082613fa6565b6020026020010181815250505f6103e890505f600f54600e54600d54846110a99190613fce565b6110b39190613fce565b6110bd9190613fce565b9050816006548260035486600101546110d69190614035565b6110e09190614035565b6110ea919061404c565b6110f4919061404c565b855f8151811061110657611106613fa6565b60209081029190910101525f5b60078401548110156114125783600701818154811061113457611134613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa15801561117f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a3919061407f565b896111af836001613fe1565b815181106111bf576111bf613fa6565b60200260200101906001600160a01b031690816001600160a01b0316815250506112748460070182815481106111f7576111f7613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015611242573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611266919061407f565b6001600160a01b0316613262565b88611280836001613fe1565b8151811061129057611290613fa6565b60200260200101819052506113308460070182815481106112b3576112b3613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa1580156112fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611322919061407f565b6001600160a01b0316613321565b60ff168761133f836001613fe1565b8151811061134f5761134f613fa6565b60200260200101818152505083600701818154811061137057611370613fa6565b5f91825260209091200154604051631197a07b60e21b8152600481018c90526001600160a01b039091169063465e81ec90602401602060405180830381865afa1580156113bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e3919061409a565b866113ef836001613fe1565b815181106113ff576113ff613fa6565b6020908102919091010152600101611113565b50505050509193509193565b611426612aff565b600a8111156114775760405162461bcd60e51b815260206004820152601760248201527f6164643a20746f6f206d616e792072657761726465727300000000000000000060448201526064016106d8565b6101f461ffff851611156114cd5760405162461bcd60e51b815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f20686967680000000000000060448201526064016106d8565b621275008311156115205760405162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016106d8565b6001600160a01b0385163b6115865760405162461bcd60e51b815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f6044820152651b9d1c9858dd60d21b60648201526084016106d8565b5f5b818110156115f9576115a58383838181106107fa576107fa613fa6565b6115f15760405162461bcd60e51b815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e7472616374000060448201526064016106d8565b600101611588565b50611602612b58565b5f600754421161161457600754611616565b425b90508660065f8282546116299190613fe1565b925050819055506004604051806101000160405280886001600160a01b031681526020018981526020018381526020015f81526020018761ffff1681526020018681526020015f81526020018585808060200260200160405190810160405280939291908181526020018383602002808284375f920182905250939094525050835460018082018655948252602091829020845160089092020180546001600160a01b0319166001600160a01b0390921691909117815583820151948101949094556040830151600285015560608301516003850155608083015160048501805461ffff191661ffff90921691909117905560a0830151600585015560c0830151600685015560e0830151805193949361174d935060078501929190910190613ba9565b5050508282604051611760929190613ff4565b6040519081900390206004546001600160a01b0388169061178390600190613fce565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b6117d8612b75565b600454869081106117fb5760405162461bcd60e51b81526004016106d890613f79565b5f6004888154811061180f5761180f613fa6565b5f9182526020909120600890910201805460405163d505accf60e01b8152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c481018690529192506001600160a01b031690819063d505accf9060e4015f604051808303815f87803b15801561188d575f5ffd5b505af115801561189f573d5f5f3e3d5ffd5b505050506118ad89896133d5565b5050506118b960018055565b505050505050565b6118c9612b75565b6118d281612bce565b6118db60018055565b50565b6118e6612b75565b5f600482815481106118fa576118fa613fa6565b5f918252602080832085845260058252604080852033865290925292208054600892909202909201600681015490935081111561198b5760405162461bcd60e51b815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e6044820152680dee840cadcdeeaced60bb1b60648201526084016106d8565b5f8083556001830181905560028301819055600383018190556006840180548392906119b8908490613fce565b909155505f90505b6007840154811015611a58578360070181815481106119e1576119e1613fa6565b5f918252602082200154604051632eef144760e01b81526004810188905233602482015260448101929092526001600160a01b031690632eef1447906064015f604051808303815f87803b158015611a37575f5ffd5b505af1158015611a49573d5f5f3e3d5ffd5b505050508060010190506119c0565b5060025483546001600160a01b03918216911603611a87578060095f828254611a819190613fce565b90915550505b8254611a9d906001600160a01b0316338361314c565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050506118db60018055565b611ae8612b75565b611af0612b58565b611af960018055565b565b5f60048281548110611b0f57611b0f613fa6565b905f5260205f209060080201600601549050919050565b600b546001600160a01b03163314611bb85760405162461bcd60e51b815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c2074686064820152681a5cc81b595d1a1bd960ba1b608482015260a4016106d8565b6001600160a01b038116611c295760405162461bcd60e51b815260206004820152603260248201527f73657420747265617375727920616464726573733a20696e76616c6964206e6560448201527177207472656173757279206164647265737360701b60648201526084016106d8565b600b80546001600160a01b0319166001600160a01b03831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a83510905f90a350565b600a546001600160a01b03163314611cfe5760405162461bcd60e51b815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f6064820152601960fa1b608482015260a4016106d8565b6001600160a01b038116611d675760405162461bcd60e51b815260206004820152602a60248201527f736574207465616d20616464726573733a20696e76616c6964206e6577207465604482015269616d206164647265737360b01b60648201526084016106d8565b600a80546001600160a01b0319166001600160a01b03831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f905f90a350565b611dba612aff565b611af95f61372a565b611dcb612aff565b6101f4811115611e315760405162461bcd60e51b815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201526a7263656e742076616c756560a81b60648201526084016106d8565b6101f4600e5482600d54611e459190613fe1565b611e4f9190613fe1565b1115611eb25760405162461bcd60e51b815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201526b0cadce840deeccae440dac2f60a31b60648201526084016106d8565b600f5460408051918252602082018390527f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b910160405180910390a1600f55565b611efb612aff565b6101f4811115611f615760405162461bcd60e51b815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201526a7263656e742076616c756560a81b60648201526084016106d8565b6101f4600f5482600d54611f759190613fe1565b611f7f9190613fe1565b1115611fe25760405162461bcd60e51b815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201526b0cadce840deeccae440dac2f60a31b60648201526084016106d8565b600e5460408051918252602082018390527fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd910160405180910390a1600e55565b61202b612aff565b6101f481111561208d5760405162461bcd60e51b815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e604482015266742076616c756560c81b60648201526084016106d8565b6101f4600f5482600e546120a19190613fe1565b6120ab9190613fe1565b111561210a5760405162461bcd60e51b815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e74206044820152670deeccae440dac2f60c31b60648201526084016106d8565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b612153612aff565b60075442106121b05760405162461bcd60e51b815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201526261647960e81b60648201526084016106d8565b6004545f5b818110156121ee575f600482815481106121d1576121d1613fa6565b5f91825260209091204260089092020160020155506001016121b5565b505042600755565b6121fe612b75565b601e81111561224f5760405162461bcd60e51b815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c206964730060448201526064016106d8565b5f5b818110156122835761227b83838381811061226e5761226e613fa6565b905060200201355f6133d5565b600101612251565b50610e4a60018055565b612295612b75565b61229f82826133d5565b610e4a60018055565b6122b0612aff565b6122b8612b58565b336001600160a01b03167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef3600484815481106122f6576122f6613fa6565b905f5260205f209060080201600101548360405161231e929190918252602082015260400190565b60405180910390a2806004838154811061233a5761233a613fa6565b905f5260205f209060080201600101546006546123579190613fce565b6123619190613fe1565b600681905550806004838154811061237b5761237b613fa6565b905f5260205f209060080201600101819055505050565b600454606090829081106123b85760405162461bcd60e51b81526004016106d890613f79565b5f600484815481106123cc576123cc613fa6565b905f5260205f209060080201905080600701805490506001600160401b038111156123f9576123f961406b565b604051908082528060200260200182016040528015612422578160200160208202803683370190505b5092505f5b60078201548110156124955781600701818154811061244857612448613fa6565b905f5260205f20015f9054906101000a90046001600160a01b031684828151811061247557612475613fa6565b6001600160a01b0390921660209283029190910190910152600101612427565b505050919050565b6124a5612aff565b6001600160a01b03811661250a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d8565b6118db8161372a565b60608060608085600480549050811061253e5760405162461bcd60e51b81526004016106d890613f79565b5f6004888154811061255257612552613fa6565b5f91825260208083208b84526005825260408085206001600160a01b038d16865290925292206003600890920290920190810154600682015460028301549294509091421180156125a257508015155b15612674575f8460020154426125b89190613fce565b90505f6103e890505f600f54600e54600d54846125d59190613fce565b6125df9190613fce565b6125e99190613fce565b90505f82600654838a60010154600354886126049190614035565b61260e9190614035565b6126189190614035565b612622919061404c565b61262c919061404c565b9050846126597f000000000000000000000000000000000000000000000000000000000000000083614035565b612663919061404c565b61266d9087613fe1565b9550505050505b5f836002015484600101547f000000000000000000000000000000000000000000000000000000000000000085875f01546126af9190614035565b6126b9919061404c565b6126c39190613fce565b6126cd9190613fe1565b60078601549091506126e0906001613fe1565b6001600160401b038111156126f7576126f761406b565b604051908082528060200260200182016040528015612720578160200160208202803683370190505b506007860154909a50612734906001613fe1565b6001600160401b0381111561274b5761274b61406b565b60405190808252806020026020018201604052801561277e57816020015b60608152602001906001900390816127695790505b506007860154909950612792906001613fe1565b6001600160401b038111156127a9576127a961406b565b6040519080825280602002602001820160405280156127d2578160200160208202803683370190505b5060078601549097506127e6906001613fe1565b6001600160401b038111156127fd576127fd61406b565b604051908082528060200260200182016040528015612826578160200160208202803683370190505b506002548b519199506001600160a01b0316908b905f9061284957612849613fa6565b6001600160a01b03928316602091820292909201015260025461286c9116613262565b895f8151811061287e5761287e613fa6565b602090810291909101015260025461289e906001600160a01b0316613321565b60ff16885f815181106128b3576128b3613fa6565b60200260200101818152505080875f815181106128d2576128d2613fa6565b60209081029190910101525f5b6007860154811015612aef5785600701818154811061290057612900613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa15801561294b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296f919061407f565b8b61297b836001613fe1565b8151811061298b5761298b613fa6565b60200260200101906001600160a01b031690816001600160a01b0316815250506129c38660070182815481106111f7576111f7613fa6565b8a6129cf836001613fe1565b815181106129df576129df613fa6565b6020026020010181905250612a028660070182815481106112b3576112b3613fa6565b60ff1689612a11836001613fe1565b81518110612a2157612a21613fa6565b602002602001018181525050856007018181548110612a4257612a42613fa6565b5f9182526020909120015460405160016232bd9d60e01b03198152600481018f90526001600160a01b038e811660248301529091169063ffcd426390604401602060405180830381865afa158015612a9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ac0919061409a565b88612acc836001613fe1565b81518110612adc57612adc613fa6565b60209081029190910101526001016128df565b5050505050505092959194509250565b5f546001600160a01b03163314611af95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d8565b5f5b6004548110156118db57612b6d81612bce565b600101612b5a565b600260015403612bc75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d8565b6002600155565b60045481908110612bf15760405162461bcd60e51b81526004016106d890613f79565b5f60048381548110612c0557612c05613fa6565b905f5260205f209060080201905080600201544211612c2357505050565b6006810154801580612c3757506001820154155b15612c485750426002909101555050565b5f826002015442612c599190613fce565b90505f600654846001015460035484612c729190614035565b612c7c9190614035565b612c86919061404c565b90505f6103e890505f600f54600e54600d5484612ca39190613fce565b612cad9190613fce565b612cb79190613fce565b600254600a54600d549293506001600160a01b03918216926340c10f1992909116908590612ce59088614035565b612cef919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612d32575f5ffd5b505af1158015612d44573d5f5f3e3d5ffd5b5050600254600b54600e546001600160a01b0392831694506340c10f1993509116908590612d729088614035565b612d7c919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612dbf575f5ffd5b505af1158015612dd1573d5f5f3e3d5ffd5b5050600254600c54600f546001600160a01b0392831694506340c10f1993509116908590612dff9088614035565b612e09919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612e4c575f5ffd5b505af1158015612e5e573d5f5f3e3d5ffd5b50506002546001600160a01b031691506340c10f1990503084612e818588614035565b612e8b919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612ece575f5ffd5b505af1158015612ee0573d5f5f3e3d5ffd5b505050600687015483915082612f167f000000000000000000000000000000000000000000000000000000000000000087614035565b612f209190614035565b612f2a919061404c565b612f34919061404c565b866003015f828254612f469190613fe1565b909155505042600287018190556003870154604080519283526020830188905282015288907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a25050505050505050565b5f60048281548110612fb657612fb6613fa6565b5f91825260208083208584526005825260408085203386529092529220600381015460089092029092019250158015612ff157506007544210155b1561300b5760058201546130059042613fe1565b60038201555b5f81600101547f00000000000000000000000000000000000000000000000000000000000000008460030154845f01546130459190614035565b61304f919061404c565b6130599190613fce565b905061306584336109de565b156130d8575f81118061307b57505f8260020154115b156130d3575f8260020154826130919190613fe1565b9050826002015460085f8282546130a89190613fce565b90915550505f600284015560058401546130c29042613fe1565b60038401556130d13382613779565b505b613146565b8015613146578060085f8282546130ef9190613fe1565b9250508190555080826002015f8282546131099190613fe1565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916131a791906140b1565b5f604051808303815f865af19150503d805f81146131e0576040519150601f19603f3d011682016040523d82523d5f602084013e6131e5565b606091505b509150915081801561320f57508051158061320f57508080602001905181019061320f91906140c7565b61325b5760405162461bcd60e51b815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c65640000000060448201526064016106d8565b5050505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916132a891906140b1565b5f60405180830381855afa9150503d805f81146132e0576040519150601f19603f3d011682016040523d82523d5f602084013e6132e5565b606091505b50915091508161331057604051806040016040528060038152602001623f3f3f60e81b815250613319565b613319816138a6565b949350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b0386169161336691906140b1565b5f60405180830381855afa9150503d805f811461339e576040519150601f19603f3d011682016040523d82523d5f602084013e6133a3565b606091505b50915091508180156133b6575080516020145b6133c1576012613319565b8080602001905181019061331991906140e6565b600454829081106133f85760405162461bcd60e51b81526004016106d890613f79565b5f6004848154811061340c5761340c613fa6565b5f918252602080832087845260058252604080852033865290925292206008909102909101915061343c85612bce565b61344585612fa2565b83156135ec5781546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613490573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b4919061409a565b83549091506134ce906001600160a01b0316333088613a31565b82546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613513573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613537919061409a565b90506135438282613fce565b600485015490965061ffff16156135a45760048401545f906127109061356d9061ffff1689614035565b613577919061404c565b600b548654919250613596916001600160a01b0390811691168361314c565b6135a08188613fce565b9650505b85835f015f8282546135b69190613fe1565b909155505060025484546001600160a01b039182169116036135e9578560095f8282546135e39190613fe1565b90915550505b50505b600382015481547f00000000000000000000000000000000000000000000000000000000000000009161361e91614035565b613628919061404c565b60018201555f5b60078301548110156136cc5782600701818154811061365057613650613fa6565b5f918252602090912001548254604051632eef144760e01b81526004810189905233602482015260448101919091526001600160a01b0390911690632eef1447906064015f604051808303815f87803b1580156136ab575f5ffd5b505af11580156136bd573d5f5f3e3d5ffd5b5050505080600101905061362f565b5083156136ec5783826006015f8282546136e69190613fe1565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156137c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e6919061409a565b1115610e4a576009546002546040516370a0823160e01b81523060048201525f92916001600160a01b0316906370a0823190602401602060405180830381865afa158015613836573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061385a919061409a565b6138649190613fce565b905080821061388957600254613884906001600160a01b0316848361314c565b505050565b811561388457600254613884906001600160a01b0316848461314c565b606060408251106138cb57818060200190518101906138c59190614101565b92915050565b8151602003613a0d575f5b60208160ff1610801561390b5750828160ff16815181106138f9576138f9613fa6565b01602001516001600160f81b03191615155b15613922578061391a816141b1565b9150506138d6565b5f8160ff166001600160401b0381111561393e5761393e61406b565b6040519080825280601f01601f191660200182016040528015613968576020820181803683370190505b5090505f91505b60208260ff161080156139a45750838260ff168151811061399257613992613fa6565b01602001516001600160f81b03191615155b15613a0657838260ff16815181106139be576139be613fa6565b602001015160f81c60f81b818360ff16815181106139de576139de613fa6565b60200101906001600160f81b03191690815f1a905350816139fe816141b1565b92505061396f565b9392505050565b50506040805180820190915260038152623f3f3f60e81b602082015290565b919050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f92839290881691613a9491906140b1565b5f604051808303815f865af19150503d805f8114613acd576040519150601f19603f3d011682016040523d82523d5f602084013e613ad2565b606091505b5091509150818015613afc575080511580613afc575080806020019051810190613afc91906140c7565b6118b95760405162461bcd60e51b815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c656460448201526064016106d8565b828054828255905f5260205f20908101928215613b99579160200282015b82811115613b995781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613b66565b50613ba5929150613bfc565b5090565b828054828255905f5260205f20908101928215613b99579160200282015b82811115613b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613bc7565b5b80821115613ba5575f8155600101613bfd565b5f60208284031215613c20575f5ffd5b5035919050565b803561ffff81168114613a2c575f5ffd5b5f5f83601f840112613c48575f5ffd5b5081356001600160401b03811115613c5e575f5ffd5b6020830191508360208260051b8501011115613c78575f5ffd5b9250929050565b5f5f5f5f5f5f60a08789031215613c94575f5ffd5b8635955060208701359450613cab60408801613c27565b93506060870135925060808701356001600160401b03811115613ccc575f5ffd5b613cd889828a01613c38565b979a9699509497509295939492505050565b6001600160a01b03811681146118db575f5ffd5b5f5f60408385031215613d0f575f5ffd5b823591506020830135613d2181613cea565b809150509250929050565b5f60208284031215613d3c575f5ffd5b8135613a0681613cea565b5f5f60408385031215613d58575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b82811015613da05781516001600160a01b0316865260209586019590910190600101613d79565b5093949350505050565b5f8151808452602084019350602083015f5b82811015613da0578151865260209586019590910190600101613dbc565b608081525f613dec6080830187613d67565b828103602084015280865180835260208301915060208160051b840101602089015f5b83811015613e6157601f19868403018552815180518085528060208301602087015e5f602082870101526020601f19601f83011686010194505050602082019150602085019450600181019050613e0f565b50508581036040870152613e758189613daa565b93505050508281036060840152613e8c8185613daa565b979650505050505050565b5f5f5f5f5f5f60a08789031215613eac575f5ffd5b863595506020870135613ebe81613cea565b9450613cab60408801613c27565b60ff811681146118db575f5ffd5b5f5f5f5f5f5f60c08789031215613eef575f5ffd5b8635955060208701359450604087013593506060870135613f0f81613ecc565b9598949750929560808101359460a0909101359350915050565b5f5f60208385031215613f3a575f5ffd5b82356001600160401b03811115613f4f575f5ffd5b613f5b85828601613c38565b90969095509350505050565b602081525f613a066020830184613d67565b602080825260139082015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156138c5576138c5613fba565b808201808211156138c5576138c5613fba565b5f8184825b8581101561402a57813561400c81613cea565b6001600160a01b031683526020928301929190910190600101613ff9565b509095945050505050565b80820281158282048414176138c5576138c5613fba565b5f8261406657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561408f575f5ffd5b8151613a0681613cea565b5f602082840312156140aa575f5ffd5b5051919050565b5f82518060208501845e5f920191825250919050565b5f602082840312156140d7575f5ffd5b81518015158114613a06575f5ffd5b5f602082840312156140f6575f5ffd5b8151613a0681613ecc565b5f60208284031215614111575f5ffd5b81516001600160401b03811115614126575f5ffd5b8201601f81018413614136575f5ffd5b80516001600160401b0381111561414f5761414f61406b565b604051601f8201601f19908116603f011681016001600160401b038111828210171561417d5761417d61406b565b604052818152828201602001861015614194575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60ff821660ff81036141c6576141c6613fba565b6001019291505056fea2646970667358221220980a40fbc1803470da868dd7534b0ec38180f45738c72d9fef26f5e568cba16c64736f6c634300081c0033000000000000000000000000054751a729ee2031296699cd655f81cb390a63190000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000051d7ec5830940d96af380842c309576cf9da26c000000000000000000000000f138d23724441ad67e87eb20aaf2d437d339a1c8000000000000000000000000f138d23724441ad67e87eb20aaf2d437d339a1c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610260575f3560e01c8063654c9ece1161014b578063afbcfea1116100bf578063e2bbb15811610084578063e2bbb1581461058a578063e6fd48bc1461059d578063eddf9652146105a6578063eff8976b146105b9578063f2fde38b146105d9578063ffcd4263146105ec575f5ffd5b8063afbcfea114610549578063c5f956af14610551578063dc640ac914610564578063de73149d14610577578063e164ac5014610581575f5ffd5b8063876d3c9c11610110578063876d3c9c1461049857806389a2bc25146104ab5780638da5cb5b146104be57806393f1a40b146104ce578063949e63021461052d578063aad5255514610540575f5ffd5b8063654c9ece1461043b5780636605bfda1461044e5780636690864e14610461578063715018a614610474578063812c64f11461047c575f5ffd5b80632e6c998d116101e25780634d370a64116101a75780634d370a64146103de578063508593ab146103e7578063515bc323146103fa57806351eb05a61461040d5780635312ea8e14610420578063630b5ba114610433575f5ffd5b80632e6c998d1461036957806342602f1e1461038c578063441a3e701461039f578063465e81ec146103b2578063474fa630146103d5575f5ffd5b80631526fe27116102285780631526fe27146102d157806317caf6f1146103275780631b9084ca146103305780631c75f085146103435780632081ccc414610356575f5ffd5b806304ef9d58146102645780630735b20814610280578063081e3eda146102895780630ba84cd21461029157806312e228fd146102a6575b5f5ffd5b61026d600e5481565b6040519081526020015b60405180910390f35b61026d600f5481565b60045461026d565b6102a461029f366004613c10565b6105ff565b005b600c546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610277565b6102e46102df366004613c10565b610652565b604080516001600160a01b039098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e001610277565b61026d60065481565b6002546102b9906001600160a01b031681565b600a546102b9906001600160a01b031681565b6102a4610364366004613c7f565b6106ad565b61037c610377366004613cfe565b6109de565b6040519015158152602001610277565b6102a461039a366004613d2c565b610a43565b6102a46103ad366004613d47565b610b89565b6103c56103c0366004613c10565b610e4e565b6040516102779493929190613dda565b61026d60085481565b61026d60035481565b6102a46103f5366004613e97565b61141e565b6102a4610408366004613eda565b6117d0565b6102a461041b366004613c10565b6118c1565b6102a461042e366004613c10565b6118de565b6102a4611ae0565b61026d610449366004613c10565b611afb565b6102a461045c366004613d2c565b611b26565b6102a461046f366004613d2c565b611c74565b6102a4611db2565b6104856101f481565b60405161ffff9091168152602001610277565b6102a46104a6366004613c10565b611dc3565b6102a46104b9366004613c10565b611ef3565b5f546001600160a01b03166102b9565b61050d6104dc366004613cfe565b600560209081525f928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b6102a461053b366004613c10565b612023565b61026d60095481565b6102a461214b565b600b546102b9906001600160a01b031681565b6102a4610572366004613f29565b6121f6565b61026d6212750081565b61026d600d5481565b6102a4610598366004613d47565b61228d565b61026d60075481565b6102a46105b4366004613d47565b6122a8565b6105cc6105c7366004613c10565b612392565b6040516102779190613f67565b6102a46105e7366004613d2c565b61249d565b6103c56105fa366004613cfe565b612513565b610607612aff565b61060f612b58565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b60048181548110610661575f80fd5b5f91825260209091206008909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b03909516965092949193909261ffff16919087565b6106b5612aff565b600454869081106106e15760405162461bcd60e51b81526004016106d890613f79565b60405180910390fd5b600a8211156107325760405162461bcd60e51b815260206004820152601760248201527f7365743a20746f6f206d616e792072657761726465727300000000000000000060448201526064016106d8565b6101f461ffff861611156107885760405162461bcd60e51b815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064016106d8565b621275008411156107db5760405162461bcd60e51b815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016106d8565b5f5b828110156108725761081e8484838181106107fa576107fa613fa6565b905060200201602081019061080f9190613d2c565b6001600160a01b03163b151590565b61086a5760405162461bcd60e51b815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e7472616374000060448201526064016106d8565b6001016107dd565b5061087b612b58565b856004888154811061088f5761088f613fa6565b905f5260205f209060080201600101546006546108ac9190613fce565b6108b69190613fe1565b60068190555085600488815481106108d0576108d0613fa6565b905f5260205f2090600802016001018190555084600488815481106108f7576108f7613fa6565b905f5260205f2090600802016004015f6101000a81548161ffff021916908361ffff160217905550836004888154811061093357610933613fa6565b905f5260205f2090600802016005018190555082826004898154811061095b5761095b613fa6565b905f5260205f2090600802016007019190610977929190613b48565b508282604051610988929190613ff4565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b6004545f9083908110610a035760405162461bcd60e51b81526004016106d890613f79565b5f8481526005602090815260408083206001600160a01b038716845290915290206007544210801590610a3a575080600301544210155b95945050505050565b600c546001600160a01b03163314610acd5760405162461bcd60e51b815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f6064820152601960fa1b608482015260a4016106d8565b6001600160a01b038116610b3e5760405162461bcd60e51b815260206004820152603260248201527f73657420696e766573746f7220616464726573733a20696e76616c6964206e656044820152717720696e766573746f72206164647265737360701b60648201526084016106d8565b600c80546001600160a01b0319166001600160a01b03831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b6791905f90a350565b610b91612b75565b60045482908110610bb45760405162461bcd60e51b81526004016106d890613f79565b5f60048481548110610bc857610bc8613fa6565b5f91825260208083208784526005825260408085203386529092529220805460089092029092019250841115610c405760405162461bcd60e51b815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f75676860448201526064016106d8565b8382600601541015610c945760405162461bcd60e51b815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f7567680060448201526064016106d8565b610c9d85612bce565b610ca685612fa2565b8315610d075783815f015f828254610cbe9190613fce565b909155505060025482546001600160a01b03918216911603610cf1578360095f828254610ceb9190613fce565b90915550505b8154610d07906001600160a01b0316338661314c565b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a5100091610d3991614035565b610d43919061404c565b60018201555f5b6007830154811015610de757826007018181548110610d6b57610d6b613fa6565b5f918252602090912001548254604051632eef144760e01b81526004810189905233602482015260448101919091526001600160a01b0390911690632eef1447906064015f604051808303815f87803b158015610dc6575f5ffd5b505af1158015610dd8573d5f5f3e3d5ffd5b50505050806001019050610d4a565b508315610e075783826006015f828254610e019190613fce565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505050610e4a60018055565b5050565b606080606080846004805490508110610e795760405162461bcd60e51b81526004016106d890613f79565b5f60048781548110610e8d57610e8d613fa6565b905f5260205f209060080201905080600701805490506001610eaf9190613fe1565b6001600160401b03811115610ec657610ec661406b565b604051908082528060200260200182016040528015610eef578160200160208202803683370190505b506007820154909650610f03906001613fe1565b6001600160401b03811115610f1a57610f1a61406b565b604051908082528060200260200182016040528015610f4d57816020015b6060815260200190600190039081610f385790505b506007820154909550610f61906001613fe1565b6001600160401b03811115610f7857610f7861406b565b604051908082528060200260200182016040528015610fa1578160200160208202803683370190505b506007820154909450610fb5906001613fe1565b6001600160401b03811115610fcc57610fcc61406b565b604051908082528060200260200182016040528015610ff5578160200160208202803683370190505b5060025487519194506001600160a01b03169087905f9061101857611018613fa6565b6001600160a01b03928316602091820292909201015260025461103b9116613262565b855f8151811061104d5761104d613fa6565b602090810291909101015260025461106d906001600160a01b0316613321565b60ff16845f8151811061108257611082613fa6565b6020026020010181815250505f6103e890505f600f54600e54600d54846110a99190613fce565b6110b39190613fce565b6110bd9190613fce565b9050816006548260035486600101546110d69190614035565b6110e09190614035565b6110ea919061404c565b6110f4919061404c565b855f8151811061110657611106613fa6565b60209081029190910101525f5b60078401548110156114125783600701818154811061113457611134613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa15801561117f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a3919061407f565b896111af836001613fe1565b815181106111bf576111bf613fa6565b60200260200101906001600160a01b031690816001600160a01b0316815250506112748460070182815481106111f7576111f7613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015611242573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611266919061407f565b6001600160a01b0316613262565b88611280836001613fe1565b8151811061129057611290613fa6565b60200260200101819052506113308460070182815481106112b3576112b3613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa1580156112fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611322919061407f565b6001600160a01b0316613321565b60ff168761133f836001613fe1565b8151811061134f5761134f613fa6565b60200260200101818152505083600701818154811061137057611370613fa6565b5f91825260209091200154604051631197a07b60e21b8152600481018c90526001600160a01b039091169063465e81ec90602401602060405180830381865afa1580156113bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e3919061409a565b866113ef836001613fe1565b815181106113ff576113ff613fa6565b6020908102919091010152600101611113565b50505050509193509193565b611426612aff565b600a8111156114775760405162461bcd60e51b815260206004820152601760248201527f6164643a20746f6f206d616e792072657761726465727300000000000000000060448201526064016106d8565b6101f461ffff851611156114cd5760405162461bcd60e51b815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f20686967680000000000000060448201526064016106d8565b621275008311156115205760405162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016106d8565b6001600160a01b0385163b6115865760405162461bcd60e51b815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f6044820152651b9d1c9858dd60d21b60648201526084016106d8565b5f5b818110156115f9576115a58383838181106107fa576107fa613fa6565b6115f15760405162461bcd60e51b815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e7472616374000060448201526064016106d8565b600101611588565b50611602612b58565b5f600754421161161457600754611616565b425b90508660065f8282546116299190613fe1565b925050819055506004604051806101000160405280886001600160a01b031681526020018981526020018381526020015f81526020018761ffff1681526020018681526020015f81526020018585808060200260200160405190810160405280939291908181526020018383602002808284375f920182905250939094525050835460018082018655948252602091829020845160089092020180546001600160a01b0319166001600160a01b0390921691909117815583820151948101949094556040830151600285015560608301516003850155608083015160048501805461ffff191661ffff90921691909117905560a0830151600585015560c0830151600685015560e0830151805193949361174d935060078501929190910190613ba9565b5050508282604051611760929190613ff4565b6040519081900390206004546001600160a01b0388169061178390600190613fce565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b6117d8612b75565b600454869081106117fb5760405162461bcd60e51b81526004016106d890613f79565b5f6004888154811061180f5761180f613fa6565b5f9182526020909120600890910201805460405163d505accf60e01b8152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c481018690529192506001600160a01b031690819063d505accf9060e4015f604051808303815f87803b15801561188d575f5ffd5b505af115801561189f573d5f5f3e3d5ffd5b505050506118ad89896133d5565b5050506118b960018055565b505050505050565b6118c9612b75565b6118d281612bce565b6118db60018055565b50565b6118e6612b75565b5f600482815481106118fa576118fa613fa6565b5f918252602080832085845260058252604080852033865290925292208054600892909202909201600681015490935081111561198b5760405162461bcd60e51b815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e6044820152680dee840cadcdeeaced60bb1b60648201526084016106d8565b5f8083556001830181905560028301819055600383018190556006840180548392906119b8908490613fce565b909155505f90505b6007840154811015611a58578360070181815481106119e1576119e1613fa6565b5f918252602082200154604051632eef144760e01b81526004810188905233602482015260448101929092526001600160a01b031690632eef1447906064015f604051808303815f87803b158015611a37575f5ffd5b505af1158015611a49573d5f5f3e3d5ffd5b505050508060010190506119c0565b5060025483546001600160a01b03918216911603611a87578060095f828254611a819190613fce565b90915550505b8254611a9d906001600160a01b0316338361314c565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050506118db60018055565b611ae8612b75565b611af0612b58565b611af960018055565b565b5f60048281548110611b0f57611b0f613fa6565b905f5260205f209060080201600601549050919050565b600b546001600160a01b03163314611bb85760405162461bcd60e51b815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c2074686064820152681a5cc81b595d1a1bd960ba1b608482015260a4016106d8565b6001600160a01b038116611c295760405162461bcd60e51b815260206004820152603260248201527f73657420747265617375727920616464726573733a20696e76616c6964206e6560448201527177207472656173757279206164647265737360701b60648201526084016106d8565b600b80546001600160a01b0319166001600160a01b03831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a83510905f90a350565b600a546001600160a01b03163314611cfe5760405162461bcd60e51b815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f6064820152601960fa1b608482015260a4016106d8565b6001600160a01b038116611d675760405162461bcd60e51b815260206004820152602a60248201527f736574207465616d20616464726573733a20696e76616c6964206e6577207465604482015269616d206164647265737360b01b60648201526084016106d8565b600a80546001600160a01b0319166001600160a01b03831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f905f90a350565b611dba612aff565b611af95f61372a565b611dcb612aff565b6101f4811115611e315760405162461bcd60e51b815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201526a7263656e742076616c756560a81b60648201526084016106d8565b6101f4600e5482600d54611e459190613fe1565b611e4f9190613fe1565b1115611eb25760405162461bcd60e51b815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201526b0cadce840deeccae440dac2f60a31b60648201526084016106d8565b600f5460408051918252602082018390527f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b910160405180910390a1600f55565b611efb612aff565b6101f4811115611f615760405162461bcd60e51b815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201526a7263656e742076616c756560a81b60648201526084016106d8565b6101f4600f5482600d54611f759190613fe1565b611f7f9190613fe1565b1115611fe25760405162461bcd60e51b815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201526b0cadce840deeccae440dac2f60a31b60648201526084016106d8565b600e5460408051918252602082018390527fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd910160405180910390a1600e55565b61202b612aff565b6101f481111561208d5760405162461bcd60e51b815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e604482015266742076616c756560c81b60648201526084016106d8565b6101f4600f5482600e546120a19190613fe1565b6120ab9190613fe1565b111561210a5760405162461bcd60e51b815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e74206044820152670deeccae440dac2f60c31b60648201526084016106d8565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b612153612aff565b60075442106121b05760405162461bcd60e51b815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201526261647960e81b60648201526084016106d8565b6004545f5b818110156121ee575f600482815481106121d1576121d1613fa6565b5f91825260209091204260089092020160020155506001016121b5565b505042600755565b6121fe612b75565b601e81111561224f5760405162461bcd60e51b815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c206964730060448201526064016106d8565b5f5b818110156122835761227b83838381811061226e5761226e613fa6565b905060200201355f6133d5565b600101612251565b50610e4a60018055565b612295612b75565b61229f82826133d5565b610e4a60018055565b6122b0612aff565b6122b8612b58565b336001600160a01b03167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef3600484815481106122f6576122f6613fa6565b905f5260205f209060080201600101548360405161231e929190918252602082015260400190565b60405180910390a2806004838154811061233a5761233a613fa6565b905f5260205f209060080201600101546006546123579190613fce565b6123619190613fe1565b600681905550806004838154811061237b5761237b613fa6565b905f5260205f209060080201600101819055505050565b600454606090829081106123b85760405162461bcd60e51b81526004016106d890613f79565b5f600484815481106123cc576123cc613fa6565b905f5260205f209060080201905080600701805490506001600160401b038111156123f9576123f961406b565b604051908082528060200260200182016040528015612422578160200160208202803683370190505b5092505f5b60078201548110156124955781600701818154811061244857612448613fa6565b905f5260205f20015f9054906101000a90046001600160a01b031684828151811061247557612475613fa6565b6001600160a01b0390921660209283029190910190910152600101612427565b505050919050565b6124a5612aff565b6001600160a01b03811661250a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d8565b6118db8161372a565b60608060608085600480549050811061253e5760405162461bcd60e51b81526004016106d890613f79565b5f6004888154811061255257612552613fa6565b5f91825260208083208b84526005825260408085206001600160a01b038d16865290925292206003600890920290920190810154600682015460028301549294509091421180156125a257508015155b15612674575f8460020154426125b89190613fce565b90505f6103e890505f600f54600e54600d54846125d59190613fce565b6125df9190613fce565b6125e99190613fce565b90505f82600654838a60010154600354886126049190614035565b61260e9190614035565b6126189190614035565b612622919061404c565b61262c919061404c565b9050846126597f000000000000000000000000000000000000000000000000000000e8d4a5100083614035565b612663919061404c565b61266d9087613fe1565b9550505050505b5f836002015484600101547f000000000000000000000000000000000000000000000000000000e8d4a5100085875f01546126af9190614035565b6126b9919061404c565b6126c39190613fce565b6126cd9190613fe1565b60078601549091506126e0906001613fe1565b6001600160401b038111156126f7576126f761406b565b604051908082528060200260200182016040528015612720578160200160208202803683370190505b506007860154909a50612734906001613fe1565b6001600160401b0381111561274b5761274b61406b565b60405190808252806020026020018201604052801561277e57816020015b60608152602001906001900390816127695790505b506007860154909950612792906001613fe1565b6001600160401b038111156127a9576127a961406b565b6040519080825280602002602001820160405280156127d2578160200160208202803683370190505b5060078601549097506127e6906001613fe1565b6001600160401b038111156127fd576127fd61406b565b604051908082528060200260200182016040528015612826578160200160208202803683370190505b506002548b519199506001600160a01b0316908b905f9061284957612849613fa6565b6001600160a01b03928316602091820292909201015260025461286c9116613262565b895f8151811061287e5761287e613fa6565b602090810291909101015260025461289e906001600160a01b0316613321565b60ff16885f815181106128b3576128b3613fa6565b60200260200101818152505080875f815181106128d2576128d2613fa6565b60209081029190910101525f5b6007860154811015612aef5785600701818154811061290057612900613fa6565b5f91825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa15801561294b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296f919061407f565b8b61297b836001613fe1565b8151811061298b5761298b613fa6565b60200260200101906001600160a01b031690816001600160a01b0316815250506129c38660070182815481106111f7576111f7613fa6565b8a6129cf836001613fe1565b815181106129df576129df613fa6565b6020026020010181905250612a028660070182815481106112b3576112b3613fa6565b60ff1689612a11836001613fe1565b81518110612a2157612a21613fa6565b602002602001018181525050856007018181548110612a4257612a42613fa6565b5f9182526020909120015460405160016232bd9d60e01b03198152600481018f90526001600160a01b038e811660248301529091169063ffcd426390604401602060405180830381865afa158015612a9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ac0919061409a565b88612acc836001613fe1565b81518110612adc57612adc613fa6565b60209081029190910101526001016128df565b5050505050505092959194509250565b5f546001600160a01b03163314611af95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d8565b5f5b6004548110156118db57612b6d81612bce565b600101612b5a565b600260015403612bc75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d8565b6002600155565b60045481908110612bf15760405162461bcd60e51b81526004016106d890613f79565b5f60048381548110612c0557612c05613fa6565b905f5260205f209060080201905080600201544211612c2357505050565b6006810154801580612c3757506001820154155b15612c485750426002909101555050565b5f826002015442612c599190613fce565b90505f600654846001015460035484612c729190614035565b612c7c9190614035565b612c86919061404c565b90505f6103e890505f600f54600e54600d5484612ca39190613fce565b612cad9190613fce565b612cb79190613fce565b600254600a54600d549293506001600160a01b03918216926340c10f1992909116908590612ce59088614035565b612cef919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612d32575f5ffd5b505af1158015612d44573d5f5f3e3d5ffd5b5050600254600b54600e546001600160a01b0392831694506340c10f1993509116908590612d729088614035565b612d7c919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612dbf575f5ffd5b505af1158015612dd1573d5f5f3e3d5ffd5b5050600254600c54600f546001600160a01b0392831694506340c10f1993509116908590612dff9088614035565b612e09919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612e4c575f5ffd5b505af1158015612e5e573d5f5f3e3d5ffd5b50506002546001600160a01b031691506340c10f1990503084612e818588614035565b612e8b919061404c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612ece575f5ffd5b505af1158015612ee0573d5f5f3e3d5ffd5b505050600687015483915082612f167f000000000000000000000000000000000000000000000000000000e8d4a5100087614035565b612f209190614035565b612f2a919061404c565b612f34919061404c565b866003015f828254612f469190613fe1565b909155505042600287018190556003870154604080519283526020830188905282015288907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a25050505050505050565b5f60048281548110612fb657612fb6613fa6565b5f91825260208083208584526005825260408085203386529092529220600381015460089092029092019250158015612ff157506007544210155b1561300b5760058201546130059042613fe1565b60038201555b5f81600101547f000000000000000000000000000000000000000000000000000000e8d4a510008460030154845f01546130459190614035565b61304f919061404c565b6130599190613fce565b905061306584336109de565b156130d8575f81118061307b57505f8260020154115b156130d3575f8260020154826130919190613fe1565b9050826002015460085f8282546130a89190613fce565b90915550505f600284015560058401546130c29042613fe1565b60038401556130d13382613779565b505b613146565b8015613146578060085f8282546130ef9190613fe1565b9250508190555080826002015f8282546131099190613fe1565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916131a791906140b1565b5f604051808303815f865af19150503d805f81146131e0576040519150601f19603f3d011682016040523d82523d5f602084013e6131e5565b606091505b509150915081801561320f57508051158061320f57508080602001905181019061320f91906140c7565b61325b5760405162461bcd60e51b815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c65640000000060448201526064016106d8565b5050505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916132a891906140b1565b5f60405180830381855afa9150503d805f81146132e0576040519150601f19603f3d011682016040523d82523d5f602084013e6132e5565b606091505b50915091508161331057604051806040016040528060038152602001623f3f3f60e81b815250613319565b613319816138a6565b949350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b0386169161336691906140b1565b5f60405180830381855afa9150503d805f811461339e576040519150601f19603f3d011682016040523d82523d5f602084013e6133a3565b606091505b50915091508180156133b6575080516020145b6133c1576012613319565b8080602001905181019061331991906140e6565b600454829081106133f85760405162461bcd60e51b81526004016106d890613f79565b5f6004848154811061340c5761340c613fa6565b5f918252602080832087845260058252604080852033865290925292206008909102909101915061343c85612bce565b61344585612fa2565b83156135ec5781546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613490573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b4919061409a565b83549091506134ce906001600160a01b0316333088613a31565b82546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613513573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613537919061409a565b90506135438282613fce565b600485015490965061ffff16156135a45760048401545f906127109061356d9061ffff1689614035565b613577919061404c565b600b548654919250613596916001600160a01b0390811691168361314c565b6135a08188613fce565b9650505b85835f015f8282546135b69190613fe1565b909155505060025484546001600160a01b039182169116036135e9578560095f8282546135e39190613fe1565b90915550505b50505b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a510009161361e91614035565b613628919061404c565b60018201555f5b60078301548110156136cc5782600701818154811061365057613650613fa6565b5f918252602090912001548254604051632eef144760e01b81526004810189905233602482015260448101919091526001600160a01b0390911690632eef1447906064015f604051808303815f87803b1580156136ab575f5ffd5b505af11580156136bd573d5f5f3e3d5ffd5b5050505080600101905061362f565b5083156136ec5783826006015f8282546136e69190613fe1565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156137c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e6919061409a565b1115610e4a576009546002546040516370a0823160e01b81523060048201525f92916001600160a01b0316906370a0823190602401602060405180830381865afa158015613836573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061385a919061409a565b6138649190613fce565b905080821061388957600254613884906001600160a01b0316848361314c565b505050565b811561388457600254613884906001600160a01b0316848461314c565b606060408251106138cb57818060200190518101906138c59190614101565b92915050565b8151602003613a0d575f5b60208160ff1610801561390b5750828160ff16815181106138f9576138f9613fa6565b01602001516001600160f81b03191615155b15613922578061391a816141b1565b9150506138d6565b5f8160ff166001600160401b0381111561393e5761393e61406b565b6040519080825280601f01601f191660200182016040528015613968576020820181803683370190505b5090505f91505b60208260ff161080156139a45750838260ff168151811061399257613992613fa6565b01602001516001600160f81b03191615155b15613a0657838260ff16815181106139be576139be613fa6565b602001015160f81c60f81b818360ff16815181106139de576139de613fa6565b60200101906001600160f81b03191690815f1a905350816139fe816141b1565b92505061396f565b9392505050565b50506040805180820190915260038152623f3f3f60e81b602082015290565b919050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f92839290881691613a9491906140b1565b5f604051808303815f865af19150503d805f8114613acd576040519150601f19603f3d011682016040523d82523d5f602084013e613ad2565b606091505b5091509150818015613afc575080511580613afc575080806020019051810190613afc91906140c7565b6118b95760405162461bcd60e51b815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c656460448201526064016106d8565b828054828255905f5260205f20908101928215613b99579160200282015b82811115613b995781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613b66565b50613ba5929150613bfc565b5090565b828054828255905f5260205f20908101928215613b99579160200282015b82811115613b9957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613bc7565b5b80821115613ba5575f8155600101613bfd565b5f60208284031215613c20575f5ffd5b5035919050565b803561ffff81168114613a2c575f5ffd5b5f5f83601f840112613c48575f5ffd5b5081356001600160401b03811115613c5e575f5ffd5b6020830191508360208260051b8501011115613c78575f5ffd5b9250929050565b5f5f5f5f5f5f60a08789031215613c94575f5ffd5b8635955060208701359450613cab60408801613c27565b93506060870135925060808701356001600160401b03811115613ccc575f5ffd5b613cd889828a01613c38565b979a9699509497509295939492505050565b6001600160a01b03811681146118db575f5ffd5b5f5f60408385031215613d0f575f5ffd5b823591506020830135613d2181613cea565b809150509250929050565b5f60208284031215613d3c575f5ffd5b8135613a0681613cea565b5f5f60408385031215613d58575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b82811015613da05781516001600160a01b0316865260209586019590910190600101613d79565b5093949350505050565b5f8151808452602084019350602083015f5b82811015613da0578151865260209586019590910190600101613dbc565b608081525f613dec6080830187613d67565b828103602084015280865180835260208301915060208160051b840101602089015f5b83811015613e6157601f19868403018552815180518085528060208301602087015e5f602082870101526020601f19601f83011686010194505050602082019150602085019450600181019050613e0f565b50508581036040870152613e758189613daa565b93505050508281036060840152613e8c8185613daa565b979650505050505050565b5f5f5f5f5f5f60a08789031215613eac575f5ffd5b863595506020870135613ebe81613cea565b9450613cab60408801613c27565b60ff811681146118db575f5ffd5b5f5f5f5f5f5f60c08789031215613eef575f5ffd5b8635955060208701359450604087013593506060870135613f0f81613ecc565b9598949750929560808101359460a0909101359350915050565b5f5f60208385031215613f3a575f5ffd5b82356001600160401b03811115613f4f575f5ffd5b613f5b85828601613c38565b90969095509350505050565b602081525f613a066020830184613d67565b602080825260139082015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156138c5576138c5613fba565b808201808211156138c5576138c5613fba565b5f8184825b8581101561402a57813561400c81613cea565b6001600160a01b031683526020928301929190910190600101613ff9565b509095945050505050565b80820281158282048414176138c5576138c5613fba565b5f8261406657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561408f575f5ffd5b8151613a0681613cea565b5f602082840312156140aa575f5ffd5b5051919050565b5f82518060208501845e5f920191825250919050565b5f602082840312156140d7575f5ffd5b81518015158114613a06575f5ffd5b5f602082840312156140f6575f5ffd5b8151613a0681613ecc565b5f60208284031215614111575f5ffd5b81516001600160401b03811115614126575f5ffd5b8201601f81018413614136575f5ffd5b80516001600160401b0381111561414f5761414f61406b565b604051601f8201601f19908116603f011681016001600160401b038111828210171561417d5761417d61406b565b604052818152828201602001861015614194575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f60ff821660ff81036141c6576141c6613fba565b6001019291505056fea2646970667358221220980a40fbc1803470da868dd7534b0ec38180f45738c72d9fef26f5e568cba16c64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000054751a729ee2031296699cd655f81cb390a63190000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000051d7ec5830940d96af380842c309576cf9da26c000000000000000000000000f138d23724441ad67e87eb20aaf2d437d339a1c8000000000000000000000000f138d23724441ad67e87eb20aaf2d437d339a1c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _statix (address): 0x054751a729EE2031296699cD655f81cb390a6319
Arg [1] : _statixPerSec (uint256): 1000000000000000000
Arg [2] : _teamAddress (address): 0x051D7Ec5830940d96af380842C309576cf9dA26c
Arg [3] : _treasuryAddress (address): 0xF138D23724441aD67E87EB20AAF2d437D339a1C8
Arg [4] : _investorAddress (address): 0xF138D23724441aD67E87EB20AAF2d437D339a1C8
Arg [5] : _teamPercent (uint256): 200
Arg [6] : _treasuryPercent (uint256): 200
Arg [7] : _investorPercent (uint256): 100
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000054751a729ee2031296699cd655f81cb390a6319
Arg [1] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [2] : 000000000000000000000000051d7ec5830940d96af380842c309576cf9da26c
Arg [3] : 000000000000000000000000f138d23724441ad67e87eb20aaf2d437d339a1c8
Arg [4] : 000000000000000000000000f138d23724441ad67e87eb20aaf2d437d339a1c8
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [6] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode Sourcemap
21811:28401:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24160:30;;;;;;;;;160:25:1;;;148:2;133:18;24160:30:0;;;;;;;;24261;;;;;;28183:95;28255:8;:15;28183:95;;46006:224;;;;;;:::i;:::-;;:::i;:::-;;23969:30;;;;;-1:-1:-1;;;;;23969:30:0;;;;;;-1:-1:-1;;;;;591:32:1;;;573:51;;561:2;546:18;23969:30:0;427:203:1;23263:26:0;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;986:32:1;;;968:51;;1050:2;1035:18;;1028:34;;;;1078:18;;;1071:34;;;;1136:2;1121:18;;1114:34;;;;1197:6;1185:19;1179:3;1164:19;;1157:48;1006:3;1221:19;;1214:35;1280:3;1265:19;;1258:35;955:3;940:19;23263:26:0;635:664:1;23508:34:0;;;;;;22921:26;;;;;-1:-1:-1;;;;;22921:26:0;;;23843;;;;;-1:-1:-1;;;;;23843:26:0;;;30430:1410;;;;;;:::i;:::-;;:::i;36863:326::-;;;;;;:::i;:::-;;:::i;:::-;;;3671:14:1;;3664:22;3646:41;;3634:2;3619:18;36863:326:0;3506:187:1;49232:474:0;;;;;;:::i;:::-;;:::i;41502:1418::-;;;;;;:::i;:::-;;:::i;34473:1773::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;23670:35::-;;;;;;22997:27;;;;;;28491:1825;;;;;;:::i;:::-;;:::i;39211:443::-;;;;;;:::i;:::-;;:::i;37636:92::-;;;;;;:::i;:::-;;:::i;42991:1018::-;;;;;;:::i;:::-;;:::i;37272:86::-;;;:::i;46699:113::-;;;;;;:::i;:::-;;:::i;48177:482::-;;;;;;:::i;:::-;;:::i;47214:434::-;;;;;;:::i;:::-;;:::i;2662:103::-;;;:::i;23175:53::-;;23225:3;23175:53;;;;;8844:6:1;8832:19;;;8814:38;;8802:2;8787:18;23175:53:0;8670:188:1;49714:495:0;;;;;;:::i;:::-;;:::i;48667:::-;;;;;;:::i;:::-;;:::i;2021:87::-;2067:7;2094:6;-1:-1:-1;;;;;2094:6:0;2021:87;;23347:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9094:25:1;;;9150:2;9135:18;;9128:34;;;;9178:18;;;9171:34;9236:2;9221:18;;9214:34;9081:3;9066:19;23347:64:0;8863:391:1;47656:455:0;;;;;;:::i;:::-;;:::i;23775:37::-;;;;;;27734:441;;;:::i;23904:30::-;;;;;-1:-1:-1;;;;;23904:30:0;;;46883:265;;;;;;:::i;:::-;;:::i;23071:58::-;;23122:7;23071:58;;24063:26;;;;;;39708:110;;;;;;:::i;:::-;;:::i;23600:29::-;;;;;;46238:453;;;;;;:::i;:::-;;:::i;36304:494::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2920:201::-;;;;;;:::i;:::-;;:::i;31906:2500::-;;;;;;:::i;:::-;;:::i;46006:224::-;1907:13;:11;:13::i;:::-;46085:18:::1;:16;:18::i;:::-;46153:12;::::0;46121:60:::1;::::0;;10159:25:1;;;10215:2;10200:18;;10193:34;;;46141:10:0::1;::::0;46121:60:::1;::::0;10132:18:1;46121:60:0::1;;;;;;;46194:12;:28:::0;46006:224::o;23263:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23263:26:0;;;;-1:-1:-1;23263:26:0;;;;;;;;;;;:::o;30430:1410::-;1907:13;:11;:13::i;:::-;24457:8:::1;:15:::0;30653:4;;24450:22;::::1;24442:54;;;;-1:-1:-1::0;;;24442:54:0::1;;;;;;;:::i;:::-;;;;;;;;;30699:2:::2;30678:23:::0;::::2;;30670:59;;;::::0;-1:-1:-1;;;30670:59:0;;10788:2:1;30670:59:0::2;::::0;::::2;10770:21:1::0;10827:2;10807:18;;;10800:30;10866:25;10846:18;;;10839:53;10909:18;;30670:59:0::2;10586:347:1::0;30670:59:0::2;23225:3;30764:41;::::0;::::2;;;30742:116;;;::::0;-1:-1:-1;;;30742:116:0;;11140:2:1;30742:116:0::2;::::0;::::2;11122:21:1::0;11179:2;11159:18;;;11152:30;11218:27;11198:18;;;11191:55;11263:18;;30742:116:0::2;10938:349:1::0;30742:116:0::2;23122:7;30891:16;:44;;30869:123;;;::::0;-1:-1:-1;;;30869:123:0;;11494:2:1;30869:123:0::2;::::0;::::2;11476:21:1::0;11533:2;11513:18;;;11506:30;11572:31;11552:18;;;11545:59;11621:18;;30869:123:0::2;11292:353:1::0;30869:123:0::2;31024:18;31005:295;31061:30:::0;;::::2;31005:295;;;31171:51;31198:10;;31209;31198:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8317:19:0;;:23;;;8022:326;31171:51:::2;31145:143;;;::::0;-1:-1:-1;;;31145:143:0;;12260:2:1;31145:143:0::2;::::0;::::2;12242:21:1::0;12299:2;12279:18;;;12272:30;12338:32;12318:18;;;12311:60;12388:18;;31145:143:0::2;12058:354:1::0;31145:143:0::2;31106:12;;31005:295;;;;31312:18;:16;:18::i;:::-;31446:11;31405:8;31414:4;31405:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;31374:15;;:56;;;;:::i;:::-;:83;;;;:::i;:::-;31343:15;:114;;;;31498:11;31470:8;31479:4;31470:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;31550:13;31520:8;31529:4;31520:14;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;31607:16;31574:8;31583:4;31574:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:49;;;;31661:10;;31634:8;31643:4;31634:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:37;;;;;;;:::i;:::-;;31811:10;;31689:143;;;;;;;:::i;:::-;;::::0;;;;;::::2;::::0;;13638:25:1;;;13711:6;13699:19;;13694:2;13679:18;;13672:47;13735:18;;;13728:34;;;31689:143:0;31707:4;;31689:143:::2;::::0;13626:2:1;13611:18;31689:143:0::2;;;;;;;1931:1:::1;30430:1410:::0;;;;;;:::o;36863:326::-;24457:8;:15;36993:4;;36969;;24450:22;;24442:54;;;;-1:-1:-1;;;24442:54:0;;;;;;;:::i;:::-;37015:21:::1;37039:14:::0;;;:8:::1;:14;::::0;;;;;;;-1:-1:-1;;;;;37039:21:0;::::1;::::0;;;;;;;37110:14:::1;::::0;37091:15:::1;:33;::::0;::::1;::::0;:90:::1;;;37160:4;:21;;;37141:15;:40;;37091:90;37071:110:::0;36863:326;-1:-1:-1;;;;;36863:326:0:o;49232:474::-;49340:15;;-1:-1:-1;;;;;49340:15:0;49326:10;:29;49304:144;;;;-1:-1:-1;;;49304:144:0;;13975:2:1;49304:144:0;;;13957:21:1;14014:2;13994:18;;;13987:30;14053:34;14033:18;;;14026:62;14124:34;14104:18;;;14097:62;-1:-1:-1;;;14175:19:1;;;14168:32;14217:19;;49304:144:0;13773:469:1;49304:144:0;-1:-1:-1;;;;;49481:30:0;;49459:130;;;;-1:-1:-1;;;49459:130:0;;14449:2:1;49459:130:0;;;14431:21:1;14488:2;14468:18;;;14461:30;14527:34;14507:18;;;14500:62;-1:-1:-1;;;14578:18:1;;;14571:48;14636:19;;49459:130:0;14247:414:1;49459:130:0;49600:15;:34;;-1:-1:-1;;;;;;49600:34:0;-1:-1:-1;;;;;49600:34:0;;;;;;;;49650:48;;49669:10;;49650:48;;-1:-1:-1;;49650:48:0;49232:474;:::o;41502:1418::-;5732:21;:19;:21::i;:::-;24457:8:::1;:15:::0;41616:4;;24450:22;::::1;24442:54;;;;-1:-1:-1::0;;;24442:54:0::1;;;;;;;:::i;:::-;41638:21:::2;41662:8;41671:4;41662:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;41711;;;:8:::2;:14:::0;;;;;;41726:10:::2;41711:26:::0;;;;;;;41831:11;;41662:14:::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;41831:22:0;-1:-1:-1;41831:22:0::2;41823:67;;;::::0;-1:-1:-1;;;41823:67:0;;14868:2:1;41823:67:0::2;::::0;::::2;14850:21:1::0;;;14887:18;;;14880:30;14946:34;14926:18;;;14919:62;14998:18;;41823:67:0::2;14666:356:1::0;41823:67:0::2;41979:7;41963:4;:12;;;:23;;41955:67;;;::::0;-1:-1:-1;;;41955:67:0;;15229:2:1;41955:67:0::2;::::0;::::2;15211:21:1::0;15268:2;15248:18;;;15241:30;15307:33;15287:18;;;15280:61;15358:18;;41955:67:0::2;15027:355:1::0;41955:67:0::2;42035:17;42047:4;42035:11;:17::i;:::-;42065:30;42090:4;42065:24;:30::i;:::-;42112:11:::0;;42108:251:::2;;42155:7;42140:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42214:6:0::2;::::0;42189:12;;-1:-1:-1;;;;;42214:6:0;;::::2;42189:12:::0;::::2;42181:40:::0;42177:110:::2;;42264:7;42242:18;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42177:110:0::2;42301:12:::0;;:46:::2;::::0;-1:-1:-1;;;;;42301:12:0::2;42327:10;42339:7:::0;42301:25:::2;:46::i;:::-;42417:22;::::0;::::2;::::0;42403:11;;42456:19:::2;::::0;42403:36:::2;::::0;::::2;:::i;:::-;42402:73;;;;:::i;:::-;42371:15;::::0;::::2;:104:::0;42507:18:::2;42488:293;42557:14;::::0;::::2;:21:::0;42544:34;::::2;42488:293;;;42632:4;:14;;42647:10;42632:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;42743:11;;42632:137:::2;::::0;-1:-1:-1;;;42632:137:0;;::::2;::::0;::::2;15984:25:1::0;;;42714:10:0::2;16025:18:1::0;;;16018:60;16094:18;;;16087:34;;;;-1:-1:-1;;;;;42632:26:0;;::::2;::::0;:40:::2;::::0;15957:18:1;;42632:137:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42593:12;;;;;42488:293;;;-1:-1:-1::0;42797:11:0;;42793:67:::2;;42841:7;42825:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42793:67:0::2;42877:35;::::0;160:25:1;;;42898:4:0;;42886:10:::2;::::0;42877:35:::2;::::0;148:2:1;133:18;42877:35:0::2;;;;;;;41627:1293;;5764:1:::1;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;41502:1418;;:::o;34473:1773::-;34611:26;34652:23;34690:25;34730:30;34573:4;24457:8;:15;;;;24450:4;:22;24442:54;;;;-1:-1:-1;;;24442:54:0;;;;;;;:::i;:::-;34788:21:::1;34812:8;34821:4;34812:14;;;;;;;;:::i;:::-;;;;;;;;;;;34788:38;;34865:4;:14;;:21;;;;34889:1;34865:25;;;;:::i;:::-;-1:-1:-1::0;;;;;34851:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;34851:40:0::1;-1:-1:-1::0;34925:14:0::1;::::0;::::1;:21:::0;34839:52;;-1:-1:-1;34925:25:0::1;::::0;34949:1:::1;34925:25;:::i;:::-;-1:-1:-1::0;;;;;34912:39:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;34987:14:0::1;::::0;::::1;:21:::0;34902:49;;-1:-1:-1;34987:25:0::1;::::0;35011:1:::1;34987:25;:::i;:::-;-1:-1:-1::0;;;;;34973:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;34973:40:0::1;-1:-1:-1::0;35054:14:0::1;::::0;::::1;:21:::0;34962:51;;-1:-1:-1;35054:25:0::1;::::0;35078:1:::1;35054:25;:::i;:::-;-1:-1:-1::0;;;;;35040:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;35040:40:0::1;-1:-1:-1::0;35116:6:0::1;::::0;35093:12;;35024:56;;-1:-1:-1;;;;;;35116:6:0::1;::::0;35093:9;;35116:6:::1;::::0;35093:12:::1;;;;:::i;:::-;-1:-1:-1::0;;;;;35093:30:0;;::::1;:12;::::0;;::::1;::::0;;;;;:30;35160:6:::1;::::0;35147:33:::1;::::0;35160:6:::1;35147:31;:33::i;:::-;35134:7;35142:1;35134:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:46;35218:6:::1;::::0;35205:35:::1;::::0;-1:-1:-1;;;;;35218:6:0::1;35205:33;:35::i;:::-;35191:49;;:8;35200:1;35191:11;;;;;;;;:::i;:::-;;;;;;:49;;;::::0;::::1;35253:13;35269:4;35253:20;;35284:17;35383:15;;35352;;35325:11;;35304:5;:32;;;;:::i;:::-;:63;;;;:::i;:::-;:94;;;;:::i;:::-;35284:114;;35534:5;35503:15;;35477:9;35462:12;;35444:4;:15;;;:30;;;;:::i;:::-;:42;;;;:::i;:::-;35443:75;;;;:::i;:::-;:96;;;;:::i;:::-;35411:13;35425:1;35411:16;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:128;35571:18:::1;35552:687;35621:14;::::0;::::1;:21:::0;35608:34;::::1;35552:687;;;35750:4;:14;;35765:10;35750:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;35750:40:0;;;;-1:-1:-1;;;;;35750:26:0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35696:9:::0;35706:14:::1;:10:::0;35719:1:::1;35706:14;:::i;:::-;35696:25;;;;;;;;:::i;:::-;;;;;;:109;-1:-1:-1::0;;;;;35696:109:0::1;;;-1:-1:-1::0;;;;;35696:109:0::1;;;::::0;::::1;35848:99;35879:4;:14;;35894:10;35879:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;35879:40:0;;;;-1:-1:-1;;;;;35879:26:0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35848:97:0::1;;:99::i;:::-;35822:7:::0;35830:14:::1;:10:::0;35843:1:::1;35830:14;:::i;:::-;35822:23;;;;;;;;:::i;:::-;;;;;;:125;;;;35991:101;36022:4;:14;;36037:10;36022:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;36022:40:0;;;;-1:-1:-1;;;;;36022:26:0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35991:99:0::1;;:101::i;:::-;35964:128;;:8:::0;35973:14:::1;:10:::0;35986:1:::1;35973:14;:::i;:::-;35964:24;;;;;;;;:::i;:::-;;;;;;:128;;;::::0;::::1;36141:4;:32;;36174:10;36141:44;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:86:::1;::::0;-1:-1:-1;;;36141:86:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;36141:44:0;;::::1;::::0;:80:::1;::::0;133:18:1;;36141:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36109:13:::0;36123:14:::1;:10:::0;36136:1:::1;36123:14;:::i;:::-;36109:29;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:118;35657:12:::1;;35552:687;;;;34777:1469;;;34473:1773:::0;;;;;;:::o;28491:1825::-;1907:13;:11;:13::i;:::-;28745:2:::1;28724:23:::0;::::1;;28716:59;;;::::0;-1:-1:-1;;;28716:59:0;;16931:2:1;28716:59:0::1;::::0;::::1;16913:21:1::0;16970:2;16950:18;;;16943:30;17009:25;16989:18;;;16982:53;17052:18;;28716:59:0::1;16729:347:1::0;28716:59:0::1;23225:3;28808:41;::::0;::::1;;;28786:116;;;::::0;-1:-1:-1;;;28786:116:0;;17283:2:1;28786:116:0::1;::::0;::::1;17265:21:1::0;17322:2;17302:18;;;17295:30;17361:27;17341:18;;;17334:55;17406:18;;28786:116:0::1;17081:349:1::0;28786:116:0::1;23122:7;28935:16;:44;;28913:123;;;::::0;-1:-1:-1;;;28913:123:0;;17637:2:1;28913:123:0::1;::::0;::::1;17619:21:1::0;17676:2;17656:18;;;17649:30;17715:31;17695:18;;;17688:59;17764:18;;28913:123:0::1;17435:353:1::0;28913:123:0::1;-1:-1:-1::0;;;;;8317:19:0;;;29047:125:::1;;;::::0;-1:-1:-1;;;29047:125:0;;17995:2:1;29047:125:0::1;::::0;::::1;17977:21:1::0;18034:2;18014:18;;;18007:30;18073:34;18053:18;;;18046:62;-1:-1:-1;;;18124:18:1;;;18117:36;18170:19;;29047:125:0::1;17793:402:1::0;29047:125:0::1;29204:18;29185:295;29241:30:::0;;::::1;29185:295;;;29351:51;29378:10;;29389;29378:22;;;;;;;:::i;29351:51::-;29325:143;;;::::0;-1:-1:-1;;;29325:143:0;;18402:2:1;29325:143:0::1;::::0;::::1;18384:21:1::0;18441:2;18421:18;;;18414:30;18480:32;18460:18;;;18453:60;18530:18;;29325:143:0::1;18200:354:1::0;29325:143:0::1;29286:12;;29185:295;;;;29492:18;:16;:18::i;:::-;29523:27;29571:14;;29553:15;:32;:93;;29632:14;;29553:93;;;29601:15;29553:93;29523:123;;29678:11;29659:15;;:30;;;;;;;:::i;:::-;;;;;;;;29702:8;29730:368;;;;;;;;29767:8;-1:-1:-1::0;;;;;29730:368:0::1;;;;;29806:11;29730:368;;;;29857:19;29730:368;;;;29914:1;29730:368;;;;29948:13;29730:368;;;;;;29997:16;29730:368;;;;30041:1;29730:368;;;;30072:10;;29730:368;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;29730:368:0;;;;-1:-1:-1;;29702:407:0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;29702:407:0::1;-1:-1:-1::0;;;;;29702:407:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;29702:407:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;29702:407:0::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;;;;30287:10;;30127:181;;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;30145:8:::1;:15:::0;-1:-1:-1;;;;;30127:181:0;::::1;::::0;30145:19:::1;::::0;30163:1:::1;::::0;30145:19:::1;:::i;:::-;30127:181;::::0;;13638:25:1;;;13711:6;13699:19;;13694:2;13679:18;;13672:47;13735:18;;;13728:34;;;30127:181:0::1;::::0;13626:2:1;13611:18;30127:181:0::1;;;;;;;28705:1611;28491:1825:::0;;;;;;:::o;39211:443::-;5732:21;:19;:21::i;:::-;24457:8:::1;:15:::0;39415:3;;24450:22;::::1;24442:54;;;;-1:-1:-1::0;;;24442:54:0::1;;;;;;;:::i;:::-;39431:21:::2;39455:8;39464:3;39455:13;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;39524:12:::0;;39549:65:::2;::::0;-1:-1:-1;;;39549:65:0;;39561:10:::2;39549:65;::::0;::::2;18870:51:1::0;39581:4:0::2;18937:18:1::0;;;18930:60;19006:18;;;18999:34;;;19049:18;;;19042:34;;;19125:4;19113:17;;19092:19;;;19085:46;19147:19;;;19140:35;;;19191:19;;;19184:35;;;39455:13:0;;-1:-1:-1;;;;;;39524:12:0::2;::::0;;;39549:11:::2;::::0;18842:19:1;;39549:65:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39625:21;39634:3;39639:6;39625:8;:21::i;:::-;39420:234;;5764:1:::1;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;39211:443;;;;;;:::o;37636:92::-;5732:21;:19;:21::i;:::-;37703:17:::1;37715:4;37703:11;:17::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;37636:92;:::o;42991:1018::-;5732:21;:19;:21::i;:::-;43063::::1;43087:8;43096:4;43087:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;43136;;;:8:::1;:14:::0;;;;;;43151:10:::1;43136:26:::0;;;;;;;43190:11;;43087:14:::1;::::0;;;::::1;::::0;;::::1;43288:12;::::0;::::1;::::0;43087:14;;-1:-1:-1;;;43288:22:0::1;43266:113;;;::::0;-1:-1:-1;;;43266:113:0;;19432:2:1;43266:113:0::1;::::0;::::1;19414:21:1::0;19471:2;19451:18;;;19444:30;19510:34;19490:18;;;19483:62;-1:-1:-1;;;19561:18:1;;;19554:39;19610:19;;43266:113:0::1;19230:405:1::0;43266:113:0::1;43406:1;43392:15:::0;;;43418::::1;::::0;::::1;:19:::0;;;43448::::1;::::0;::::1;:23:::0;;;43482:21:::1;::::0;::::1;:25:::0;;;43518:12:::1;::::0;::::1;:22:::0;;43534:6;;43406:1;43518:22:::1;::::0;43534:6;;43518:22:::1;:::i;:::-;::::0;;;-1:-1:-1;43572:18:0::1;::::0;-1:-1:-1;43553:217:0::1;43622:14;::::0;::::1;:21:::0;43609:34;::::1;43553:217;;;43697:4;:14;;43712:10;43697:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;:61:::1;::::0;-1:-1:-1;;;43697:61:0;;::::1;::::0;::::1;15984:25:1::0;;;43744:10:0::1;16025:18:1::0;;;16018:60;16094:18;;;16087:34;;;;-1:-1:-1;;;;;43697:26:0::1;::::0;:40:::1;::::0;15957:18:1;;43697:61:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43658:12;;;;;43553:217;;;-1:-1:-1::0;43819:6:0::1;::::0;43794:12;;-1:-1:-1;;;;;43819:6:0;;::::1;43794:12:::0;::::1;43786:40:::0;43782:101:::1;;43865:6;43843:18;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43782:101:0::1;43895:12:::0;;:45:::1;::::0;-1:-1:-1;;;;;43895:12:0::1;43921:10;43933:6:::0;43895:25:::1;:45::i;:::-;43958:43;::::0;160:25:1;;;43988:4:0;;43976:10:::1;::::0;43958:43:::1;::::0;148:2:1;133:18;43958:43:0::1;;;;;;;43052:957;;;5776:20:::0;5170:1;6296:22;;6113:213;37272:86;5732:21;:19;:21::i;:::-;37332:18:::1;:16;:18::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;5776:20;37272:86::o;46699:113::-;46756:7;46783:8;46792:3;46783:13;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;46776:28;;46699:113;;;:::o;48177:482::-;48285:15;;-1:-1:-1;;;;;48285:15:0;48271:10;:29;48249:152;;;;-1:-1:-1;;;48249:152:0;;20200:2:1;48249:152:0;;;20182:21:1;20239:2;20219:18;;;20212:30;20278:34;20258:18;;;20251:62;20349:34;20329:18;;;20322:62;-1:-1:-1;;;20400:19:1;;;20393:40;20450:19;;48249:152:0;19998:477:1;48249:152:0;-1:-1:-1;;;;;48434:30:0;;48412:130;;;;-1:-1:-1;;;48412:130:0;;20682:2:1;48412:130:0;;;20664:21:1;20721:2;20701:18;;;20694:30;20760:34;20740:18;;;20733:62;-1:-1:-1;;;20811:18:1;;;20804:48;20869:19;;48412:130:0;20480:414:1;48412:130:0;48553:15;:34;;-1:-1:-1;;;;;;48553:34:0;-1:-1:-1;;;;;48553:34:0;;;;;;;;48603:48;;48622:10;;48603:48;;-1:-1:-1;;48603:48:0;48177:482;:::o;47214:434::-;47314:11;;-1:-1:-1;;;;;47314:11:0;47300:10;:25;47278:140;;;;-1:-1:-1;;;47278:140:0;;21101:2:1;47278:140:0;;;21083:21:1;21140:2;21120:18;;;21113:30;21179:34;21159:18;;;21152:62;21250:34;21230:18;;;21223:62;-1:-1:-1;;;21301:19:1;;;21294:32;21343:19;;47278:140:0;20899:469:1;47278:140:0;-1:-1:-1;;;;;47451:26:0;;47429:118;;;;-1:-1:-1;;;47429:118:0;;21575:2:1;47429:118:0;;;21557:21:1;21614:2;21594:18;;;21587:30;21653:34;21633:18;;;21626:62;-1:-1:-1;;;21704:18:1;;;21697:40;21754:19;;47429:118:0;21373:406:1;47429:118:0;47558:11;:26;;-1:-1:-1;;;;;;47558:26:0;-1:-1:-1;;;;;47558:26:0;;;;;;;;47600:40;;47615:10;;47600:40;;-1:-1:-1;;47600:40:0;47214:434;:::o;2662:103::-;1907:13;:11;:13::i;:::-;2727:30:::1;2754:1;2727:18;:30::i;49714:495::-:0;1907:13;:11;:13::i;:::-;49844:3:::1;49821:19;:26;;49799:119;;;::::0;-1:-1:-1;;;49799:119:0;;21986:2:1;49799:119:0::1;::::0;::::1;21968:21:1::0;22025:2;22005:18;;;21998:30;22064:34;22044:18;;;22037:62;-1:-1:-1;;;22115:18:1;;;22108:41;22166:19;;49799:119:0::1;21784:407:1::0;49799:119:0::1;50006:3;49987:15;;49965:19;49951:11;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;49929:152;;;::::0;-1:-1:-1;;;49929:152:0;;22398:2:1;49929:152:0::1;::::0;::::1;22380:21:1::0;22437:2;22417:18;;;22410:30;22476:34;22456:18;;;22449:62;-1:-1:-1;;;22527:18:1;;;22520:42;22579:19;;49929:152:0::1;22196:408:1::0;49929:152:0::1;50116:15;::::0;50097:56:::1;::::0;;10159:25:1;;;10215:2;10200:18;;10193:34;;;50097:56:0::1;::::0;10132:18:1;50097:56:0::1;;;;;;;50164:15;:37:::0;49714:495::o;48667:::-;1907:13;:11;:13::i;:::-;48797:3:::1;48774:19;:26;;48752:119;;;::::0;-1:-1:-1;;;48752:119:0;;22811:2:1;48752:119:0::1;::::0;::::1;22793:21:1::0;22850:2;22830:18;;;22823:30;22889:34;22869:18;;;22862:62;-1:-1:-1;;;22940:18:1;;;22933:41;22991:19;;48752:119:0::1;22609:407:1::0;48752:119:0::1;48959:3;48940:15;;48918:19;48904:11;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;48882:152;;;::::0;-1:-1:-1;;;48882:152:0;;23223:2:1;48882:152:0::1;::::0;::::1;23205:21:1::0;23262:2;23242:18;;;23235:30;23301:34;23281:18;;;23274:62;-1:-1:-1;;;23352:18:1;;;23345:42;23404:19;;48882:152:0::1;23021:408:1::0;48882:152:0::1;49069:15;::::0;49050:56:::1;::::0;;10159:25:1;;;10215:2;10200:18;;10193:34;;;49050:56:0::1;::::0;10132:18:1;49050:56:0::1;;;;;;;49117:15;:37:::0;48667:495::o;47656:455::-;1907:13;:11;:13::i;:::-;47774:3:::1;47755:15;:22;;47733:111;;;::::0;-1:-1:-1;;;47733:111:0;;23636:2:1;47733:111:0::1;::::0;::::1;23618:21:1::0;23675:2;23655:18;;;23648:30;23714:34;23694:18;;;23687:62;-1:-1:-1;;;23765:18:1;;;23758:37;23812:19;;47733:111:0::1;23434:403:1::0;47733:111:0::1;47932:3;47913:15;;47895;47877;;:33;;;;:::i;:::-;:51;;;;:::i;:::-;:58;;47855:148;;;::::0;-1:-1:-1;;;47855:148:0;;24044:2:1;47855:148:0::1;::::0;::::1;24026:21:1::0;24083:2;24063:18;;;24056:30;24122:34;24102:18;;;24095:62;-1:-1:-1;;;24173:18:1;;;24166:38;24221:19;;47855:148:0::1;23842:404:1::0;47855:148:0::1;48034:11;::::0;48019:44:::1;::::0;;10159:25:1;;;10215:2;10200:18;;10193:34;;;48019:44:0::1;::::0;10132:18:1;48019:44:0::1;;;;;;;48074:11;:29:::0;47656:455::o;27734:441::-;1907:13;:11;:13::i;:::-;27826:14:::1;;27808:15;:32;27786:117;;;::::0;-1:-1:-1;;;27786:117:0;;24453:2:1;27786:117:0::1;::::0;::::1;24435:21:1::0;24492:2;24472:18;;;24465:30;24531:34;24511:18;;;24504:62;-1:-1:-1;;;24582:18:1;;;24575:33;24625:19;;27786:117:0::1;24251:399:1::0;27786:117:0::1;27933:8;:15:::0;27916:14:::1;27959:164;27987:6;27981:3;:12;27959:164;;;28017:21;28041:8;28050:3;28041:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;28096:15:::1;28041:13;::::0;;::::1;;28069:24;;:42:::0;-1:-1:-1;27995:5:0::1;;27959:164;;;-1:-1:-1::0;;28152:15:0::1;28135:14;:32:::0;27734:441::o;46883:265::-;5732:21;:19;:21::i;:::-;46985:2:::1;46969:18:::0;::::1;;46961:62;;;::::0;-1:-1:-1;;;46961:62:0;;24857:2:1;46961:62:0::1;::::0;::::1;24839:21:1::0;24896:2;24876:18;;;24869:30;24935:33;24915:18;;;24908:61;24986:18;;46961:62:0::1;24655:355:1::0;46961:62:0::1;47039:13;47034:107;47058:20:::0;;::::1;47034:107;;;47104:25;47113:5;;47119;47113:12;;;;;;;:::i;:::-;;;;;;;47127:1;47104:8;:25::i;:::-;47080:7;;47034:107;;;;5776:20:::0;5170:1;6296:22;;6113:213;39708:110;5732:21;:19;:21::i;:::-;39787:23:::1;39796:4;39802:7;39787:8;:23::i;:::-;5776:20:::0;5170:1;6296:22;;6113:213;46238:453;1907:13;:11;:13::i;:::-;46350:18:::1;:16;:18::i;:::-;46419:10;-1:-1:-1::0;;;;;46386:120:0::1;;46444:8;46453:4;46444:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;46484:11;46386:120;;;;;;10159:25:1::0;;;10215:2;10200:18;;10193:34;10147:2;10132:18;;9985:248;46386:120:0::1;;;;;;;;46622:11;46581:8;46590:4;46581:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;46550:15;;:56;;;;:::i;:::-;:83;;;;:::i;:::-;46519:15;:114;;;;46672:11;46644:8;46653:4;46644:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;46238:453:::0;;:::o;36304:494::-;24457:8;:15;36424:26;;36400:4;;24450:22;;24442:54;;;;-1:-1:-1;;;24442:54:0;;;;;;;:::i;:::-;36468:21:::1;36492:8;36501:4;36492:14;;;;;;;;:::i;:::-;;;;;;;;;;;36468:38;;36543:4;:14;;:21;;;;-1:-1:-1::0;;;;;36529:36:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;36529:36:0::1;-1:-1:-1::0;36517:48:0;-1:-1:-1;36595:18:0::1;36576:215;36645:14;::::0;::::1;:21:::0;36632:34;::::1;36576:215;;;36752:4;:14;;36767:10;36752:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36752:26:0::1;36720:9;36730:10;36720:21;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36720:59:0;;::::1;:21;::::0;;::::1;::::0;;;;;;;:59;36681:12:::1;;36576:215;;;;36457:341;36304:494:::0;;;;:::o;2920:201::-;1907:13;:11;:13::i;:::-;-1:-1:-1;;;;;3009:22:0;::::1;3001:73;;;::::0;-1:-1:-1;;;3001:73:0;;25217:2:1;3001:73:0::1;::::0;::::1;25199:21:1::0;25256:2;25236:18;;;25229:30;25295:34;25275:18;;;25268:62;-1:-1:-1;;;25346:18:1;;;25339:36;25392:19;;3001:73:0::1;25015:402:1::0;3001:73:0::1;3085:28;3104:8;3085:18;:28::i;31906:2500::-:0;32055:26;32096:23;32134:25;32174:24;32017:4;24457:8;:15;;;;24450:4;:22;24442:54;;;;-1:-1:-1;;;24442:54:0;;;;;;;:::i;:::-;32226:21:::1;32250:8;32259:4;32250:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;32299;;;:8:::1;:14:::0;;;;;;-1:-1:-1;;;;;32299:21:0;::::1;::::0;;;;;;;32359:22:::1;32250:14;::::0;;::::1;::::0;;::::1;32359:22:::0;;::::1;::::0;32411:12:::1;::::0;::::1;::::0;32458:24:::1;::::0;::::1;::::0;32250:14;;-1:-1:-1;32359:22:0;;32440:15:::1;:42;:59:::0;::::1;;;-1:-1:-1::0;32486:13:0;;::::1;32440:59;32436:660;;;32516:18;32555:4;:24;;;32537:15;:42;;;;:::i;:::-;32516:63;;32594:13;32610:4;32594:20;;32629:17;32740:15;;32705;;32674:11;;32649:5;:36;;;;:::i;:::-;:71;;;;:::i;:::-;:106;;;;:::i;:::-;32629:126;;32772:20;32958:5;32923:15;;32893:9;32858:4;:15;;;32826:12;;32796:10;:42;;;;:::i;:::-;:77;;;;:::i;:::-;:106;;;;:::i;:::-;32795:143;;;;:::i;:::-;:168;;;;:::i;:::-;32772:191:::0;-1:-1:-1;33060:8:0;33022:34:::1;33037:19;32772:191:::0;33022:34:::1;:::i;:::-;33021:47;;;;:::i;:::-;32980:104;::::0;;::::1;:::i;:::-;;;32501:595;;;;32436:660;33108:21;33225:4;:19;;;33206:4;:15;;;33183:19;33149:17;33135:4;:11;;;:31;;;;:::i;:::-;33134:68;;;;:::i;:::-;33133:88;;;;:::i;:::-;33132:112;;;;:::i;:::-;33283:14;::::0;::::1;:21:::0;33108:136;;-1:-1:-1;33283:25:0::1;::::0;33307:1:::1;33283:25;:::i;:::-;-1:-1:-1::0;;;;;33269:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33269:40:0::1;-1:-1:-1::0;33343:14:0::1;::::0;::::1;:21:::0;33257:52;;-1:-1:-1;33343:25:0::1;::::0;33367:1:::1;33343:25;:::i;:::-;-1:-1:-1::0;;;;;33330:39:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33404:14:0::1;::::0;::::1;:21:::0;33320:49;;-1:-1:-1;33404:25:0::1;::::0;33428:1:::1;33404:25;:::i;:::-;-1:-1:-1::0;;;;;33390:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33390:40:0::1;-1:-1:-1::0;33466:14:0::1;::::0;::::1;:21:::0;33380:50;;-1:-1:-1;33466:25:0::1;::::0;33490:1:::1;33466:25;:::i;:::-;-1:-1:-1::0;;;;;33452:40:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33452:40:0::1;-1:-1:-1::0;33528:6:0::1;::::0;33505:12;;33441:51;;-1:-1:-1;;;;;;33528:6:0::1;::::0;33505:9;;33528:6:::1;::::0;33505:12:::1;;;;:::i;:::-;-1:-1:-1::0;;;;;33505:30:0;;::::1;:12;::::0;;::::1;::::0;;;;;:30;33572:6:::1;::::0;33559:33:::1;::::0;33572:6:::1;33559:31;:33::i;:::-;33546:7;33554:1;33546:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:46;33630:6:::1;::::0;33617:35:::1;::::0;-1:-1:-1;;;;;33630:6:0::1;33617:33;:35::i;:::-;33603:49;;:8;33612:1;33603:11;;;;;;;;:::i;:::-;;;;;;:49;;;::::0;::::1;33676:13;33663:7;33671:1;33663:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:26;33721:18:::1;33702:697;33771:14;::::0;::::1;:21:::0;33758:34;::::1;33702:697;;;33900:4;:14;;33915:10;33900:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;33900:40:0;;;;-1:-1:-1;;;;;33900:26:0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33846:9:::0;33856:14:::1;:10:::0;33869:1:::1;33856:14;:::i;:::-;33846:25;;;;;;;;:::i;:::-;;;;;;:109;-1:-1:-1::0;;;;;33846:109:0::1;;;-1:-1:-1::0;;;;;33846:109:0::1;;;::::0;::::1;33998:99;34029:4;:14;;34044:10;34029:26;;;;;;;;:::i;33998:99::-;33972:7:::0;33980:14:::1;:10:::0;33993:1:::1;33980:14;:::i;:::-;33972:23;;;;;;;;:::i;:::-;;;;;;:125;;;;34141:101;34172:4;:14;;34187:10;34172:26;;;;;;;;:::i;34141:101::-;34114:128;;:8:::0;34123:14:::1;:10:::0;34136:1:::1;34123:14;:::i;:::-;34114:24;;;;;;;;:::i;:::-;;;;;;:128;;;::::0;::::1;34285:4;:14;;34300:10;34285:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:102:::1;::::0;-1:-1:-1;;;;;;34285:102:0;;::::1;::::0;::::1;25596:25:1::0;;;-1:-1:-1;;;;;25657:32:1;;;25637:18;;;25630:60;34285:26:0;;::::1;::::0;:40:::1;::::0;25569:18:1;;34285:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34259:7:::0;34267:14:::1;:10:::0;34280:1:::1;34267:14;:::i;:::-;34259:23;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:128;33807:12:::1;;33702:697;;;;32215:2191;;;;;31906:2500:::0;;;;;;;;:::o;2186:132::-;2067:7;2094:6;-1:-1:-1;;;;;2094:6:0;740:10;2250:23;2242:68;;;;-1:-1:-1;;;2242:68:0;;25903:2:1;2242:68:0;;;25885:21:1;;;25922:18;;;25915:30;25981:34;25961:18;;;25954:62;26033:18;;2242:68:0;25701:356:1;37410:150:0;37463:11;37458:95;37486:8;:15;37480:21;;37458:95;;;37525:16;37537:3;37525:11;:16::i;:::-;37503:5;;37458:95;;5812:293;5214:1;5946:7;;:19;5938:63;;;;-1:-1:-1;;;5938:63:0;;26264:2:1;5938:63:0;;;26246:21:1;26303:2;26283:18;;;26276:30;26342:33;26322:18;;;26315:61;26393:18;;5938:63:0;26062:355:1;5938:63:0;5214:1;6079:7;:18;5812:293::o;37776:1427::-;24457:8;:15;37838:4;;24450:22;;24442:54;;;;-1:-1:-1;;;24442:54:0;;;;;;;:::i;:::-;37855:21:::1;37879:8;37888:4;37879:14;;;;;;;;:::i;:::-;;;;;;;;;;;37855:38;;37929:4;:24;;;37910:15;:43;37906:82;;37970:7;41502:1418:::0;;:::o;37906:82::-:1;38019:12;::::0;::::1;::::0;38048:13;;;:37:::1;;-1:-1:-1::0;38065:15:0::1;::::0;::::1;::::0;:20;38048:37:::1;38044:133;;;-1:-1:-1::0;38129:15:0::1;38102:24;::::0;;::::1;:42:::0;41502:1418;;:::o;38044:133::-:1;38189:18;38228:4;:24;;;38210:15;:42;;;;:::i;:::-;38189:63;;38265:20;38351:15;;38319:4;:15;;;38303:12;;38290:10;:25;;;;:::i;:::-;38289:45;;;;:::i;:::-;38288:78;;;;:::i;:::-;38265:101;;38379:13;38395:4;38379:20;;38410:17;38509:15;;38478;;38451:11;;38430:5;:32;;;;:::i;:::-;:63;;;;:::i;:::-;:94;;;;:::i;:::-;38537:6;::::0;38549:11:::1;::::0;38578::::1;::::0;38410:114;;-1:-1:-1;;;;;;38537:6:0;;::::1;::::0;:11:::1;::::0;38549;;::::1;::::0;38593:5;;38563:26:::1;::::0;:12;:26:::1;:::i;:::-;38562:36;;;;:::i;:::-;38537:62;::::0;-1:-1:-1;;;;;;38537:62:0::1;::::0;;;;;;-1:-1:-1;;;;;26614:32:1;;;38537:62:0::1;::::0;::::1;26596:51:1::0;26663:18;;;26656:34;26569:18;;38537:62:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38610:6:0::1;::::0;38622:15:::1;::::0;38655::::1;::::0;-1:-1:-1;;;;;38610:6:0;;::::1;::::0;-1:-1:-1;38610:11:0::1;::::0;-1:-1:-1;38622:15:0;::::1;::::0;38674:5;;38640:30:::1;::::0;:12;:30:::1;:::i;:::-;38639:40;;;;:::i;:::-;38610:70;::::0;-1:-1:-1;;;;;;38610:70:0::1;::::0;;;;;;-1:-1:-1;;;;;26614:32:1;;;38610:70:0::1;::::0;::::1;26596:51:1::0;26663:18;;;26656:34;26569:18;;38610:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38691:6:0::1;::::0;38703:15:::1;::::0;38736::::1;::::0;-1:-1:-1;;;;;38691:6:0;;::::1;::::0;-1:-1:-1;38691:11:0::1;::::0;-1:-1:-1;38703:15:0;::::1;::::0;38755:5;;38721:30:::1;::::0;:12;:30:::1;:::i;:::-;38720:40;;;;:::i;:::-;38691:70;::::0;-1:-1:-1;;;;;;38691:70:0::1;::::0;;;;;;-1:-1:-1;;;;;26614:32:1;;;38691:70:0::1;::::0;::::1;26596:51:1::0;26663:18;;;26656:34;26569:18;;38691:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;38772:6:0::1;::::0;-1:-1:-1;;;;;38772:6:0::1;::::0;-1:-1:-1;38772:11:0::1;::::0;-1:-1:-1;38792:4:0::1;38828:5:::0;38800:24:::1;38815:9:::0;38800:12;:24:::1;:::i;:::-;38799:34;;;;:::i;:::-;38772:62;::::0;-1:-1:-1;;;;;;38772:62:0::1;::::0;;;;;;-1:-1:-1;;;;;26614:32:1;;;38772:62:0::1;::::0;::::1;26596:51:1::0;26663:18;;;26656:34;26569:18;;38772:62:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;38950:12:0::1;::::0;::::1;::::0;38978:5;;-1:-1:-1;38924:9:0;38887:34:::1;38902:19;38887:12:::0;:34:::1;:::i;:::-;:46;;;;:::i;:::-;38886:76;;;;:::i;:::-;:97;;;;:::i;:::-;38847:4;:22;;;:136;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39023:15:0::1;38996:24;::::0;::::1;:42:::0;;;39162:22:::1;::::0;::::1;::::0;39056:139:::1;::::0;;26903:25:1;;;26959:2;26944:18;;26937:34;;;26987:18;;26980:34;39081:4:0;;39056:139:::1;::::0;26891:2:1;26876:18;39056:139:0::1;;;;;;;37844:1359;;;;;;37776:1427:::0;;:::o;44055:1181::-;44123:21;44147:8;44156:4;44147:14;;;;;;;;:::i;:::-;;;;;;;;;44196;;;:8;:14;;;;;;44211:10;44196:26;;;;;;;44239:21;;;;44147:14;;;;;;;;-1:-1:-1;44239:26:0;:63;;;;;44288:14;;44269:15;:33;;44239:63;44235:158;;;44361:20;;;;44343:38;;:15;:38;:::i;:::-;44319:21;;;:62;44235:158;44405:15;44501:4;:15;;;44478:19;44439:4;:22;;;44425:4;:11;;;:36;;;;:::i;:::-;44424:73;;;;:::i;:::-;44423:93;;;;:::i;:::-;44405:111;;44533:28;44544:4;44550:10;44533;:28::i;:::-;44529:700;;;44592:1;44582:7;:11;:38;;;;44619:1;44597:4;:19;;;:23;44582:38;44578:453;;;44641:22;44676:4;:19;;;44666:7;:29;;;;:::i;:::-;44641:54;;44773:4;:19;;;44749:20;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;44833:1:0;44811:19;;;:23;44895:20;;;;44877:38;;:15;:38;:::i;:::-;44853:21;;;:62;44969:46;44988:10;45000:14;44969:18;:46::i;:::-;44622:409;44578:453;44529:700;;;45052:11;;45048:181;;45104:7;45080:20;;:31;;;;;;;:::i;:::-;;;;;;;;45149:7;45126:4;:19;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;45176:41:0;;160:25:1;;;45203:4:0;;45191:10;;45176:41;;148:2:1;133:18;45176:41:0;;;;;;;45048:181;44112:1124;;;44055:1181;:::o;20340:407::-;20534:48;;;-1:-1:-1;;;;;26614:32:1;;;20534:48:0;;;26596:51:1;26663:18;;;;26656:34;;;20534:48:0;;;;;;;;;;26569:18:1;;;;20534:48:0;;;;;;;-1:-1:-1;;;;;20534:48:0;-1:-1:-1;;;20534:48:0;;;20500:93;;-1:-1:-1;;;;20500:19:0;;;;:93;;20534:48;20500:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20464:129;;;;20626:7;:57;;;;-1:-1:-1;20638:11:0;;:16;;:44;;;20669:4;20658:24;;;;;;;;;;;;:::i;:::-;20604:135;;;;-1:-1:-1;;;20604:135:0;;27815:2:1;20604:135:0;;;27797:21:1;27854:2;27834:18;;;27827:30;27893;27873:18;;;27866:58;27941:18;;20604:135:0;27613:352:1;20604:135:0;20453:294;;20340:407;;;:::o;18746:310::-;18943:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18943:34:0;-1:-1:-1;;;18943:34:0;;;18903:85;;18836:13;;18868:12;;;;-1:-1:-1;;;;;18903:25:0;;;:85;;18943:34;18903:85;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18867:121;;;;19006:7;:42;;;;;;;;;;;;;;;-1:-1:-1;;;19006:42:0;;;;;;19016:24;19035:4;19016:18;:24::i;:::-;18999:49;18746:310;-1:-1:-1;;;;18746:310:0:o;19771:293::-;19930:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19930:36:0;-1:-1:-1;;;19930:36:0;;;19890:87;;19836:5;;;;;;-1:-1:-1;;;;;19890:25:0;;;:87;;19930:36;19890:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19854:123;;;;19995:7;:28;;;;;20006:4;:11;20021:2;20006:17;19995:28;:61;;20054:2;19995:61;;;20037:4;20026:25;;;;;;;;;;;;:::i;39872:1599::-;24457:8;:15;39966:4;;24450:22;;24442:54;;;;-1:-1:-1;;;24442:54:0;;;;;;;:::i;:::-;39988:21:::1;40012:8;40021:4;40012:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;40061;;;:8:::1;:14:::0;;;;;;40076:10:::1;40061:26:::0;;;;;;;40012:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;40100:17:0::1;40070:4:::0;40100:11:::1;:17::i;:::-;40130:30;40155:4;40130:24;:30::i;:::-;40177:11:::0;;40173:740:::1;;40229:12:::0;;:37:::1;::::0;-1:-1:-1;;;40229:37:0;;40260:4:::1;40229:37;::::0;::::1;573:51:1::0;40205:21:0::1;::::0;-1:-1:-1;;;;;40229:12:0::1;::::0;:22:::1;::::0;546:18:1;;40229:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40281:12:::0;;40205:61;;-1:-1:-1;40281:65:0::1;::::0;-1:-1:-1;;;;;40281:12:0::1;40311:10;40331:4;40338:7:::0;40281:29:::1;:65::i;:::-;40384:12:::0;;:37:::1;::::0;-1:-1:-1;;;40384:37:0;;40415:4:::1;40384:37;::::0;::::1;573:51:1::0;40361:20:0::1;::::0;-1:-1:-1;;;;;40384:12:0::1;::::0;:22:::1;::::0;546:18:1;;40384:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40361:60:::0;-1:-1:-1;40448:28:0::1;40463:13:::0;40361:60;40448:28:::1;:::i;:::-;40497:17;::::0;::::1;::::0;40438:38;;-1:-1:-1;40497:17:0::1;;:21:::0;40493:244:::1;;40571:17;::::0;::::1;::::0;40539:18:::1;::::0;40592:5:::1;::::0;40561:27:::1;::::0;40571:17:::1;;40561:7:::0;:27:::1;:::i;:::-;40560:37;;;;:::i;:::-;40642:15;::::0;40616:12;;40539:58;;-1:-1:-1;40616:54:0::1;::::0;-1:-1:-1;;;;;40616:12:0;;::::1;::::0;40642:15:::1;40539:58:::0;40616:25:::1;:54::i;:::-;40701:20;40711:10:::0;40701:7;:20:::1;:::i;:::-;40691:30;;40520:217;40493:244;40768:7;40753:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40829:6:0::1;::::0;40804:12;;-1:-1:-1;;;;;40829:6:0;;::::1;40804:12:::0;::::1;40796:40:::0;40792:110:::1;;40879:7;40857:18;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40792:110:0::1;40190:723;;40173:740;40969:22;::::0;::::1;::::0;40955:11;;41008:19:::1;::::0;40955:36:::1;::::0;::::1;:::i;:::-;40954:73;;;;:::i;:::-;40923:15;::::0;::::1;:104:::0;41059:18:::1;41040:293;41109:14;::::0;::::1;:21:::0;41096:34;::::1;41040:293;;;41184:4;:14;;41199:10;41184:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;41295:11;;41184:137:::1;::::0;-1:-1:-1;;;41184:137:0;;::::1;::::0;::::1;15984:25:1::0;;;41266:10:0::1;16025:18:1::0;;;16018:60;16094:18;;;16087:34;;;;-1:-1:-1;;;;;41184:26:0;;::::1;::::0;:40:::1;::::0;15957:18:1;;41184:137:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41145:12;;;;;41040:293;;;-1:-1:-1::0;41349:11:0;;41345:67:::1;;41393:7;41377:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;41345:67:0::1;41429:34;::::0;160:25:1;;;41449:4:0;;41437:10:::1;::::0;41429:34:::1;::::0;148:2:1;133:18;41429:34:0::1;;;;;;;39977:1494;;39872:1599:::0;;;:::o;3281:191::-;3355:16;3374:6;;-1:-1:-1;;;;;3391:17:0;;;-1:-1:-1;;;;;;3391:17:0;;;;;;3424:40;;3374:6;;;;;;;3424:40;;3355:16;3424:40;3344:128;3281:191;:::o;45353:645::-;45469:18;;45435:6;;:31;;-1:-1:-1;;;45435:31:0;;45460:4;45435:31;;;573:51:1;-1:-1:-1;;;;;45435:6:0;;;;:16;;546:18:1;;45435:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;45431:560;;;45760:18;;45709:6;;:31;;-1:-1:-1;;;45709:31:0;;45734:4;45709:31;;;573:51:1;45689:17:0;;45760:18;-1:-1:-1;;;;;45709:6:0;;:16;;546:18:1;;45709:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;;;;:::i;:::-;45689:89;;45808:9;45797:7;:20;45793:187;;45838:6;;:35;;-1:-1:-1;;;;;45838:6:0;45858:3;45863:9;45838:19;:35::i;:::-;45489:502;45353:645;;:::o;45793:187::-;45899:11;;45895:85;;45931:6;;:33;;-1:-1:-1;;;;;45931:6:0;45951:3;45956:7;45931:19;:33::i;17921:619::-;18018:13;18068:2;18053:4;:11;:17;18049:484;;18105:4;18094:26;;;;;;;;;;;;:::i;:::-;18087:33;17921:619;-1:-1:-1;;17921:619:0:o;18049:484::-;18142:4;:11;18157:2;18142:17;18138:395;;18176:7;18202:69;18213:2;18209:1;:6;;;:22;;;;;18219:4;18224:1;18219:7;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;18219:7:0;:12;;18209:22;18202:69;;;18252:3;;;;:::i;:::-;;;;18202:69;;;18285:23;18321:1;18311:12;;-1:-1:-1;;;;;18311:12:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18311:12:0;;18285:38;;18347:1;18343:5;;18338:99;18354:2;18350:1;:6;;;:22;;;;;18360:4;18365:1;18360:7;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;18360:7:0;:12;;18350:22;18338:99;;;18414:4;18419:1;18414:7;;;;;;;;;;:::i;:::-;;;;;;;;;18398:10;18409:1;18398:13;;;;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;18398:23:0;;;;;;;;-1:-1:-1;18374:3:0;;;;:::i;:::-;;;;18338:99;;;18465:10;17921:619;-1:-1:-1;;;17921:619:0:o;18138:395::-;-1:-1:-1;;18509:12:0;;;;;;;;;;;;-1:-1:-1;;;18509:12:0;;;;;17921:619::o;18138:395::-;17921:619;;;:::o;21070:449::-;21291:59;;;-1:-1:-1;;;;;29562:32:1;;;21291:59:0;;;29544:51:1;29631:32;;;29611:18;;;29604:60;29680:18;;;;29673:34;;;21291:59:0;;;;;;;;;;29517:18:1;;;;21291:59:0;;;;;;;-1:-1:-1;;;;;21291:59:0;-1:-1:-1;;;21291:59:0;;;21257:104;;-1:-1:-1;;;;21257:19:0;;;;:104;;21291:59;21257:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21221:140;;;;21394:7;:57;;;;-1:-1:-1;21406:11:0;;:16;;:44;;;21437:4;21426:24;;;;;;;;;;;;:::i;:::-;21372:139;;;;-1:-1:-1;;;21372:139:0;;29920:2:1;21372:139:0;;;29902:21:1;;;29939:18;;;29932:30;29998:34;29978:18;;;29971:62;30050:18;;21372:139:0;29718:356:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:226:1;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;369:23:1;;196:226;-1:-1:-1;196:226:1:o;1532:159::-;1599:20;;1659:6;1648:18;;1638:29;;1628:57;;1681:1;1678;1671:12;1696:385;1777:8;1787:6;1841:3;1834:4;1826:6;1822:17;1818:27;1808:55;;1859:1;1856;1849:12;1808:55;-1:-1:-1;1882:20:1;;-1:-1:-1;;;;;1914:30:1;;1911:50;;;1957:1;1954;1947:12;1911:50;1994:4;1986:6;1982:17;1970:29;;2054:3;2047:4;2037:6;2034:1;2030:14;2022:6;2018:27;2014:38;2011:47;2008:67;;;2071:1;2068;2061:12;2008:67;1696:385;;;;;:::o;2086:907::-;2231:6;2239;2247;2255;2263;2271;2324:3;2312:9;2303:7;2299:23;2295:33;2292:53;;;2341:1;2338;2331:12;2292:53;2386:23;;;-1:-1:-1;2506:2:1;2491:18;;2478:32;;-1:-1:-1;2555:37:1;2588:2;2573:18;;2555:37;:::i;:::-;2545:47;-1:-1:-1;2665:2:1;2650:18;;2637:32;;-1:-1:-1;2746:3:1;2731:19;;2718:33;-1:-1:-1;;;;;2763:30:1;;2760:50;;;2806:1;2803;2796:12;2760:50;2845:88;2925:7;2916:6;2905:9;2901:22;2845:88;:::i;:::-;2086:907;;;;-1:-1:-1;2086:907:1;;-1:-1:-1;2086:907:1;;2952:8;;2086:907;-1:-1:-1;;;2086:907:1:o;2998:131::-;-1:-1:-1;;;;;3073:31:1;;3063:42;;3053:70;;3119:1;3116;3109:12;3134:367;3202:6;3210;3263:2;3251:9;3242:7;3238:23;3234:32;3231:52;;;3279:1;3276;3269:12;3231:52;3324:23;;;-1:-1:-1;3423:2:1;3408:18;;3395:32;3436:33;3395:32;3436:33;:::i;:::-;3488:7;3478:17;;;3134:367;;;;;:::o;3698:247::-;3757:6;3810:2;3798:9;3789:7;3785:23;3781:32;3778:52;;;3826:1;3823;3816:12;3778:52;3865:9;3852:23;3884:31;3909:5;3884:31;:::i;3950:346::-;4018:6;4026;4079:2;4067:9;4058:7;4054:23;4050:32;4047:52;;;4095:1;4092;4085:12;4047:52;-1:-1:-1;;4140:23:1;;;4260:2;4245:18;;;4232:32;;-1:-1:-1;3950:346:1:o;4301:446::-;4354:3;4392:5;4386:12;4419:6;4414:3;4407:19;4451:4;4446:3;4442:14;4435:21;;4490:4;4483:5;4479:16;4513:1;4523:199;4537:6;4534:1;4531:13;4523:199;;;4602:13;;-1:-1:-1;;;;;4598:39:1;4586:52;;4667:4;4658:14;;;;4695:17;;;;4634:1;4552:9;4523:199;;;-1:-1:-1;4738:3:1;;4301:446;-1:-1:-1;;;;4301:446:1:o;4752:420::-;4805:3;4843:5;4837:12;4870:6;4865:3;4858:19;4902:4;4897:3;4893:14;4886:21;;4941:4;4934:5;4930:16;4964:1;4974:173;4988:6;4985:1;4982:13;4974:173;;;5049:13;;5037:26;;5092:4;5083:14;;;;5120:17;;;;5010:1;5003:9;4974:173;;5177:1565;5610:3;5599:9;5592:22;5573:4;5637:57;5689:3;5678:9;5674:19;5666:6;5637:57;:::i;:::-;5742:9;5734:6;5730:22;5725:2;5714:9;5710:18;5703:50;5773:6;5808;5802:13;5839:6;5831;5824:22;5874:2;5866:6;5862:15;5855:22;;5933:2;5923:6;5920:1;5916:14;5908:6;5904:27;5900:36;5971:2;5963:6;5959:15;5992:1;6002:488;6016:6;6013:1;6010:13;6002:488;;;6106:2;6102:7;6093:6;6085;6081:19;6077:33;6072:3;6065:46;6140:6;6134:13;6182:2;6176:9;6213:8;6205:6;6198:24;6271:8;6266:2;6262;6258:11;6253:2;6245:6;6241:15;6235:45;6332:1;6327:2;6316:8;6308:6;6304:21;6300:30;6293:41;6407:2;6400;6396:7;6391:2;6381:8;6377:17;6373:31;6365:6;6361:44;6357:53;6347:63;;;;6445:2;6437:6;6433:15;6423:25;;6477:2;6472:3;6468:12;6461:19;;6038:1;6035;6031:9;6026:14;;6002:488;;;6006:3;;6538:9;6530:6;6526:22;6521:2;6510:9;6506:18;6499:50;6572:44;6609:6;6601;6572:44;:::i;:::-;6558:58;;;;;6664:9;6656:6;6652:22;6647:2;6636:9;6632:18;6625:50;6692:44;6729:6;6721;6692:44;:::i;:::-;6684:52;5177:1565;-1:-1:-1;;;;;;;5177:1565:1:o;6747:948::-;6912:6;6920;6928;6936;6944;6952;7005:3;6993:9;6984:7;6980:23;6976:33;6973:53;;;7022:1;7019;7012:12;6973:53;7067:23;;;-1:-1:-1;7166:2:1;7151:18;;7138:32;7179:33;7138:32;7179:33;:::i;:::-;7231:7;-1:-1:-1;7257:37:1;7290:2;7275:18;;7257:37;:::i;7700:114::-;7784:4;7777:5;7773:16;7766:5;7763:27;7753:55;;7804:1;7801;7794:12;7819:846;7921:6;7929;7937;7945;7953;7961;8014:3;8002:9;7993:7;7989:23;7985:33;7982:53;;;8031:1;8028;8021:12;7982:53;8076:23;;;-1:-1:-1;8196:2:1;8181:18;;8168:32;;-1:-1:-1;8299:2:1;8284:18;;8271:32;;-1:-1:-1;8381:2:1;8366:18;;8353:32;8394:31;8353:32;8394:31;:::i;:::-;7819:846;;;;-1:-1:-1;7819:846:1;;8524:3;8509:19;;8496:33;;8628:3;8613:19;;;8600:33;;-1:-1:-1;7819:846:1;-1:-1:-1;;7819:846:1:o;9259:455::-;9345:6;9353;9406:2;9394:9;9385:7;9381:23;9377:32;9374:52;;;9422:1;9419;9412:12;9374:52;9462:9;9449:23;-1:-1:-1;;;;;9487:6:1;9484:30;9481:50;;;9527:1;9524;9517:12;9481:50;9566:88;9646:7;9637:6;9626:9;9622:22;9566:88;:::i;:::-;9673:8;;9540:114;;-1:-1:-1;9259:455:1;-1:-1:-1;;;;9259:455:1:o;9719:261::-;9898:2;9887:9;9880:21;9861:4;9918:56;9970:2;9959:9;9955:18;9947:6;9918:56;:::i;10238:343::-;10440:2;10422:21;;;10479:2;10459:18;;;10452:30;-1:-1:-1;;;10513:2:1;10498:18;;10491:49;10572:2;10557:18;;10238:343::o;11650:127::-;11711:10;11706:3;11702:20;11699:1;11692:31;11742:4;11739:1;11732:15;11766:4;11763:1;11756:15;12417:127;12478:10;12473:3;12469:20;12466:1;12459:31;12509:4;12506:1;12499:15;12533:4;12530:1;12523:15;12549:128;12616:9;;;12637:11;;;12634:37;;;12651:18;;:::i;12682:125::-;12747:9;;;12768:10;;;12765:36;;;12781:18;;:::i;12812:621::-;13007:3;13038;13085:6;13007:3;13119:287;13133:6;13130:1;13127:13;13119:287;;;13208:6;13195:20;13228:31;13253:5;13228:31;:::i;:::-;-1:-1:-1;;;;;13286:31:1;13272:46;;13351:4;13340:16;;;;13379:17;;;;;13314:1;13148:9;13119:287;;;-1:-1:-1;13422:5:1;;12812:621;-1:-1:-1;;;;;12812:621:1:o;15387:168::-;15460:9;;;15491;;15508:15;;;15502:22;;15488:37;15478:71;;15529:18;;:::i;15560:217::-;15600:1;15626;15616:132;;15670:10;15665:3;15661:20;15658:1;15651:31;15705:4;15702:1;15695:15;15733:4;15730:1;15723:15;15616:132;-1:-1:-1;15762:9:1;;15560:217::o;16132:127::-;16193:10;16188:3;16184:20;16181:1;16174:31;16224:4;16221:1;16214:15;16248:4;16245:1;16238:15;16264:271;16354:6;16407:2;16395:9;16386:7;16382:23;16378:32;16375:52;;;16423:1;16420;16413:12;16375:52;16455:9;16449:16;16474:31;16499:5;16474:31;:::i;16540:184::-;16610:6;16663:2;16651:9;16642:7;16638:23;16634:32;16631:52;;;16679:1;16676;16669:12;16631:52;-1:-1:-1;16702:16:1;;16540:184;-1:-1:-1;16540:184:1:o;27025:301::-;27154:3;27192:6;27186:13;27238:6;27231:4;27223:6;27219:17;27214:3;27208:37;27300:1;27264:16;;27289:13;;;-1:-1:-1;27264:16:1;27025:301;-1:-1:-1;27025:301:1:o;27331:277::-;27398:6;27451:2;27439:9;27430:7;27426:23;27422:32;27419:52;;;27467:1;27464;27457:12;27419:52;27499:9;27493:16;27552:5;27545:13;27538:21;27531:5;27528:32;27518:60;;27574:1;27571;27564:12;27970:247;28038:6;28091:2;28079:9;28070:7;28066:23;28062:32;28059:52;;;28107:1;28104;28097:12;28059:52;28139:9;28133:16;28158:29;28181:5;28158:29;:::i;28222:935::-;28302:6;28355:2;28343:9;28334:7;28330:23;28326:32;28323:52;;;28371:1;28368;28361:12;28323:52;28404:9;28398:16;-1:-1:-1;;;;;28429:6:1;28426:30;28423:50;;;28469:1;28466;28459:12;28423:50;28492:22;;28545:4;28537:13;;28533:27;-1:-1:-1;28523:55:1;;28574:1;28571;28564:12;28523:55;28607:2;28601:9;-1:-1:-1;;;;;28625:6:1;28622:30;28619:56;;;28655:18;;:::i;:::-;28704:2;28698:9;28796:2;28758:17;;-1:-1:-1;;28754:31:1;;;28787:2;28750:40;28746:54;28734:67;;-1:-1:-1;;;;;28816:34:1;;28852:22;;;28813:62;28810:88;;;28878:18;;:::i;:::-;28914:2;28907:22;28938;;;28979:15;;;28996:2;28975:24;28972:37;-1:-1:-1;28969:57:1;;;29022:1;29019;29012:12;28969:57;29071:6;29066:2;29062;29058:11;29053:2;29045:6;29041:15;29035:43;29124:1;29098:19;;;29119:2;29094:28;29087:39;;;;29102:6;28222:935;-1:-1:-1;;;;28222:935:1:o;29162:175::-;29199:3;29243:4;29236:5;29232:16;29272:4;29263:7;29260:17;29257:43;;29280:18;;:::i;:::-;29329:1;29316:15;;29162:175;-1:-1:-1;;29162:175:1:o
Swarm Source
ipfs://980a40fbc1803470da868dd7534b0ec38180f45738c72d9fef26f5e568cba16c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.