More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 247 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 15397987 | 845 days ago | IN | 0 ETH | 0.00095289 | ||||
Deposit | 15397949 | 845 days ago | IN | 0 ETH | 0.00281905 | ||||
Deposit | 15397532 | 846 days ago | IN | 0 ETH | 0.00158082 | ||||
Compute | 15393535 | 846 days ago | IN | 0 ETH | 0.00197668 | ||||
Deposit | 15391692 | 846 days ago | IN | 0 ETH | 0.00314478 | ||||
Compute | 15387258 | 847 days ago | IN | 0 ETH | 0.00068545 | ||||
Deposit | 15383875 | 848 days ago | IN | 0 ETH | 0.00068346 | ||||
Compute | 15380890 | 848 days ago | IN | 0 ETH | 0.00108213 | ||||
Compute | 15374546 | 849 days ago | IN | 0 ETH | 0.00275659 | ||||
Compute | 15368253 | 850 days ago | IN | 0 ETH | 0.00503456 | ||||
Withdraw | 15363278 | 851 days ago | IN | 0 ETH | 0.00067183 | ||||
Compute | 15361941 | 851 days ago | IN | 0 ETH | 0.00168699 | ||||
Deposit | 15356820 | 852 days ago | IN | 0 ETH | 0.00074589 | ||||
Compute | 15355649 | 852 days ago | IN | 0 ETH | 0.00172811 | ||||
Deposit | 15351610 | 853 days ago | IN | 0 ETH | 0.00109554 | ||||
Compute | 15349268 | 853 days ago | IN | 0 ETH | 0.00213514 | ||||
Compute | 15342969 | 854 days ago | IN | 0 ETH | 0.0038562 | ||||
Compute | 15336665 | 855 days ago | IN | 0 ETH | 0.00131846 | ||||
Compute | 15330270 | 856 days ago | IN | 0 ETH | 0.00239963 | ||||
Withdraw | 15327479 | 857 days ago | IN | 0 ETH | 0.00460964 | ||||
Withdraw | 15326669 | 857 days ago | IN | 0 ETH | 0.00126966 | ||||
Compute | 15323935 | 857 days ago | IN | 0 ETH | 0.00277026 | ||||
Compute | 15317622 | 858 days ago | IN | 0 ETH | 0.00255332 | ||||
Withdraw | 15314594 | 859 days ago | IN | 0 ETH | 0.00463452 | ||||
Compute | 15311277 | 859 days ago | IN | 0 ETH | 0.00196856 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Vault
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-25 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.3; /** * @title Represents an ownable resource. */ contract Ownable { address internal _owner; event OwnershipTransferred(address previousOwner, address newOwner); /** * Constructor * @param addr The owner of the smart contract */ constructor (address addr) { require(addr != address(0), "non-zero address required"); require(addr != address(1), "ecrecover address not allowed"); _owner = addr; emit OwnershipTransferred(address(0), addr); } /** * @notice This modifier indicates that the function can only be called by the owner. * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(msg.sender), "Only owner requirement"); _; } /** * @notice Transfers ownership to the address specified. * @param addr Specifies the address of the new owner. * @dev Throws if called by any account other than the owner. */ function transferOwnership (address addr) public onlyOwner { require(addr != address(0), "non-zero address required"); emit OwnershipTransferred(_owner, addr); _owner = addr; } /** * @notice Destroys the smart contract. * @param addr The payable address of the recipient. */ function destroy(address payable addr) public virtual onlyOwner { require(addr != address(0), "non-zero address required"); require(addr != address(1), "ecrecover address not allowed"); selfdestruct(addr); } /** * @notice Gets the address of the owner. * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @notice Indicates if the address specified is the owner of the resource. * @return true if `msg.sender` is the owner of the contract. */ function isOwner(address addr) public view returns (bool) { return addr == _owner; } } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20 { /** * Transfer token for a specified address * @param to The address to transfer to. * @param value The amount to be transferred. */ function transfer(address to, uint256 value) external returns (bool); /** * Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) external returns (bool); /** * Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * 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 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) external returns (bool); /** * Returns the total number of tokens in existence. */ function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); /** * Gets the balance of the address specified. * @param addr The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address addr) external view returns (uint256); /** * Function to check the amount of tokens that an owner allowed to a spender. * @param owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address owner, address spender) external view returns (uint256); /** * This event is triggered when a given amount of tokens is sent to an address. * @param from The address of the sender * @param to The address of the receiver * @param value The amount transferred */ event Transfer(address indexed from, address indexed to, uint256 value); /** * This event is triggered when a given address is approved to spend a specific amount of tokens * on behalf of the sender. * @param owner The owner of the token * @param spender The spender * @param value The amount to transfer */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title Represents an ERC-20 */ contract ERC20 is IERC20 { // Basic ERC-20 data string private _name; string private _symbol; uint8 private _decimals; uint256 internal _totalSupply; // The balance of each owner mapping(address => uint256) internal _balances; // The allowance set by each owner mapping(address => mapping(address => uint256)) private _allowances; /** * @notice Constructor * @param tokenName The name of the token * @param tokenSymbol The symbol of the token * @param tokenDecimals The decimals of the token * @param initialSupply The initial supply */ constructor (string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals, uint256 initialSupply) { _name = tokenName; _symbol = tokenSymbol; _decimals = tokenDecimals; _totalSupply = initialSupply; } /** * @notice Transfers a given amount tokens to the address specified. * @param from The address of the sender. * @param to The address to transfer to. * @param value The amount to be transferred. * @return Returns true in case of success. */ function executeErc20Transfer (address from, address to, uint256 value) private returns (bool) { // Checks require(to != address(0), "non-zero address required"); require(from != address(0), "non-zero sender required"); require(value > 0, "Amount cannot be zero"); require(_balances[from] >= value, "Amount exceeds sender balance"); // State changes _balances[from] = _balances[from] - value; _balances[to] = _balances[to] + value; // Emit the event per ERC-20 emit Transfer(from, to, value); return true; } /** * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * @dev 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 * @param ownerAddr The address of the owner. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return Returns true in case of success. */ function approveSpender(address ownerAddr, address spender, uint256 value) private returns (bool) { require(spender != address(0), "non-zero spender required"); require(ownerAddr != address(0), "non-zero owner required"); // State changes _allowances[ownerAddr][spender] = value; // Emit the event emit Approval(ownerAddr, spender, value); return true; } /** * @notice Transfers a given amount tokens to the address specified. * @param to The address to transfer to. * @param value The amount to be transferred. * @return Returns true in case of success. */ function transfer(address to, uint256 value) public override returns (bool) { require (executeErc20Transfer(msg.sender, to, value), "Failed to execute ERC20 transfer"); return true; } /** * @notice Transfer tokens from one address to another. * @dev Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred * @return Returns true in case of success. */ function transferFrom(address from, address to, uint256 value) public override returns (bool) { require (executeErc20Transfer(from, to, value), "Failed to execute transferFrom"); uint256 currentAllowance = _allowances[from][msg.sender]; require(currentAllowance >= value, "Amount exceeds allowance"); require(approveSpender(from, msg.sender, currentAllowance - value), "ERC20: Approval failed"); return true; } /** * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * @dev 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 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return Returns true in case of success. */ function approve(address spender, uint256 value) public override returns (bool) { require(approveSpender(msg.sender, spender, value), "ERC20: Approval failed"); return true; } /** * Gets the total supply of tokens */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @notice Gets the name of the token. */ function name() public view override returns (string memory) { return _name; } /** * @notice Gets the symbol of the token. */ function symbol() public view override returns (string memory) { return _symbol; } /** * @notice Gets the decimals of the token. */ function decimals() public view override returns (uint8) { return _decimals; } /** * Gets the balance of the address specified. * @param addr The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address addr) public view override returns (uint256) { return _balances[addr]; } /** * Function to check the amount of tokens that an owner allowed to a spender. * @param owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } } /** * @notice Represents an ERC20 that can be minted and/or burnt by multiple parties. */ contract Mintable is ERC20, Ownable { /** * @notice The maximum circulating supply of tokens */ uint256 public maxSupply; // Keeps track of the authorized minters mapping (address => bool) internal _authorizedMinters; // Keeps track of the authorized burners mapping (address => bool) internal _authorizedBurners; // --------------------------------------- // Events // --------------------------------------- /** * This event is triggered whenever an address is added as a valid minter. * @param addr The address that became a valid minter */ event OnMinterGranted(address addr); /** * This event is triggered when a minter is revoked. * @param addr The address that was revoked */ event OnMinterRevoked(address addr); /** * This event is triggered whenever an address is added as a valid burner. * @param addr The address that became a valid burner */ event OnBurnerGranted(address addr); /** * This event is triggered when a burner is revoked. * @param addr The address that was revoked */ event OnBurnerRevoked(address addr); /** * This event is triggered when the maximum limit for minting tokens is updated. * @param prevValue The previous limit * @param newValue The new limit */ event OnMaxSupplyChanged(uint256 prevValue, uint256 newValue); // --------------------------------------- // Constructor // --------------------------------------- /** * @notice Constructor * @param newOwner The contract owner * @param tokenName The name of the token * @param tokenSymbol The symbol of the token * @param tokenDecimals The decimals of the token * @param initialSupply The initial supply */ constructor (address newOwner, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals, uint256 initialSupply) ERC20(tokenName, tokenSymbol, tokenDecimals, initialSupply) Ownable(newOwner) { // solhint-disable-line no-empty-blocks } /** * @notice Throws if the sender is not a valid minter */ modifier onlyMinter() { require(_authorizedMinters[msg.sender], "Unauthorized minter"); _; } /** * @notice Throws if the sender is not a valid burner */ modifier onlyBurner() { require(_authorizedBurners[msg.sender], "Unauthorized burner"); _; } /** * @notice Grants the right to issue new tokens to the address specified. * @dev This function can be called by the owner only. * @param addr The destination address */ function grantMinter (address addr) public onlyOwner { require(!_authorizedMinters[addr], "Address authorized already"); _authorizedMinters[addr] = true; emit OnMinterGranted(addr); } /** * @notice Revokes the right to issue new tokens from the address specified. * @dev This function can be called by the owner only. * @param addr The destination address */ function revokeMinter (address addr) public onlyOwner { require(_authorizedMinters[addr], "Address was never authorized"); _authorizedMinters[addr] = false; emit OnMinterRevoked(addr); } /** * @notice Grants the right to burn tokens to the address specified. * @dev This function can be called by the owner only. * @param addr The destination address */ function grantBurner (address addr) public onlyOwner { require(!_authorizedBurners[addr], "Address authorized already"); _authorizedBurners[addr] = true; emit OnBurnerGranted(addr); } /** * @notice Revokes the right to burn tokens from the address specified. * @dev This function can be called by the owner only. * @param addr The destination address */ function revokeBurner (address addr) public onlyOwner { require(_authorizedBurners[addr], "Address was never authorized"); _authorizedBurners[addr] = false; emit OnBurnerRevoked(addr); } /** * @notice Updates the maximum limit for minting tokens. * @param newValue The new limit */ function changeMaxSupply (uint256 newValue) public onlyOwner { require(newValue == 0 || newValue > _totalSupply, "Invalid max supply"); emit OnMaxSupplyChanged(maxSupply, newValue); maxSupply = newValue; } /** * @notice Issues a given number of tokens to the address specified. * @dev This function throws if the sender is not a whitelisted minter. * @param addr The destination address * @param amount The number of tokens */ function mint (address addr, uint256 amount) public onlyMinter { require(addr != address(0) && addr != address(this), "Invalid address"); require(amount > 0, "Invalid amount"); require(canMint(amount), "Max token supply exceeded"); _totalSupply += amount; _balances[addr] += amount; emit Transfer(address(0), addr, amount); } /** * @notice Burns a given number of tokens from the address specified. * @dev This function throws if the sender is not a whitelisted minter. In this context, minters and burners have the same privileges. * @param addr The destination address * @param amount The number of tokens */ function burn (address addr, uint256 amount) public onlyBurner { require(addr != address(0) && addr != address(this), "Invalid address"); require(amount > 0, "Invalid amount"); require(_totalSupply > 0, "No token supply"); uint256 accountBalance = _balances[addr]; require(accountBalance >= amount, "Burn amount exceeds balance"); _balances[addr] = accountBalance - amount; _totalSupply -= amount; emit Transfer(addr, address(0), amount); } /** * @notice Indicates if we can issue/mint the number of tokens specified. * @param amount The number of tokens to issue/mint */ function canMint (uint256 amount) public view returns (bool) { return (maxSupply == 0) || (_totalSupply + amount <= maxSupply); } } /** * @title Represents a controllable resource. */ contract Controllable is Ownable { // The address of the controller address internal _controllerAddress; /** * @notice Constructor * @param ownerAddr The owner of the smart contract * @param controllerAddr The address of the controller */ constructor (address ownerAddr, address controllerAddr) Ownable (ownerAddr) { require(controllerAddr != address(0), "Controller address required"); require(controllerAddr != ownerAddr, "Owner cannot be the Controller"); _controllerAddress = controllerAddr; } /** * @notice Throws if the sender is not the controller */ modifier onlyController() { require(msg.sender == _controllerAddress, "Unauthorized controller"); _; } /** * @notice Makes sure the sender is either the owner of the contract or the controller */ modifier onlyOwnerOrController() { require(msg.sender == _controllerAddress || msg.sender == _owner, "Only owner or controller"); _; } /** * @notice Sets the controller * @dev This function can be called by the owner only * @param controllerAddr The address of the controller */ function setController (address controllerAddr) public onlyOwner { // Checks require(controllerAddr != address(0), "Controller address required"); require(controllerAddr != _owner, "Owner cannot be the Controller"); require(controllerAddr != _controllerAddress, "Controller already set"); // State changes _controllerAddress = controllerAddr; } /** * @notice Gets the address of the controller * @return Returns an address */ function getControllerAddress () public view returns (address) { return _controllerAddress; } } /** * @title Represents a receipt token. The token is fully compliant with the ERC20 interface. * @dev The token can be minted or burnt by whitelisted addresses only. Only the owner is allowed to enable/disable addresses. */ contract ReceiptToken is Mintable { /** * @notice Constructor. * @param newOwner The owner of the smart contract. */ constructor (address newOwner, uint256 initialMaxSupply) Mintable(newOwner, "Fractal Protocol Vault Token", "USDF", 6, 0) { maxSupply = initialMaxSupply; } } /** * @notice This library provides stateless, general purpose functions. */ library Utils { /** * @notice Indicates if the address specified represents a smart contract. * @dev Notice that this method returns TRUE if the address is a contract under construction * @param addr The address to evaluate * @return Returns true if the address represents a smart contract */ function isContract (address addr) internal view returns (bool) { bytes32 eoaHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; bytes32 codeHash; // solhint-disable-next-line no-inline-assembly assembly { codeHash := extcodehash(addr) } return (codeHash != eoaHash && codeHash != 0x0); } } library DateUtils { // The number of seconds per day uint256 internal constant SECONDS_PER_DAY = 24 * 60 * 60; // The number of seconds per hour uint256 internal constant SECONDS_PER_HOUR = 60 * 60; // The number of seconds per minute uint256 internal constant SECONDS_PER_MINUTE = 60; // The offset from 01/01/1970 int256 internal constant OFFSET19700101 = 2440588; /** * @notice Gets the year of the timestamp specified. * @param timestamp The timestamp * @return year The year */ function getYear (uint256 timestamp) internal pure returns (uint256 year) { (year,,) = _daysToDate(timestamp / SECONDS_PER_DAY); } /** * @notice Gets the timestamp of the date specified. * @param year The year * @param month The month * @param day The day * @param hour The hour * @param minute The minute * @param second The seconds * @return timestamp The timestamp */ function timestampFromDateTime(uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second) internal pure returns (uint256 timestamp) { timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR + minute * SECONDS_PER_MINUTE + second; } /** * @notice Gets the number of days elapsed between the two timestamps specified. * @param fromTimestamp The source date * @param toTimestamp The target date * @return Returns the difference, in days */ function diffDays (uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256) { require(fromTimestamp <= toTimestamp, "Invalid order for timestamps"); return (toTimestamp - fromTimestamp) / SECONDS_PER_DAY; } /** * @notice Calculate year/month/day from the number of days since 1970/01/01 using the date conversion algorithm from http://aa.usno.navy.mil/faq/docs/JD_Formula.php and adding the offset 2440588 so that 1970/01/01 is day 0 * @dev Taken from https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary/blob/master/contracts/BokkyPooBahsDateTimeLibrary.sol * @param _days The year * @return year The year * @return month The month * @return day The day */ function _daysToDate (uint256 _days) internal pure returns (uint256 year, uint256 month, uint256 day) { int256 __days = int256(_days); int256 x = __days + 68569 + OFFSET19700101; int256 n = 4 * x / 146097; x = x - (146097 * n + 3) / 4; int256 _year = 4000 * (x + 1) / 1461001; x = x - 1461 * _year / 4 + 31; int256 _month = 80 * x / 2447; int256 _day = x - 2447 * _month / 80; x = _month / 11; _month = _month + 2 - 12 * x; _year = 100 * (n - 49) + _year + x; year = uint256(_year); month = uint256(_month); day = uint256(_day); } /** * @notice Calculates the number of days from 1970/01/01 to year/month/day using the date conversion algorithm from http://aa.usno.navy.mil/faq/docs/JD_Formula.php and subtracting the offset 2440588 so that 1970/01/01 is day 0 * @dev Taken from https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary/blob/master/contracts/BokkyPooBahsDateTimeLibrary.sol * @param year The year * @param month The month * @param day The day * @return _days Returns the number of days */ function _daysFromDate (uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) { require(year >= 1970, "Error"); int _year = int(year); int _month = int(month); int _day = int(day); int __days = _day - 32075 + 1461 * (_year + 4800 + (_month - 14) / 12) / 4 + 367 * (_month - 2 - (_month - 14) / 12 * 12) / 12 - 3 * ((_year + 4900 + (_month - 14) / 12) / 100) / 4 - OFFSET19700101; _days = uint256(__days); } } interface IDeployable { function deployCapital (uint256 deploymentAmount, bytes32 foreignNetwork) external; function claim (uint256 dailyInterestAmount) external; } /** * @title Represents a vault. */ contract Vault is Controllable { // The decimal multiplier of the receipt token uint256 private constant USDF_DECIMAL_MULTIPLIER = uint256(10) ** uint256(6); // Represents a record struct Record { uint8 apr; uint256 tokenPrice; uint256 totalDeposited; uint256 dailyInterest; } /** * @notice The timestamp that defines the start of the current year * @dev This is the unix epoch of January 1st of the current block's timestamp. */ uint256 public startOfYearTimestamp; /** * @notice The current period. It is the zero-based day of the year, ranging from [0..364] * @dev Day zero represents January 1st (first day of the year) whereas day 364 represents December 31st (last day of the day) */ uint256 public currentPeriod; /** * @notice The minimum amount you can deposit in the vault. */ uint256 public minDepositAmount; /** * @notice The flat fee to apply to vault withdrawals. */ uint256 public flatFeePercent; // The decimals multiplier of the underlying ERC20 uint256 immutable private _decimalsMultiplier; // The decimals multiplier of the receipt token uint256 immutable private _decimalsMultiplierOfReceiptToken; /** * @notice The percentage of capital that needs to be invested. It ranges from [1..99] * @dev The investment percent is set to 90% by default */ uint8 public investmentPercent = 90; // The reentrancy guard for deposits uint8 private _reentrancyMutexForDeposits; // The reentrancy guard for withdrawals uint8 private _reentrancyMutexForWithdrawals; /** * @notice The address of the yield reserve */ address public yieldReserveAddress; /** * @notice The address that collects the applicable fees */ address public feesAddress; /** * @notice The interface of the underlying token */ IERC20 public immutable tokenInterface; // The receipt token. This is immutable so it cannot be altered after deployment. ReceiptToken private immutable _receiptToken; // The snapshots history mapping (uint256 => Record) private _records; // --------------------------------------- // Events // --------------------------------------- /** * @notice This event is fired when the vault receives a deposit. * @param tokenAddress Specifies the token address * @param fromAddress Specifies the address of the sender * @param depositAmount Specifies the deposit amount in USDC or the ERC20 handled by this contract * @param receiptTokensAmount Specifies the amount of receipt tokens issued to the user */ event OnVaultDeposit (address tokenAddress, address fromAddress, uint256 depositAmount, uint256 receiptTokensAmount); /** * @notice This event is fired when a user withdraws funds from the vault. * @param tokenAddress Specifies the token address * @param toAddress Specifies the address of the recipient * @param erc20Amount Specifies the amount in USDC or the ERC20 handled by this contract * @param receiptTokensAmount Specifies the amount of receipt tokens withdrawn by the user * @param fee Specifies the withdrawal fee */ event OnVaultWithdrawal (address tokenAddress, address toAddress, uint256 erc20Amount, uint256 receiptTokensAmount, uint256 fee); // --------------------------------------- // Constructor // --------------------------------------- constructor ( address ownerAddr, address controllerAddr, ReceiptToken receiptTokenInterface, IERC20 eip20Interface, uint8 initialApr, uint256 initialTokenPrice, uint256 initialMinDepositAmount, uint256 flatFeePerc, address feesAddr) Controllable (ownerAddr, controllerAddr) { // Checks require(initialMinDepositAmount > 0, "Invalid min deposit amount"); require(feesAddr != address(0), "Invalid address for fees"); // State changes tokenInterface = eip20Interface; _receiptToken = receiptTokenInterface; minDepositAmount = initialMinDepositAmount; _decimalsMultiplier = uint256(10) ** uint256(eip20Interface.decimals()); _decimalsMultiplierOfReceiptToken = uint256(10) ** uint256(receiptTokenInterface.decimals()); uint256 currentTimestamp = block.timestamp; // solhint-disable-line not-rely-on-time // Get the current year uint256 currentYear = DateUtils.getYear(currentTimestamp); // Set the timestamp of January 1st of the current year (the year starts at this unix epoch) startOfYearTimestamp = DateUtils.timestampFromDateTime(currentYear, 1, 1, 0, 0, 0); // Create the first record currentPeriod = DateUtils.diffDays(startOfYearTimestamp, currentTimestamp); _records[currentPeriod] = Record(initialApr, initialTokenPrice, 0, 0); flatFeePercent = flatFeePerc; feesAddress = feesAddr; } // --------------------------------------- // Modifiers // --------------------------------------- /** * @notice Throws if there is a deposit in progress */ modifier ifNotReentrantDeposit() { require(_reentrancyMutexForDeposits == 0, "Reentrant deposit rejected"); _; } /** * @notice Throws if there is a withdrawal in progress */ modifier ifNotReentrantWithdrawal() { require(_reentrancyMutexForWithdrawals == 0, "Reentrant withdrawal rejected"); _; } // --------------------------------------- // Functions // --------------------------------------- /** * @notice Sets the address of the bridge * @dev This function can be called by the owner or the controller. * @param addr The address of the bridge */ function setYieldReserveAddress (address addr) public onlyOwnerOrController { require(addr != address(0) && addr != address(this), "Invalid address"); require(Utils.isContract(addr), "The address must be a contract"); yieldReserveAddress = addr; } /** * @notice Sets the minimum amount for deposits. * @dev This function can be called by the owner or the controller. * @param minAmount The minimum deposit amount */ function setMinDepositAmount (uint256 minAmount) public onlyOwnerOrController { // Checks require(minAmount > 0, "Invalid minimum deposit amount"); // State changes minDepositAmount = minAmount; } /** * @notice Sets a new flat fee for withdrawals. * @dev The new fee is allowed to be zero (aka: no fees). * @param newFeeWithMultiplier The new fee, which is expressed per decimals precision of the underlying token (say USDC for example) */ function setFlatWithdrawalFee (uint256 newFeeWithMultiplier) public onlyOwnerOrController { // Example for USDC (6 decimal places): // Say the fee is: 0.03% // Thus the fee amount is: 0.03 * _decimalsMultiplier = 30000 = 0.03 * (10 to the power of 6) flatFeePercent = newFeeWithMultiplier; } /** * @notice Sets the address for collecting fees. * @param addr The address */ function setFeeAddress (address addr) public onlyOwnerOrController { require(addr != address(0) && addr != feesAddress, "Invalid address for fees"); feesAddress = addr; } /** * @notice Deposits funds in the vault. The caller gets the respective amount of receipt tokens in exchange for their deposit. * @dev The number of receipt tokens is calculated based on the current token price. * @param depositAmount Specifies the deposit amount */ function deposit (uint256 depositAmount) public ifNotReentrantDeposit { // Make sure the deposit amount falls within the expected range require(depositAmount >= minDepositAmount, "Minimum deposit amount not met"); // Wake up the reentrancy guard _reentrancyMutexForDeposits = 1; // Refresh the current timelime, if needed compute(); // The transaction sender. Presumably it is also the legitimate depositor. Otherwise it is a relayer. address senderAddr = msg.sender; // Make sure the sender can cover the deposit (aka: has enough USDC/ERC20 on their wallet) require(tokenInterface.balanceOf(senderAddr) >= depositAmount, "Insufficient funds"); // Make sure the user approved this contract to spend the amount specified require(tokenInterface.allowance(senderAddr, address(this)) >= depositAmount, "Insufficient allowance"); // Determine how many tokens can be issued/minted to the destination address uint256 numberOfReceiptTokens = depositAmount * _decimalsMultiplierOfReceiptToken / _records[currentPeriod].tokenPrice; // Make sure we can issue the number of tokens specified, per limits require(_receiptToken.canMint(numberOfReceiptTokens), "Token supply limit exceeded"); _records[currentPeriod].totalDeposited += depositAmount; // Get the current balance of this contract in USDC (or whatever the ERC20 is, which defined at deployment time) uint256 balanceBeforeTransfer = tokenInterface.balanceOf(address(this)); // Make sure the ERC20 transfer succeeded require(tokenInterface.transferFrom(senderAddr, address(this), depositAmount), "Token transfer failed"); // The new balance of this contract, after the transfer uint256 newBalance = tokenInterface.balanceOf(address(this)); // At the very least, the new balance should be the previous balance + the deposit. require(newBalance >= balanceBeforeTransfer + depositAmount, "Balance verification failed"); // Issue/mint the respective number of tokens. Users get a receipt token in exchange for their deposit in USDC/ERC20. _receiptToken.mint(senderAddr, numberOfReceiptTokens); // Emit a new "deposit" event emit OnVaultDeposit(address(tokenInterface), senderAddr, depositAmount, numberOfReceiptTokens); // Reset the reentrancy guard _reentrancyMutexForDeposits = 0; } /** * @notice Withdraws a specific amount of tokens from the Vault. * @param receiptTokenAmount The number of tokens to withdraw from the vault */ function withdraw (uint256 receiptTokenAmount) public ifNotReentrantWithdrawal { // Checks require(receiptTokenAmount > 0, "Invalid withdrawal amount"); // Wake up the reentrancy guard _reentrancyMutexForWithdrawals = 1; address senderAddr = msg.sender; // Refresh the current timelime, if needed compute(); // Make sure the sender has enough receipt tokens to burn require(_receiptToken.balanceOf(senderAddr) >= receiptTokenAmount, "Insufficient balance of tokens"); // The amount of USDC you get in exchange, at the current token price uint256 withdrawalAmount = toErc20Amount(receiptTokenAmount); require(withdrawalAmount <= _records[currentPeriod].totalDeposited, "Invalid withdrawal amount"); uint256 maxWithdrawalAmount = getMaxWithdrawalAmount(); require(withdrawalAmount <= maxWithdrawalAmount, "Max withdrawal amount exceeded"); uint256 currentBalance = tokenInterface.balanceOf(address(this)); require(currentBalance > withdrawalAmount, "Insufficient funds in the buffer"); // Notice that the fee is applied in the underlying currency instead of receipt tokens. // The amount applicable to the fee uint256 feeAmount = (flatFeePercent > 0) ? withdrawalAmount * flatFeePercent / uint256(100) / _decimalsMultiplier : 0; require(feeAmount < withdrawalAmount, "Invalid fee"); // The amount to send to the destination address (recipient), after applying the fee uint256 withdrawalAmountAfterFees = withdrawalAmount - feeAmount; // Update the record per amount withdrawn, with no applicable fees. // A common mistake would be update the metric below with fees included. DONT DO THAT. _records[currentPeriod].totalDeposited -= withdrawalAmount; // Burn the number of receipt tokens specified _receiptToken.burn(senderAddr, receiptTokenAmount); // Transfer the respective amount of underlying tokens to the sender (after applying the fee) require(tokenInterface.transfer(senderAddr, withdrawalAmountAfterFees), "Token transfer failed"); if (feeAmount > 0) { // Transfer the applicable fee, if any require(tokenInterface.transfer(feesAddress, feeAmount), "Fee transfer failed"); } // Emit a new "withdrawal" event emit OnVaultWithdrawal(address(tokenInterface), senderAddr, withdrawalAmount, receiptTokenAmount, feeAmount); // Reset the reentrancy guard _reentrancyMutexForWithdrawals = 0; // solhint-disable-line reentrancy } /** * @notice Runs an emergency withdrawal. Sends the whole balance to the address specified. * @dev This function can be called by the owner only. * @param destinationAddr The destination address */ function emergencyWithdraw (address destinationAddr) public onlyOwner ifNotReentrantWithdrawal { require(destinationAddr != address(0) && destinationAddr != address(this), "Invalid address"); // Wake up the reentrancy guard _reentrancyMutexForWithdrawals = 1; uint256 currentBalance = tokenInterface.balanceOf(address(this)); require(currentBalance > 0, "The vault has no funds"); // Transfer all funds to the address specified require(tokenInterface.transfer(destinationAddr, currentBalance), "Token transfer failed"); // Reset the reentrancy guard _reentrancyMutexForWithdrawals = 0; // solhint-disable-line reentrancy } /** * @notice Updates the APR * @param newApr The new APR */ function changeApr (uint8 newApr) public onlyOwner { require(newApr > 0, "Invalid APR"); compute(); _records[currentPeriod].apr = newApr; } /** * @notice Sets the token price, arbitrarily. * @param newTokenPrice The new price of the receipt token */ function setTokenPrice (uint256 newTokenPrice) public onlyOwner { require(newTokenPrice > 0, "Invalid token price"); compute(); _records[currentPeriod].tokenPrice = newTokenPrice; } /** * @notice Sets the investment percent. * @param newPercent The new investment percent */ function setInvestmentPercent (uint8 newPercent) public onlyOwnerOrController { require(newPercent > 0 && newPercent < 100, "Invalid investment percent"); investmentPercent = newPercent; } /** * @notice Computes the metrics (token price, daily interest) for the current day of year */ function compute () public { uint256 currentTimestamp = block.timestamp; // solhint-disable-line not-rely-on-time uint256 newPeriod = DateUtils.diffDays(startOfYearTimestamp, currentTimestamp); if (newPeriod <= currentPeriod) return; uint256 x = 0; for (uint256 i = currentPeriod + 1; i <= newPeriod; i++) { x++; _records[i].apr = _records[i - 1].apr; _records[i].totalDeposited = _records[i - 1].totalDeposited; uint256 diff = uint256(_records[i - 1].apr) * USDF_DECIMAL_MULTIPLIER * uint256(100) / uint256(365); _records[i].tokenPrice = _records[i - 1].tokenPrice + (diff / uint256(10000)); _records[i].dailyInterest = _records[i - 1].totalDeposited * uint256(_records[i - 1].apr) / uint256(365) / uint256(100); if (x >= 30) break; } currentPeriod += x; } /** * @notice Moves the deployable capital from the vault to the yield reserve */ function lockCapital () public onlyOwnerOrController { compute(); // Get the maximum amount of capital that can be deployed at this point in time uint256 maxDeployableAmount = getDeployableCapital(); require(maxDeployableAmount > 0, "Invalid deployable capital"); require(tokenInterface.transfer(yieldReserveAddress, maxDeployableAmount), "Transfer failed"); } /** * @notice Claims the daily interest promised per APR. */ function claimDailyInterest () public onlyOwnerOrController { compute(); // Get the daily interest that need to be claimed at this point in time uint256 dailyInterestAmount = getDailyInterest(); uint256 balanceBefore = tokenInterface.balanceOf(address(this)); IDeployable(yieldReserveAddress).claim(dailyInterestAmount); uint256 balanceAfter = tokenInterface.balanceOf(address(this)); require(balanceAfter >= balanceBefore + dailyInterestAmount, "Balance verification failed"); } /** * @notice Gets the period of the current unix epoch. * @dev The period is the zero-based day of the current year. It is the number of days that elapsed since January 1st of the current year. * @return Returns a number between [0..364] */ function getPeriodOfCurrentEpoch () public view returns (uint256) { return DateUtils.diffDays(startOfYearTimestamp, block.timestamp); // solhint-disable-line not-rely-on-time } function getSnapshot (uint256 i) public view returns (uint8 apr, uint256 tokenPrice, uint256 totalDeposited, uint256 dailyInterest) { apr = _records[i].apr; tokenPrice = _records[i].tokenPrice; totalDeposited = _records[i].totalDeposited; dailyInterest = _records[i].dailyInterest; } /** * @notice Gets the total amount deposited in the vault * @return The total amount deposited */ function getTotalDeposited () public view returns (uint256) { return _records[currentPeriod].totalDeposited; } /** * @notice Gets the daily interest * @return The daily interest */ function getDailyInterest () public view returns (uint256) { return _records[currentPeriod].dailyInterest; } /** * @notice Gets the current token price * @return The price of the token */ function getTokenPrice () public view returns (uint256) { return _records[currentPeriod].tokenPrice; } /** * @notice Gets the maximum amount of USDC/ERC20 you can withdraw from the vault * @return The maximum withdrawal amount */ function getMaxWithdrawalAmount () public view returns (uint256) { // X% of the current balance instead of X% of the total deposited //return _records[currentPeriod].totalDeposited * (uint256(100) - uint256(investmentPercent)) / uint256(100); return tokenInterface.balanceOf(address(this)) * (uint256(100) - uint256(investmentPercent)) / uint256(100); } /** * @notice Gets the amount of capital that can be deployed. * @return The amount of deployable capital */ function getDeployableCapital () public view returns (uint256) { return tokenInterface.balanceOf(address(this)) * uint256(investmentPercent) / uint256(100); } /** * @notice Returns the amount of USDC you would get by burning the number of receipt tokens specified, at the current price. * @return The amount of USDC you get in exchange, at the current token price */ function toErc20Amount (uint256 receiptTokenAmount) public view returns (uint256) { return receiptTokenAmount * _records[currentPeriod].tokenPrice / _decimalsMultiplierOfReceiptToken; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"ownerAddr","type":"address"},{"internalType":"address","name":"controllerAddr","type":"address"},{"internalType":"contract ReceiptToken","name":"receiptTokenInterface","type":"address"},{"internalType":"contract IERC20","name":"eip20Interface","type":"address"},{"internalType":"uint8","name":"initialApr","type":"uint8"},{"internalType":"uint256","name":"initialTokenPrice","type":"uint256"},{"internalType":"uint256","name":"initialMinDepositAmount","type":"uint256"},{"internalType":"uint256","name":"flatFeePerc","type":"uint256"},{"internalType":"address","name":"feesAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiptTokensAmount","type":"uint256"}],"name":"OnVaultDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiptTokensAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"OnVaultWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint8","name":"newApr","type":"uint8"}],"name":"changeApr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDailyInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destinationAddr","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flatFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getControllerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDailyInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeployableCapital","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWithdrawalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPeriodOfCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getSnapshot","outputs":[{"internalType":"uint8","name":"apr","type":"uint8"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"totalDeposited","type":"uint256"},{"internalType":"uint256","name":"dailyInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investmentPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockCapital","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controllerAddr","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeeWithMultiplier","type":"uint256"}],"name":"setFlatWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newPercent","type":"uint8"}],"name":"setInvestmentPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"setMinDepositAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setYieldReserveAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startOfYearTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"receiptTokenAmount","type":"uint256"}],"name":"toErc20Amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenInterface","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"receiptTokenAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldReserveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101006040526006805460ff1916605a1790553480156200001f57600080fd5b5060405162003be838038062003be8833981016040819052620000429162000961565b8888816001600160a01b038116620000a15760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f20616464726573732072657175697265640000000000000060448201526064015b60405180910390fd5b6001600160a01b03811660011415620000fd5760405162461bcd60e51b815260206004820152601d60248201527f65637265636f7665722061646472657373206e6f7420616c6c6f776564000000604482015260640162000098565b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1506001600160a01b038116620001ad5760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c657220616464726573732072657175697265640000000000604482015260640162000098565b816001600160a01b0316816001600160a01b03161415620002115760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c65720000604482015260640162000098565b600180546001600160a01b0319166001600160a01b03929092169190911790555082620002815760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206d696e206465706f73697420616d6f756e74000000000000604482015260640162000098565b6001600160a01b038116620002d95760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f7220666565730000000000000000604482015260640162000098565b6001600160601b0319606087811b821660c05288901b1660e05260048381556040805163313ce56760e01b815290516001600160a01b0389169263313ce56792808201926020929091829003018186803b1580156200033757600080fd5b505afa1580156200034c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000372919062000a0f565b620003829060ff16600a62000b26565b60808181525050866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620003c357600080fd5b505afa158015620003d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fe919062000a0f565b6200040e9060ff16600a62000b26565b60a0524260006200042b82620004fd602090811b6200255117901c565b90506200044b8160018060008060006200052160201b620025711760201c565b6002819055506200046a600254836200058b60201b620025cd1760201c565b60038181556040805160808101825260ff9a8b16815260208082019a8b526000828401818152606084018281529682526008909252929092209051815460ff19169b169a909a178a55975160018a015596516002890155519690950195909555600591909155600780546001600160a01b0319166001600160a01b039092169190911790555062000d6395505050505050565b60006200051862000512620151808462000ac2565b62000602565b50909392505050565b60008162000531603c8562000c9d565b6200053f610e108762000c9d565b62015180620005508b8b8b620007ae565b6200055c919062000c9d565b62000568919062000a73565b62000574919062000a73565b62000580919062000a73565b979650505050505050565b600081831115620005df5760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d707300000000604482015260640162000098565b62015180620005ef848462000d04565b620005fb919062000ac2565b9392505050565b60008080838162253d8c6200061b8362010bd962000a2c565b62000627919062000a2c565b9050600062023ab16200063c83600462000c0e565b62000648919062000a8e565b905060046200065b8262023ab162000c0e565b6200066890600362000a2c565b62000674919062000a8e565b62000680908362000cbf565b9150600062164b096200069584600162000a2c565b620006a390610fa062000c0e565b620006af919062000a8e565b90506004620006c1826105b562000c0e565b620006cd919062000a8e565b620006d9908462000cbf565b620006e690601f62000a2c565b9250600061098f620006fa85605062000c0e565b62000706919062000a8e565b9050600060506200071a8361098f62000c0e565b62000726919062000a8e565b62000732908662000cbf565b905062000741600b8362000a8e565b94506200075085600c62000c0e565b6200075d83600262000a2c565b62000769919062000cbf565b915084836200077a60318762000cbf565b6200078790606462000c0e565b62000793919062000a2c565b6200079f919062000a2c565b9a919950975095505050505050565b60006107b2841015620007ec5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b604482015260640162000098565b838383600062253d8c60046064600c62000808600e8862000cbf565b62000814919062000a8e565b620008228861132462000a2c565b6200082e919062000a2c565b6200083a919062000a8e565b6200084790600362000c0e565b62000853919062000a8e565b600c8062000863600e8862000cbf565b6200086f919062000a8e565b6200087c90600c62000c0e565b6200088960028862000cbf565b62000895919062000cbf565b620008a39061016f62000c0e565b620008af919062000a8e565b6004600c620008c0600e8962000cbf565b620008cc919062000a8e565b620008da896112c062000a2c565b620008e6919062000a2c565b620008f4906105b562000c0e565b62000900919062000a8e565b6200090e617d4b8762000cbf565b6200091a919062000a2c565b62000926919062000a2c565b62000932919062000cbf565b6200093e919062000cbf565b98975050505050505050565b805160ff811681146200095c57600080fd5b919050565b60008060008060008060008060006101208a8c03121562000980578485fd5b89516200098d8162000d4a565b60208b0151909950620009a08162000d4a565b60408b0151909850620009b38162000d4a565b60608b0151909750620009c68162000d4a565b9550620009d660808b016200094a565b945060a08a0151935060c08a0151925060e08a015191506101008a0151620009fe8162000d4a565b809150509295985092959850929598565b60006020828403121562000a21578081fd5b620005fb826200094a565b600080821280156001600160ff1b038490038513161562000a515762000a5162000d1e565b600160ff1b839003841281161562000a6d5762000a6d62000d1e565b50500190565b6000821982111562000a895762000a8962000d1e565b500190565b60008262000aa05762000aa062000d34565b600160ff1b82146000198414161562000abd5762000abd62000d1e565b500590565b60008262000ad45762000ad462000d34565b500490565b80825b600180861162000aed575062000b1d565b81870482111562000b025762000b0262000d1e565b8086161562000b1057918102915b9490941c93800262000adc565b94509492505050565b6000620005fb600019848460008262000b4257506001620005fb565b8162000b5157506000620005fb565b816001811462000b6a576002811462000b755762000ba9565b6001915050620005fb565b60ff84111562000b895762000b8962000d1e565b6001841b91508482111562000ba25762000ba262000d1e565b50620005fb565b5060208310610133831016604e8410600b841016171562000be1575081810a8381111562000bdb5762000bdb62000d1e565b620005fb565b62000bf0848484600162000ad9565b80860482111562000c055762000c0562000d1e565b02949350505050565b60006001600160ff1b038184138284138082168684048611161562000c375762000c3762000d1e565b600160ff1b8487128281168783058912161562000c585762000c5862000d1e565b85871292508782058712848416161562000c765762000c7662000d1e565b8785058712818416161562000c8f5762000c8f62000d1e565b505050929093029392505050565b600081600019048311821515161562000cba5762000cba62000d1e565b500290565b60008083128015600160ff1b85018412161562000ce05762000ce062000d1e565b6001600160ff1b038401831381161562000cfe5762000cfe62000d1e565b50500390565b60008282101562000d195762000d1962000d1e565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b038116811462000d6057600080fd5b50565b60805160a05160c05160601c60e05160601c612db262000e3660003960008181610beb01528181610f6101528181611db6015261212b0152600081816104e701528181610621015281816109ba01528181610d9701528181610fe1015281816110aa015281816111780152818161151801528181611603015281816119fb01528181611ba501528181611c9101528181611ec501528181611f76015281816120280152818161219301528181612292015261238901526000818161133c0152611d6e01526000610e7e0152612db26000f3fe608060405234801561001057600080fd5b50600436106102105760003560e01c80636a61e5fc116101255780639ce7f670116100ad578063bced91171161007c578063bced9117146104b6578063c57380a2146104be578063f2fde38b146104cf578063f343d683146104e2578063f36932b71461050957610210565b80639ce7f6701461046e578063b508195014610476578063b68ef55914610489578063b6b55f25146104a357610210565b80638da5cb5b116100f45780638da5cb5b14610411578063919cfa211461042257806391dd75e71461043557806392eefe9b146104485780639c256eef1461045b57610210565b80636a61e5fc1461037a5780636ff1c9bc1461038d57806376f10ad0146103a05780638705fcd4146103fe57610210565b80632e1a7d4d116101a85780634378f0ec116101775780634378f0ec146103185780634b94f50e146103315780635798ef311461034b57806357e0bf941461035e578063645006ca1461037157610210565b80632e1a7d4d146102c25780632f54bf6e146102d55780633a621d371461030757806342c9b1d91461030f57610210565b80631a43c338116101e45780631a43c3381461026d578063292bbd32146102755780632a40eb72146102a75780632a80cda3146102af57610210565b8062f55d9d146102155780630301310b1461022a578063060406181461024e57806308b4a99414610265575b600080fd5b610228610223366004612956565b610512565b005b6006546102379060ff1681565b60405160ff90911681526020015b60405180910390f35b61025760035481565b604051908152602001610245565b6102576105fd565b6102286106bd565b60065461028f90630100000090046001600160a01b031681565b6040516001600160a01b039091168152602001610245565b6102286108e6565b6102286102bd366004612992565b610a77565b6102286102d0366004612992565b610b0b565b6102f76102e3366004612956565b6000546001600160a01b0390811691161490565b6040519015158152602001610245565b6102576111f8565b61025760025481565b6003805460009081526008602052604090200154610257565b600354600090815260086020526040902060010154610257565b610228610359366004612956565b611206565b61025761036c366004612992565b611325565b61025760045481565b610228610388366004612992565b611376565b61022861039b366004612956565b611405565b6103da6103ae366004612992565b600090815260086020526040902080546001820154600283015460039093015460ff9092169390929190565b6040805160ff90951685526020850193909352918301526060820152608001610245565b61022861040c366004612956565b6116ab565b6000546001600160a01b031661028f565b610228610430366004612992565b61177e565b60075461028f906001600160a01b031681565b610228610456366004612956565b6117c2565b6102286104693660046129c2565b611919565b6102576119d0565b6102286104843660046129c2565b611a32565b600354600090815260086020526040902060020154610257565b6102286104b1366004612992565b611aca565b61022861220c565b6001546001600160a01b031661028f565b6102286104dd366004612956565b61246c565b61028f7f000000000000000000000000000000000000000000000000000000000000000081565b61025760055481565b6000546001600160a01b031633146105455760405162461bcd60e51b815260040161053c90612a12565b60405180910390fd5b6001600160a01b0381166105975760405162461bcd60e51b81526020600482015260196024820152781b9bdb8b5e995c9bc81859191c995cdcc81c995c5d5a5c9959603a1b604482015260640161053c565b6001600160a01b038116600114156105f15760405162461bcd60e51b815260206004820152601d60248201527f65637265636f7665722061646472657373206e6f7420616c6c6f776564000000604482015260640161053c565b806001600160a01b0316ff5b6006546040516370a0823160e01b815230600482015260009160649160ff909116907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b60206040518083038186803b15801561066c57600080fd5b505afa158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906129aa565b6106ae9190612cab565b6106b89190612b00565b905090565b600042905060006106d0600254836125cd565b905060035481116106e25750506108e4565b60008060035460016106f49190612aba565b90505b8281116108c8578161070881612d20565b925060089050600061071b600184612d09565b81526020808201929092526040908101600090812054848252600893849052918120805460ff191660ff9093169290921790915561075a600184612d09565b8152602001908152602001600020600201546008600083815260200190815260200160002060020181905550600061016d60646006600a61079b9190612b5a565b600860006107aa600188612d09565b81526020810191909152604001600020546107c8919060ff16612cab565b6107d29190612cab565b6107dc9190612b00565b90506107ea61271082612b00565b600860006107f9600186612d09565b8152602001908152602001600020600101546108159190612aba565b6000838152600860208190526040822060019081019390935560649261016d92906108409087612d09565b8152602081019190915260400160009081205460ff1690600890610865600188612d09565b8152602001908152602001600020600201546108819190612cab565b61088b9190612b00565b6108959190612b00565b600083815260086020526040902060030155601e83106108b557506108c8565b50806108c081612d20565b9150506106f7565b5080600360008282546108db9190612aba565b90915550505050505b565b6001546001600160a01b031633148061090957506000546001600160a01b031633145b6109255760405162461bcd60e51b815260040161053c90612a42565b61092d6106bd565b60006109376105fd565b9050600081116109895760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206465706c6f7961626c65206361706974616c000000000000604482015260640161053c565b60065460405163a9059cbb60e01b815263010000009091046001600160a01b039081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b1580156109fe57600080fd5b505af1158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190612972565b610a745760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161053c565b50565b6001546001600160a01b0316331480610a9a57506000546001600160a01b031633145b610ab65760405162461bcd60e51b815260040161053c90612a42565b60008111610b065760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206d696e696d756d206465706f73697420616d6f756e740000604482015260640161053c565b600455565b60065462010000900460ff1615610b645760405162461bcd60e51b815260206004820152601d60248201527f5265656e7472616e74207769746864726177616c2072656a6563746564000000604482015260640161053c565b60008111610bb05760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b604482015260640161053c565b6006805462ff000019166201000017905533610bca6106bd565b6040516370a0823160e01b81526001600160a01b03828116600483015283917f0000000000000000000000000000000000000000000000000000000000000000909116906370a082319060240160206040518083038186803b158015610c2f57600080fd5b505afa158015610c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6791906129aa565b1015610cb55760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742062616c616e6365206f6620746f6b656e730000604482015260640161053c565b6000610cc083611325565b600354600090815260086020526040902060020154909150811115610d235760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b604482015260640161053c565b6000610d2d6119d0565b905080821115610d7f5760405162461bcd60e51b815260206004820152601e60248201527f4d6178207769746864726177616c20616d6f756e742065786365656465640000604482015260640161053c565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610de157600080fd5b505afa158015610df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1991906129aa565b9050828111610e6a5760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742066756e647320696e2074686520627566666572604482015260640161053c565b60008060055411610e7c576000610ec1565b7f0000000000000000000000000000000000000000000000000000000000000000606460055486610ead9190612cab565b610eb79190612b00565b610ec19190612b00565b9050838110610f005760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015260640161053c565b6000610f0c8286612d09565b9050846008600060035481526020019081526020016000206002016000828254610f369190612d09565b9091555050604051632770a7eb60e21b81526001600160a01b038781166004830152602482018990527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038981166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb9150604401602060405180830381600087803b15801561102757600080fd5b505af115801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f9190612972565b61107b5760405162461bcd60e51b815260040161053c906129e3565b811561116a5760075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111289190612972565b61116a5760405162461bcd60e51b8152602060048201526013602482015272119959481d1c985b9cd9995c8819985a5b1959606a1b604482015260640161053c565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682528816602082015290810186905260608101889052608081018390527f297b983b359127be0bb37e151a4fec683bc9012dd4d0ac96db47cfc17019c1e49060a00160405180910390a150506006805462ff0000191690555050505050565b60006106b8600254426125cd565b6001546001600160a01b031633148061122957506000546001600160a01b031633145b6112455760405162461bcd60e51b815260040161053c90612a42565b6001600160a01b0381161580159061126657506001600160a01b0381163014155b6112a45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161053c565b6112ad8161263e565b6112f95760405162461bcd60e51b815260206004820152601e60248201527f5468652061646472657373206d757374206265206120636f6e74726163740000604482015260640161053c565b600680546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6003546000908152600860205260408120600101547f0000000000000000000000000000000000000000000000000000000000000000906113669084612cab565b6113709190612b00565b92915050565b6000546001600160a01b031633146113a05760405162461bcd60e51b815260040161053c90612a12565b600081116113e65760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420746f6b656e20707269636560681b604482015260640161053c565b6113ee6106bd565b600354600090815260086020526040902060010155565b6000546001600160a01b0316331461142f5760405162461bcd60e51b815260040161053c90612a12565b60065462010000900460ff16156114885760405162461bcd60e51b815260206004820152601d60248201527f5265656e7472616e74207769746864726177616c2072656a6563746564000000604482015260640161053c565b6001600160a01b038116158015906114a957506001600160a01b0381163014155b6114e75760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161053c565b6006805462ff00001916620100001790556040516370a0823160e01b81523060048201526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561155a57600080fd5b505afa15801561156e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159291906129aa565b9050600081116115dd5760405162461bcd60e51b8152602060048201526016602482015275546865207661756c7420686173206e6f2066756e647360501b604482015260640161053c565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167f9190612972565b61169b5760405162461bcd60e51b815260040161053c906129e3565b50506006805462ff000019169055565b6001546001600160a01b03163314806116ce57506000546001600160a01b031633145b6116ea5760405162461bcd60e51b815260040161053c90612a42565b6001600160a01b0381161580159061171057506007546001600160a01b03828116911614155b61175c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f7220666565730000000000000000604482015260640161053c565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806117a157506000546001600160a01b031633145b6117bd5760405162461bcd60e51b815260040161053c90612a42565b600555565b6000546001600160a01b031633146117ec5760405162461bcd60e51b815260040161053c90612a12565b6001600160a01b0381166118425760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c657220616464726573732072657175697265640000000000604482015260640161053c565b6000546001600160a01b03828116911614156118a05760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c65720000604482015260640161053c565b6001546001600160a01b03828116911614156118f75760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c88185b1c9958591e481cd95d60521b604482015260640161053c565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633148061193c57506000546001600160a01b031633145b6119585760405162461bcd60e51b815260040161053c90612a42565b60008160ff1611801561196e575060648160ff16105b6119ba5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e766573746d656e742070657263656e74000000000000604482015260640161053c565b6006805460ff191660ff92909216919091179055565b6006546000906064906119e69060ff1682612d09565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401610654565b6000546001600160a01b03163314611a5c5760405162461bcd60e51b815260040161053c90612a12565b60008160ff1611611a9d5760405162461bcd60e51b815260206004820152600b60248201526a24b73b30b634b21020a82960a91b604482015260640161053c565b611aa56106bd565b6003546000908152600860205260409020805460ff191660ff92909216919091179055565b600654610100900460ff1615611b225760405162461bcd60e51b815260206004820152601a60248201527f5265656e7472616e74206465706f7369742072656a6563746564000000000000604482015260640161053c565b600454811015611b745760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f73697420616d6f756e74206e6f74206d65740000604482015260640161053c565b6006805461ff001916610100179055611b8b6106bd565b6040516370a0823160e01b815233600482018190529082907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611bef57600080fd5b505afa158015611c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2791906129aa565b1015611c6a5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b604482015260640161053c565b604051636eb1769f60e11b81526001600160a01b03828116600483015230602483015283917f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e9060440160206040518083038186803b158015611cd557600080fd5b505afa158015611ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0d91906129aa565b1015611d545760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015260640161053c565b600354600090815260086020526040812060010154611d937f000000000000000000000000000000000000000000000000000000000000000085612cab565b611d9d9190612b00565b604051635dd871a360e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635dd871a39060240160206040518083038186803b158015611e0057600080fd5b505afa158015611e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e389190612972565b611e845760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e20737570706c79206c696d69742065786365656465640000000000604482015260640161053c565b60035460009081526008602052604081206002018054859290611ea8908490612aba565b90915550506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611f0f57600080fd5b505afa158015611f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4791906129aa565b6040516323b872dd60e01b81526001600160a01b038581166004830152306024830152604482018790529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd90606401602060405180830381600087803b158015611fbc57600080fd5b505af1158015611fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff49190612972565b6120105760405162461bcd60e51b815260040161053c906129e3565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561207257600080fd5b505afa158015612086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120aa91906129aa565b90506120b68583612aba565b8110156121055760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c65640000000000604482015260640161053c565b6040516340c10f1960e01b81526001600160a01b038581166004830152602482018590527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b15801561216f57600080fd5b505af1158015612183573d6000803e3d6000fd5b5050604080516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116825288166020820152908101889052606081018690527f6c6941772efad791f0e8f0ff7e3e76b52034604c1427fc1bbda4dbd3d2570fc69250608001905060405180910390a150506006805461ff0019169055505050565b6001546001600160a01b031633148061222f57506000546001600160a01b031633145b61224b5760405162461bcd60e51b815260040161053c90612a42565b6122536106bd565b600061226f600380546000908152600860205260409020015490565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b1580156122d457600080fd5b505afa1580156122e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230c91906129aa565b60065460405163379607f560e01b815260048101859052919250630100000090046001600160a01b03169063379607f590602401600060405180830381600087803b15801561235a57600080fd5b505af115801561236e573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a082319060240160206040518083038186803b1580156123d457600080fd5b505afa1580156123e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240c91906129aa565b90506124188383612aba565b8110156124675760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c65640000000000604482015260640161053c565b505050565b6000546001600160a01b031633146124965760405162461bcd60e51b815260040161053c90612a12565b6001600160a01b0381166124e85760405162461bcd60e51b81526020600482015260196024820152781b9bdb8b5e995c9bc81859191c995cdcc81c995c5d5a5c9959603a1b604482015260640161053c565b600054604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006125686125636201518084612b00565b61267a565b50909392505050565b60008161257f603c85612cab565b61258b610e1087612cab565b6201518061259a8b8b8b6127ee565b6125a49190612cab565b6125ae9190612aba565b6125b89190612aba565b6125c29190612aba565b979650505050505050565b60008183111561261f5760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d707300000000604482015260640161053c565b6201518061262d8484612d09565b6126379190612b00565b9392505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f80821480159061267257508015155b949350505050565b60008080838162253d8c6126918362010bd9612a79565b61269b9190612a79565b9050600062023ab16126ae836004612c28565b6126b89190612ad2565b905060046126c98262023ab1612c28565b6126d4906003612a79565b6126de9190612ad2565b6126e89083612cca565b9150600062164b096126fb846001612a79565b61270790610fa0612c28565b6127119190612ad2565b90506004612721826105b5612c28565b61272b9190612ad2565b6127359084612cca565b61274090601f612a79565b9250600061098f612752856050612c28565b61275c9190612ad2565b90506000605061276e8361098f612c28565b6127789190612ad2565b6127829086612cca565b905061278f600b83612ad2565b945061279c85600c612c28565b6127a7836002612a79565b6127b19190612cca565b915084836127c0603187612cca565b6127cb906064612c28565b6127d59190612a79565b6127df9190612a79565b9a919950975095505050505050565b60006107b284101561282a5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b604482015260640161053c565b838383600062253d8c60046064600c612844600e88612cca565b61284e9190612ad2565b61285a88611324612a79565b6128649190612a79565b61286e9190612ad2565b612879906003612c28565b6128839190612ad2565b600c80612891600e88612cca565b61289b9190612ad2565b6128a690600c612c28565b6128b1600288612cca565b6128bb9190612cca565b6128c79061016f612c28565b6128d19190612ad2565b6004600c6128e0600e89612cca565b6128ea9190612ad2565b6128f6896112c0612a79565b6129009190612a79565b61290c906105b5612c28565b6129169190612ad2565b612922617d4b87612cca565b61292c9190612a79565b6129369190612a79565b6129409190612cca565b61294a9190612cca565b98975050505050505050565b600060208284031215612967578081fd5b813561263781612d67565b600060208284031215612983578081fd5b81518015158114612637578182fd5b6000602082840312156129a3578081fd5b5035919050565b6000602082840312156129bb578081fd5b5051919050565b6000602082840312156129d3578081fd5b813560ff81168114612637578182fd5b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b60208082526016908201527513db9b1e481bdddb995c881c995c5d5a5c995b595b9d60521b604082015260600190565b60208082526018908201527f4f6e6c79206f776e6572206f7220636f6e74726f6c6c65720000000000000000604082015260600190565b600080821280156001600160ff1b0384900385131615612a9b57612a9b612d3b565b600160ff1b8390038412811615612ab457612ab4612d3b565b50500190565b60008219821115612acd57612acd612d3b565b500190565b600082612ae157612ae1612d51565b600160ff1b821460001984141615612afb57612afb612d3b565b500590565b600082612b0f57612b0f612d51565b500490565b80825b6001808611612b265750612b51565b818704821115612b3857612b38612d3b565b80861615612b4557918102915b9490941c938002612b17565b94509492505050565b60006126376000198484600082612b7357506001612637565b81612b8057506000612637565b8160018114612b965760028114612ba057612bcd565b6001915050612637565b60ff841115612bb157612bb1612d3b565b6001841b915084821115612bc757612bc7612d3b565b50612637565b5060208310610133831016604e8410600b8410161715612c00575081810a83811115612bfb57612bfb612d3b565b612637565b612c0d8484846001612b14565b808604821115612c1f57612c1f612d3b565b02949350505050565b60006001600160ff1b0381841382841380821686840486111615612c4e57612c4e612d3b565b600160ff1b84871282811687830589121615612c6c57612c6c612d3b565b858712925087820587128484161615612c8757612c87612d3b565b87850587128184161615612c9d57612c9d612d3b565b505050929093029392505050565b6000816000190483118215151615612cc557612cc5612d3b565b500290565b60008083128015600160ff1b850184121615612ce857612ce8612d3b565b6001600160ff1b0384018313811615612d0357612d03612d3b565b50500390565b600082821015612d1b57612d1b612d3b565b500390565b6000600019821415612d3457612d34612d3b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0381168114610a7457600080fdfea26469706673582212200501fa8d7ecc2953141eb4fdf28e194ee0a4d5bcd5478d3c0630568e6e6b121f64736f6c63430008030033000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed68000000000000000000000000ca8d52bd76a0b09a2df5ccf49ab4fcab7611bbcc00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed68
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102105760003560e01c80636a61e5fc116101255780639ce7f670116100ad578063bced91171161007c578063bced9117146104b6578063c57380a2146104be578063f2fde38b146104cf578063f343d683146104e2578063f36932b71461050957610210565b80639ce7f6701461046e578063b508195014610476578063b68ef55914610489578063b6b55f25146104a357610210565b80638da5cb5b116100f45780638da5cb5b14610411578063919cfa211461042257806391dd75e71461043557806392eefe9b146104485780639c256eef1461045b57610210565b80636a61e5fc1461037a5780636ff1c9bc1461038d57806376f10ad0146103a05780638705fcd4146103fe57610210565b80632e1a7d4d116101a85780634378f0ec116101775780634378f0ec146103185780634b94f50e146103315780635798ef311461034b57806357e0bf941461035e578063645006ca1461037157610210565b80632e1a7d4d146102c25780632f54bf6e146102d55780633a621d371461030757806342c9b1d91461030f57610210565b80631a43c338116101e45780631a43c3381461026d578063292bbd32146102755780632a40eb72146102a75780632a80cda3146102af57610210565b8062f55d9d146102155780630301310b1461022a578063060406181461024e57806308b4a99414610265575b600080fd5b610228610223366004612956565b610512565b005b6006546102379060ff1681565b60405160ff90911681526020015b60405180910390f35b61025760035481565b604051908152602001610245565b6102576105fd565b6102286106bd565b60065461028f90630100000090046001600160a01b031681565b6040516001600160a01b039091168152602001610245565b6102286108e6565b6102286102bd366004612992565b610a77565b6102286102d0366004612992565b610b0b565b6102f76102e3366004612956565b6000546001600160a01b0390811691161490565b6040519015158152602001610245565b6102576111f8565b61025760025481565b6003805460009081526008602052604090200154610257565b600354600090815260086020526040902060010154610257565b610228610359366004612956565b611206565b61025761036c366004612992565b611325565b61025760045481565b610228610388366004612992565b611376565b61022861039b366004612956565b611405565b6103da6103ae366004612992565b600090815260086020526040902080546001820154600283015460039093015460ff9092169390929190565b6040805160ff90951685526020850193909352918301526060820152608001610245565b61022861040c366004612956565b6116ab565b6000546001600160a01b031661028f565b610228610430366004612992565b61177e565b60075461028f906001600160a01b031681565b610228610456366004612956565b6117c2565b6102286104693660046129c2565b611919565b6102576119d0565b6102286104843660046129c2565b611a32565b600354600090815260086020526040902060020154610257565b6102286104b1366004612992565b611aca565b61022861220c565b6001546001600160a01b031661028f565b6102286104dd366004612956565b61246c565b61028f7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b61025760055481565b6000546001600160a01b031633146105455760405162461bcd60e51b815260040161053c90612a12565b60405180910390fd5b6001600160a01b0381166105975760405162461bcd60e51b81526020600482015260196024820152781b9bdb8b5e995c9bc81859191c995cdcc81c995c5d5a5c9959603a1b604482015260640161053c565b6001600160a01b038116600114156105f15760405162461bcd60e51b815260206004820152601d60248201527f65637265636f7665722061646472657373206e6f7420616c6c6f776564000000604482015260640161053c565b806001600160a01b0316ff5b6006546040516370a0823160e01b815230600482015260009160649160ff909116907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a08231906024015b60206040518083038186803b15801561066c57600080fd5b505afa158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906129aa565b6106ae9190612cab565b6106b89190612b00565b905090565b600042905060006106d0600254836125cd565b905060035481116106e25750506108e4565b60008060035460016106f49190612aba565b90505b8281116108c8578161070881612d20565b925060089050600061071b600184612d09565b81526020808201929092526040908101600090812054848252600893849052918120805460ff191660ff9093169290921790915561075a600184612d09565b8152602001908152602001600020600201546008600083815260200190815260200160002060020181905550600061016d60646006600a61079b9190612b5a565b600860006107aa600188612d09565b81526020810191909152604001600020546107c8919060ff16612cab565b6107d29190612cab565b6107dc9190612b00565b90506107ea61271082612b00565b600860006107f9600186612d09565b8152602001908152602001600020600101546108159190612aba565b6000838152600860208190526040822060019081019390935560649261016d92906108409087612d09565b8152602081019190915260400160009081205460ff1690600890610865600188612d09565b8152602001908152602001600020600201546108819190612cab565b61088b9190612b00565b6108959190612b00565b600083815260086020526040902060030155601e83106108b557506108c8565b50806108c081612d20565b9150506106f7565b5080600360008282546108db9190612aba565b90915550505050505b565b6001546001600160a01b031633148061090957506000546001600160a01b031633145b6109255760405162461bcd60e51b815260040161053c90612a42565b61092d6106bd565b60006109376105fd565b9050600081116109895760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206465706c6f7961626c65206361706974616c000000000000604482015260640161053c565b60065460405163a9059cbb60e01b815263010000009091046001600160a01b039081166004830152602482018390527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169063a9059cbb90604401602060405180830381600087803b1580156109fe57600080fd5b505af1158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190612972565b610a745760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161053c565b50565b6001546001600160a01b0316331480610a9a57506000546001600160a01b031633145b610ab65760405162461bcd60e51b815260040161053c90612a42565b60008111610b065760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206d696e696d756d206465706f73697420616d6f756e740000604482015260640161053c565b600455565b60065462010000900460ff1615610b645760405162461bcd60e51b815260206004820152601d60248201527f5265656e7472616e74207769746864726177616c2072656a6563746564000000604482015260640161053c565b60008111610bb05760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b604482015260640161053c565b6006805462ff000019166201000017905533610bca6106bd565b6040516370a0823160e01b81526001600160a01b03828116600483015283917f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa909116906370a082319060240160206040518083038186803b158015610c2f57600080fd5b505afa158015610c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6791906129aa565b1015610cb55760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742062616c616e6365206f6620746f6b656e730000604482015260640161053c565b6000610cc083611325565b600354600090815260086020526040902060020154909150811115610d235760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b604482015260640161053c565b6000610d2d6119d0565b905080821115610d7f5760405162461bcd60e51b815260206004820152601e60248201527f4d6178207769746864726177616c20616d6f756e742065786365656465640000604482015260640161053c565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015610de157600080fd5b505afa158015610df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1991906129aa565b9050828111610e6a5760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742066756e647320696e2074686520627566666572604482015260640161053c565b60008060055411610e7c576000610ec1565b7f00000000000000000000000000000000000000000000000000000000000f4240606460055486610ead9190612cab565b610eb79190612b00565b610ec19190612b00565b9050838110610f005760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b604482015260640161053c565b6000610f0c8286612d09565b9050846008600060035481526020019081526020016000206002016000828254610f369190612d09565b9091555050604051632770a7eb60e21b81526001600160a01b038781166004830152602482018990527f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa1690639dc29fac90604401600060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038981166004830152602482018590527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816925063a9059cbb9150604401602060405180830381600087803b15801561102757600080fd5b505af115801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f9190612972565b61107b5760405162461bcd60e51b815260040161053c906129e3565b811561116a5760075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489091169063a9059cbb90604401602060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111289190612972565b61116a5760405162461bcd60e51b8152602060048201526013602482015272119959481d1c985b9cd9995c8819985a5b1959606a1b604482015260640161053c565b604080516001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48811682528816602082015290810186905260608101889052608081018390527f297b983b359127be0bb37e151a4fec683bc9012dd4d0ac96db47cfc17019c1e49060a00160405180910390a150506006805462ff0000191690555050505050565b60006106b8600254426125cd565b6001546001600160a01b031633148061122957506000546001600160a01b031633145b6112455760405162461bcd60e51b815260040161053c90612a42565b6001600160a01b0381161580159061126657506001600160a01b0381163014155b6112a45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161053c565b6112ad8161263e565b6112f95760405162461bcd60e51b815260206004820152601e60248201527f5468652061646472657373206d757374206265206120636f6e74726163740000604482015260640161053c565b600680546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6003546000908152600860205260408120600101547f00000000000000000000000000000000000000000000000000000000000f4240906113669084612cab565b6113709190612b00565b92915050565b6000546001600160a01b031633146113a05760405162461bcd60e51b815260040161053c90612a12565b600081116113e65760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420746f6b656e20707269636560681b604482015260640161053c565b6113ee6106bd565b600354600090815260086020526040902060010155565b6000546001600160a01b0316331461142f5760405162461bcd60e51b815260040161053c90612a12565b60065462010000900460ff16156114885760405162461bcd60e51b815260206004820152601d60248201527f5265656e7472616e74207769746864726177616c2072656a6563746564000000604482015260640161053c565b6001600160a01b038116158015906114a957506001600160a01b0381163014155b6114e75760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161053c565b6006805462ff00001916620100001790556040516370a0823160e01b81523060048201526000906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a082319060240160206040518083038186803b15801561155a57600080fd5b505afa15801561156e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159291906129aa565b9050600081116115dd5760405162461bcd60e51b8152602060048201526016602482015275546865207661756c7420686173206e6f2066756e647360501b604482015260640161053c565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169063a9059cbb90604401602060405180830381600087803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167f9190612972565b61169b5760405162461bcd60e51b815260040161053c906129e3565b50506006805462ff000019169055565b6001546001600160a01b03163314806116ce57506000546001600160a01b031633145b6116ea5760405162461bcd60e51b815260040161053c90612a42565b6001600160a01b0381161580159061171057506007546001600160a01b03828116911614155b61175c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f7220666565730000000000000000604482015260640161053c565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806117a157506000546001600160a01b031633145b6117bd5760405162461bcd60e51b815260040161053c90612a42565b600555565b6000546001600160a01b031633146117ec5760405162461bcd60e51b815260040161053c90612a12565b6001600160a01b0381166118425760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c657220616464726573732072657175697265640000000000604482015260640161053c565b6000546001600160a01b03828116911614156118a05760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c65720000604482015260640161053c565b6001546001600160a01b03828116911614156118f75760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c88185b1c9958591e481cd95d60521b604482015260640161053c565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633148061193c57506000546001600160a01b031633145b6119585760405162461bcd60e51b815260040161053c90612a42565b60008160ff1611801561196e575060648160ff16105b6119ba5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e766573746d656e742070657263656e74000000000000604482015260640161053c565b6006805460ff191660ff92909216919091179055565b6006546000906064906119e69060ff1682612d09565b6040516370a0823160e01b81523060048201527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a0823190602401610654565b6000546001600160a01b03163314611a5c5760405162461bcd60e51b815260040161053c90612a12565b60008160ff1611611a9d5760405162461bcd60e51b815260206004820152600b60248201526a24b73b30b634b21020a82960a91b604482015260640161053c565b611aa56106bd565b6003546000908152600860205260409020805460ff191660ff92909216919091179055565b600654610100900460ff1615611b225760405162461bcd60e51b815260206004820152601a60248201527f5265656e7472616e74206465706f7369742072656a6563746564000000000000604482015260640161053c565b600454811015611b745760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f73697420616d6f756e74206e6f74206d65740000604482015260640161053c565b6006805461ff001916610100179055611b8b6106bd565b6040516370a0823160e01b815233600482018190529082907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015611bef57600080fd5b505afa158015611c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2791906129aa565b1015611c6a5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b604482015260640161053c565b604051636eb1769f60e11b81526001600160a01b03828116600483015230602483015283917f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489091169063dd62ed3e9060440160206040518083038186803b158015611cd557600080fd5b505afa158015611ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0d91906129aa565b1015611d545760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015260640161053c565b600354600090815260086020526040812060010154611d937f00000000000000000000000000000000000000000000000000000000000f424085612cab565b611d9d9190612b00565b604051635dd871a360e01b8152600481018290529091507f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b031690635dd871a39060240160206040518083038186803b158015611e0057600080fd5b505afa158015611e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e389190612972565b611e845760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e20737570706c79206c696d69742065786365656465640000000000604482015260640161053c565b60035460009081526008602052604081206002018054859290611ea8908490612aba565b90915550506040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015611f0f57600080fd5b505afa158015611f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4791906129aa565b6040516323b872dd60e01b81526001600160a01b038581166004830152306024830152604482018790529192507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48909116906323b872dd90606401602060405180830381600087803b158015611fbc57600080fd5b505af1158015611fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff49190612972565b6120105760405162461bcd60e51b815260040161053c906129e3565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b15801561207257600080fd5b505afa158015612086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120aa91906129aa565b90506120b68583612aba565b8110156121055760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c65640000000000604482015260640161053c565b6040516340c10f1960e01b81526001600160a01b038581166004830152602482018590527f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa16906340c10f1990604401600060405180830381600087803b15801561216f57600080fd5b505af1158015612183573d6000803e3d6000fd5b5050604080516001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488116825288166020820152908101889052606081018690527f6c6941772efad791f0e8f0ff7e3e76b52034604c1427fc1bbda4dbd3d2570fc69250608001905060405180910390a150506006805461ff0019169055505050565b6001546001600160a01b031633148061222f57506000546001600160a01b031633145b61224b5760405162461bcd60e51b815260040161053c90612a42565b6122536106bd565b600061226f600380546000908152600860205260409020015490565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a082319060240160206040518083038186803b1580156122d457600080fd5b505afa1580156122e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230c91906129aa565b60065460405163379607f560e01b815260048101859052919250630100000090046001600160a01b03169063379607f590602401600060405180830381600087803b15801561235a57600080fd5b505af115801561236e573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b031691506370a082319060240160206040518083038186803b1580156123d457600080fd5b505afa1580156123e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240c91906129aa565b90506124188383612aba565b8110156124675760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c65640000000000604482015260640161053c565b505050565b6000546001600160a01b031633146124965760405162461bcd60e51b815260040161053c90612a12565b6001600160a01b0381166124e85760405162461bcd60e51b81526020600482015260196024820152781b9bdb8b5e995c9bc81859191c995cdcc81c995c5d5a5c9959603a1b604482015260640161053c565b600054604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006125686125636201518084612b00565b61267a565b50909392505050565b60008161257f603c85612cab565b61258b610e1087612cab565b6201518061259a8b8b8b6127ee565b6125a49190612cab565b6125ae9190612aba565b6125b89190612aba565b6125c29190612aba565b979650505050505050565b60008183111561261f5760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d707300000000604482015260640161053c565b6201518061262d8484612d09565b6126379190612b00565b9392505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f80821480159061267257508015155b949350505050565b60008080838162253d8c6126918362010bd9612a79565b61269b9190612a79565b9050600062023ab16126ae836004612c28565b6126b89190612ad2565b905060046126c98262023ab1612c28565b6126d4906003612a79565b6126de9190612ad2565b6126e89083612cca565b9150600062164b096126fb846001612a79565b61270790610fa0612c28565b6127119190612ad2565b90506004612721826105b5612c28565b61272b9190612ad2565b6127359084612cca565b61274090601f612a79565b9250600061098f612752856050612c28565b61275c9190612ad2565b90506000605061276e8361098f612c28565b6127789190612ad2565b6127829086612cca565b905061278f600b83612ad2565b945061279c85600c612c28565b6127a7836002612a79565b6127b19190612cca565b915084836127c0603187612cca565b6127cb906064612c28565b6127d59190612a79565b6127df9190612a79565b9a919950975095505050505050565b60006107b284101561282a5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b604482015260640161053c565b838383600062253d8c60046064600c612844600e88612cca565b61284e9190612ad2565b61285a88611324612a79565b6128649190612a79565b61286e9190612ad2565b612879906003612c28565b6128839190612ad2565b600c80612891600e88612cca565b61289b9190612ad2565b6128a690600c612c28565b6128b1600288612cca565b6128bb9190612cca565b6128c79061016f612c28565b6128d19190612ad2565b6004600c6128e0600e89612cca565b6128ea9190612ad2565b6128f6896112c0612a79565b6129009190612a79565b61290c906105b5612c28565b6129169190612ad2565b612922617d4b87612cca565b61292c9190612a79565b6129369190612a79565b6129409190612cca565b61294a9190612cca565b98975050505050505050565b600060208284031215612967578081fd5b813561263781612d67565b600060208284031215612983578081fd5b81518015158114612637578182fd5b6000602082840312156129a3578081fd5b5035919050565b6000602082840312156129bb578081fd5b5051919050565b6000602082840312156129d3578081fd5b813560ff81168114612637578182fd5b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b60208082526016908201527513db9b1e481bdddb995c881c995c5d5a5c995b595b9d60521b604082015260600190565b60208082526018908201527f4f6e6c79206f776e6572206f7220636f6e74726f6c6c65720000000000000000604082015260600190565b600080821280156001600160ff1b0384900385131615612a9b57612a9b612d3b565b600160ff1b8390038412811615612ab457612ab4612d3b565b50500190565b60008219821115612acd57612acd612d3b565b500190565b600082612ae157612ae1612d51565b600160ff1b821460001984141615612afb57612afb612d3b565b500590565b600082612b0f57612b0f612d51565b500490565b80825b6001808611612b265750612b51565b818704821115612b3857612b38612d3b565b80861615612b4557918102915b9490941c938002612b17565b94509492505050565b60006126376000198484600082612b7357506001612637565b81612b8057506000612637565b8160018114612b965760028114612ba057612bcd565b6001915050612637565b60ff841115612bb157612bb1612d3b565b6001841b915084821115612bc757612bc7612d3b565b50612637565b5060208310610133831016604e8410600b8410161715612c00575081810a83811115612bfb57612bfb612d3b565b612637565b612c0d8484846001612b14565b808604821115612c1f57612c1f612d3b565b02949350505050565b60006001600160ff1b0381841382841380821686840486111615612c4e57612c4e612d3b565b600160ff1b84871282811687830589121615612c6c57612c6c612d3b565b858712925087820587128484161615612c8757612c87612d3b565b87850587128184161615612c9d57612c9d612d3b565b505050929093029392505050565b6000816000190483118215151615612cc557612cc5612d3b565b500290565b60008083128015600160ff1b850184121615612ce857612ce8612d3b565b6001600160ff1b0384018313811615612d0357612d03612d3b565b50500390565b600082821015612d1b57612d1b612d3b565b500390565b6000600019821415612d3457612d34612d3b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0381168114610a7457600080fdfea26469706673582212200501fa8d7ecc2953141eb4fdf28e194ee0a4d5bcd5478d3c0630568e6e6b121f64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed68000000000000000000000000ca8d52bd76a0b09a2df5ccf49ab4fcab7611bbcc00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed68
-----Decoded View---------------
Arg [0] : ownerAddr (address): 0xc692d583567cdA0fDE14Cd3D6136c2623202Ed68
Arg [1] : controllerAddr (address): 0xCA8D52bd76a0b09a2DF5CcF49AB4FCab7611BBcc
Arg [2] : receiptTokenInterface (address): 0x51acB1ea45c1EC2512ae4202B9076C13016dc8aA
Arg [3] : eip20Interface (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [4] : initialApr (uint8): 15
Arg [5] : initialTokenPrice (uint256): 1000000
Arg [6] : initialMinDepositAmount (uint256): 1000000
Arg [7] : flatFeePerc (uint256): 1000000
Arg [8] : feesAddr (address): 0xc692d583567cdA0fDE14Cd3D6136c2623202Ed68
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed68
Arg [1] : 000000000000000000000000ca8d52bd76a0b09a2df5ccf49ab4fcab7611bbcc
Arg [2] : 00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa
Arg [3] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [5] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [6] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [7] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [8] : 000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed68
Deployed Bytecode Sourcemap
26372:20377:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1427:239;;;;;;:::i;:::-;;:::i;:::-;;27863:35;;;;;;;;;;;;16089:4:1;16077:17;;;16059:36;;16047:2;16032:18;27863:35:0;;;;;;;;27185:28;;;;;;;;;15881:25:1;;;15869:2;15854:18;27185:28:0;15836:76:1;46136:172:0;;;:::i;41859:926::-;;;:::i;28164:34::-;;;;;;;;-1:-1:-1;;;;;28164:34:0;;;;;;-1:-1:-1;;;;;1700:32:1;;;1682:51;;1670:2;1655:18;28164:34:0;1637:102:1;42892:414:0;;;:::i;32948:239::-;;;;;;:::i;:::-;;:::i;37127:2702::-;;;;;;:::i;:::-;;:::i;2034:98::-;;;;;;:::i;:::-;2086:4;2118:6;-1:-1:-1;;;;;2118:6:0;;;2110:14;;;;2034:98;;;;3853:14:1;;3846:22;3828:41;;3816:2;3801:18;2034:98:0;3783:92:1;44228:190:0;;;:::i;26895:35::-;;;;;;45105:122;45191:13;;;45155:7;45182:23;;;:8;:23;;;;;:37;;45105:122;;45337:116;45420:13;;45384:7;45411:23;;;:8;:23;;;;;:34;;;45337:116;;32462:281;;;;;;:::i;:::-;;:::i;46547:199::-;;;;;;:::i;:::-;;:::i;27305:31::-;;;;;;41188:215;;;;;;:::i;:::-;;:::i;40066:716::-;;;;;;:::i;:::-;;:::i;44426:324::-;;;;;;:::i;:::-;44480:9;44575:11;;;:8;:11;;;;;:15;;;44614:22;;;44664:26;;;;44717:25;;;;;44575:15;;;;;44614:22;;44664:26;44717:25;44426:324;;;;;16363:4:1;16351:17;;;16333:36;;16400:2;16385:18;;16378:34;;;;16428:18;;;16421:34;16486:2;16471:18;;16464:34;16320:3;16305:19;44426:324:0;16287:217:1;33911:193:0;;;;;;:::i;:::-;;:::i;1781:79::-;1819:7;1846:6;-1:-1:-1;;;;;1846:6:0;1781:79;;33467:332;;;;;;:::i;:::-;;:::i;28287:26::-;;;;;-1:-1:-1;;;;;28287:26:0;;;20088:405;;;;;;:::i;:::-;;:::i;41527:211::-;;;;;;:::i;:::-;;:::i;45611:385::-;;;:::i;40874:173::-;;;;;;:::i;:::-;;:::i;44880:124::-;44967:13;;44931:7;44958:23;;;:8;:23;;;;;:38;;;44880:124;;34410:2539;;;;;;:::i;:::-;;:::i;43392:557::-;;;:::i;20605:107::-;20686:18;;-1:-1:-1;;;;;20686:18:0;20605:107;;1090:208;;;;;;:::i;:::-;;:::i;28394:38::-;;;;;27423:29;;;;;;1427:239;2086:4;2118:6;-1:-1:-1;;;;;2118:6:0;817:10;2110:14;801:54;;;;-1:-1:-1;;;801:54:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;1510:18:0;::::1;1502:56;;;::::0;-1:-1:-1;;;1502:56:0;;12425:2:1;1502:56:0::1;::::0;::::1;12407:21:1::0;12464:2;12444:18;;;12437:30;-1:-1:-1;;;12483:18:1;;;12476:55;12548:18;;1502:56:0::1;12397:175:1::0;1502:56:0::1;-1:-1:-1::0;;;;;1577:18:0;::::1;1593:1;1577:18;;1569:60;;;::::0;-1:-1:-1;;;1569:60:0;;6765:2:1;1569:60:0::1;::::0;::::1;6747:21:1::0;6804:2;6784:18;;;6777:30;6843:31;6823:18;;;6816:59;6892:18;;1569:60:0::1;6737:179:1::0;1569:60:0::1;1653:4;-1:-1:-1::0;;;;;1640:18:0::1;;46136:172:::0;46267:17;;46217:39;;-1:-1:-1;;;46217:39:0;;46250:4;46217:39;;;1682:51:1;46190:7:0;;46296:3;;46267:17;;;;;46217:14;-1:-1:-1;;;;;46217:24:0;;;;1655:18:1;;46217:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;;;:::i;:::-;:83;;;;:::i;:::-;46210:90;;46136:172;:::o;41859:926::-;41897:24;41924:15;41897:42;;41993:17;42013:58;42032:20;;42054:16;42013:18;:58::i;:::-;41993:78;;42099:13;;42086:9;:26;42082:39;;42114:7;;;;42082:39;42133:9;42164;42176:13;;42192:1;42176:17;;;;:::i;:::-;42164:29;;42159:588;42200:9;42195:1;:14;42159:588;;42231:3;;;;:::i;:::-;;-1:-1:-1;42267:8:0;;-1:-1:-1;42267:15:0;42276:5;42280:1;42276;:5;:::i;:::-;42267:15;;;;;;;;;;;;;;-1:-1:-1;42267:15:0;;;:19;42249:11;;;:8;:11;;;;;;;:37;;-1:-1:-1;;42249:37:0;42267:19;;;;42249:37;;;;;;;42339:5;42267:19;42258:1;42339:5;:::i;:::-;42330:15;;;;;;;;;;;:30;;;42301:8;:11;42310:1;42301:11;;;;;;;;;;;:26;;:59;;;;42377:12;42472:3;42457;26536:1;26521:2;26513:25;;;;:::i;:::-;42400:8;:15;42409:5;42413:1;42409;:5;:::i;:::-;42400:15;;;;;;;;;;;-1:-1:-1;42400:15:0;:19;42392:54;;;42400:19;;42392:54;:::i;:::-;:69;;;;:::i;:::-;:84;;;;:::i;:::-;42377:99;-1:-1:-1;42546:21:0;42561:5;42377:99;42546:21;:::i;:::-;42516:8;:15;42525:5;42529:1;42525;:5;:::i;:::-;42516:15;;;;;;;;;;;:26;;;:52;;;;:::i;:::-;42491:11;;;;:8;:11;;;;;;;:22;;;;:77;;;;42698:3;;42683;;42491:11;42661:5;;42500:1;42661:5;:::i;:::-;42652:15;;;;;;;;;;;-1:-1:-1;42652:15:0;;;:19;;;;42611:8;;42620:5;42652:19;42620:1;:5;:::i;:::-;42611:15;;;;;;;;;;;:30;;;:61;;;;:::i;:::-;:76;;;;:::i;:::-;:91;;;;:::i;:::-;42583:11;;;;:8;:11;;;;;:25;;:119;42726:2;42721:7;;42717:18;;42730:5;;;42717:18;-1:-1:-1;42211:3:0;;;;:::i;:::-;;;;42159:588;;;;42776:1;42759:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;41859:926:0;:::o;42892:414::-;19816:18;;-1:-1:-1;;;;;19816:18:0;19802:10;:32;;:56;;-1:-1:-1;19852:6:0;;-1:-1:-1;;;;;19852:6:0;19838:10;:20;19802:56;19794:93;;;;-1:-1:-1;;;19794:93:0;;;;;;;:::i;:::-;42956:9:::1;:7;:9::i;:::-;43067:27;43097:22;:20;:22::i;:::-;43067:52;;43160:1;43138:19;:23;43130:62;;;::::0;-1:-1:-1;;;43130:62:0;;13490:2:1;43130:62:0::1;::::0;::::1;13472:21:1::0;13529:2;13509:18;;;13502:30;13568:28;13548:18;;;13541:56;13614:18;;43130:62:0::1;13462:176:1::0;43130:62:0::1;43237:19;::::0;43213:65:::1;::::0;-1:-1:-1;;;43213:65:0;;43237:19;;;::::1;-1:-1:-1::0;;;;;43237:19:0;;::::1;43213:65;::::0;::::1;3583:51:1::0;3650:18;;;3643:34;;;43213:14:0::1;:23;::::0;::::1;::::0;3556:18:1;;43213:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43205:93;;;::::0;-1:-1:-1;;;43205:93:0;;5002:2:1;43205:93:0::1;::::0;::::1;4984:21:1::0;5041:2;5021:18;;;5014:30;-1:-1:-1;;;5060:18:1;;;5053:45;5115:18;;43205:93:0::1;4974:165:1::0;43205:93:0::1;19898:1;42892:414::o:0;32948:239::-;19816:18;;-1:-1:-1;;;;;19816:18:0;19802:10;:32;;:56;;-1:-1:-1;19852:6:0;;-1:-1:-1;;;;;19852:6:0;19838:10;:20;19802:56;19794:93;;;;-1:-1:-1;;;19794:93:0;;;;;;;:::i;:::-;33076:1:::1;33064:9;:13;33056:56;;;::::0;-1:-1:-1;;;33056:56:0;;8177:2:1;33056:56:0::1;::::0;::::1;8159:21:1::0;8216:2;8196:18;;;8189:30;8255:32;8235:18;;;8228:60;8305:18;;33056:56:0::1;8149:180:1::0;33056:56:0::1;33151:16;:28:::0;32948:239::o;37127:2702::-;32067:30;;;;;;;:35;32059:77;;;;-1:-1:-1;;;32059:77:0;;9603:2:1;32059:77:0;;;9585:21:1;9642:2;9622:18;;;9615:30;9681:31;9661:18;;;9654:59;9730:18;;32059:77:0;9575:179:1;32059:77:0;37265:1:::1;37244:18;:22;37236:60;;;::::0;-1:-1:-1;;;37236:60:0;;4304:2:1;37236:60:0::1;::::0;::::1;4286:21:1::0;4343:2;4323:18;;;4316:30;-1:-1:-1;;;4362:18:1;;;4355:55;4427:18;;37236:60:0::1;4276:175:1::0;37236:60:0::1;37350:30;:34:::0;;-1:-1:-1;;37350:34:0::1;::::0;::::1;::::0;;37418:10:::1;37493:9;:7;:9::i;:::-;37590:35;::::0;-1:-1:-1;;;37590:35:0;;-1:-1:-1;;;;;1700:32:1;;;37590:35:0::1;::::0;::::1;1682:51:1::0;37629:18:0;;37590:13:::1;:23:::0;;::::1;::::0;::::1;::::0;1655:18:1;;37590:35:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;37582:100;;;::::0;-1:-1:-1;;;37582:100:0;;9244:2:1;37582:100:0::1;::::0;::::1;9226:21:1::0;9283:2;9263:18;;;9256:30;9322:32;9302:18;;;9295:60;9372:18;;37582:100:0::1;9216:180:1::0;37582:100:0::1;37774:24;37801:33;37815:18;37801:13;:33::i;:::-;37882:13;::::0;37873:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;::::0;37774:60;;-1:-1:-1;37853:58:0;::::1;;37845:96;;;::::0;-1:-1:-1;;;37845:96:0;;4304:2:1;37845:96:0::1;::::0;::::1;4286:21:1::0;4343:2;4323:18;;;4316:30;-1:-1:-1;;;4362:18:1;;;4355:55;4427:18;;37845:96:0::1;4276:175:1::0;37845:96:0::1;37954:27;37984:24;:22;:24::i;:::-;37954:54;;38047:19;38027:16;:39;;38019:82;;;::::0;-1:-1:-1;;;38019:82:0;;13845:2:1;38019:82:0::1;::::0;::::1;13827:21:1::0;13884:2;13864:18;;;13857:30;13923:32;13903:18;;;13896:60;13973:18;;38019:82:0::1;13817:180:1::0;38019:82:0::1;38139:39;::::0;-1:-1:-1;;;38139:39:0;;38172:4:::1;38139:39;::::0;::::1;1682:51:1::0;38114:22:0::1;::::0;38139:14:::1;-1:-1:-1::0;;;;;38139:24:0::1;::::0;::::1;::::0;1655:18:1;;38139:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38114:64;;38214:16;38197:14;:33;38189:78;;;::::0;-1:-1:-1;;;38189:78:0;;8883:2:1;38189:78:0::1;::::0;::::1;8865:21:1::0;;;8902:18;;;8895:30;8961:34;8941:18;;;8934:62;9013:18;;38189:78:0::1;8855:182:1::0;38189:78:0::1;38422:17;38460:1:::0;38443:14:::1;;:18;38442:97;;38538:1;38442:97;;;38516:19;38509:3;38484:14;;38465:16;:33;;;;:::i;:::-;:48;;;;:::i;:::-;:70;;;;:::i;:::-;38422:117;;38570:16;38558:9;:28;38550:52;;;::::0;-1:-1:-1;;;38550:52:0;;10667:2:1;38550:52:0::1;::::0;::::1;10649:21:1::0;10706:2;10686:18;;;10679:30;-1:-1:-1;;;10725:18:1;;;10718:41;10776:18;;38550:52:0::1;10639:161:1::0;38550:52:0::1;38709:33;38745:28;38764:9:::0;38745:16;:28:::1;:::i;:::-;38709:64;;39001:16;38959:8;:23;38968:13;;38959:23;;;;;;;;;;;:38;;;:58;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39086:50:0::1;::::0;-1:-1:-1;;;39086:50:0;;-1:-1:-1;;;;;3601:32:1;;;39086:50:0::1;::::0;::::1;3583:51:1::0;3650:18;;;3643:34;;;39086:13:0::1;:18;::::0;::::1;::::0;3556::1;;39086:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;39260:62:0::1;::::0;-1:-1:-1;;;39260:62:0;;-1:-1:-1;;;;;3601:32:1;;;39260:62:0::1;::::0;::::1;3583:51:1::0;3650:18;;;3643:34;;;39260:14:0::1;:23;::::0;-1:-1:-1;39260:23:0::1;::::0;-1:-1:-1;3556:18:1;;39260:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39252:96;;;;-1:-1:-1::0;;;39252:96:0::1;;;;;;;:::i;:::-;39365:13:::0;;39361:177:::1;;39479:11;::::0;39455:47:::1;::::0;-1:-1:-1;;;39455:47:0;;-1:-1:-1;;;;;39479:11:0;;::::1;39455:47;::::0;::::1;3583:51:1::0;3650:18;;;3643:34;;;39455:14:0::1;:23:::0;;::::1;::::0;::::1;::::0;3556:18:1;;39455:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39447:79;;;::::0;-1:-1:-1;;;39447:79:0;;7123:2:1;39447:79:0::1;::::0;::::1;7105:21:1::0;7162:2;7142:18;;;7135:30;-1:-1:-1;;;7181:18:1;;;7174:49;7240:18;;39447:79:0::1;7095:169:1::0;39447:79:0::1;39597:103;::::0;;-1:-1:-1;;;;;39623:14:0::1;3200:15:1::0;;3182:34;;3252:15;;3247:2;3232:18;;3225:43;3284:18;;;3277:34;;;3342:2;3327:18;;3320:34;;;3385:3;3370:19;;3363:35;;;39597:103:0::1;::::0;3131:3:1;3116:19;39597:103:0::1;;;;;;;-1:-1:-1::0;;39752:30:0::1;:34:::0;;-1:-1:-1;;39752:34:0::1;::::0;;-1:-1:-1;;;;;37127:2702:0:o;44228:190::-;44285:7;44312:57;44331:20;;44353:15;44312:18;:57::i;32462:281::-;19816:18;;-1:-1:-1;;;;;19816:18:0;19802:10;:32;;:56;;-1:-1:-1;19852:6:0;;-1:-1:-1;;;;;19852:6:0;19838:10;:20;19802:56;19794:93;;;;-1:-1:-1;;;19794:93:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32557:18:0;::::1;::::0;;::::1;::::0;:43:::1;;-1:-1:-1::0;;;;;;32579:21:0;::::1;32595:4;32579:21;;32557:43;32549:71;;;::::0;-1:-1:-1;;;32549:71:0;;4658:2:1;32549:71:0::1;::::0;::::1;4640:21:1::0;4697:2;4677:18;;;4670:30;-1:-1:-1;;;4716:18:1;;;4709:45;4771:18;;32549:71:0::1;4630:165:1::0;32549:71:0::1;32639:22;32656:4;32639:16;:22::i;:::-;32631:65;;;::::0;-1:-1:-1;;;32631:65:0;;11007:2:1;32631:65:0::1;::::0;::::1;10989:21:1::0;11046:2;11026:18;;;11019:30;11085:32;11065:18;;;11058:60;11135:18;;32631:65:0::1;10979:180:1::0;32631:65:0::1;32709:19;:26:::0;;-1:-1:-1;;;;;32709:26:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;32709:26:0;;::::1;::::0;;;::::1;::::0;;32462:281::o;46547:199::-;46677:13;;46620:7;46668:23;;;:8;:23;;;;;:34;;;46705:33;;46647:55;;:18;:55;:::i;:::-;:91;;;;:::i;:::-;46640:98;46547:199;-1:-1:-1;;46547:199:0:o;41188:215::-;2086:4;2118:6;-1:-1:-1;;;;;2118:6:0;817:10;2110:14;801:54;;;;-1:-1:-1;;;801:54:0;;;;;;;:::i;:::-;41287:1:::1;41271:13;:17;41263:49;;;::::0;-1:-1:-1;;;41263:49:0;;14204:2:1;41263:49:0::1;::::0;::::1;14186:21:1::0;14243:2;14223:18;;;14216:30;-1:-1:-1;;;14262:18:1;;;14255:49;14321:18;;41263:49:0::1;14176:169:1::0;41263:49:0::1;41325:9;:7;:9::i;:::-;41354:13;::::0;41345:23:::1;::::0;;;:8:::1;:23;::::0;;;;:34:::1;;:50:::0;41188:215::o;40066:716::-;2086:4;2118:6;-1:-1:-1;;;;;2118:6:0;817:10;2110:14;801:54;;;;-1:-1:-1;;;801:54:0;;;;;;;:::i;:::-;32067:30:::1;::::0;;;::::1;;;:35:::0;32059:77:::1;;;::::0;-1:-1:-1;;;32059:77:0;;9603:2:1;32059:77:0::1;::::0;::::1;9585:21:1::0;9642:2;9622:18;;;9615:30;9681:31;9661:18;;;9654:59;9730:18;;32059:77:0::1;9575:179:1::0;32059:77:0::1;-1:-1:-1::0;;;;;40180:29:0;::::2;::::0;;::::2;::::0;:65:::2;;-1:-1:-1::0;;;;;;40213:32:0;::::2;40240:4;40213:32;;40180:65;40172:93;;;::::0;-1:-1:-1;;;40172:93:0;;4658:2:1;40172:93:0::2;::::0;::::2;4640:21:1::0;4697:2;4677:18;;;4670:30;-1:-1:-1;;;4716:18:1;;;4709:45;4771:18;;40172:93:0::2;4630:165:1::0;40172:93:0::2;40319:30;:34:::0;;-1:-1:-1;;40319:34:0::2;::::0;::::2;::::0;;40391:39:::2;::::0;-1:-1:-1;;;40391:39:0;;40424:4:::2;40391:39;::::0;::::2;1682:51:1::0;-1:-1:-1;;;;;;;40391:14:0::2;:24;::::0;::::2;::::0;1655:18:1;;40391:39:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40366:64;;40466:1;40449:14;:18;40441:53;;;::::0;-1:-1:-1;;;40441:53:0;;7826:2:1;40441:53:0::2;::::0;::::2;7808:21:1::0;7865:2;7845:18;;;7838:30;-1:-1:-1;;;7884:18:1;;;7877:52;7946:18;;40441:53:0::2;7798:172:1::0;40441:53:0::2;40571:56;::::0;-1:-1:-1;;;40571:56:0;;-1:-1:-1;;;;;3601:32:1;;;40571:56:0::2;::::0;::::2;3583:51:1::0;3650:18;;;3643:34;;;40571:14:0::2;:23;::::0;::::2;::::0;3556:18:1;;40571:56:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40563:90;;;;-1:-1:-1::0;;;40563:90:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;40705:30:0::2;:34:::0;;-1:-1:-1;;40705:34:0::2;::::0;;40066:716::o;33911:193::-;19816:18;;-1:-1:-1;;;;;19816:18:0;19802:10;:32;;:56;;-1:-1:-1;19852:6:0;;-1:-1:-1;;;;;19852:6:0;19838:10;:20;19802:56;19794:93;;;;-1:-1:-1;;;19794:93:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33997:18:0;::::1;::::0;;::::1;::::0;:41:::1;;-1:-1:-1::0;34027:11:0::1;::::0;-1:-1:-1;;;;;34019:19:0;;::::1;34027:11:::0;::::1;34019:19;;33997:41;33989:78;;;::::0;-1:-1:-1;;;33989:78:0;;5697:2:1;33989:78:0::1;::::0;::::1;5679:21:1::0;5736:2;5716:18;;;5709:30;5775:26;5755:18;;;5748:54;5819:18;;33989:78:0::1;5669:174:1::0;33989:78:0::1;34078:11;:18:::0;;-1:-1:-1;;;;;;34078:18:0::1;-1:-1:-1::0;;;;;34078:18:0;;;::::1;::::0;;;::::1;::::0;;33911:193::o;33467:332::-;19816:18;;-1:-1:-1;;;;;19816:18:0;19802:10;:32;;:56;;-1:-1:-1;19852:6:0;;-1:-1:-1;;;;;19852:6:0;19838:10;:20;19802:56;19794:93;;;;-1:-1:-1;;;19794:93:0;;;;;;;:::i;:::-;33754:14:::1;:37:::0;33467:332::o;20088:405::-;2086:4;2118:6;-1:-1:-1;;;;;2118:6:0;817:10;2110:14;801:54;;;;-1:-1:-1;;;801:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20191:28:0;::::1;20183:68;;;::::0;-1:-1:-1;;;20183:68:0;;6050:2:1;20183:68:0::1;::::0;::::1;6032:21:1::0;6089:2;6069:18;;;6062:30;6128:29;6108:18;;;6101:57;6175:18;;20183:68:0::1;6022:177:1::0;20183:68:0::1;20288:6;::::0;-1:-1:-1;;;;;20270:24:0;;::::1;20288:6:::0;::::1;20270:24;;20262:67;;;::::0;-1:-1:-1;;;20262:67:0;;14885:2:1;20262:67:0::1;::::0;::::1;14867:21:1::0;14924:2;14904:18;;;14897:30;14963:32;14943:18;;;14936:60;15013:18;;20262:67:0::1;14857:180:1::0;20262:67:0::1;20366:18;::::0;-1:-1:-1;;;;;20348:36:0;;::::1;20366:18:::0;::::1;20348:36;;20340:71;;;::::0;-1:-1:-1;;;20340:71:0;;12074:2:1;20340:71:0::1;::::0;::::1;12056:21:1::0;12113:2;12093:18;;;12086:30;-1:-1:-1;;;12132:18:1;;;12125:52;12194:18;;20340:71:0::1;12046:172:1::0;20340:71:0::1;20450:18;:35:::0;;-1:-1:-1;;;;;;20450:35:0::1;-1:-1:-1::0;;;;;20450:35:0;;;::::1;::::0;;;::::1;::::0;;20088:405::o;41527:211::-;19816:18;;-1:-1:-1;;;;;19816:18:0;19802:10;:32;;:56;;-1:-1:-1;19852:6:0;;-1:-1:-1;;;;;19852:6:0;19838:10;:20;19802:56;19794:93;;;;-1:-1:-1;;;19794:93:0;;;;;;;:::i;:::-;41637:1:::1;41624:10;:14;;;:34;;;;;41655:3;41642:10;:16;;;41624:34;41616:73;;;::::0;-1:-1:-1;;;41616:73:0;;12779:2:1;41616:73:0::1;::::0;::::1;12761:21:1::0;12818:2;12798:18;;;12791:30;12857:28;12837:18;;;12830:56;12903:18;;41616:73:0::1;12751:176:1::0;41616:73:0::1;41700:17;:30:::0;;-1:-1:-1;;41700:30:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;41527:211::o;45611:385::-;45954:17;;45667:7;;45984:3;;45931:41;;45954:17;;45984:3;45931:41;:::i;:::-;45888:39;;-1:-1:-1;;;45888:39:0;;45921:4;45888:39;;;1682:51:1;45888:14:0;-1:-1:-1;;;;;45888:24:0;;;;1655:18:1;;45888:39:0;1637:102:1;40874:173:0;2086:4;2118:6;-1:-1:-1;;;;;2118:6:0;817:10;2110:14;801:54;;;;-1:-1:-1;;;801:54:0;;;;;;;:::i;:::-;40953:1:::1;40944:6;:10;;;40936:34;;;::::0;-1:-1:-1;;;40936:34:0;;15597:2:1;40936:34:0::1;::::0;::::1;15579:21:1::0;15636:2;15616:18;;;15609:30;-1:-1:-1;;;15655:18:1;;;15648:41;15706:18;;40936:34:0::1;15569:161:1::0;40936:34:0::1;40983:9;:7;:9::i;:::-;41012:13;::::0;41003:23:::1;::::0;;;:8:::1;:23;::::0;;;;:36;;-1:-1:-1;;41003:36:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;40874:173::o;34410:2539::-;31843:27;;;;;;;:32;31835:71;;;;-1:-1:-1;;;31835:71:0;;7471:2:1;31835:71:0;;;7453:21:1;7510:2;7490:18;;;7483:30;7549:28;7529:18;;;7522:56;7595:18;;31835:71:0;7443:176:1;31835:71:0;34589:16:::1;;34572:13;:33;;34564:76;;;::::0;-1:-1:-1;;;34564:76:0;;6406:2:1;34564:76:0::1;::::0;::::1;6388:21:1::0;6445:2;6425:18;;;6418:30;6484:32;6464:18;;;6457:60;6534:18;;34564:76:0::1;6378:180:1::0;34564:76:0::1;34694:27;:31:::0;;-1:-1:-1;;34694:31:0::1;;;::::0;;34790:9:::1;:7;:9::i;:::-;35075:36;::::0;-1:-1:-1;;;35075:36:0;;34944:10:::1;35075:36;::::0;::::1;1682:51:1::0;;;34944:10:0;35115:13;;35075:14:::1;-1:-1:-1::0;;;;;35075:24:0::1;::::0;::::1;::::0;1655:18:1;;35075:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;35067:84;;;::::0;-1:-1:-1;;;35067:84:0;;8536:2:1;35067:84:0::1;::::0;::::1;8518:21:1::0;8575:2;8555:18;;;8548:30;-1:-1:-1;;;8594:18:1;;;8587:48;8652:18;;35067:84:0::1;8508:168:1::0;35067:84:0::1;35256:51;::::0;-1:-1:-1;;;35256:51:0;;-1:-1:-1;;;;;1974:15:1;;;35256:51:0::1;::::0;::::1;1956:34:1::0;35301:4:0::1;2006:18:1::0;;;1999:43;35311:13:0;;35256:14:::1;:24:::0;;::::1;::::0;::::1;::::0;1891:18:1;;35256:51:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;35248:103;;;::::0;-1:-1:-1;;;35248:103:0;;5346:2:1;35248:103:0::1;::::0;::::1;5328:21:1::0;5385:2;5365:18;;;5358:30;-1:-1:-1;;;5404:18:1;;;5397:52;5466:18;;35248:103:0::1;5318:172:1::0;35248:103:0::1;35543:13;::::0;35450:29:::1;35534:23:::0;;;:8:::1;:23;::::0;;;;:34:::1;;::::0;35482:49:::1;35498:33;35482:13:::0;:49:::1;:::i;:::-;:86;;;;:::i;:::-;35667:44;::::0;-1:-1:-1;;;35667:44:0;;::::1;::::0;::::1;15881:25:1::0;;;35450:118:0;;-1:-1:-1;35667:13:0::1;-1:-1:-1::0;;;;;35667:21:0::1;::::0;::::1;::::0;15854:18:1;;35667:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35659:84;;;::::0;-1:-1:-1;;;35659:84:0;;13134:2:1;35659:84:0::1;::::0;::::1;13116:21:1::0;13173:2;13153:18;;;13146:30;13212:29;13192:18;;;13185:57;13259:18;;35659:84:0::1;13106:177:1::0;35659:84:0::1;35765:13;::::0;35756:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;:55:::0;;35798:13;;35756:23;:55:::1;::::0;35798:13;;35756:55:::1;:::i;:::-;::::0;;;-1:-1:-1;;35978:39:0::1;::::0;-1:-1:-1;;;35978:39:0;;36011:4:::1;35978:39;::::0;::::1;1682:51:1::0;35946:29:0::1;::::0;35978:14:::1;-1:-1:-1::0;;;;;35978:24:0::1;::::0;::::1;::::0;1655:18:1;;35978:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36089:69;::::0;-1:-1:-1;;;36089:69:0;;-1:-1:-1;;;;;2311:15:1;;;36089:69:0::1;::::0;::::1;2293:34:1::0;36137:4:0::1;2343:18:1::0;;;2336:43;2395:18;;;2388:34;;;35946:71:0;;-1:-1:-1;36089:14:0::1;:27:::0;;::::1;::::0;::::1;::::0;2228:18:1;;36089:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36081:103;;;;-1:-1:-1::0;;;36081:103:0::1;;;;;;;:::i;:::-;36283:39;::::0;-1:-1:-1;;;36283:39:0;;36316:4:::1;36283:39;::::0;::::1;1682:51:1::0;36262:18:0::1;::::0;36283:14:::1;-1:-1:-1::0;;;;;36283:24:0::1;::::0;::::1;::::0;1655:18:1;;36283:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36262:60:::0;-1:-1:-1;36450:37:0::1;36474:13:::0;36450:21;:37:::1;:::i;:::-;36436:10;:51;;36428:91;;;::::0;-1:-1:-1;;;36428:91:0;;10311:2:1;36428:91:0::1;::::0;::::1;10293:21:1::0;10350:2;10330:18;;;10323:30;10389:29;10369:18;;;10362:57;10436:18;;36428:91:0::1;10283:177:1::0;36428:91:0::1;36659:53;::::0;-1:-1:-1;;;36659:53:0;;-1:-1:-1;;;;;3601:32:1;;;36659:53:0::1;::::0;::::1;3583:51:1::0;3650:18;;;3643:34;;;36659:13:0::1;:18;::::0;::::1;::::0;3556::1;;36659:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36769:89:0::1;::::0;;-1:-1:-1;;;;;36792:14:0::1;2720:15:1::0;;2702:34;;2772:15;;2767:2;2752:18;;2745:43;2804:18;;;2797:34;;;2862:2;2847:18;;2840:34;;;36769:89:0::1;::::0;-1:-1:-1;2651:3:1;2636:19;;-1:-1:-1;36769:89:0::1;;;;;;;-1:-1:-1::0;;36910:27:0::1;:31:::0;;-1:-1:-1;;36910:31:0::1;::::0;;-1:-1:-1;;;34410:2539:0:o;43392:557::-;19816:18;;-1:-1:-1;;;;;19816:18:0;19802:10;:32;;:56;;-1:-1:-1;19852:6:0;;-1:-1:-1;;;;;19852:6:0;19838:10;:20;19802:56;19794:93;;;;-1:-1:-1;;;19794:93:0;;;;;;;:::i;:::-;43463:9:::1;:7;:9::i;:::-;43566:27;43596:18;45191:13:::0;;;45155:7;45182:23;;;:8;:23;;;;;:37;;45105:122;;43596:18:::1;43651:39;::::0;-1:-1:-1;;;43651:39:0;;43684:4:::1;43651:39;::::0;::::1;1682:51:1::0;43566:48:0;;-1:-1:-1;43627:21:0::1;::::0;-1:-1:-1;;;;;43651:14:0::1;:24;::::0;::::1;::::0;1655:18:1;;43651:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43715:19;::::0;43703:59:::1;::::0;-1:-1:-1;;;43703:59:0;;::::1;::::0;::::1;15881:25:1::0;;;43627:63:0;;-1:-1:-1;43715:19:0;;::::1;-1:-1:-1::0;;;;;43715:19:0::1;::::0;43703:38:::1;::::0;15854:18:1;;43703:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43798:39:0::1;::::0;-1:-1:-1;;;43798:39:0;;43831:4:::1;43798:39;::::0;::::1;1682:51:1::0;43775:20:0::1;::::0;-1:-1:-1;43798:14:0::1;-1:-1:-1::0;;;;;43798:24:0::1;::::0;-1:-1:-1;43798:24:0::1;::::0;1655:18:1;;43798:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43775:62:::0;-1:-1:-1;43874:35:0::1;43890:19:::0;43874:13;:35:::1;:::i;:::-;43858:12;:51;;43850:91;;;::::0;-1:-1:-1;;;43850:91:0;;10311:2:1;43850:91:0::1;::::0;::::1;10293:21:1::0;10350:2;10330:18;;;10323:30;10389:29;10369:18;;;10362:57;10436:18;;43850:91:0::1;10283:177:1::0;43850:91:0::1;19898:1;;;43392:557::o:0;1090:208::-;2086:4;2118:6;-1:-1:-1;;;;;2118:6:0;817:10;2110:14;801:54;;;;-1:-1:-1;;;801:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1168:18:0;::::1;1160:56;;;::::0;-1:-1:-1;;;1160:56:0;;12425:2:1;1160:56:0::1;::::0;::::1;12407:21:1::0;12464:2;12444:18;;;12437:30;-1:-1:-1;;;12483:18:1;;;12476:55;12548:18;;1160:56:0::1;12397:175:1::0;1160:56:0::1;1253:6;::::0;1232:34:::1;::::0;;-1:-1:-1;;;;;1253:6:0;;::::1;1956:34:1::0;;2026:15;;;2021:2;2006:18;;1999:43;1232:34:0::1;::::0;1891:18:1;1232:34:0::1;;;;;;;1277:6;:13:::0;;-1:-1:-1;;;;;;1277:13:0::1;-1:-1:-1::0;;;;;1277:13:0;;;::::1;::::0;;;::::1;::::0;;1090:208::o;22632:144::-;22692:12;22728:40;22740:27;22174:12;22740:9;:27;:::i;:::-;22728:11;:40::i;:::-;-1:-1:-1;22717:51:0;;22632:144;-1:-1:-1;;;22632:144:0:o;23083:306::-;23225:17;23375:6;23345:27;22383:2;23345:6;:27;:::i;:::-;23319:23;22279:7;23319:4;:23;:::i;:::-;22174:12;23267:31;23281:4;23287:5;23294:3;23267:13;:31::i;:::-;:49;;;;:::i;:::-;:75;;;;:::i;:::-;:105;;;;:::i;:::-;:114;;;;:::i;:::-;23255:126;23083:306;-1:-1:-1;;;;;;;23083:306:0:o;23637:248::-;23723:7;23768:11;23751:13;:28;;23743:69;;;;-1:-1:-1;;;23743:69:0;;11366:2:1;23743:69:0;;;11348:21:1;11405:2;11385:18;;;11378:30;11444;11424:18;;;11417:58;11492:18;;23743:69:0;11338:178:1;23743:69:0;22174:12;23831:27;23845:13;23831:11;:27;:::i;:::-;23830:47;;;;:::i;:::-;23823:54;23637:248;-1:-1:-1;;;23637:248:0:o;21691:367::-;21749:4;21784:66;21972:17;;22011:19;;;;;;:38;;-1:-1:-1;22034:15:0;;;22011:38;22003:47;21691:367;-1:-1:-1;;;;21691:367:0:o;24397:665::-;24457:12;;;24533:5;24457:12;22471:7;24563:14;24533:5;24572;24563:14;:::i;:::-;:31;;;;:::i;:::-;24552:42;-1:-1:-1;24605:8:0;24624:6;24616:5;24552:42;24616:1;:5;:::i;:::-;:14;;;;:::i;:::-;24605:25;-1:-1:-1;24668:1:0;24650:10;24605:25;24650:6;:10;:::i;:::-;:14;;24663:1;24650:14;:::i;:::-;24649:20;;;;:::i;:::-;24645:24;;:1;:24;:::i;:::-;24641:28;-1:-1:-1;24680:12:0;24712:7;24703:5;24641:28;24707:1;24703:5;:::i;:::-;24695:14;;:4;:14;:::i;:::-;:24;;;;:::i;:::-;24680:39;-1:-1:-1;24753:1:0;24738:12;24680:39;24738:4;:12;:::i;:::-;:16;;;;:::i;:::-;24734:20;;:1;:20;:::i;:::-;:25;;24757:2;24734:25;:::i;:::-;24730:29;-1:-1:-1;24770:13:0;24795:4;24786:6;24730:29;24786:2;:6;:::i;:::-;:13;;;;:::i;:::-;24770:29;-1:-1:-1;24810:11:0;24844:2;24828:13;24770:29;24828:4;:13;:::i;:::-;:18;;;;:::i;:::-;24824:22;;:1;:22;:::i;:::-;24810:36;-1:-1:-1;24861:11:0;24870:2;24861:6;:11;:::i;:::-;24857:15;-1:-1:-1;24905:6:0;24857:15;24905:2;:6;:::i;:::-;24892:10;:6;24901:1;24892:10;:::i;:::-;:19;;;;:::i;:::-;24883:28;-1:-1:-1;24955:1:0;24947:5;24937:6;24941:2;24937:1;:6;:::i;:::-;24930:14;;:3;:14;:::i;:::-;:22;;;;:::i;:::-;:26;;;;:::i;:::-;24922:34;25017:6;;-1:-1:-1;25049:4:0;-1:-1:-1;24397:665:0;-1:-1:-1;;;;;;24397:665:0:o;25593:550::-;25682:13;25724:4;25716;:12;;25708:30;;;;-1:-1:-1;;;25708:30:0;;14552:2:1;25708:30:0;;;14534:21:1;14591:1;14571:18;;;14564:29;-1:-1:-1;;;14609:18:1;;;14602:35;14654:18;;25708:30:0;14524:154:1;25708:30:0;25765:4;25798:5;25830:3;25749:9;22471:7;26070:1;26063:3;26057:2;26042:11;26051:2;25798:5;26042:11;:::i;:::-;26041:18;;;;:::i;:::-;26026:12;:5;26034:4;26026:12;:::i;:::-;:33;;;;:::i;:::-;26025:41;;;;:::i;:::-;26020:47;;:1;:47;:::i;:::-;:51;;;;:::i;:::-;26004:2;;25978:11;25987:2;25978:6;:11;:::i;:::-;25977:18;;;;:::i;:::-;:23;;25998:2;25977:23;:::i;:::-;25964:10;25973:1;25964:6;:10;:::i;:::-;:36;;;;:::i;:::-;25957:44;;:3;:44;:::i;:::-;:49;;;;:::i;:::-;25942:1;25936:2;25921:11;25930:2;25921:6;:11;:::i;:::-;25920:18;;;;:::i;:::-;25905:12;:5;25913:4;25905:12;:::i;:::-;:33;;;;:::i;:::-;25897:42;;:4;:42;:::i;:::-;:46;;;;:::i;:::-;25860:23;25878:5;25860:4;:23;:::i;:::-;:83;;;;:::i;:::-;:146;;;;:::i;:::-;:211;;;;:::i;:::-;:239;;;;:::i;:::-;25847:252;25593:550;-1:-1:-1;;;;;;;;25593:550:0:o;14:257:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;546:297::-;;666:2;654:9;645:7;641:23;637:32;634:2;;;687:6;679;672:22;634:2;724:9;718:16;777:5;770:13;763:21;756:5;753:32;743:2;;804:6;796;789:22;848:190;;960:2;948:9;939:7;935:23;931:32;928:2;;;981:6;973;966:22;928:2;-1:-1:-1;1009:23:1;;918:120;-1:-1:-1;918:120:1:o;1043:194::-;;1166:2;1154:9;1145:7;1141:23;1137:32;1134:2;;;1187:6;1179;1172:22;1134:2;-1:-1:-1;1215:16:1;;1124:113;-1:-1:-1;1124:113:1:o;1242:289::-;;1352:2;1340:9;1331:7;1327:23;1323:32;1320:2;;;1373:6;1365;1358:22;1320:2;1417:9;1404:23;1467:4;1460:5;1456:16;1449:5;1446:27;1436:2;;1492:6;1484;1477:22;9759:345;9961:2;9943:21;;;10000:2;9980:18;;;9973:30;-1:-1:-1;;;10034:2:1;10019:18;;10012:51;10095:2;10080:18;;9933:171::o;11521:346::-;11723:2;11705:21;;;11762:2;11742:18;;;11735:30;-1:-1:-1;;;11796:2:1;11781:18;;11774:52;11858:2;11843:18;;11695:172::o;15042:348::-;15244:2;15226:21;;;15283:2;15263:18;;;15256:30;15322:26;15317:2;15302:18;;15295:54;15381:2;15366:18;;15216:174::o;16509:267::-;;16576:11;;;16603:10;;-1:-1:-1;;;;;16622:27:1;;;16615:35;;16599:52;16596:2;;;16654:18;;:::i;:::-;-1:-1:-1;;;16701:19:1;;;16694:27;;16686:36;;16683:2;;;16725:18;;:::i;:::-;-1:-1:-1;;16761:9:1;;16556:220::o;16781:128::-;;16852:1;16848:6;16845:1;16842:13;16839:2;;;16858:18;;:::i;:::-;-1:-1:-1;16894:9:1;;16829:80::o;16914:193::-;;16979:1;16969:2;;16984:18;;:::i;:::-;-1:-1:-1;;;17020:18:1;;-1:-1:-1;;17040:13:1;;17016:38;17013:2;;;17057:18;;:::i;:::-;-1:-1:-1;17091:10:1;;16959:148::o;17112:120::-;;17178:1;17168:2;;17183:18;;:::i;:::-;-1:-1:-1;17217:9:1;;17158:74::o;17237:453::-;17333:6;17356:5;17370:314;17419:1;17456:2;17446:8;17443:16;17433:2;;17463:5;;;17433:2;17504:4;17499:3;17495:14;17489:4;17486:24;17483:2;;;17513:18;;:::i;:::-;17563:2;17553:8;17549:17;17546:2;;;17578:16;;;;17546:2;17657:17;;;;;17617:15;;17370:314;;;17314:376;;;;;;;:::o;17695:139::-;;17784:44;-1:-1:-1;;17811:8:1;17805:4;17839:922;17923:8;17913:2;;-1:-1:-1;17964:1:1;17978:5;;17913:2;18012:4;18002:2;;-1:-1:-1;18049:1:1;18063:5;;18002:2;18094:4;18112:1;18107:59;;;;18180:1;18175:183;;;;18087:271;;18107:59;18137:1;18128:10;;18151:5;;;18175:183;18212:3;18202:8;18199:17;18196:2;;;18219:18;;:::i;:::-;18275:1;18265:8;18261:16;18252:25;;18303:3;18296:5;18293:14;18290:2;;;18310:18;;:::i;:::-;18343:5;;;18087:271;;18442:2;18432:8;18429:16;18423:3;18417:4;18414:13;18410:36;18404:2;18394:8;18391:16;18386:2;18380:4;18377:12;18373:35;18370:77;18367:2;;;-1:-1:-1;18479:19:1;;;18514:14;;;18511:2;;;18531:18;;:::i;:::-;18564:5;;18367:2;18611:42;18649:3;18639:8;18633:4;18630:1;18611:42;:::i;:::-;18686:6;18681:3;18677:16;18668:7;18665:29;18662:2;;;18697:18;;:::i;:::-;18735:20;;17903:858;-1:-1:-1;;;;17903:858:1:o;18766:577::-;;-1:-1:-1;;;;;18875:15:1;;;18909;;;18940:11;;;18959:10;;;18953:17;;18936:35;18933:2;;;18974:18;;:::i;:::-;-1:-1:-1;;;19043:15:1;;;19074:11;;;19094;;;19087:19;;19070:37;19067:2;;;19110:18;;:::i;:::-;19156:7;19153:1;19149:15;19139:25;;19209:1;19205:2;19200:11;19197:1;19193:19;19188:2;19184;19180:11;19176:37;19173:2;;;19216:18;;:::i;:::-;19281:1;19277:2;19272:11;19269:1;19265:19;19260:2;19256;19252:11;19248:37;19245:2;;;19288:18;;:::i;:::-;-1:-1:-1;;;19328:9:1;;;;;18817:526;-1:-1:-1;;;18817:526:1:o;19348:168::-;;19454:1;19450;19446:6;19442:14;19439:1;19436:21;19431:1;19424:9;19417:17;19413:45;19410:2;;;19461:18;;:::i;:::-;-1:-1:-1;19501:9:1;;19400:116::o;19521:270::-;;19589:12;;;19617:10;;-1:-1:-1;;;19636:19:1;;19629:27;;19613:44;19610:2;;;19660:18;;:::i;:::-;-1:-1:-1;;;;;19707:27:1;;19700:35;;19692:44;;19689:2;;;19739:18;;:::i;:::-;-1:-1:-1;;19776:9:1;;19569:222::o;19796:125::-;;19864:1;19861;19858:8;19855:2;;;19869:18;;:::i;:::-;-1:-1:-1;19906:9:1;;19845:76::o;19926:135::-;;-1:-1:-1;;19986:17:1;;19983:2;;;20006:18;;:::i;:::-;-1:-1:-1;20053:1:1;20042:13;;19973:88::o;20066:127::-;20127:10;20122:3;20118:20;20115:1;20108:31;20158:4;20155:1;20148:15;20182:4;20179:1;20172:15;20198:127;20259:10;20254:3;20250:20;20247:1;20240:31;20290:4;20287:1;20280:15;20314:4;20311:1;20304:15;20330:131;-1:-1:-1;;;;;20405:31:1;;20395:42;;20385:2;;20451:1;20448;20441:12
Swarm Source
ipfs://0501fa8d7ecc2953141eb4fdf28e194ee0a4d5bcd5478d3c0630568e6e6b121f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.