More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 688 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 21028301 | 23 days ago | IN | 0 ETH | 0.00172913 | ||||
Withdraw | 20850714 | 48 days ago | IN | 0 ETH | 0.00085735 | ||||
Withdraw | 20850622 | 48 days ago | IN | 0 ETH | 0.0005377 | ||||
Withdraw | 20850580 | 48 days ago | IN | 0 ETH | 0.00080253 | ||||
Withdraw | 20772236 | 59 days ago | IN | 0 ETH | 0.00132145 | ||||
Withdraw | 20772224 | 59 days ago | IN | 0 ETH | 0.00202879 | ||||
Withdraw | 20712244 | 68 days ago | IN | 0 ETH | 0.00047694 | ||||
Withdraw | 20701666 | 69 days ago | IN | 0 ETH | 0.00024964 | ||||
Withdraw | 20699064 | 69 days ago | IN | 0 ETH | 0.00025901 | ||||
Withdraw | 20667129 | 74 days ago | IN | 0 ETH | 0.00007918 | ||||
Withdraw | 20667125 | 74 days ago | IN | 0 ETH | 0.00012916 | ||||
Withdraw | 20630130 | 79 days ago | IN | 0 ETH | 0.00007152 | ||||
Emergency Withdr... | 20630129 | 79 days ago | IN | 0 ETH | 0.00007695 | ||||
Deposit | 20630125 | 79 days ago | IN | 0 ETH | 0.00006412 | ||||
Withdraw | 20614599 | 81 days ago | IN | 0 ETH | 0.0002184 | ||||
Withdraw | 20614592 | 81 days ago | IN | 0 ETH | 0.00041034 | ||||
Withdraw | 20546218 | 91 days ago | IN | 0 ETH | 0.00023969 | ||||
Withdraw | 20546214 | 91 days ago | IN | 0 ETH | 0.00043037 | ||||
Withdraw | 20531409 | 93 days ago | IN | 0 ETH | 0.00017588 | ||||
Withdraw | 20531406 | 93 days ago | IN | 0 ETH | 0.00035715 | ||||
Withdraw | 20529075 | 93 days ago | IN | 0 ETH | 0.00081647 | ||||
Withdraw | 20510982 | 96 days ago | IN | 0 ETH | 0.00026206 | ||||
Withdraw | 20485409 | 99 days ago | IN | 0 ETH | 0.00082273 | ||||
Withdraw | 20479902 | 100 days ago | IN | 0 ETH | 0.00029398 | ||||
Withdraw | 20469525 | 101 days ago | IN | 0 ETH | 0.00027118 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ImgnaiPool
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-15 */ // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/utils/Initializable.sol // OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !Address.isContract(address(this)); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: ImgnaiPool.sol pragma solidity ^0.8.4; contract ImgnaiPool is Ownable, Initializable, ReentrancyGuard { using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many tokens the user has provided. uint256 blockStaked; // What block the user staked in on. uint256 rewardDebt; // Reward debt, tokens staked out to user uint256 lockedDebt; // Locked debt, reward tokens owed to user but awaiting lockup time to pass. } // Info of each pool. struct PoolInfo { uint256 lastRewardBlock; // last block number that Rewards distribution occured. uint256 accRewardTokenPerShare; // Accumulated Rewards per share, times 1e30. See below. } // In the event that further config is required, deposits can start disabled. bool public depositsEnabled = true; // The stake token IERC20 public STAKE_TOKEN; // The reward token (WETH) IERC20 public REWARD_TOKEN; // Bonus yield token (IMGNAI) IERC20 public BONUS_TOKEN; // Block time in seconds (Default: Ethereum, 12s per block) uint256 constant public BLOCK_TIME_SECONDS = 12; // Reward tokens created per block. uint256 public rewardPerBlock; // Total reward & bonus tokens deposited (to determine the ratio of bonus tokens to share per harvest) uint256 public totalRewardTokensDeposited; uint256 public totalBonusTokensDeposited; // Keep track of number of tokens staked in case the contract earns reflect fees uint256 public totalStaked; // Lockup time (if applicable) in blocks. uint256 public harvestLockupBlocks; // Max lockup blocks for vesting uint256 private maxHarvestLockupBlocks = (60 * 60 * 24 * 31) / BLOCK_TIME_SECONDS; // Info of each pool. PoolInfo public poolInfo; // Info of each user that stakes LP tokens. mapping (address => UserInfo) public userInfo; // The block number when Reward mining starts. uint256 public startBlock; // The block number when mining ends. uint256 public endBlock; // Denotes if an owner-level rewards withdrawal has been requested bool public rewardsWithdrawalRequested = false; // Denotes which block rewards can be withdrawn at owner-level uint256 public rewardsWithdrawalBlock; // Blocks required to wait until owner-level request to withdraw rewards. Default: 4 Hours uint256 public blocksRequiredForWithdrawalRequest = (60 * 60 * 72) / BLOCK_TIME_SECONDS; event Deposit(address indexed user, uint256 amount); event DepositRewards(uint256 amount, uint256 _bonusAmount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event LogUpdatePool(uint256 endBlock, uint256 rewardPerBlock); event EmergencyRewardWithdraw(address indexed user, uint256 amount); event EmergencySweepWithdraw(address indexed user, IERC20 indexed token, uint256 amount); event StartBlockUpdated(uint256 newStartBlock); event HarvestLockupBlocksSet(uint256 blocks); event RewardsWithdrawalRequested(uint256 unlockBlock); event RewardsWithdrawn(); event DepositsEnabled(); /// @dev Modifier which prevents execution if emissions have already begun. modifier beforeStart { require(startBlock > block.number, 'This action can only be executed before emissions have begun!'); _; } function initialize( IERC20 _stakeToken, IERC20 _rewardToken, IERC20 _bonusToken, uint256 _rewardPerBlock, uint256 _startBlock, uint256 _endBlock, bool _depositsEnabled ) external initializer onlyOwner { require(_endBlock > _startBlock, 'End block must be greater than start block!'); require(_startBlock > block.number, 'Start block must be greater than current block!'); require(_rewardToken != _bonusToken, 'Reward token and bonus token cannot be the same!'); STAKE_TOKEN = _stakeToken; REWARD_TOKEN = _rewardToken; BONUS_TOKEN = _bonusToken; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; endBlock = _endBlock; depositsEnabled = _depositsEnabled; // staking pool poolInfo = PoolInfo({ lastRewardBlock: startBlock, accRewardTokenPerShare: 0 }); } /// Return reward multiplier over the given _from to _to block. /// @param _from Starting block /// @param _to Ending block function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { if (_to <= endBlock) { return _to - _from; } else if (_from >= endBlock) { return 0; } else { return endBlock - _from; } } /// Determines if a user can withdraw following any minimum staking period /// @param _stakedInBlock Block which the user staked in on /// @return True if minimum staking period has passed, otherwise false function canWithdrawWithoutLockup(uint256 _stakedInBlock) public view returns(bool) { if (_stakedInBlock < startBlock) { _stakedInBlock = startBlock; // Lockup time should only count from when emissions have begun. } uint256 noPenaltyBlock = harvestLockupBlocks + _stakedInBlock; if (noPenaltyBlock > endBlock) { noPenaltyBlock = endBlock; } if (block.number > noPenaltyBlock) { return true; } return false; } /// View pending rewards /// @param _user Wallet ID of staked user /// @return Pending rewards function pendingReward(address _user) external view returns (uint256) { UserInfo storage user = userInfo[_user]; uint256 accRewardTokenPerShare = poolInfo.accRewardTokenPerShare; if (block.number > poolInfo.lastRewardBlock && totalStaked != 0) { uint256 multiplier = getMultiplier(poolInfo.lastRewardBlock, block.number); uint256 tokenReward = multiplier * rewardPerBlock; accRewardTokenPerShare = accRewardTokenPerShare + (tokenReward * 1e30 / totalStaked); } return (user.amount * accRewardTokenPerShare / 1e30 - user.rewardDebt) + user.lockedDebt; } /// View pending bonus rewards based off reward & bonus token deposits /// @param _pendingReward user's outstanding pending reward /// @return Pending bonus rewards function pendingBonus(uint256 _pendingReward) public view returns (uint256) { if (totalBonusTokensDeposited > 0 && totalRewardTokensDeposited > 0) { return totalBonusTokensDeposited * _pendingReward / totalRewardTokensDeposited; } return 0; } /// Update reward variables of the given pool to be up-to-date. function updatePool() public { if (block.number <= poolInfo.lastRewardBlock) { return; } if (totalStaked == 0) { poolInfo.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(poolInfo.lastRewardBlock, block.number); uint256 tokenReward = multiplier * rewardPerBlock; poolInfo.accRewardTokenPerShare = poolInfo.accRewardTokenPerShare + (tokenReward * 1e30 / totalStaked); poolInfo.lastRewardBlock = block.number; } /// Deposit staking token into the contract to earn rewards. /// @dev Since this contract needs to be supplied with rewards we are /// sending the balance of the contract if the pending rewards are higher /// @param _amount The amount of staking tokens to deposit function deposit(uint256 _amount) public nonReentrant { require(depositsEnabled, 'Deposits have not yet been enabled.'); UserInfo storage user = userInfo[msg.sender]; uint256 finalDepositAmount = 0; updatePool(); if (user.amount > 0) { uint256 pending = user.amount * poolInfo.accRewardTokenPerShare / 1e30 - user.rewardDebt; if(pending > 0) { uint256 currentRewardBalance = rewardBalance(); if(currentRewardBalance > 0 && canWithdrawWithoutLockup(user.blockStaked)) { if (user.lockedDebt > 0) { pending = pending + user.lockedDebt; user.lockedDebt = 0; } if(pending > currentRewardBalance) { safeTransferReward(msg.sender, currentRewardBalance); } else { safeTransferReward(msg.sender, pending); } uint256 bonus = pendingBonus(pending); if (bonus > 0) { uint256 currentBonusBalance = bonusBalance(); if (bonus > currentBonusBalance) { safeTransferBonus(msg.sender, currentBonusBalance); } else { safeTransferBonus(msg.sender, bonus); } } } else { user.lockedDebt = user.lockedDebt + pending; } } } if (_amount > 0) { uint256 preStakeBalance = STAKE_TOKEN.balanceOf(address(this)); STAKE_TOKEN.safeTransferFrom(msg.sender, address(this), _amount); finalDepositAmount = STAKE_TOKEN.balanceOf(address(this)) - preStakeBalance; user.blockStaked = block.number; user.amount = user.amount + finalDepositAmount; totalStaked = totalStaked + finalDepositAmount; } user.rewardDebt = user.amount * poolInfo.accRewardTokenPerShare / 1e30; emit Deposit(msg.sender, finalDepositAmount); } /// Withdraw rewards and/or staked tokens. Pass a 0 amount to withdraw only rewards /// @param _amount The amount of staking tokens to withdraw function withdraw(uint256 _amount) public nonReentrant { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "Error: insufficient output amount"); require(canWithdrawWithoutLockup(user.blockStaked), "The minimum timespan for withdrawals has not yet passed."); updatePool(); uint256 pending = user.amount * poolInfo.accRewardTokenPerShare / 1e30 - user.rewardDebt; if (user.lockedDebt > 0) { pending = pending + user.lockedDebt; user.lockedDebt = 0; } if(pending > 0) { uint256 currentRewardBalance = rewardBalance(); if(currentRewardBalance > 0) { if(pending > currentRewardBalance) { safeTransferReward(msg.sender, currentRewardBalance); } else { safeTransferReward(msg.sender, pending); } uint256 bonus = pendingBonus(pending); if (bonus > 0) { uint256 currentBonusBalance = bonusBalance(); if (bonus > currentBonusBalance) { safeTransferBonus(msg.sender, currentBonusBalance); } else { safeTransferBonus(msg.sender, bonus); } } } } if(_amount > 0) { totalStaked -= _amount; user.amount -= _amount; STAKE_TOKEN.safeTransfer(msg.sender, _amount); } user.rewardDebt = user.amount * poolInfo.accRewardTokenPerShare / 1e30; emit Withdraw(msg.sender, _amount); } /// Obtain the reward balance of this contract /// @return balance of rewards token function rewardBalance() public view returns (uint256) { uint256 balance = REWARD_TOKEN.balanceOf(address(this)); if (STAKE_TOKEN == REWARD_TOKEN) return balance - totalStaked; return balance; } /// Obtain the reward balance of this contract /// @return balance of bonus token function bonusBalance() public view returns (uint256) { uint256 balance = BONUS_TOKEN.balanceOf(address(this)); if (STAKE_TOKEN == BONUS_TOKEN) return balance - totalStaked; return balance; } /// Deposit Rewards into contract, must be called prior to emissions starting. /// @param _amount Amount of tokens to deposit /// @param _bonusAmount Amount of bonus tokens to deposit function depositRewards(uint256 _amount, uint256 _bonusAmount) external onlyOwner { require(_amount > 0, 'Deposit value must be greater than 0.'); REWARD_TOKEN.safeTransferFrom(msg.sender, address(this), _amount); if (_bonusAmount > 0) { BONUS_TOKEN.safeTransferFrom(msg.sender, address(this), _bonusAmount); } totalRewardTokensDeposited += _amount; totalBonusTokensDeposited += _bonusAmount; emit DepositRewards(_amount, _bonusAmount); } /// @param _to address to send reward token to /// @param _amount value of reward token to transfer function safeTransferReward(address _to, uint256 _amount) internal { REWARD_TOKEN.safeTransfer(_to, _amount); } /// @param _to address to send bonus token to /// @param _amount value of bonus token to transfer function safeTransferBonus(address _to, uint256 _amount) internal { BONUS_TOKEN.safeTransfer(_to, _amount); } /* Admin Functions */ /// @param _rewardPerBlock The amount of reward tokens to be given per block function setRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { updatePool(); rewardPerBlock = _rewardPerBlock; emit LogUpdatePool(endBlock, rewardPerBlock); } /// @param _endBlock The block when rewards will end function setEndBlock(uint256 _endBlock) external onlyOwner { require(_endBlock > endBlock, 'New end block must be greater than the current.'); endBlock = _endBlock; emit LogUpdatePool(endBlock, rewardPerBlock); } /// @param _startBlock The block when rewards will start function setStartBlock(uint256 _startBlock) external onlyOwner beforeStart { startBlock = _startBlock; poolInfo.lastRewardBlock = _startBlock; emit StartBlockUpdated(_startBlock); } /// @param _harvestLockupBlocks Amount of blocks that must pass before a user can un-stake function setHarvestLockupBlocks(uint256 _harvestLockupBlocks) external onlyOwner beforeStart { require(_harvestLockupBlocks <= maxHarvestLockupBlocks, 'Cannot exceed max harvest lockup blocks!'); harvestLockupBlocks = _harvestLockupBlocks; emit HarvestLockupBlocksSet(harvestLockupBlocks); } /// @dev Enable deposits for staking function enableDeposits() external onlyOwner { require(rewardsWithdrawalBlock == 0, "Rewards withdrawal has been requested, deposits cannot be enabled."); depositsEnabled = true; emit DepositsEnabled(); } /* Emergency Functions */ // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; totalStaked = totalStaked - user.amount; uint256 _amount = user.amount; user.amount = 0; user.rewardDebt = 0; user.lockedDebt = 0; STAKE_TOKEN.safeTransfer(msg.sender, _amount); emit EmergencyWithdraw(msg.sender, _amount); } /// @dev Request removal of rewards balance, in the event a redeploy or otherwise is required. /// This should only be called in the case of an emergency, with the intention of disabling the pool. function requestRewardsWithdrawal() external onlyOwner { rewardsWithdrawalBlock = block.number + blocksRequiredForWithdrawalRequest; harvestLockupBlocks = 0; depositsEnabled = false; rewardsWithdrawalRequested = true; emit RewardsWithdrawalRequested(rewardsWithdrawalBlock); } /// @dev Withdraw rewards function rewardsWithdrawal() external onlyOwner { require(rewardsWithdrawalRequested, 'Rewards withdrawal not yet requested!'); require(block.number > rewardsWithdrawalBlock, 'Not yet reached the rewards withdrawal block!'); depositsEnabled = false; uint256 currentRewardBalance = rewardBalance(); uint256 currentBonusBalance = bonusBalance(); if(currentRewardBalance > 0) { safeTransferReward(msg.sender, currentRewardBalance); } if(currentBonusBalance > 0) { safeTransferBonus(msg.sender, currentBonusBalance); } totalRewardTokensDeposited = 0; totalBonusTokensDeposited = 0; rewardsWithdrawalRequested = false; emit RewardsWithdrawn(); } /// @notice A public function to sweep accidental ERC20 transfers to this contract. /// Tokens are sent to owner /// @param token The address of the ERC20 token to sweep function sweepToken(IERC20 token) external onlyOwner { require(address(token) != address(STAKE_TOKEN), "Stake Token cannot be sweeped!"); require(address(token) != address(REWARD_TOKEN), "Reward Token cannot be sweeped!"); require(address(token) != address(BONUS_TOKEN), "Bonus Token cannot be sweeped!"); uint256 balance = token.balanceOf(address(this)); token.safeTransfer(msg.sender, balance); emit EmergencySweepWithdraw(msg.sender, token, balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_bonusAmount","type":"uint256"}],"name":"DepositRewards","type":"event"},{"anonymous":false,"inputs":[],"name":"DepositsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyRewardWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencySweepWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"HarvestLockupBlocksSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"LogUpdatePool","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":false,"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"name":"RewardsWithdrawalRequested","type":"event"},{"anonymous":false,"inputs":[],"name":"RewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStartBlock","type":"uint256"}],"name":"StartBlockUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BLOCK_TIME_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BONUS_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKE_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksRequiredForWithdrawalRequest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakedInBlock","type":"uint256"}],"name":"canWithdrawWithoutLockup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_bonusAmount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestLockupBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stakeToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IERC20","name":"_bonusToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"},{"internalType":"bool","name":"_depositsEnabled","type":"bool"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pendingReward","type":"uint256"}],"name":"pendingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardTokenPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRewardsWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsWithdrawalBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsWithdrawalRequested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"setEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_harvestLockupBlocks","type":"uint256"}],"name":"setHarvestLockupBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"setRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"name":"setStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"sweepToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBonusTokensDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardTokensDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","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":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"blockStaked","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"lockedDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600260006101000a81548160ff021916908315150217905550600c6228de806200003191906200016b565b600a556000601060006101000a81548160ff021916908315150217905550600c6203f4806200006191906200016b565b6012553480156200007157600080fd5b5062000092620000866200009f60201b60201c565b620000a760201b60201c565b60018081905550620001dc565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006200017882620001a3565b91506200018583620001a3565b925082620001985762000197620001ad565b5b828204905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b61413280620001ec6000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c80638da5cb5b1161013b578063c713aa94116100b8578063f0b104a01161007c578063f0b104a01461062b578063f2fde38b14610649578063f35e4a6e14610665578063f40f0f5214610681578063fbe92b83146106b157610248565b8063c713aa94146105d3578063cf84c05a146105ef578063db2e21bc146105f9578063e3161ddd14610603578063e38944601461060d57610248565b8063b6b55f25116100ff578063b6b55f2514610545578063ba6e365214610561578063bb872b4a1461057f578063bdd071fb1461059b578063c1561abe146105b757610248565b80638da5cb5b1461049f5780638dbb1e3a146104bd578063927df922146104ed57806399248ea714610509578063aa5c3ab41461052757610248565b806348a43270116101c95780635e4c57a41161018d5780635e4c57a414610431578063715018a61461043b5780637d5c694714610445578063817b1cd2146104635780638ae39cac1461048157610248565b806348a432701461038857806348cd4cb1146103b85780634957acf8146103d65780635392fd1c146103f45780635a2f3d091461041257610248565b80631c39b672116102105780631c39b672146102e25780631f6c1af5146103005780632e1a7d4d1461031e57806333c092761461033a57806334ee0e681461035857610248565b806303bf61111461024d578063083c63231461026b5780630917e4ec146102895780631959a002146102935780631be19560146102c6575b600080fd5b6102556106cf565b6040516102629190613755565b60405180910390f35b6102736106d5565b6040516102809190613755565b60405180910390f35b6102916106db565b005b6102ad60048036038101906102a89190612e19565b6108a0565b6040516102bd9493929190613799565b60405180910390f35b6102e060048036038101906102db9190612e6b565b6108d0565b005b6102ea610c20565b6040516102f79190613438565b60405180910390f35b610308610c46565b6040516103159190613438565b60405180910390f35b61033860048036038101906103339190612f32565b610c6c565b005b610342610fa6565b60405161034f9190613755565b60405180910390f35b610372600480360381019061036d9190612f32565b610fab565b60405161037f9190613755565b60405180910390f35b6103a2600480360381019061039d9190612f32565b610ff1565b6040516103af919061341d565b60405180910390f35b6103c0611042565b6040516103cd9190613755565b60405180910390f35b6103de611048565b6040516103eb9190613755565b60405180910390f35b6103fc61104e565b604051610409919061341d565b60405180910390f35b61041a611061565b604051610428929190613770565b60405180910390f35b610439611073565b005b61044361117d565b005b61044d611205565b60405161045a9190613755565b60405180910390f35b61046b61120b565b6040516104789190613755565b60405180910390f35b610489611211565b6040516104969190613755565b60405180910390f35b6104a7611217565b6040516104b491906133a2565b60405180910390f35b6104d760048036038101906104d29190612f84565b611240565b6040516104e49190613755565b60405180910390f35b61050760048036038101906105029190612f32565b611287565b005b6105116113cf565b60405161051e9190613438565b60405180910390f35b61052f6113f5565b60405161053c9190613755565b60405180910390f35b61055f600480360381019061055a9190612f32565b61153b565b005b6105696119df565b6040516105769190613755565b60405180910390f35b61059960048036038101906105949190612f32565b611b25565b005b6105b560048036038101906105b09190612f84565b611bf0565b005b6105d160048036038101906105cc9190612e94565b611dc6565b005b6105ed60048036038101906105e89190612f32565b612146565b005b6105f761224d565b005b610601612356565b005b61060b6124cc565b005b61061561256a565b6040516106229190613755565b60405180910390f35b610633612570565b6040516106409190613755565b60405180910390f35b610663600480360381019061065e9190612e19565b612576565b005b61067f600480360381019061067a9190612f32565b61266e565b005b61069b60048036038101906106969190612e19565b612779565b6040516106a89190613755565b60405180910390f35b6106b961288d565b6040516106c6919061341d565b60405180910390f35b60095481565b600f5481565b6106e36128a0565b73ffffffffffffffffffffffffffffffffffffffff16610701611217565b73ffffffffffffffffffffffffffffffffffffffff1614610757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074e906135b5565b60405180910390fd5b601060009054906101000a900460ff166107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d906136b5565b60405180910390fd5b60115443116107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e1906134b5565b60405180910390fd5b6000600260006101000a81548160ff021916908315150217905550600061080f6113f5565b9050600061081b6119df565b905060008211156108315761083033836128a8565b5b60008111156108455761084433826128f9565b5b600060068190555060006007819055506000601060006101000a81548160ff0219169083151502179055507fc97fea7f9cfd95a80e18f16ffdd2b5e40729157a076958ad882b8a43303ff68060405160405180910390a15050565b600d6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6108d86128a0565b73ffffffffffffffffffffffffffffffffffffffff166108f6611217565b73ffffffffffffffffffffffffffffffffffffffff161461094c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610943906135b5565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d490613655565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6590613715565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af690613615565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b3a91906133a2565b60206040518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8a9190612f5b565b9050610bb733828473ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9186304ffe50c568e430e57234122976c83522da68345954bb5485cbab39571383604051610c149190613755565b60405180910390a35050565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026001541415610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990613735565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600001541015610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b90613495565b60405180910390fd5b610d518160010154610ff1565b610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790613515565b60405180910390fd5b610d986124cc565b600081600201546c0c9f2c9cd04674edea40000000600b600101548460000154610dc29190613897565b610dcc9190613866565b610dd691906138f1565b9050600082600301541115610e0257816003015481610df59190613810565b9050600082600301819055505b6000811115610e8c576000610e156113f5565b90506000811115610e8a5780821115610e3757610e3233826128a8565b610e42565b610e4133836128a8565b5b6000610e4d83610fab565b90506000811115610e88576000610e626119df565b905080821115610e7b57610e7633826128f9565b610e86565b610e8533836128f9565b5b505b505b505b6000831115610f17578260086000828254610ea791906138f1565b9250508190555082826000016000828254610ec291906138f1565b92505081905550610f163384600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b5b6c0c9f2c9cd04674edea40000000600b600101548360000154610f3a9190613897565b610f449190613866565b82600201819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436484604051610f929190613755565b60405180910390a250506001808190555050565b600c81565b600080600754118015610fc057506000600654115b15610fe75760065482600754610fd69190613897565b610fe09190613866565b9050610fec565b600090505b919050565b6000600e5482101561100357600e5491505b6000826009546110139190613810565b9050600f5481111561102557600f5490505b8043111561103757600191505061103d565b60009150505b919050565b600e5481565b60125481565b600260009054906101000a900460ff1681565b600b8060000154908060010154905082565b61107b6128a0565b73ffffffffffffffffffffffffffffffffffffffff16611099611217565b73ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e6906135b5565b60405180910390fd5b600060115414611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b906134f5565b60405180910390fd5b6001600260006101000a81548160ff0219169083151502179055507f8824dcb92309d9474923a7f382fc61d5bca1b2ef464bfdf9572d18d23ac75ffd60405160405180910390a1565b6111856128a0565b73ffffffffffffffffffffffffffffffffffffffff166111a3611217565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f0906135b5565b60405180910390fd5b61120360006129d0565b565b60065481565b60085481565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600f54821161125e57828261125791906138f1565b9050611281565b600f5483106112705760009050611281565b82600f5461127e91906138f1565b90505b92915050565b61128f6128a0565b73ffffffffffffffffffffffffffffffffffffffff166112ad611217565b73ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa906135b5565b60405180910390fd5b43600e5411611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133e90613575565b60405180910390fd5b600a5481111561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138390613475565b60405180910390fd5b806009819055507ffb30df4b37d3032f2d4be2795da92ff303953f7c856bcd7dc0bf8c5aa429b1026009546040516113c49190613755565b60405180910390a150565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161145391906133a2565b60206040518083038186803b15801561146b57600080fd5b505afa15801561147f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a39190612f5b565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611533576008548161152b91906138f1565b915050611538565b809150505b90565b60026001541415611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890613735565b60405180910390fd5b6002600181905550600260009054906101000a900460ff166115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf906135f5565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006116256124cc565b60008260000154111561175a57600082600201546c0c9f2c9cd04674edea40000000600b60010154856000015461165c9190613897565b6116669190613866565b61167091906138f1565b905060008111156117585760006116856113f5565b90506000811180156116a0575061169f8460010154610ff1565b5b1561173d576000846003015411156116cf578360030154826116c29190613810565b9150600084600301819055505b808211156116e6576116e133826128a8565b6116f1565b6116f033836128a8565b5b60006116fc83610fab565b905060008111156117375760006117116119df565b90508082111561172a5761172533826128f9565b611735565b61173433836128f9565b5b505b50611756565b81846003015461174d9190613810565b84600301819055505b505b505b6000831115611950576000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117c091906133a2565b60206040518083038186803b1580156117d857600080fd5b505afa1580156117ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118109190612f5b565b9050611861333086600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a94909392919063ffffffff16565b80600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118bd91906133a2565b60206040518083038186803b1580156118d557600080fd5b505afa1580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d9190612f5b565b61191791906138f1565b91504383600101819055508183600001546119329190613810565b8360000181905550816008546119489190613810565b600881905550505b6c0c9f2c9cd04674edea40000000600b6001015483600001546119739190613897565b61197d9190613866565b82600201819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c826040516119cb9190613755565b60405180910390a250506001808190555050565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a3d91906133a2565b60206040518083038186803b158015611a5557600080fd5b505afa158015611a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8d9190612f5b565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b1d5760085481611b1591906138f1565b915050611b22565b809150505b90565b611b2d6128a0565b73ffffffffffffffffffffffffffffffffffffffff16611b4b611217565b73ffffffffffffffffffffffffffffffffffffffff1614611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b98906135b5565b60405180910390fd5b611ba96124cc565b806005819055507f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a4572600f54600554604051611be5929190613770565b60405180910390a150565b611bf86128a0565b73ffffffffffffffffffffffffffffffffffffffff16611c16611217565b73ffffffffffffffffffffffffffffffffffffffff1614611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c63906135b5565b60405180910390fd5b60008211611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca690613635565b60405180910390fd5b611cfe333084600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a94909392919063ffffffff16565b6000811115611d5757611d56333083600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a94909392919063ffffffff16565b5b8160066000828254611d699190613810565b925050819055508060076000828254611d829190613810565b925050819055507ff35f95f47bca6d62bdc5bc7f14da33e6e8d8d7acdb29e8bb3ac08aad5cc7dbe58282604051611dba929190613770565b60405180910390a15050565b600060159054906101000a900460ff16611df057600060149054906101000a900460ff1615611df9565b611df8612b1d565b5b611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f90613595565b60405180910390fd5b60008060159054906101000a900460ff161590508015611e89576001600060156101000a81548160ff0219169083151502179055506001600060146101000a81548160ff0219169083151502179055505b611e916128a0565b73ffffffffffffffffffffffffffffffffffffffff16611eaf611217565b73ffffffffffffffffffffffffffffffffffffffff1614611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc906135b5565b60405180910390fd5b838311611f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e90613535565b60405180910390fd5b438411611f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8090613695565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef906135d5565b60405180910390fd5b87600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460058190555083600e8190555082600f8190555081600260006101000a81548160ff0219169083151502179055506040518060400160405280600e5481526020016000815250600b6000820151816000015560208201518160010155905050801561213c5760008060156101000a81548160ff0219169083151502179055505b5050505050505050565b61214e6128a0565b73ffffffffffffffffffffffffffffffffffffffff1661216c611217565b73ffffffffffffffffffffffffffffffffffffffff16146121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b9906135b5565b60405180910390fd5b600f548111612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd906136f5565b60405180910390fd5b80600f819055507f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a4572600f54600554604051612242929190613770565b60405180910390a150565b6122556128a0565b73ffffffffffffffffffffffffffffffffffffffff16612273611217565b73ffffffffffffffffffffffffffffffffffffffff16146122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c0906135b5565b60405180910390fd5b601254436122d79190613810565b60118190555060006009819055506000600260006101000a81548160ff0219169083151502179055506001601060006101000a81548160ff0219169083151502179055507f5d7072cb293da98ed00a65635d1de6406ba7ee453706a9ce45daac4db4cf718360115460405161234c9190613755565b60405180910390a1565b6002600154141561239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239390613735565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001546008546123f991906138f1565b6008819055506000816000015490506000826000018190555060008260020181905550600082600301819055506124733382600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516124b99190613755565b60405180910390a2505060018081905550565b600b6000015443116124dd57612568565b600060085414156124f75743600b60000181905550612568565b6000612508600b6000015443611240565b905060006005548261251a9190613897565b90506008546c0c9f2c9cd04674edea40000000826125389190613897565b6125429190613866565b600b600101546125529190613810565b600b6001018190555043600b6000018190555050505b565b60075481565b60115481565b61257e6128a0565b73ffffffffffffffffffffffffffffffffffffffff1661259c611217565b73ffffffffffffffffffffffffffffffffffffffff16146125f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e9906135b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612659906134d5565b60405180910390fd5b61266b816129d0565b50565b6126766128a0565b73ffffffffffffffffffffffffffffffffffffffff16612694611217565b73ffffffffffffffffffffffffffffffffffffffff16146126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e1906135b5565b60405180910390fd5b43600e541161272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590613575565b60405180910390fd5b80600e8190555080600b600001819055507f4bb9dd09b6a66721c98f875ba3f3533d0bd985533957120aee36f4e1599068b58160405161276e9190613755565b60405180910390a150565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600b600101549050600b60000154431180156127de5750600060085414155b1561283e5760006127f4600b6000015443611240565b90506000600554826128069190613897565b90506008546c0c9f2c9cd04674edea40000000826128249190613897565b61282e9190613866565b836128399190613810565b925050505b816003015482600201546c0c9f2c9cd04674edea400000008385600001546128669190613897565b6128709190613866565b61287a91906138f1565b6128849190613810565b92505050919050565b601060009054906101000a900460ff1681565b600033905090565b6128f58282600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b5050565b6129468282600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b5050565b6129cb8363a9059cbb60e01b84846040516024016129699291906133f4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b2e565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b17846323b872dd60e01b858585604051602401612ab5939291906133bd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b2e565b50505050565b6000612b2830612bf5565b15905090565b6000612b90826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c089092919063ffffffff16565b9050600081511115612bf05780806020019051810190612bb09190612e42565b612bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be6906136d5565b60405180910390fd5b5b505050565b600080823b905060008111915050919050565b6060612c178484600085612c20565b90509392505050565b606082471015612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5c90613555565b60405180910390fd5b612c6e85612bf5565b612cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca490613675565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cd6919061338b565b60006040518083038185875af1925050503d8060008114612d13576040519150601f19603f3d011682016040523d82523d6000602084013e612d18565b606091505b5091509150612d28828286612d34565b92505050949350505050565b60608315612d4457829050612d94565b600083511115612d575782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8b9190613453565b60405180910390fd5b9392505050565b600081359050612daa816140a0565b92915050565b600081359050612dbf816140b7565b92915050565b600081519050612dd4816140b7565b92915050565b600081359050612de9816140ce565b92915050565b600081359050612dfe816140e5565b92915050565b600081519050612e13816140e5565b92915050565b600060208284031215612e2b57600080fd5b6000612e3984828501612d9b565b91505092915050565b600060208284031215612e5457600080fd5b6000612e6284828501612dc5565b91505092915050565b600060208284031215612e7d57600080fd5b6000612e8b84828501612dda565b91505092915050565b600080600080600080600060e0888a031215612eaf57600080fd5b6000612ebd8a828b01612dda565b9750506020612ece8a828b01612dda565b9650506040612edf8a828b01612dda565b9550506060612ef08a828b01612def565b9450506080612f018a828b01612def565b93505060a0612f128a828b01612def565b92505060c0612f238a828b01612db0565b91505092959891949750929550565b600060208284031215612f4457600080fd5b6000612f5284828501612def565b91505092915050565b600060208284031215612f6d57600080fd5b6000612f7b84828501612e04565b91505092915050565b60008060408385031215612f9757600080fd5b6000612fa585828601612def565b9250506020612fb685828601612def565b9150509250929050565b612fc981613925565b82525050565b612fd881613937565b82525050565b6000612fe9826137de565b612ff381856137f4565b93506130038185602086016139a3565b80840191505092915050565b6130188161397f565b82525050565b6000613029826137e9565b61303381856137ff565b93506130438185602086016139a3565b61304c81613a34565b840191505092915050565b60006130646028836137ff565b915061306f82613a45565b604082019050919050565b60006130876021836137ff565b915061309282613a94565b604082019050919050565b60006130aa602d836137ff565b91506130b582613ae3565b604082019050919050565b60006130cd6026836137ff565b91506130d882613b32565b604082019050919050565b60006130f06042836137ff565b91506130fb82613b81565b606082019050919050565b60006131136038836137ff565b915061311e82613bf6565b604082019050919050565b6000613136602b836137ff565b915061314182613c45565b604082019050919050565b60006131596026836137ff565b915061316482613c94565b604082019050919050565b600061317c603d836137ff565b915061318782613ce3565b604082019050919050565b600061319f602e836137ff565b91506131aa82613d32565b604082019050919050565b60006131c26020836137ff565b91506131cd82613d81565b602082019050919050565b60006131e56030836137ff565b91506131f082613daa565b604082019050919050565b60006132086023836137ff565b915061321382613df9565b604082019050919050565b600061322b601e836137ff565b915061323682613e48565b602082019050919050565b600061324e6025836137ff565b915061325982613e71565b604082019050919050565b6000613271601e836137ff565b915061327c82613ec0565b602082019050919050565b6000613294601d836137ff565b915061329f82613ee9565b602082019050919050565b60006132b7602f836137ff565b91506132c282613f12565b604082019050919050565b60006132da6025836137ff565b91506132e582613f61565b604082019050919050565b60006132fd602a836137ff565b915061330882613fb0565b604082019050919050565b6000613320602f836137ff565b915061332b82613fff565b604082019050919050565b6000613343601f836137ff565b915061334e8261404e565b602082019050919050565b6000613366601f836137ff565b915061337182614077565b602082019050919050565b61338581613975565b82525050565b60006133978284612fde565b915081905092915050565b60006020820190506133b76000830184612fc0565b92915050565b60006060820190506133d26000830186612fc0565b6133df6020830185612fc0565b6133ec604083018461337c565b949350505050565b60006040820190506134096000830185612fc0565b613416602083018461337c565b9392505050565b60006020820190506134326000830184612fcf565b92915050565b600060208201905061344d600083018461300f565b92915050565b6000602082019050818103600083015261346d818461301e565b905092915050565b6000602082019050818103600083015261348e81613057565b9050919050565b600060208201905081810360008301526134ae8161307a565b9050919050565b600060208201905081810360008301526134ce8161309d565b9050919050565b600060208201905081810360008301526134ee816130c0565b9050919050565b6000602082019050818103600083015261350e816130e3565b9050919050565b6000602082019050818103600083015261352e81613106565b9050919050565b6000602082019050818103600083015261354e81613129565b9050919050565b6000602082019050818103600083015261356e8161314c565b9050919050565b6000602082019050818103600083015261358e8161316f565b9050919050565b600060208201905081810360008301526135ae81613192565b9050919050565b600060208201905081810360008301526135ce816131b5565b9050919050565b600060208201905081810360008301526135ee816131d8565b9050919050565b6000602082019050818103600083015261360e816131fb565b9050919050565b6000602082019050818103600083015261362e8161321e565b9050919050565b6000602082019050818103600083015261364e81613241565b9050919050565b6000602082019050818103600083015261366e81613264565b9050919050565b6000602082019050818103600083015261368e81613287565b9050919050565b600060208201905081810360008301526136ae816132aa565b9050919050565b600060208201905081810360008301526136ce816132cd565b9050919050565b600060208201905081810360008301526136ee816132f0565b9050919050565b6000602082019050818103600083015261370e81613313565b9050919050565b6000602082019050818103600083015261372e81613336565b9050919050565b6000602082019050818103600083015261374e81613359565b9050919050565b600060208201905061376a600083018461337c565b92915050565b6000604082019050613785600083018561337c565b613792602083018461337c565b9392505050565b60006080820190506137ae600083018761337c565b6137bb602083018661337c565b6137c8604083018561337c565b6137d5606083018461337c565b95945050505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061381b82613975565b915061382683613975565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561385b5761385a6139d6565b5b828201905092915050565b600061387182613975565b915061387c83613975565b92508261388c5761388b613a05565b5b828204905092915050565b60006138a282613975565b91506138ad83613975565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138e6576138e56139d6565b5b828202905092915050565b60006138fc82613975565b915061390783613975565b92508282101561391a576139196139d6565b5b828203905092915050565b600061393082613955565b9050919050565b60008115159050919050565b600061394e82613925565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061398a82613991565b9050919050565b600061399c82613955565b9050919050565b60005b838110156139c15780820151818401526020810190506139a6565b838111156139d0576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f43616e6e6f7420657863656564206d61782068617276657374206c6f636b757060008201527f20626c6f636b7321000000000000000000000000000000000000000000000000602082015250565b7f4572726f723a20696e73756666696369656e74206f757470757420616d6f756e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207965742072656163686564207468652072657761726473207769746860008201527f64726177616c20626c6f636b2100000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f52657761726473207769746864726177616c20686173206265656e207265717560008201527f65737465642c206465706f736974732063616e6e6f7420626520656e61626c6560208201527f642e000000000000000000000000000000000000000000000000000000000000604082015250565b7f546865206d696e696d756d2074696d657370616e20666f72207769746864726160008201527f77616c7320686173206e6f7420796574207061737365642e0000000000000000602082015250565b7f456e6420626c6f636b206d7573742062652067726561746572207468616e207360008201527f7461727420626c6f636b21000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5468697320616374696f6e2063616e206f6e6c7920626520657865637574656460008201527f206265666f726520656d697373696f6e73206861766520626567756e21000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f52657761726420746f6b656e20616e6420626f6e757320746f6b656e2063616e60008201527f6e6f74206265207468652073616d652100000000000000000000000000000000602082015250565b7f4465706f736974732068617665206e6f7420796574206265656e20656e61626c60008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b7f426f6e757320546f6b656e2063616e6e6f742062652073776565706564210000600082015250565b7f4465706f7369742076616c7565206d757374206265206772656174657220746860008201527f616e20302e000000000000000000000000000000000000000000000000000000602082015250565b7f5374616b6520546f6b656e2063616e6e6f742062652073776565706564210000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f537461727420626c6f636b206d7573742062652067726561746572207468616e60008201527f2063757272656e7420626c6f636b210000000000000000000000000000000000602082015250565b7f52657761726473207769746864726177616c206e6f742079657420726571756560008201527f7374656421000000000000000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4e657720656e6420626c6f636b206d757374206265206772656174657220746860008201527f616e207468652063757272656e742e0000000000000000000000000000000000602082015250565b7f52657761726420546f6b656e2063616e6e6f7420626520737765657065642100600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6140a981613925565b81146140b457600080fd5b50565b6140c081613937565b81146140cb57600080fd5b50565b6140d781613943565b81146140e257600080fd5b50565b6140ee81613975565b81146140f957600080fd5b5056fea2646970667358221220e01c4b147c4633775c9f4422a1db01c97f6850ffb436fdbdc5d364f9e75c79dc64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c80638da5cb5b1161013b578063c713aa94116100b8578063f0b104a01161007c578063f0b104a01461062b578063f2fde38b14610649578063f35e4a6e14610665578063f40f0f5214610681578063fbe92b83146106b157610248565b8063c713aa94146105d3578063cf84c05a146105ef578063db2e21bc146105f9578063e3161ddd14610603578063e38944601461060d57610248565b8063b6b55f25116100ff578063b6b55f2514610545578063ba6e365214610561578063bb872b4a1461057f578063bdd071fb1461059b578063c1561abe146105b757610248565b80638da5cb5b1461049f5780638dbb1e3a146104bd578063927df922146104ed57806399248ea714610509578063aa5c3ab41461052757610248565b806348a43270116101c95780635e4c57a41161018d5780635e4c57a414610431578063715018a61461043b5780637d5c694714610445578063817b1cd2146104635780638ae39cac1461048157610248565b806348a432701461038857806348cd4cb1146103b85780634957acf8146103d65780635392fd1c146103f45780635a2f3d091461041257610248565b80631c39b672116102105780631c39b672146102e25780631f6c1af5146103005780632e1a7d4d1461031e57806333c092761461033a57806334ee0e681461035857610248565b806303bf61111461024d578063083c63231461026b5780630917e4ec146102895780631959a002146102935780631be19560146102c6575b600080fd5b6102556106cf565b6040516102629190613755565b60405180910390f35b6102736106d5565b6040516102809190613755565b60405180910390f35b6102916106db565b005b6102ad60048036038101906102a89190612e19565b6108a0565b6040516102bd9493929190613799565b60405180910390f35b6102e060048036038101906102db9190612e6b565b6108d0565b005b6102ea610c20565b6040516102f79190613438565b60405180910390f35b610308610c46565b6040516103159190613438565b60405180910390f35b61033860048036038101906103339190612f32565b610c6c565b005b610342610fa6565b60405161034f9190613755565b60405180910390f35b610372600480360381019061036d9190612f32565b610fab565b60405161037f9190613755565b60405180910390f35b6103a2600480360381019061039d9190612f32565b610ff1565b6040516103af919061341d565b60405180910390f35b6103c0611042565b6040516103cd9190613755565b60405180910390f35b6103de611048565b6040516103eb9190613755565b60405180910390f35b6103fc61104e565b604051610409919061341d565b60405180910390f35b61041a611061565b604051610428929190613770565b60405180910390f35b610439611073565b005b61044361117d565b005b61044d611205565b60405161045a9190613755565b60405180910390f35b61046b61120b565b6040516104789190613755565b60405180910390f35b610489611211565b6040516104969190613755565b60405180910390f35b6104a7611217565b6040516104b491906133a2565b60405180910390f35b6104d760048036038101906104d29190612f84565b611240565b6040516104e49190613755565b60405180910390f35b61050760048036038101906105029190612f32565b611287565b005b6105116113cf565b60405161051e9190613438565b60405180910390f35b61052f6113f5565b60405161053c9190613755565b60405180910390f35b61055f600480360381019061055a9190612f32565b61153b565b005b6105696119df565b6040516105769190613755565b60405180910390f35b61059960048036038101906105949190612f32565b611b25565b005b6105b560048036038101906105b09190612f84565b611bf0565b005b6105d160048036038101906105cc9190612e94565b611dc6565b005b6105ed60048036038101906105e89190612f32565b612146565b005b6105f761224d565b005b610601612356565b005b61060b6124cc565b005b61061561256a565b6040516106229190613755565b60405180910390f35b610633612570565b6040516106409190613755565b60405180910390f35b610663600480360381019061065e9190612e19565b612576565b005b61067f600480360381019061067a9190612f32565b61266e565b005b61069b60048036038101906106969190612e19565b612779565b6040516106a89190613755565b60405180910390f35b6106b961288d565b6040516106c6919061341d565b60405180910390f35b60095481565b600f5481565b6106e36128a0565b73ffffffffffffffffffffffffffffffffffffffff16610701611217565b73ffffffffffffffffffffffffffffffffffffffff1614610757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074e906135b5565b60405180910390fd5b601060009054906101000a900460ff166107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d906136b5565b60405180910390fd5b60115443116107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e1906134b5565b60405180910390fd5b6000600260006101000a81548160ff021916908315150217905550600061080f6113f5565b9050600061081b6119df565b905060008211156108315761083033836128a8565b5b60008111156108455761084433826128f9565b5b600060068190555060006007819055506000601060006101000a81548160ff0219169083151502179055507fc97fea7f9cfd95a80e18f16ffdd2b5e40729157a076958ad882b8a43303ff68060405160405180910390a15050565b600d6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6108d86128a0565b73ffffffffffffffffffffffffffffffffffffffff166108f6611217565b73ffffffffffffffffffffffffffffffffffffffff161461094c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610943906135b5565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d490613655565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6590613715565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af690613615565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b3a91906133a2565b60206040518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8a9190612f5b565b9050610bb733828473ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9186304ffe50c568e430e57234122976c83522da68345954bb5485cbab39571383604051610c149190613755565b60405180910390a35050565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026001541415610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990613735565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600001541015610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b90613495565b60405180910390fd5b610d518160010154610ff1565b610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790613515565b60405180910390fd5b610d986124cc565b600081600201546c0c9f2c9cd04674edea40000000600b600101548460000154610dc29190613897565b610dcc9190613866565b610dd691906138f1565b9050600082600301541115610e0257816003015481610df59190613810565b9050600082600301819055505b6000811115610e8c576000610e156113f5565b90506000811115610e8a5780821115610e3757610e3233826128a8565b610e42565b610e4133836128a8565b5b6000610e4d83610fab565b90506000811115610e88576000610e626119df565b905080821115610e7b57610e7633826128f9565b610e86565b610e8533836128f9565b5b505b505b505b6000831115610f17578260086000828254610ea791906138f1565b9250508190555082826000016000828254610ec291906138f1565b92505081905550610f163384600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b5b6c0c9f2c9cd04674edea40000000600b600101548360000154610f3a9190613897565b610f449190613866565b82600201819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436484604051610f929190613755565b60405180910390a250506001808190555050565b600c81565b600080600754118015610fc057506000600654115b15610fe75760065482600754610fd69190613897565b610fe09190613866565b9050610fec565b600090505b919050565b6000600e5482101561100357600e5491505b6000826009546110139190613810565b9050600f5481111561102557600f5490505b8043111561103757600191505061103d565b60009150505b919050565b600e5481565b60125481565b600260009054906101000a900460ff1681565b600b8060000154908060010154905082565b61107b6128a0565b73ffffffffffffffffffffffffffffffffffffffff16611099611217565b73ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e6906135b5565b60405180910390fd5b600060115414611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b906134f5565b60405180910390fd5b6001600260006101000a81548160ff0219169083151502179055507f8824dcb92309d9474923a7f382fc61d5bca1b2ef464bfdf9572d18d23ac75ffd60405160405180910390a1565b6111856128a0565b73ffffffffffffffffffffffffffffffffffffffff166111a3611217565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f0906135b5565b60405180910390fd5b61120360006129d0565b565b60065481565b60085481565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600f54821161125e57828261125791906138f1565b9050611281565b600f5483106112705760009050611281565b82600f5461127e91906138f1565b90505b92915050565b61128f6128a0565b73ffffffffffffffffffffffffffffffffffffffff166112ad611217565b73ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa906135b5565b60405180910390fd5b43600e5411611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133e90613575565b60405180910390fd5b600a5481111561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138390613475565b60405180910390fd5b806009819055507ffb30df4b37d3032f2d4be2795da92ff303953f7c856bcd7dc0bf8c5aa429b1026009546040516113c49190613755565b60405180910390a150565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161145391906133a2565b60206040518083038186803b15801561146b57600080fd5b505afa15801561147f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a39190612f5b565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611533576008548161152b91906138f1565b915050611538565b809150505b90565b60026001541415611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890613735565b60405180910390fd5b6002600181905550600260009054906101000a900460ff166115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf906135f5565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006116256124cc565b60008260000154111561175a57600082600201546c0c9f2c9cd04674edea40000000600b60010154856000015461165c9190613897565b6116669190613866565b61167091906138f1565b905060008111156117585760006116856113f5565b90506000811180156116a0575061169f8460010154610ff1565b5b1561173d576000846003015411156116cf578360030154826116c29190613810565b9150600084600301819055505b808211156116e6576116e133826128a8565b6116f1565b6116f033836128a8565b5b60006116fc83610fab565b905060008111156117375760006117116119df565b90508082111561172a5761172533826128f9565b611735565b61173433836128f9565b5b505b50611756565b81846003015461174d9190613810565b84600301819055505b505b505b6000831115611950576000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117c091906133a2565b60206040518083038186803b1580156117d857600080fd5b505afa1580156117ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118109190612f5b565b9050611861333086600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a94909392919063ffffffff16565b80600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118bd91906133a2565b60206040518083038186803b1580156118d557600080fd5b505afa1580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d9190612f5b565b61191791906138f1565b91504383600101819055508183600001546119329190613810565b8360000181905550816008546119489190613810565b600881905550505b6c0c9f2c9cd04674edea40000000600b6001015483600001546119739190613897565b61197d9190613866565b82600201819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c826040516119cb9190613755565b60405180910390a250506001808190555050565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a3d91906133a2565b60206040518083038186803b158015611a5557600080fd5b505afa158015611a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8d9190612f5b565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b1d5760085481611b1591906138f1565b915050611b22565b809150505b90565b611b2d6128a0565b73ffffffffffffffffffffffffffffffffffffffff16611b4b611217565b73ffffffffffffffffffffffffffffffffffffffff1614611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b98906135b5565b60405180910390fd5b611ba96124cc565b806005819055507f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a4572600f54600554604051611be5929190613770565b60405180910390a150565b611bf86128a0565b73ffffffffffffffffffffffffffffffffffffffff16611c16611217565b73ffffffffffffffffffffffffffffffffffffffff1614611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c63906135b5565b60405180910390fd5b60008211611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca690613635565b60405180910390fd5b611cfe333084600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a94909392919063ffffffff16565b6000811115611d5757611d56333083600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a94909392919063ffffffff16565b5b8160066000828254611d699190613810565b925050819055508060076000828254611d829190613810565b925050819055507ff35f95f47bca6d62bdc5bc7f14da33e6e8d8d7acdb29e8bb3ac08aad5cc7dbe58282604051611dba929190613770565b60405180910390a15050565b600060159054906101000a900460ff16611df057600060149054906101000a900460ff1615611df9565b611df8612b1d565b5b611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f90613595565b60405180910390fd5b60008060159054906101000a900460ff161590508015611e89576001600060156101000a81548160ff0219169083151502179055506001600060146101000a81548160ff0219169083151502179055505b611e916128a0565b73ffffffffffffffffffffffffffffffffffffffff16611eaf611217565b73ffffffffffffffffffffffffffffffffffffffff1614611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc906135b5565b60405180910390fd5b838311611f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e90613535565b60405180910390fd5b438411611f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8090613695565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef906135d5565b60405180910390fd5b87600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460058190555083600e8190555082600f8190555081600260006101000a81548160ff0219169083151502179055506040518060400160405280600e5481526020016000815250600b6000820151816000015560208201518160010155905050801561213c5760008060156101000a81548160ff0219169083151502179055505b5050505050505050565b61214e6128a0565b73ffffffffffffffffffffffffffffffffffffffff1661216c611217565b73ffffffffffffffffffffffffffffffffffffffff16146121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b9906135b5565b60405180910390fd5b600f548111612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd906136f5565b60405180910390fd5b80600f819055507f055418cabed8a0ec732dd9b1f84e69d3f33a8f9a70d721b7a6962a00c26a4572600f54600554604051612242929190613770565b60405180910390a150565b6122556128a0565b73ffffffffffffffffffffffffffffffffffffffff16612273611217565b73ffffffffffffffffffffffffffffffffffffffff16146122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c0906135b5565b60405180910390fd5b601254436122d79190613810565b60118190555060006009819055506000600260006101000a81548160ff0219169083151502179055506001601060006101000a81548160ff0219169083151502179055507f5d7072cb293da98ed00a65635d1de6406ba7ee453706a9ce45daac4db4cf718360115460405161234c9190613755565b60405180910390a1565b6002600154141561239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239390613735565b60405180910390fd5b60026001819055506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001546008546123f991906138f1565b6008819055506000816000015490506000826000018190555060008260020181905550600082600301819055506124733382600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516124b99190613755565b60405180910390a2505060018081905550565b600b6000015443116124dd57612568565b600060085414156124f75743600b60000181905550612568565b6000612508600b6000015443611240565b905060006005548261251a9190613897565b90506008546c0c9f2c9cd04674edea40000000826125389190613897565b6125429190613866565b600b600101546125529190613810565b600b6001018190555043600b6000018190555050505b565b60075481565b60115481565b61257e6128a0565b73ffffffffffffffffffffffffffffffffffffffff1661259c611217565b73ffffffffffffffffffffffffffffffffffffffff16146125f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e9906135b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612659906134d5565b60405180910390fd5b61266b816129d0565b50565b6126766128a0565b73ffffffffffffffffffffffffffffffffffffffff16612694611217565b73ffffffffffffffffffffffffffffffffffffffff16146126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e1906135b5565b60405180910390fd5b43600e541161272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590613575565b60405180910390fd5b80600e8190555080600b600001819055507f4bb9dd09b6a66721c98f875ba3f3533d0bd985533957120aee36f4e1599068b58160405161276e9190613755565b60405180910390a150565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600b600101549050600b60000154431180156127de5750600060085414155b1561283e5760006127f4600b6000015443611240565b90506000600554826128069190613897565b90506008546c0c9f2c9cd04674edea40000000826128249190613897565b61282e9190613866565b836128399190613810565b925050505b816003015482600201546c0c9f2c9cd04674edea400000008385600001546128669190613897565b6128709190613866565b61287a91906138f1565b6128849190613810565b92505050919050565b601060009054906101000a900460ff1681565b600033905090565b6128f58282600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b5050565b6129468282600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661294a9092919063ffffffff16565b5050565b6129cb8363a9059cbb60e01b84846040516024016129699291906133f4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b2e565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b17846323b872dd60e01b858585604051602401612ab5939291906133bd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b2e565b50505050565b6000612b2830612bf5565b15905090565b6000612b90826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c089092919063ffffffff16565b9050600081511115612bf05780806020019051810190612bb09190612e42565b612bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be6906136d5565b60405180910390fd5b5b505050565b600080823b905060008111915050919050565b6060612c178484600085612c20565b90509392505050565b606082471015612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5c90613555565b60405180910390fd5b612c6e85612bf5565b612cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca490613675565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cd6919061338b565b60006040518083038185875af1925050503d8060008114612d13576040519150601f19603f3d011682016040523d82523d6000602084013e612d18565b606091505b5091509150612d28828286612d34565b92505050949350505050565b60608315612d4457829050612d94565b600083511115612d575782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8b9190613453565b60405180910390fd5b9392505050565b600081359050612daa816140a0565b92915050565b600081359050612dbf816140b7565b92915050565b600081519050612dd4816140b7565b92915050565b600081359050612de9816140ce565b92915050565b600081359050612dfe816140e5565b92915050565b600081519050612e13816140e5565b92915050565b600060208284031215612e2b57600080fd5b6000612e3984828501612d9b565b91505092915050565b600060208284031215612e5457600080fd5b6000612e6284828501612dc5565b91505092915050565b600060208284031215612e7d57600080fd5b6000612e8b84828501612dda565b91505092915050565b600080600080600080600060e0888a031215612eaf57600080fd5b6000612ebd8a828b01612dda565b9750506020612ece8a828b01612dda565b9650506040612edf8a828b01612dda565b9550506060612ef08a828b01612def565b9450506080612f018a828b01612def565b93505060a0612f128a828b01612def565b92505060c0612f238a828b01612db0565b91505092959891949750929550565b600060208284031215612f4457600080fd5b6000612f5284828501612def565b91505092915050565b600060208284031215612f6d57600080fd5b6000612f7b84828501612e04565b91505092915050565b60008060408385031215612f9757600080fd5b6000612fa585828601612def565b9250506020612fb685828601612def565b9150509250929050565b612fc981613925565b82525050565b612fd881613937565b82525050565b6000612fe9826137de565b612ff381856137f4565b93506130038185602086016139a3565b80840191505092915050565b6130188161397f565b82525050565b6000613029826137e9565b61303381856137ff565b93506130438185602086016139a3565b61304c81613a34565b840191505092915050565b60006130646028836137ff565b915061306f82613a45565b604082019050919050565b60006130876021836137ff565b915061309282613a94565b604082019050919050565b60006130aa602d836137ff565b91506130b582613ae3565b604082019050919050565b60006130cd6026836137ff565b91506130d882613b32565b604082019050919050565b60006130f06042836137ff565b91506130fb82613b81565b606082019050919050565b60006131136038836137ff565b915061311e82613bf6565b604082019050919050565b6000613136602b836137ff565b915061314182613c45565b604082019050919050565b60006131596026836137ff565b915061316482613c94565b604082019050919050565b600061317c603d836137ff565b915061318782613ce3565b604082019050919050565b600061319f602e836137ff565b91506131aa82613d32565b604082019050919050565b60006131c26020836137ff565b91506131cd82613d81565b602082019050919050565b60006131e56030836137ff565b91506131f082613daa565b604082019050919050565b60006132086023836137ff565b915061321382613df9565b604082019050919050565b600061322b601e836137ff565b915061323682613e48565b602082019050919050565b600061324e6025836137ff565b915061325982613e71565b604082019050919050565b6000613271601e836137ff565b915061327c82613ec0565b602082019050919050565b6000613294601d836137ff565b915061329f82613ee9565b602082019050919050565b60006132b7602f836137ff565b91506132c282613f12565b604082019050919050565b60006132da6025836137ff565b91506132e582613f61565b604082019050919050565b60006132fd602a836137ff565b915061330882613fb0565b604082019050919050565b6000613320602f836137ff565b915061332b82613fff565b604082019050919050565b6000613343601f836137ff565b915061334e8261404e565b602082019050919050565b6000613366601f836137ff565b915061337182614077565b602082019050919050565b61338581613975565b82525050565b60006133978284612fde565b915081905092915050565b60006020820190506133b76000830184612fc0565b92915050565b60006060820190506133d26000830186612fc0565b6133df6020830185612fc0565b6133ec604083018461337c565b949350505050565b60006040820190506134096000830185612fc0565b613416602083018461337c565b9392505050565b60006020820190506134326000830184612fcf565b92915050565b600060208201905061344d600083018461300f565b92915050565b6000602082019050818103600083015261346d818461301e565b905092915050565b6000602082019050818103600083015261348e81613057565b9050919050565b600060208201905081810360008301526134ae8161307a565b9050919050565b600060208201905081810360008301526134ce8161309d565b9050919050565b600060208201905081810360008301526134ee816130c0565b9050919050565b6000602082019050818103600083015261350e816130e3565b9050919050565b6000602082019050818103600083015261352e81613106565b9050919050565b6000602082019050818103600083015261354e81613129565b9050919050565b6000602082019050818103600083015261356e8161314c565b9050919050565b6000602082019050818103600083015261358e8161316f565b9050919050565b600060208201905081810360008301526135ae81613192565b9050919050565b600060208201905081810360008301526135ce816131b5565b9050919050565b600060208201905081810360008301526135ee816131d8565b9050919050565b6000602082019050818103600083015261360e816131fb565b9050919050565b6000602082019050818103600083015261362e8161321e565b9050919050565b6000602082019050818103600083015261364e81613241565b9050919050565b6000602082019050818103600083015261366e81613264565b9050919050565b6000602082019050818103600083015261368e81613287565b9050919050565b600060208201905081810360008301526136ae816132aa565b9050919050565b600060208201905081810360008301526136ce816132cd565b9050919050565b600060208201905081810360008301526136ee816132f0565b9050919050565b6000602082019050818103600083015261370e81613313565b9050919050565b6000602082019050818103600083015261372e81613336565b9050919050565b6000602082019050818103600083015261374e81613359565b9050919050565b600060208201905061376a600083018461337c565b92915050565b6000604082019050613785600083018561337c565b613792602083018461337c565b9392505050565b60006080820190506137ae600083018761337c565b6137bb602083018661337c565b6137c8604083018561337c565b6137d5606083018461337c565b95945050505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061381b82613975565b915061382683613975565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561385b5761385a6139d6565b5b828201905092915050565b600061387182613975565b915061387c83613975565b92508261388c5761388b613a05565b5b828204905092915050565b60006138a282613975565b91506138ad83613975565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138e6576138e56139d6565b5b828202905092915050565b60006138fc82613975565b915061390783613975565b92508282101561391a576139196139d6565b5b828203905092915050565b600061393082613955565b9050919050565b60008115159050919050565b600061394e82613925565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061398a82613991565b9050919050565b600061399c82613955565b9050919050565b60005b838110156139c15780820151818401526020810190506139a6565b838111156139d0576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f43616e6e6f7420657863656564206d61782068617276657374206c6f636b757060008201527f20626c6f636b7321000000000000000000000000000000000000000000000000602082015250565b7f4572726f723a20696e73756666696369656e74206f757470757420616d6f756e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207965742072656163686564207468652072657761726473207769746860008201527f64726177616c20626c6f636b2100000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f52657761726473207769746864726177616c20686173206265656e207265717560008201527f65737465642c206465706f736974732063616e6e6f7420626520656e61626c6560208201527f642e000000000000000000000000000000000000000000000000000000000000604082015250565b7f546865206d696e696d756d2074696d657370616e20666f72207769746864726160008201527f77616c7320686173206e6f7420796574207061737365642e0000000000000000602082015250565b7f456e6420626c6f636b206d7573742062652067726561746572207468616e207360008201527f7461727420626c6f636b21000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5468697320616374696f6e2063616e206f6e6c7920626520657865637574656460008201527f206265666f726520656d697373696f6e73206861766520626567756e21000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f52657761726420746f6b656e20616e6420626f6e757320746f6b656e2063616e60008201527f6e6f74206265207468652073616d652100000000000000000000000000000000602082015250565b7f4465706f736974732068617665206e6f7420796574206265656e20656e61626c60008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b7f426f6e757320546f6b656e2063616e6e6f742062652073776565706564210000600082015250565b7f4465706f7369742076616c7565206d757374206265206772656174657220746860008201527f616e20302e000000000000000000000000000000000000000000000000000000602082015250565b7f5374616b6520546f6b656e2063616e6e6f742062652073776565706564210000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f537461727420626c6f636b206d7573742062652067726561746572207468616e60008201527f2063757272656e7420626c6f636b210000000000000000000000000000000000602082015250565b7f52657761726473207769746864726177616c206e6f742079657420726571756560008201527f7374656421000000000000000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4e657720656e6420626c6f636b206d757374206265206772656174657220746860008201527f616e207468652063757272656e742e0000000000000000000000000000000000602082015250565b7f52657761726420546f6b656e2063616e6e6f7420626520737765657065642100600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6140a981613925565b81146140b457600080fd5b50565b6140c081613937565b81146140cb57600080fd5b50565b6140d781613943565b81146140e257600080fd5b50565b6140ee81613975565b81146140f957600080fd5b5056fea2646970667358221220e01c4b147c4633775c9f4422a1db01c97f6850ffb436fdbdc5d364f9e75c79dc64736f6c63430008040033
Deployed Bytecode Sourcemap
24860:18005:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26507:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26962:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41363:788;;;:::i;:::-;;26783:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;42346:514;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25768:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25900;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35069:1697;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25999:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31487:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30015:525;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26887:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27327:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25701:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26703:24;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;40041:236;;;:::i;:::-;;5524:103;;;:::i;:::-;;26242:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26425:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26096:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4873:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29501:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39668:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25832:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36868:239;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32699:2208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37207:236;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38770:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37650:519;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28377:977;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39037:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40998:326;;;:::i;:::-;;40381:402;;;:::i;:::-;;31851:553;;;:::i;:::-;;26290:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27187:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5782:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39351:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30658:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27066:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26507:34;;;;:::o;26962:23::-;;;;:::o;41363:788::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41430:26:::1;;;;;;;;;;;41422:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41532:22;;41517:12;:37;41509:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41633:5;41615:15;;:23;;;;;;;;;;;;;;;;;;41649:28;41680:15;:13;:15::i;:::-;41649:46;;41706:27;41736:14;:12;:14::i;:::-;41706:44;;41787:1;41764:20;:24;41761:108;;;41805:52;41824:10;41836:20;41805:18;:52::i;:::-;41761:108;41904:1;41882:19;:23;41879:105;;;41922:50;41940:10;41952:19;41922:17;:50::i;:::-;41879:105;42023:1;41994:26;:30;;;;42063:1;42035:25;:29;;;;42104:5;42075:26;;:34;;;;;;;;;;;;;;;;;;42125:18;;;;;;;;;;5164:1;;41363:788::o:0;26783:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42346:514::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42444:11:::1;;;;;;;;;;;42418:38;;42426:5;42418:38;;;;42410:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42536:12;;;;;;;;;;;42510:39;;42518:5;42510:39;;;;42502:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;42630:11;;;;;;;;;;;42604:38;;42612:5;42604:38;;;;42596:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42688:15;42706:5;:15;;;42730:4;42706:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42688:48;;42747:39;42766:10;42778:7;42747:5;:18;;;;:39;;;;;:::i;:::-;42837:5;42802:50;;42825:10;42802:50;;;42844:7;42802:50;;;;;;:::i;:::-;;;;;;;;5164:1;42346:514:::0;:::o;25768:25::-;;;;;;;;;;;;;:::o;25900:::-;;;;;;;;;;;;;:::o;35069:1697::-;1865:1;2463:7;;:19;;2455:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1865:1;2596:7;:18;;;;35135:21:::1;35159:8;:20;35168:10;35159:20;;;;;;;;;;;;;;;35135:44;;35213:7;35198:4;:11;;;:22;;35190:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35277:42;35302:4;:16;;;35277:24;:42::i;:::-;35269:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35391:12;:10;:12::i;:::-;35414:15;35487:4;:15;;;35480:4;35446:8;:31;;;35432:4;:11;;;:45;;;;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;35414:88;;35535:1;35517:4;:15;;;:19;35513:121;;;35573:4;:15;;;35563:7;:25;;;;:::i;:::-;35553:35;;35621:1;35603:4;:15;;:19;;;;35513:121;35657:1;35647:7;:11;35644:811;;;35675:28;35706:15;:13;:15::i;:::-;35675:46;;35762:1;35739:20;:24;35736:708;;;35797:20;35787:7;:30;35784:218;;;35842:52;35861:10;35873:20;35842:18;:52::i;:::-;35784:218;;;35943:39;35962:10;35974:7;35943:18;:39::i;:::-;35784:218;36022:13;36038:21;36051:7;36038:12;:21::i;:::-;36022:37;;36090:1;36082:5;:9;36078:351;;;36116:27;36146:14;:12;:14::i;:::-;36116:44;;36195:19;36187:5;:27;36183:227;;;36243:50;36261:10;36273:19;36243:17;:50::i;:::-;36183:227;;;36350:36;36368:10;36380:5;36350:17;:36::i;:::-;36183:227;36078:351;;35736:708;;35644:811;;36478:1;36468:7;:11;36465:164;;;36511:7;36496:11;;:22;;;;;;;:::i;:::-;;;;;;;;36548:7;36533:4;:11;;;:22;;;;;;;:::i;:::-;;;;;;;;36572:45;36597:10;36609:7;36572:11;;;;;;;;;;;:24;;;;:45;;;;;:::i;:::-;36465:164;36707:4;36673:8;:31;;;36659:4;:11;;;:45;;;;:::i;:::-;:52;;;;:::i;:::-;36641:4;:15;;:70;;;;36738:10;36729:29;;;36750:7;36729:29;;;;;;:::i;:::-;;;;;;;;2627:1;;1821::::0;2775:7;:22;;;;35069:1697;:::o;25999:47::-;26044:2;25999:47;:::o;31487:287::-;31554:7;31606:1;31578:25;;:29;:63;;;;;31640:1;31611:26;;:30;31578:63;31574:174;;;31710:26;;31693:14;31665:25;;:42;;;;:::i;:::-;:71;;;;:::i;:::-;31658:78;;;;31574:174;31765:1;31758:8;;31487:287;;;;:::o;30015:525::-;30093:4;30131:10;;30114:14;:27;30110:152;;;30175:10;;30158:27;;30110:152;30272:22;30319:14;30297:19;;:36;;;;:::i;:::-;30272:61;;30365:8;;30348:14;:25;30344:83;;;30407:8;;30390:25;;30344:83;30456:14;30441:12;:29;30437:73;;;30494:4;30487:11;;;;;30437:73;30527:5;30520:12;;;30015:525;;;;:::o;26887:25::-;;;;:::o;27327:87::-;;;;:::o;25701:34::-;;;;;;;;;;;;;:::o;26703:24::-;;;;;;;;;;;;;;:::o;40041:236::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40131:1:::1;40105:22;;:27;40097:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;40232:4;40214:15;;:22;;;;;;;;;;;;;;;;;;40252:17;;;;;;;;;;40041:236::o:0;5524:103::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5589:30:::1;5616:1;5589:18;:30::i;:::-;5524:103::o:0;26242:41::-;;;;:::o;26425:26::-;;;;:::o;26096:29::-;;;;:::o;4873:87::-;4919:7;4946:6;;;;;;;;;;;4939:13;;4873:87;:::o;29501:285::-;29573:7;29604:8;;29597:3;:15;29593:186;;29642:5;29636:3;:11;;;;:::i;:::-;29629:18;;;;29593:186;29678:8;;29669:5;:17;29665:114;;29710:1;29703:8;;;;29665:114;29762:5;29751:8;;:16;;;;:::i;:::-;29744:23;;29501:285;;;;;:::o;39668:323::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28271:12:::1;28258:10;;:25;28250:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39804:22:::2;;39780:20;:46;;39772:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39904:20;39882:19;:42;;;;39940:43;39963:19;;39940:43;;;;;;:::i;:::-;;;;;;;;39668:323:::0;:::o;25832:26::-;;;;;;;;;;;;;:::o;36868:239::-;36914:7;36934:15;36952:12;;;;;;;;;;;:22;;;36983:4;36952:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36934:55;;37019:12;;;;;;;;;;;37004:27;;:11;;;;;;;;;;;:27;;;37000:74;;;37063:11;;37053:7;:21;;;;:::i;:::-;37046:28;;;;;37000:74;37092:7;37085:14;;;36868:239;;:::o;32699:2208::-;1865:1;2463:7;;:19;;2455:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1865:1;2596:7;:18;;;;32772:15:::1;;;;;;;;;;;32764:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32838:21;32862:8;:20;32871:10;32862:20;;;;;;;;;;;;;;;32838:44;;32893:26;32934:12;:10;:12::i;:::-;32975:1;32961:4;:11;;;:15;32957:1350;;;32993:15;33066:4;:15;;;33059:4;33025:8;:31;;;33011:4;:11;;;:45;;;;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;32993:88;;33109:1;33099:7;:11;33096:1200;;;33131:28;33162:15;:13;:15::i;:::-;33131:46;;33222:1;33199:20;:24;:70;;;;;33227:42;33252:4;:16;;;33227:24;:42::i;:::-;33199:70;33196:1085;;;33316:1;33298:4;:15;;;:19;33294:157;;;33366:4;:15;;;33356:7;:25;;;;:::i;:::-;33346:35;;33426:1;33408:4;:15;;:19;;;;33294:157;33486:20;33476:7;:30;33473:234;;;33535:52;33554:10;33566:20;33535:18;:52::i;:::-;33473:234;;;33644:39;33663:10;33675:7;33644:18;:39::i;:::-;33473:234;33731:13;33747:21;33760:7;33747:12;:21::i;:::-;33731:37;;33803:1;33795:5;:9;33791:379;;;33833:27;33863:14;:12;:14::i;:::-;33833:44;;33916:19;33908:5;:27;33904:243;;;33968:50;33986:10;33998:19;33968:17;:50::i;:::-;33904:243;;;34083:36;34101:10;34113:5;34083:17;:36::i;:::-;33904:243;33791:379;;33196:1085;;;;34254:7;34236:4;:15;;;:25;;;;:::i;:::-;34218:4;:15;;:43;;;;33196:1085;33096:1200;;32957:1350;;34331:1;34321:7;:11;34317:443;;;34349:23;34375:11;;;;;;;;;;;:21;;;34405:4;34375:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34349:62;;34426:64;34455:10;34475:4;34482:7;34426:11;;;;;;;;;;;:28;;;;:64;;;;;;:::i;:::-;34565:15;34526:11;;;;;;;;;;;:21;;;34556:4;34526:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;34505:75;;34614:12;34595:4;:16;;:31;;;;34669:18;34655:4;:11;;;:32;;;;:::i;:::-;34641:4;:11;;:46;;;;34730:18;34716:11;;:32;;;;:::i;:::-;34702:11;:46;;;;34317:443;;34838:4;34804:8;:31;;;34790:4;:11;;;:45;;;;:::i;:::-;:52;;;;:::i;:::-;34772:4;:15;;:70;;;;34868:10;34860:39;;;34880:18;34860:39;;;;;;:::i;:::-;;;;;;;;2627:1;;1821::::0;2775:7;:22;;;;32699:2208;:::o;37207:236::-;37252:7;37272:15;37290:11;;;;;;;;;;;:21;;;37320:4;37290:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37272:54;;37356:11;;;;;;;;;;;37341:26;;:11;;;;;;;;;;;:26;;;37337:73;;;37399:11;;37389:7;:21;;;;:::i;:::-;37382:28;;;;;37337:73;37428:7;37421:14;;;37207:236;;:::o;38770:200::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38852:12:::1;:10;:12::i;:::-;38892:15;38875:14;:32;;;;38923:39;38937:8;;38947:14;;38923:39;;;;;;;:::i;:::-;;;;;;;;38770:200:::0;:::o;37650:519::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37761:1:::1;37751:7;:11;37743:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37815:65;37845:10;37865:4;37872:7;37815:12;;;;;;;;;;;:29;;;;:65;;;;;;:::i;:::-;37910:1;37895:12;:16;37891:118;;;37928:69;37957:10;37977:4;37984:12;37928:11;;;;;;;;;;;:28;;;;:69;;;;;;:::i;:::-;37891:118;38049:7;38019:26;;:37;;;;;;;:::i;:::-;;;;;;;;38096:12;38067:25;;:41;;;;;;;:::i;:::-;;;;;;;;38124:37;38139:7;38148:12;38124:37;;;;;;;:::i;:::-;;;;;;;;37650:519:::0;;:::o;28377:977::-;16986:13;;;;;;;;;;;:48;;17022:12;;;;;;;;;;;17021:13;16986:48;;;17002:16;:14;:16::i;:::-;16986:48;16978:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;17098:19;17121:13;;;;;;;;;;;17120:14;17098:36;;17149:14;17145:101;;;17196:4;17180:13;;:20;;;;;;;;;;;;;;;;;;17230:4;17215:12;;:19;;;;;;;;;;;;;;;;;;17145:101;5104:12:::1;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28683:11:::2;28671:9;:23;28663:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;28775:12;28761:11;:26;28753:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;28874:11;28858:27;;:12;:27;;;;28850:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;28963:11;28949;;:25;;;;;;;;;;;;;;;;;;29000:12;28985;;:27;;;;;;;;;;;;;;;;;;29037:11;29023;;:25;;;;;;;;;;;;;;;;;;29076:15;29059:14;:32;;;;29115:11;29102:10;:24;;;;29148:9;29137:8;:20;;;;29186:16;29168:15;;:34;;;;;;;;;;;;;;;;;;29251:95;;;;;;;;29288:10;;29251:95;;;;29333:1;29251:95;;::::0;29240:8:::2;:106;;;;;;;;;;;;;;;;;;;17276:14:::0;17272:68;;;17323:5;17307:13;;:21;;;;;;;;;;;;;;;;;;17272:68;28377:977;;;;;;;;:::o;39037:244::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39127:8:::1;;39115:9;:20;39107:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;39209:9;39198:8;:20;;;;39234:39;39248:8;;39258:14;;39234:39;;;;;;;:::i;:::-;;;;;;;;39037:244:::0;:::o;40998:326::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41104:34:::1;;41089:12;:49;;;;:::i;:::-;41064:22;:74;;;;41171:1;41149:19;:23;;;;41201:5;41183:15;;:23;;;;;;;;;;;;;;;;;;41246:4;41217:26;;:33;;;;;;;;;;;;;;;;;;41266:50;41293:22;;41266:50;;;;;;:::i;:::-;;;;;;;;40998:326::o:0;40381:402::-;1865:1;2463:7;;:19;;2455:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1865:1;2596:7;:18;;;;40443:21:::1;40467:8;:20;40476:10;40467:20;;;;;;;;;;;;;;;40443:44;;40526:4;:11;;;40512;;:25;;;;:::i;:::-;40498:11;:39;;;;40548:15;40566:4;:11;;;40548:29;;40604:1;40590:4;:11;;:15;;;;40634:1;40616:4;:15;;:19;;;;40664:1;40646:4;:15;;:19;;;;40676:45;40701:10;40713:7;40676:11;;;;;;;;;;;:24;;;;:45;;;;;:::i;:::-;40755:10;40737:38;;;40767:7;40737:38;;;;;;:::i;:::-;;;;;;;;2627:1;;1821::::0;2775:7;:22;;;;40381:402::o;31851:553::-;31911:8;:24;;;31895:12;:40;31891:79;;31952:7;;31891:79;31999:1;31984:11;;:16;31980:109;;;32044:12;32017:8;:24;;:39;;;;32071:7;;31980:109;32099:18;32120:53;32134:8;:24;;;32160:12;32120:13;:53::i;:::-;32099:74;;32184:19;32219:14;;32206:10;:27;;;;:::i;:::-;32184:49;;32334:11;;32327:4;32313:11;:18;;;;:::i;:::-;:32;;;;:::i;:::-;32278:8;:31;;;:68;;;;:::i;:::-;32244:8;:31;;:102;;;;32384:12;32357:8;:24;;:39;;;;31851:553;;;:::o;26290:40::-;;;;:::o;27187:37::-;;;;:::o;5782:201::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5891:1:::1;5871:22;;:8;:22;;;;5863:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5947:28;5966:8;5947:18;:28::i;:::-;5782:201:::0;:::o;39351:213::-;5104:12;:10;:12::i;:::-;5093:23;;:7;:5;:7::i;:::-;:23;;;5085:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28271:12:::1;28258:10;;:25;28250:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39450:11:::2;39437:10;:24;;;;39499:11;39472:8;:24;;:38;;;;39526:30;39544:11;39526:30;;;;;;:::i;:::-;;;;;;;;39351:213:::0;:::o;30658:641::-;30719:7;30739:21;30763:8;:15;30772:5;30763:15;;;;;;;;;;;;;;;30739:39;;30789:30;30822:8;:31;;;30789:64;;30883:8;:24;;;30868:12;:39;:59;;;;;30926:1;30911:11;;:16;;30868:59;30864:329;;;30944:18;30965:53;30979:8;:24;;;31005:12;30965:13;:53::i;:::-;30944:74;;31033:19;31068:14;;31055:10;:27;;;;:::i;:::-;31033:49;;31169:11;;31162:4;31148:11;:18;;;;:::i;:::-;:32;;;;:::i;:::-;31122:22;:59;;;;:::i;:::-;31097:84;;30864:329;;;31276:4;:15;;;31257:4;:15;;;31250:4;31225:22;31211:4;:11;;;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:61;;;;:::i;:::-;31210:81;;;;:::i;:::-;31203:88;;;;30658:641;;;:::o;27066:46::-;;;;;;;;;;;;;:::o;3544:98::-;3597:7;3624:10;3617:17;;3544:98;:::o;38287:125::-;38365:39;38391:3;38396:7;38365:12;;;;;;;;;;;:25;;;;:39;;;;;:::i;:::-;38287:125;;:::o;38528:123::-;38605:38;38630:3;38635:7;38605:11;;;;;;;;;;;:24;;;;:38;;;;;:::i;:::-;38528:123;;:::o;21498:211::-;21615:86;21635:5;21665:23;;;21690:2;21694:5;21642:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21615:19;:86::i;:::-;21498:211;;;:::o;6143:191::-;6217:16;6236:6;;;;;;;;;;;6217:25;;6262:8;6253:6;;:17;;;;;;;;;;;;;;;;;;6317:8;6286:40;;6307:8;6286:40;;;;;;;;;;;;6143:191;;:::o;21717:248::-;21861:96;21881:5;21911:27;;;21940:4;21946:2;21950:5;21888:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21861:19;:96::i;:::-;21717:248;;;;:::o;17678:114::-;17726:4;17751:33;17778:4;17751:18;:33::i;:::-;17750:34;17743:41;;17678:114;:::o;24071:716::-;24495:23;24521:69;24549:4;24521:69;;;;;;;;;;;;;;;;;24529:5;24521:27;;;;:69;;;;;:::i;:::-;24495:95;;24625:1;24605:10;:17;:21;24601:179;;;24702:10;24691:30;;;;;;;;;;;;:::i;:::-;24683:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;24601:179;24071:716;;;:::o;7214:387::-;7274:4;7482:12;7549:7;7537:20;7529:28;;7592:1;7585:4;:8;7578:15;;;7214:387;;;:::o;10020:229::-;10157:12;10189:52;10211:6;10219:4;10225:1;10228:12;10189:21;:52::i;:::-;10182:59;;10020:229;;;;;:::o;11140:510::-;11310:12;11368:5;11343:21;:30;;11335:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11435:18;11446:6;11435:10;:18::i;:::-;11427:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;11501:12;11515:23;11542:6;:11;;11561:5;11568:4;11542:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11500:73;;;;11591:51;11608:7;11617:10;11629:12;11591:16;:51::i;:::-;11584:58;;;;11140:510;;;;;;:::o;13826:712::-;13976:12;14005:7;14001:530;;;14036:10;14029:17;;;;14001:530;14170:1;14150:10;:17;:21;14146:374;;;14348:10;14342:17;14409:15;14396:10;14392:2;14388:19;14381:44;14296:148;14491:12;14484:20;;;;;;;;;;;:::i;:::-;;;;;;;;13826:712;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;345:5;376:6;370:13;361:22;;392:30;416:5;392:30;:::i;:::-;351:77;;;;:::o;434:167::-;494:5;532:6;519:20;510:29;;548:47;589:5;548:47;:::i;:::-;500:101;;;;:::o;607:139::-;653:5;691:6;678:20;669:29;;707:33;734:5;707:33;:::i;:::-;659:87;;;;:::o;752:143::-;809:5;840:6;834:13;825:22;;856:33;883:5;856:33;:::i;:::-;815:80;;;;:::o;901:262::-;960:6;1009:2;997:9;988:7;984:23;980:32;977:2;;;1025:1;1022;1015:12;977:2;1068:1;1093:53;1138:7;1129:6;1118:9;1114:22;1093:53;:::i;:::-;1083:63;;1039:117;967:196;;;;:::o;1169:278::-;1236:6;1285:2;1273:9;1264:7;1260:23;1256:32;1253:2;;;1301:1;1298;1291:12;1253:2;1344:1;1369:61;1422:7;1413:6;1402:9;1398:22;1369:61;:::i;:::-;1359:71;;1315:125;1243:204;;;;:::o;1453:290::-;1526:6;1575:2;1563:9;1554:7;1550:23;1546:32;1543:2;;;1591:1;1588;1581:12;1543:2;1634:1;1659:67;1718:7;1709:6;1698:9;1694:22;1659:67;:::i;:::-;1649:77;;1605:131;1533:210;;;;:::o;1749:1214::-;1901:6;1909;1917;1925;1933;1941;1949;1998:3;1986:9;1977:7;1973:23;1969:33;1966:2;;;2015:1;2012;2005:12;1966:2;2058:1;2083:67;2142:7;2133:6;2122:9;2118:22;2083:67;:::i;:::-;2073:77;;2029:131;2199:2;2225:67;2284:7;2275:6;2264:9;2260:22;2225:67;:::i;:::-;2215:77;;2170:132;2341:2;2367:67;2426:7;2417:6;2406:9;2402:22;2367:67;:::i;:::-;2357:77;;2312:132;2483:2;2509:53;2554:7;2545:6;2534:9;2530:22;2509:53;:::i;:::-;2499:63;;2454:118;2611:3;2638:53;2683:7;2674:6;2663:9;2659:22;2638:53;:::i;:::-;2628:63;;2582:119;2740:3;2767:53;2812:7;2803:6;2792:9;2788:22;2767:53;:::i;:::-;2757:63;;2711:119;2869:3;2896:50;2938:7;2929:6;2918:9;2914:22;2896:50;:::i;:::-;2886:60;;2840:116;1956:1007;;;;;;;;;;:::o;2969:262::-;3028:6;3077:2;3065:9;3056:7;3052:23;3048:32;3045:2;;;3093:1;3090;3083:12;3045:2;3136:1;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3107:117;3035:196;;;;:::o;3237:284::-;3307:6;3356:2;3344:9;3335:7;3331:23;3327:32;3324:2;;;3372:1;3369;3362:12;3324:2;3415:1;3440:64;3496:7;3487:6;3476:9;3472:22;3440:64;:::i;:::-;3430:74;;3386:128;3314:207;;;;:::o;3527:407::-;3595:6;3603;3652:2;3640:9;3631:7;3627:23;3623:32;3620:2;;;3668:1;3665;3658:12;3620:2;3711:1;3736:53;3781:7;3772:6;3761:9;3757:22;3736:53;:::i;:::-;3726:63;;3682:117;3838:2;3864:53;3909:7;3900:6;3889:9;3885:22;3864:53;:::i;:::-;3854:63;;3809:118;3610:324;;;;;:::o;3940:118::-;4027:24;4045:5;4027:24;:::i;:::-;4022:3;4015:37;4005:53;;:::o;4064:109::-;4145:21;4160:5;4145:21;:::i;:::-;4140:3;4133:34;4123:50;;:::o;4179:373::-;4283:3;4311:38;4343:5;4311:38;:::i;:::-;4365:88;4446:6;4441:3;4365:88;:::i;:::-;4358:95;;4462:52;4507:6;4502:3;4495:4;4488:5;4484:16;4462:52;:::i;:::-;4539:6;4534:3;4530:16;4523:23;;4287:265;;;;;:::o;4558:159::-;4659:51;4704:5;4659:51;:::i;:::-;4654:3;4647:64;4637:80;;:::o;4723:364::-;4811:3;4839:39;4872:5;4839:39;:::i;:::-;4894:71;4958:6;4953:3;4894:71;:::i;:::-;4887:78;;4974:52;5019:6;5014:3;5007:4;5000:5;4996:16;4974:52;:::i;:::-;5051:29;5073:6;5051:29;:::i;:::-;5046:3;5042:39;5035:46;;4815:272;;;;;:::o;5093:366::-;5235:3;5256:67;5320:2;5315:3;5256:67;:::i;:::-;5249:74;;5332:93;5421:3;5332:93;:::i;:::-;5450:2;5445:3;5441:12;5434:19;;5239:220;;;:::o;5465:366::-;5607:3;5628:67;5692:2;5687:3;5628:67;:::i;:::-;5621:74;;5704:93;5793:3;5704:93;:::i;:::-;5822:2;5817:3;5813:12;5806:19;;5611:220;;;:::o;5837:366::-;5979:3;6000:67;6064:2;6059:3;6000:67;:::i;:::-;5993:74;;6076:93;6165:3;6076:93;:::i;:::-;6194:2;6189:3;6185:12;6178:19;;5983:220;;;:::o;6209:366::-;6351:3;6372:67;6436:2;6431:3;6372:67;:::i;:::-;6365:74;;6448:93;6537:3;6448:93;:::i;:::-;6566:2;6561:3;6557:12;6550:19;;6355:220;;;:::o;6581:366::-;6723:3;6744:67;6808:2;6803:3;6744:67;:::i;:::-;6737:74;;6820:93;6909:3;6820:93;:::i;:::-;6938:2;6933:3;6929:12;6922:19;;6727:220;;;:::o;6953:366::-;7095:3;7116:67;7180:2;7175:3;7116:67;:::i;:::-;7109:74;;7192:93;7281:3;7192:93;:::i;:::-;7310:2;7305:3;7301:12;7294:19;;7099:220;;;:::o;7325:366::-;7467:3;7488:67;7552:2;7547:3;7488:67;:::i;:::-;7481:74;;7564:93;7653:3;7564:93;:::i;:::-;7682:2;7677:3;7673:12;7666:19;;7471:220;;;:::o;7697:366::-;7839:3;7860:67;7924:2;7919:3;7860:67;:::i;:::-;7853:74;;7936:93;8025:3;7936:93;:::i;:::-;8054:2;8049:3;8045:12;8038:19;;7843:220;;;:::o;8069:366::-;8211:3;8232:67;8296:2;8291:3;8232:67;:::i;:::-;8225:74;;8308:93;8397:3;8308:93;:::i;:::-;8426:2;8421:3;8417:12;8410:19;;8215:220;;;:::o;8441:366::-;8583:3;8604:67;8668:2;8663:3;8604:67;:::i;:::-;8597:74;;8680:93;8769:3;8680:93;:::i;:::-;8798:2;8793:3;8789:12;8782:19;;8587:220;;;:::o;8813:366::-;8955:3;8976:67;9040:2;9035:3;8976:67;:::i;:::-;8969:74;;9052:93;9141:3;9052:93;:::i;:::-;9170:2;9165:3;9161:12;9154:19;;8959:220;;;:::o;9185:366::-;9327:3;9348:67;9412:2;9407:3;9348:67;:::i;:::-;9341:74;;9424:93;9513:3;9424:93;:::i;:::-;9542:2;9537:3;9533:12;9526:19;;9331:220;;;:::o;9557:366::-;9699:3;9720:67;9784:2;9779:3;9720:67;:::i;:::-;9713:74;;9796:93;9885:3;9796:93;:::i;:::-;9914:2;9909:3;9905:12;9898:19;;9703:220;;;:::o;9929:366::-;10071:3;10092:67;10156:2;10151:3;10092:67;:::i;:::-;10085:74;;10168:93;10257:3;10168:93;:::i;:::-;10286:2;10281:3;10277:12;10270:19;;10075:220;;;:::o;10301:366::-;10443:3;10464:67;10528:2;10523:3;10464:67;:::i;:::-;10457:74;;10540:93;10629:3;10540:93;:::i;:::-;10658:2;10653:3;10649:12;10642:19;;10447:220;;;:::o;10673:366::-;10815:3;10836:67;10900:2;10895:3;10836:67;:::i;:::-;10829:74;;10912:93;11001:3;10912:93;:::i;:::-;11030:2;11025:3;11021:12;11014:19;;10819:220;;;:::o;11045:366::-;11187:3;11208:67;11272:2;11267:3;11208:67;:::i;:::-;11201:74;;11284:93;11373:3;11284:93;:::i;:::-;11402:2;11397:3;11393:12;11386:19;;11191:220;;;:::o;11417:366::-;11559:3;11580:67;11644:2;11639:3;11580:67;:::i;:::-;11573:74;;11656:93;11745:3;11656:93;:::i;:::-;11774:2;11769:3;11765:12;11758:19;;11563:220;;;:::o;11789:366::-;11931:3;11952:67;12016:2;12011:3;11952:67;:::i;:::-;11945:74;;12028:93;12117:3;12028:93;:::i;:::-;12146:2;12141:3;12137:12;12130:19;;11935:220;;;:::o;12161:366::-;12303:3;12324:67;12388:2;12383:3;12324:67;:::i;:::-;12317:74;;12400:93;12489:3;12400:93;:::i;:::-;12518:2;12513:3;12509:12;12502:19;;12307:220;;;:::o;12533:366::-;12675:3;12696:67;12760:2;12755:3;12696:67;:::i;:::-;12689:74;;12772:93;12861:3;12772:93;:::i;:::-;12890:2;12885:3;12881:12;12874:19;;12679:220;;;:::o;12905:366::-;13047:3;13068:67;13132:2;13127:3;13068:67;:::i;:::-;13061:74;;13144:93;13233:3;13144:93;:::i;:::-;13262:2;13257:3;13253:12;13246:19;;13051:220;;;:::o;13277:366::-;13419:3;13440:67;13504:2;13499:3;13440:67;:::i;:::-;13433:74;;13516:93;13605:3;13516:93;:::i;:::-;13634:2;13629:3;13625:12;13618:19;;13423:220;;;:::o;13649:118::-;13736:24;13754:5;13736:24;:::i;:::-;13731:3;13724:37;13714:53;;:::o;13773:271::-;13903:3;13925:93;14014:3;14005:6;13925:93;:::i;:::-;13918:100;;14035:3;14028:10;;13907:137;;;;:::o;14050:222::-;14143:4;14181:2;14170:9;14166:18;14158:26;;14194:71;14262:1;14251:9;14247:17;14238:6;14194:71;:::i;:::-;14148:124;;;;:::o;14278:442::-;14427:4;14465:2;14454:9;14450:18;14442:26;;14478:71;14546:1;14535:9;14531:17;14522:6;14478:71;:::i;:::-;14559:72;14627:2;14616:9;14612:18;14603:6;14559:72;:::i;:::-;14641;14709:2;14698:9;14694:18;14685:6;14641:72;:::i;:::-;14432:288;;;;;;:::o;14726:332::-;14847:4;14885:2;14874:9;14870:18;14862:26;;14898:71;14966:1;14955:9;14951:17;14942:6;14898:71;:::i;:::-;14979:72;15047:2;15036:9;15032:18;15023:6;14979:72;:::i;:::-;14852:206;;;;;:::o;15064:210::-;15151:4;15189:2;15178:9;15174:18;15166:26;;15202:65;15264:1;15253:9;15249:17;15240:6;15202:65;:::i;:::-;15156:118;;;;:::o;15280:250::-;15387:4;15425:2;15414:9;15410:18;15402:26;;15438:85;15520:1;15509:9;15505:17;15496:6;15438:85;:::i;:::-;15392:138;;;;:::o;15536:313::-;15649:4;15687:2;15676:9;15672:18;15664:26;;15736:9;15730:4;15726:20;15722:1;15711:9;15707:17;15700:47;15764:78;15837:4;15828:6;15764:78;:::i;:::-;15756:86;;15654:195;;;;:::o;15855:419::-;16021:4;16059:2;16048:9;16044:18;16036:26;;16108:9;16102:4;16098:20;16094:1;16083:9;16079:17;16072:47;16136:131;16262:4;16136:131;:::i;:::-;16128:139;;16026:248;;;:::o;16280:419::-;16446:4;16484:2;16473:9;16469:18;16461:26;;16533:9;16527:4;16523:20;16519:1;16508:9;16504:17;16497:47;16561:131;16687:4;16561:131;:::i;:::-;16553:139;;16451:248;;;:::o;16705:419::-;16871:4;16909:2;16898:9;16894:18;16886:26;;16958:9;16952:4;16948:20;16944:1;16933:9;16929:17;16922:47;16986:131;17112:4;16986:131;:::i;:::-;16978:139;;16876:248;;;:::o;17130:419::-;17296:4;17334:2;17323:9;17319:18;17311:26;;17383:9;17377:4;17373:20;17369:1;17358:9;17354:17;17347:47;17411:131;17537:4;17411:131;:::i;:::-;17403:139;;17301:248;;;:::o;17555:419::-;17721:4;17759:2;17748:9;17744:18;17736:26;;17808:9;17802:4;17798:20;17794:1;17783:9;17779:17;17772:47;17836:131;17962:4;17836:131;:::i;:::-;17828:139;;17726:248;;;:::o;17980:419::-;18146:4;18184:2;18173:9;18169:18;18161:26;;18233:9;18227:4;18223:20;18219:1;18208:9;18204:17;18197:47;18261:131;18387:4;18261:131;:::i;:::-;18253:139;;18151:248;;;:::o;18405:419::-;18571:4;18609:2;18598:9;18594:18;18586:26;;18658:9;18652:4;18648:20;18644:1;18633:9;18629:17;18622:47;18686:131;18812:4;18686:131;:::i;:::-;18678:139;;18576:248;;;:::o;18830:419::-;18996:4;19034:2;19023:9;19019:18;19011:26;;19083:9;19077:4;19073:20;19069:1;19058:9;19054:17;19047:47;19111:131;19237:4;19111:131;:::i;:::-;19103:139;;19001:248;;;:::o;19255:419::-;19421:4;19459:2;19448:9;19444:18;19436:26;;19508:9;19502:4;19498:20;19494:1;19483:9;19479:17;19472:47;19536:131;19662:4;19536:131;:::i;:::-;19528:139;;19426:248;;;:::o;19680:419::-;19846:4;19884:2;19873:9;19869:18;19861:26;;19933:9;19927:4;19923:20;19919:1;19908:9;19904:17;19897:47;19961:131;20087:4;19961:131;:::i;:::-;19953:139;;19851:248;;;:::o;20105:419::-;20271:4;20309:2;20298:9;20294:18;20286:26;;20358:9;20352:4;20348:20;20344:1;20333:9;20329:17;20322:47;20386:131;20512:4;20386:131;:::i;:::-;20378:139;;20276:248;;;:::o;20530:419::-;20696:4;20734:2;20723:9;20719:18;20711:26;;20783:9;20777:4;20773:20;20769:1;20758:9;20754:17;20747:47;20811:131;20937:4;20811:131;:::i;:::-;20803:139;;20701:248;;;:::o;20955:419::-;21121:4;21159:2;21148:9;21144:18;21136:26;;21208:9;21202:4;21198:20;21194:1;21183:9;21179:17;21172:47;21236:131;21362:4;21236:131;:::i;:::-;21228:139;;21126:248;;;:::o;21380:419::-;21546:4;21584:2;21573:9;21569:18;21561:26;;21633:9;21627:4;21623:20;21619:1;21608:9;21604:17;21597:47;21661:131;21787:4;21661:131;:::i;:::-;21653:139;;21551:248;;;:::o;21805:419::-;21971:4;22009:2;21998:9;21994:18;21986:26;;22058:9;22052:4;22048:20;22044:1;22033:9;22029:17;22022:47;22086:131;22212:4;22086:131;:::i;:::-;22078:139;;21976:248;;;:::o;22230:419::-;22396:4;22434:2;22423:9;22419:18;22411:26;;22483:9;22477:4;22473:20;22469:1;22458:9;22454:17;22447:47;22511:131;22637:4;22511:131;:::i;:::-;22503:139;;22401:248;;;:::o;22655:419::-;22821:4;22859:2;22848:9;22844:18;22836:26;;22908:9;22902:4;22898:20;22894:1;22883:9;22879:17;22872:47;22936:131;23062:4;22936:131;:::i;:::-;22928:139;;22826:248;;;:::o;23080:419::-;23246:4;23284:2;23273:9;23269:18;23261:26;;23333:9;23327:4;23323:20;23319:1;23308:9;23304:17;23297:47;23361:131;23487:4;23361:131;:::i;:::-;23353:139;;23251:248;;;:::o;23505:419::-;23671:4;23709:2;23698:9;23694:18;23686:26;;23758:9;23752:4;23748:20;23744:1;23733:9;23729:17;23722:47;23786:131;23912:4;23786:131;:::i;:::-;23778:139;;23676:248;;;:::o;23930:419::-;24096:4;24134:2;24123:9;24119:18;24111:26;;24183:9;24177:4;24173:20;24169:1;24158:9;24154:17;24147:47;24211:131;24337:4;24211:131;:::i;:::-;24203:139;;24101:248;;;:::o;24355:419::-;24521:4;24559:2;24548:9;24544:18;24536:26;;24608:9;24602:4;24598:20;24594:1;24583:9;24579:17;24572:47;24636:131;24762:4;24636:131;:::i;:::-;24628:139;;24526:248;;;:::o;24780:419::-;24946:4;24984:2;24973:9;24969:18;24961:26;;25033:9;25027:4;25023:20;25019:1;25008:9;25004:17;24997:47;25061:131;25187:4;25061:131;:::i;:::-;25053:139;;24951:248;;;:::o;25205:419::-;25371:4;25409:2;25398:9;25394:18;25386:26;;25458:9;25452:4;25448:20;25444:1;25433:9;25429:17;25422:47;25486:131;25612:4;25486:131;:::i;:::-;25478:139;;25376:248;;;:::o;25630:222::-;25723:4;25761:2;25750:9;25746:18;25738:26;;25774:71;25842:1;25831:9;25827:17;25818:6;25774:71;:::i;:::-;25728:124;;;;:::o;25858:332::-;25979:4;26017:2;26006:9;26002:18;25994:26;;26030:71;26098:1;26087:9;26083:17;26074:6;26030:71;:::i;:::-;26111:72;26179:2;26168:9;26164:18;26155:6;26111:72;:::i;:::-;25984:206;;;;;:::o;26196:553::-;26373:4;26411:3;26400:9;26396:19;26388:27;;26425:71;26493:1;26482:9;26478:17;26469:6;26425:71;:::i;:::-;26506:72;26574:2;26563:9;26559:18;26550:6;26506:72;:::i;:::-;26588;26656:2;26645:9;26641:18;26632:6;26588:72;:::i;:::-;26670;26738:2;26727:9;26723:18;26714:6;26670:72;:::i;:::-;26378:371;;;;;;;:::o;26755:98::-;26806:6;26840:5;26834:12;26824:22;;26813:40;;;:::o;26859:99::-;26911:6;26945:5;26939:12;26929:22;;26918:40;;;:::o;26964:147::-;27065:11;27102:3;27087:18;;27077:34;;;;:::o;27117:169::-;27201:11;27235:6;27230:3;27223:19;27275:4;27270:3;27266:14;27251:29;;27213:73;;;;:::o;27292:305::-;27332:3;27351:20;27369:1;27351:20;:::i;:::-;27346:25;;27385:20;27403:1;27385:20;:::i;:::-;27380:25;;27539:1;27471:66;27467:74;27464:1;27461:81;27458:2;;;27545:18;;:::i;:::-;27458:2;27589:1;27586;27582:9;27575:16;;27336:261;;;;:::o;27603:185::-;27643:1;27660:20;27678:1;27660:20;:::i;:::-;27655:25;;27694:20;27712:1;27694:20;:::i;:::-;27689:25;;27733:1;27723:2;;27738:18;;:::i;:::-;27723:2;27780:1;27777;27773:9;27768:14;;27645:143;;;;:::o;27794:348::-;27834:7;27857:20;27875:1;27857:20;:::i;:::-;27852:25;;27891:20;27909:1;27891:20;:::i;:::-;27886:25;;28079:1;28011:66;28007:74;28004:1;28001:81;27996:1;27989:9;27982:17;27978:105;27975:2;;;28086:18;;:::i;:::-;27975:2;28134:1;28131;28127:9;28116:20;;27842:300;;;;:::o;28148:191::-;28188:4;28208:20;28226:1;28208:20;:::i;:::-;28203:25;;28242:20;28260:1;28242:20;:::i;:::-;28237:25;;28281:1;28278;28275:8;28272:2;;;28286:18;;:::i;:::-;28272:2;28331:1;28328;28324:9;28316:17;;28193:146;;;;:::o;28345:96::-;28382:7;28411:24;28429:5;28411:24;:::i;:::-;28400:35;;28390:51;;;:::o;28447:90::-;28481:7;28524:5;28517:13;28510:21;28499:32;;28489:48;;;:::o;28543:110::-;28594:7;28623:24;28641:5;28623:24;:::i;:::-;28612:35;;28602:51;;;:::o;28659:126::-;28696:7;28736:42;28729:5;28725:54;28714:65;;28704:81;;;:::o;28791:77::-;28828:7;28857:5;28846:16;;28836:32;;;:::o;28874:154::-;28938:9;28971:51;29016:5;28971:51;:::i;:::-;28958:64;;28948:80;;;:::o;29034:127::-;29098:9;29131:24;29149:5;29131:24;:::i;:::-;29118:37;;29108:53;;;:::o;29167:307::-;29235:1;29245:113;29259:6;29256:1;29253:13;29245:113;;;29344:1;29339:3;29335:11;29329:18;29325:1;29320:3;29316:11;29309:39;29281:2;29278:1;29274:10;29269:15;;29245:113;;;29376:6;29373:1;29370:13;29367:2;;;29456:1;29447:6;29442:3;29438:16;29431:27;29367:2;29216:258;;;;:::o;29480:180::-;29528:77;29525:1;29518:88;29625:4;29622:1;29615:15;29649:4;29646:1;29639:15;29666:180;29714:77;29711:1;29704:88;29811:4;29808:1;29801:15;29835:4;29832:1;29825:15;29852:102;29893:6;29944:2;29940:7;29935:2;29928:5;29924:14;29920:28;29910:38;;29900:54;;;:::o;29960:227::-;30100:34;30096:1;30088:6;30084:14;30077:58;30169:10;30164:2;30156:6;30152:15;30145:35;30066:121;:::o;30193:220::-;30333:34;30329:1;30321:6;30317:14;30310:58;30402:3;30397:2;30389:6;30385:15;30378:28;30299:114;:::o;30419:232::-;30559:34;30555:1;30547:6;30543:14;30536:58;30628:15;30623:2;30615:6;30611:15;30604:40;30525:126;:::o;30657:225::-;30797:34;30793:1;30785:6;30781:14;30774:58;30866:8;30861:2;30853:6;30849:15;30842:33;30763:119;:::o;30888:290::-;31028:34;31024:1;31016:6;31012:14;31005:58;31097:34;31092:2;31084:6;31080:15;31073:59;31166:4;31161:2;31153:6;31149:15;31142:29;30994:184;:::o;31184:243::-;31324:34;31320:1;31312:6;31308:14;31301:58;31393:26;31388:2;31380:6;31376:15;31369:51;31290:137;:::o;31433:230::-;31573:34;31569:1;31561:6;31557:14;31550:58;31642:13;31637:2;31629:6;31625:15;31618:38;31539:124;:::o;31669:225::-;31809:34;31805:1;31797:6;31793:14;31786:58;31878:8;31873:2;31865:6;31861:15;31854:33;31775:119;:::o;31900:248::-;32040:34;32036:1;32028:6;32024:14;32017:58;32109:31;32104:2;32096:6;32092:15;32085:56;32006:142;:::o;32154:233::-;32294:34;32290:1;32282:6;32278:14;32271:58;32363:16;32358:2;32350:6;32346:15;32339:41;32260:127;:::o;32393:182::-;32533:34;32529:1;32521:6;32517:14;32510:58;32499:76;:::o;32581:235::-;32721:34;32717:1;32709:6;32705:14;32698:58;32790:18;32785:2;32777:6;32773:15;32766:43;32687:129;:::o;32822:222::-;32962:34;32958:1;32950:6;32946:14;32939:58;33031:5;33026:2;33018:6;33014:15;33007:30;32928:116;:::o;33050:180::-;33190:32;33186:1;33178:6;33174:14;33167:56;33156:74;:::o;33236:224::-;33376:34;33372:1;33364:6;33360:14;33353:58;33445:7;33440:2;33432:6;33428:15;33421:32;33342:118;:::o;33466:180::-;33606:32;33602:1;33594:6;33590:14;33583:56;33572:74;:::o;33652:179::-;33792:31;33788:1;33780:6;33776:14;33769:55;33758:73;:::o;33837:234::-;33977:34;33973:1;33965:6;33961:14;33954:58;34046:17;34041:2;34033:6;34029:15;34022:42;33943:128;:::o;34077:224::-;34217:34;34213:1;34205:6;34201:14;34194:58;34286:7;34281:2;34273:6;34269:15;34262:32;34183:118;:::o;34307:229::-;34447:34;34443:1;34435:6;34431:14;34424:58;34516:12;34511:2;34503:6;34499:15;34492:37;34413:123;:::o;34542:234::-;34682:34;34678:1;34670:6;34666:14;34659:58;34751:17;34746:2;34738:6;34734:15;34727:42;34648:128;:::o;34782:181::-;34922:33;34918:1;34910:6;34906:14;34899:57;34888:75;:::o;34969:181::-;35109:33;35105:1;35097:6;35093:14;35086:57;35075:75;:::o;35156:122::-;35229:24;35247:5;35229:24;:::i;:::-;35222:5;35219:35;35209:2;;35268:1;35265;35258:12;35209:2;35199:79;:::o;35284:116::-;35354:21;35369:5;35354:21;:::i;:::-;35347:5;35344:32;35334:2;;35390:1;35387;35380:12;35334:2;35324:76;:::o;35406:150::-;35493:38;35525:5;35493:38;:::i;:::-;35486:5;35483:49;35473:2;;35546:1;35543;35536:12;35473:2;35463:93;:::o;35562:122::-;35635:24;35653:5;35635:24;:::i;:::-;35628:5;35625:35;35615:2;;35674:1;35671;35664:12;35615:2;35605:79;:::o
Swarm Source
ipfs://e01c4b147c4633775c9f4422a1db01c97f6850ffb436fdbdc5d364f9e75c79dc
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.