ERC-20
Overview
Max Total Supply
72,485.206673593848852163 EQSF
Holders
1,013
Market
Price
$0.00 @ 0.000000 FTM
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000008093103089169 EQSFValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
VaultFrankenstein
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-11-21 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.9; interface IERC20Simplified { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20MetadataS is IERC20Simplified { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract ERC20Simplified is Context, IERC20Simplified, IERC20MetadataS { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); } } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } interface IStrategy { function WETH() external view returns (address); function router() external view returns (address); function lpToken() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function farm() external view returns (address); function pid() external view returns (uint256); function hasPid() external view returns (bool); function getTotalCapitalInternal() external view returns (uint256); function getTotalCapital() external view returns (uint256); function getAmountLPFromFarm() external view returns (uint256); function getPendingYel(address) external view returns (uint256); function claimYel(address) external; function setRouter(address) external; function requestWithdraw(address, uint256) external; function withdrawUSDTFee(address) external; function emergencyWithdraw(address) external; function autoCompound() external; function deposit() external payable returns (uint256); function depositAsMigrate() external; function migrate(uint256) external; function updateTWAP() external; function token1TWAP() external view returns (uint256); function token0TWAP() external view returns (uint256); function token1Price() external view returns (uint256); function token0Price() external view returns (uint256); } contract VaultFrankenstein is ERC20Simplified, Ownable { using SafeERC20 for IERC20; using Address for address; mapping(address => uint256) private requestBlock; mapping(uint256 => bool) public nameExist; mapping(uint256 => address) public strategies; mapping(address => bool) public strategyExist; uint256 public constant REQUIRED_NUMBER_OF_BLOCKS = 10; uint256 public NUMBER_OF_BLOCKS_BTW_TX = 2; uint256 public lastExecutableBlockByOwner; uint256 public lastExecutableBlockAfterDeposit; uint256 public depositLimitMIN; uint256 public defaultStrategyID = 0; uint256 public depositLimit; address public governance; // string messages string DIFFERENCE_BLOCK_ERROR = "Difference of blocks is less than REQUIRED_NUMBER_OF_BLOCKS"; string NO_STRATEGY_ERROR = "There is no strategy"; string STRATEGY_DOES_NOT_EXIST = "The Name of strategy with this ID does not exist"; uint256[] private names; event DepositToVault(uint256 amount); event RequestYelFromStrategies(); event PartialMigrate(uint256 amount); event Migrate(uint256 amount); constructor() ERC20Simplified("EQ Shares Frankenstein", "EQSF") { depositLimit = 1000 * 10 ** 18; depositLimitMIN = 1 * 10 ** 17; // 0.1 governance = 0x4e5b3043FEB9f939448e2F791a66C4EA65A315a8; } receive() external payable { deposit(); } modifier onlyOwnerOrGovernance() { require( owner() == _msgSender() || governance == _msgSender(), "The sender is not the owner or governance" ); _; } modifier onlyGovernance() { require(governance == _msgSender(), "The sender is not governance"); _; } modifier whenNotBlocked() { uint256 currentBlock = block.number; if(requestBlock[msg.sender] == 0) { _; requestBlock[msg.sender] = currentBlock; } else { if(_isNotBlockedByTime()) { _; requestBlock[msg.sender] = currentBlock; } else { revert(DIFFERENCE_BLOCK_ERROR); } } } modifier notBlocked() { _checkBlockedByTime(); _executableAfterUpdate(); _; } modifier executableAfterUpdate() { _executableAfterUpdate(); _; } function deposit() public payable notBlocked { require( block.number - lastExecutableBlockAfterDeposit > NUMBER_OF_BLOCKS_BTW_TX, "NUMBER_OF_BLOCKS_BTW_TX blocks is required between deposit" ); require(msg.value >= depositLimitMIN, "Funds should be >= than depositLimitMIN"); autoCompound(); _checkDeposit(getTotalCapital(), msg.value); require(names.length != 0, NO_STRATEGY_ERROR); uint256 shares; uint256 totalCapitalInternal = getTotalCapitalInternal(); uint256 depositorCapitalValue = IStrategy(currentStrategy()).deposit{value: msg.value}(); if (totalCapitalInternal == 0 || totalSupply() == 0) { shares = depositorCapitalValue; } else { uint256 FTMperShare = totalCapitalInternal * (10**12) / totalSupply(); shares = depositorCapitalValue * (10**12) / FTMperShare; } _mint(msg.sender, shares); lastExecutableBlockAfterDeposit = block.number; emit DepositToVault(depositorCapitalValue); } function requestWithdraw(uint256 _shares) public whenNotBlocked { require(names.length != 0, NO_STRATEGY_ERROR); require(totalSupply() != 0, "Total share value is zero"); require(_shares > 0, "Amount of shares can not be a zero value"); autoCompound(); uint256 percent = _shares * 100 * 10**12 / totalSupply(); require(_shares <= totalSupply(), "Percent can not be more than 100"); _burn(msg.sender, _shares); _requestYelFromStrategies(msg.sender, percent); emit RequestYelFromStrategies(); } function claimYel() public notBlocked { autoCompound(); uint256 _YELamount = 0; uint256 _YELamountTotal = 0; for (uint256 i; i < names.length; i++) { _YELamount = IStrategy(strategies[names[i]]).getPendingYel(msg.sender); if(_YELamount > 0) { IStrategy(strategies[names[i]]).claimYel(msg.sender); _YELamountTotal += _YELamount; } } require(_YELamountTotal > 0, "You don't have any pending YEL"); } function setDefaultStrategy(uint256 _nameID) public onlyOwnerOrGovernance { _checkParameters(_nameID); defaultStrategyID = _nameID; } function getPendingYel(address _address) public view returns (uint256 _YELamount) { for (uint256 i; i < names.length; i++) { _YELamount += IStrategy(strategies[names[i]]).getPendingYel(_address); } } function getRemainingBlocks(address _address) public view returns (uint256) { // just double check if the user uses the contract at the first time if (requestBlock[_address] == 0) { return 0; } uint256 amountFromLast = block.number - requestBlock[_address]; if (amountFromLast >= REQUIRED_NUMBER_OF_BLOCKS) return 0; else return REQUIRED_NUMBER_OF_BLOCKS - amountFromLast; } function nameIDs() public view returns (uint256[] memory) { return names; } function nameIDLength() public view returns(uint256) { return names.length; } function currentStrategy() public view returns (address) { require(names.length > 0, "This vault does not have any strategies"); return strategies[defaultStrategyID]; } function strategyInfo(uint256 _nameID) public view returns ( address _router, address _lpToken, address _token1, address _token0, address _farm, string memory _pid, uint256 _totalLP, uint256 _totalCapital, uint256 _totalCapitalInternal) { require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST); _router = IStrategy(strategies[_nameID]).router(); _lpToken = IStrategy(strategies[_nameID]).lpToken(); _token1 = IStrategy(strategies[_nameID]).token1(); _token0 = IStrategy(strategies[_nameID]).token0(); _farm = IStrategy(strategies[_nameID]).farm(); if(IStrategy(strategies[_nameID]).hasPid()) { _pid = Strings.toString(IStrategy(strategies[_nameID]).pid()); } else { _pid = "No pid"; } _totalCapital = IStrategy(strategies[_nameID]).getTotalCapital(); _totalCapitalInternal = IStrategy(strategies[_nameID]).getTotalCapitalInternal(); _totalLP = IStrategy(strategies[_nameID]).getAmountLPFromFarm(); } function strategyInfo2(uint256 _nameID) public view returns ( uint256 _token1TWAP, uint256 _token0TWAP, uint256 _token1Price, uint256 _token0Price) { require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST); address _strategy = strategies[_nameID]; _token1TWAP = IStrategy(_strategy).token1TWAP(); _token0TWAP = IStrategy(_strategy).token0TWAP(); _token1Price = IStrategy(_strategy).token1Price(); _token0Price = IStrategy(_strategy).token0Price(); } function autoCompound() public executableAfterUpdate { require(names.length != 0, NO_STRATEGY_ERROR); for (uint256 i = 0; i < names.length; i++) { IStrategy(strategies[names[i]]).autoCompound(); } } function getTotalCapital() public view returns (uint256 totalCapital) { require(names.length != 0, NO_STRATEGY_ERROR); for (uint256 i = 0; i < names.length; i++) { totalCapital += IStrategy(strategies[names[i]]).getTotalCapital(); } } function getTotalCapitalInternal() public view returns (uint256 totalCapital) { require(names.length != 0, NO_STRATEGY_ERROR); for (uint256 i = 0; i < names.length; i++) { totalCapital += IStrategy(strategies[names[i]]).getTotalCapitalInternal(); } } function withdrawFee() onlyOwner public { for(uint256 i = 0; i < names.length; i++) { IStrategy(strategies[names[i]]).withdrawUSDTFee(msg.sender); } } function setNumberOfBlocksBtwTX(uint256 _amount) onlyOwner public { NUMBER_OF_BLOCKS_BTW_TX = _amount; } function updateTWAP() onlyOwner public { for(uint256 i = 0; i < names.length; i++) { IStrategy(strategies[names[i]]).updateTWAP(); } lastExecutableBlockByOwner = block.number; } function emergencyWithdraw() public onlyGovernance { for (uint256 i; i < names.length; i++) { IStrategy(strategies[names[i]]).emergencyWithdraw(msg.sender); } } function setGovernance(address _governance) external onlyOwner { require( _governance != address(0), "Government can not be a zero address" ); governance = _governance; } function setDepositLimit(uint256 _amount) external onlyOwnerOrGovernance { depositLimit = _amount; } function addStrategy(address _newStrategy, uint256 _nameID) public onlyOwnerOrGovernance { require(_newStrategy != address(0), "The strategy can not be a zero address"); require(strategies[_nameID] == address(0), "This strategy is not empty"); require(!strategyExist[_newStrategy], "This strategy already exists"); if (!nameExist[_nameID]) { names.push(_nameID); nameExist[_nameID] = true; strategyExist[_newStrategy] = true; } strategies[_nameID] = _newStrategy; } function removeStrategy(uint256 _nameID) public onlyOwnerOrGovernance { _checkParameters(_nameID); require( strategies[_nameID] != currentStrategy(), "Can not remove the current strategy" ); require(IStrategy(strategies[_nameID]).getTotalCapitalInternal() == 0, "Total capital internal is not zero" ); require(IStrategy(strategies[_nameID]).getTotalCapital() == 0, "Total capital is not zero" ); // continue removing strategy nameExist[_nameID] = false; strategyExist[strategies[_nameID]] = false; strategies[_nameID] = address(0); if(names.length != 1) { for(uint256 i = 0; i < names.length; i++){ if(names[i] == _nameID) { if(i != names.length-1) { names[i] = names[names.length-1]; } names.pop(); } } } else { names.pop(); } } function setRouterForStrategy(address _newRouter, uint256 _nameID) public onlyOwnerOrGovernance { _checkParameters(_nameID); require(_newRouter != address(0), "Router can not be a zero address"); IStrategy(strategies[_nameID]).setRouter(_newRouter); } function migrate( uint256 _nameIdFrom, uint256 _amountInPercent, uint256 _nameIdTo) public onlyOwnerOrGovernance { _migrate(_nameIdFrom, _amountInPercent, _nameIdTo); } function withdrawSuddenTokens(address _token) public onlyOwner { IERC20(_token).transfer(payable(msg.sender), IERC20(_token).balanceOf(address(this))); } function _executableAfterUpdate() internal view { require( block.number - lastExecutableBlockByOwner > NUMBER_OF_BLOCKS_BTW_TX, "NUMBER_OF_BLOCKS_BTW_TX blocks is required" ); } function _checkParameters(uint256 _nameID) internal view { require(names.length > 1, "Not enough strategies"); require(nameExist[_nameID], STRATEGY_DOES_NOT_EXIST); } function _isNotBlockedByTime() internal view returns (bool) { return block.number - requestBlock[msg.sender] >= REQUIRED_NUMBER_OF_BLOCKS; } function _checkBlockedByTime() internal view { require(_isNotBlockedByTime(), DIFFERENCE_BLOCK_ERROR); } function _migrate(uint256 _nameIdFrom, uint256 _amountInPercent, uint256 _nameIdTo) internal { // TODO: return error if totalCapital on strategy 0 _checkParameters(_nameIdFrom); require(nameExist[_nameIdTo], "The _nameIdTo value does not exist"); require( _amountInPercent > 0 && _amountInPercent <= 100, "The _amountInPercent value sould be more than 0 and less than 100" ); autoCompound(); address WETH = IStrategy(strategies[_nameIdFrom]).WETH(); // take Native Tokens from old strategy IStrategy(strategies[_nameIdFrom]).migrate(_amountInPercent); uint256 _balance = IERC20(WETH).balanceOf(address(this)); if(_balance > 0){ // put Native Tokens to new strategy IERC20(WETH).safeTransfer(strategies[_nameIdTo], _balance); IStrategy(strategies[_nameIdTo]).depositAsMigrate(); } emit PartialMigrate(_amountInPercent); } function _requestYelFromStrategies(address _receiver, uint256 _percent) internal { for (uint256 i; i < names.length; i++) { IStrategy(strategies[names[i]]).requestWithdraw(_receiver, _percent); } } function _checkDeposit(uint256 _totalCapital, uint256 _depositValue) internal view { require(_totalCapital + _depositValue <= depositLimit, "Deposit is limited by contract"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositToVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PartialMigrate","type":"event"},{"anonymous":false,"inputs":[],"name":"RequestYelFromStrategies","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NUMBER_OF_BLOCKS_BTW_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUIRED_NUMBER_OF_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"},{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"addStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimYel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultStrategyID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositLimitMIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getPendingYel","outputs":[{"internalType":"uint256","name":"_YELamount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRemainingBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapital","outputs":[{"internalType":"uint256","name":"totalCapital","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapitalInternal","outputs":[{"internalType":"uint256","name":"totalCapital","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastExecutableBlockAfterDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastExecutableBlockByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameIdFrom","type":"uint256"},{"internalType":"uint256","name":"_amountInPercent","type":"uint256"},{"internalType":"uint256","name":"_nameIdTo","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nameExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameIDLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameIDs","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":"uint256","name":"_nameID","type":"uint256"}],"name":"removeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"setDefaultStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setDepositLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setNumberOfBlocksBtwTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouter","type":"address"},{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"setRouterForStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strategyExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"strategyInfo","outputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_farm","type":"address"},{"internalType":"string","name":"_pid","type":"string"},{"internalType":"uint256","name":"_totalLP","type":"uint256"},{"internalType":"uint256","name":"_totalCapital","type":"uint256"},{"internalType":"uint256","name":"_totalCapitalInternal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nameID","type":"uint256"}],"name":"strategyInfo2","outputs":[{"internalType":"uint256","name":"_token1TWAP","type":"uint256"},{"internalType":"uint256","name":"_token0TWAP","type":"uint256"},{"internalType":"uint256","name":"_token1Price","type":"uint256"},{"internalType":"uint256","name":"_token0Price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateTWAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawSuddenTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6002600a556000600e5560e0604052603b60808181529062003c3360a03980516200003391601191602090910190620001e9565b506040805180820190915260148082527f5468657265206973206e6f20737472617465677900000000000000000000000060209092019182526200007a91601291620001e9565b5060405180606001604052806030815260200162003c6e603091398051620000ab91601391602090910190620001e9565b50348015620000b957600080fd5b50604080518082018252601681527f455120536861726573204672616e6b656e737465696e0000000000000000000060208083019182528351808501909452600484526322a8a9a360e11b9084015281519192916200011b91600391620001e9565b50805162000131906004906020840190620001e9565b5050506200014e620001486200019360201b60201c565b62000197565b683635c9adc5dea00000600f5567016345785d8a0000600d55601080546001600160a01b031916734e5b3043feb9f939448e2f791a66c4ea65a315a8179055620002cc565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f7906200028f565b90600052602060002090601f0160209004810192826200021b576000855562000266565b82601f106200023657805160ff191683800117855562000266565b8280016001018555821562000266579182015b828111156200026657825182559160200191906001019062000249565b506200027492915062000278565b5090565b5b8082111562000274576000815560010162000279565b600181811c90821680620002a457607f821691505b60208210811415620002c657634e487b7160e01b600052602260045260246000fd5b50919050565b61395780620002dc6000396000f3fe60806040526004361061026b5760003560e01c8063ab033ea911610144578063d0e30db0116100b6578063e941fa781161007a578063e941fa7814610736578063ecf708581461074b578063f2fde38b14610761578063f705c03b14610781578063f921215d146107a1578063fc039165146107c157600080fd5b8063d0e30db014610693578063d574ea3d1461069b578063d84dbb1c146106d1578063db2e21bc14610701578063e1a4877a1461071657600080fd5b8063bb91c33911610108578063bb91c339146105d2578063bdc8144b14610607578063c03601cc14610627578063c0cbbca61461063d578063c6cf43861461065d578063c9411e221461067357600080fd5b8063ab033ea914610527578063b032cf6c14610547578063b070a44f1461055d578063b42a8e5514610572578063b44d0b9f1461059257600080fd5b80635eb674b6116101dd578063745400c9116101a1578063745400c91461048a578063821c0576146104aa57806388c95018146104bf5780638da5cb5b146104df57806395d89b41146104fd5780639bea590e1461051257600080fd5b80635eb674b6146103f557806366f2b1a7146104155780636a1ceb2d1461042a57806370a082311461043f578063715018a61461047557600080fd5b80632d73fc081161022f5780632d73fc081461033e5780632d751e0814610354578063313ce5671461036957806351a5cc5b1461038557806354b35d001461039b5780635aa6e675146103bd57600080fd5b806302ee8de91461027f57806305131172146102a757806306fdde03146102c757806318160ddd146102e95780631c7b048d146102fe57600080fd5b3661027a576102786107d6565b005b600080fd5b34801561028b57600080fd5b50610294610a3d565b6040519081526020015b60405180910390f35b3480156102b357600080fd5b506102786102c23660046134aa565b610b47565b3480156102d357600080fd5b506102dc610c74565b60405161029e9190613523565b3480156102f557600080fd5b50600254610294565b34801561030a57600080fd5b5061032e6103193660046134aa565b60096020526000908152604090205460ff1681565b604051901515815260200161029e565b34801561034a57600080fd5b50610294600c5481565b34801561036057600080fd5b50601454610294565b34801561037557600080fd5b506040516012815260200161029e565b34801561039157600080fd5b50610294600e5481565b3480156103a757600080fd5b506103b0610d06565b60405161029e9190613536565b3480156103c957600080fd5b506010546103dd906001600160a01b031681565b6040516001600160a01b03909116815260200161029e565b34801561040157600080fd5b5061027861041036600461357a565b610d5d565b34801561042157600080fd5b50610294600a81565b34801561043657600080fd5b506103dd610e6b565b34801561044b57600080fd5b5061029461045a3660046134aa565b6001600160a01b031660009081526020819052604090205490565b34801561048157600080fd5b50610278610eec565b34801561049657600080fd5b506102786104a53660046135a6565b610f22565b3480156104b657600080fd5b50610278611139565b3480156104cb57600080fd5b506102786104da3660046135bf565b61121e565b3480156104eb57600080fd5b506005546001600160a01b03166103dd565b34801561050957600080fd5b506102dc61126d565b34801561051e57600080fd5b5061027861127c565b34801561053357600080fd5b506102786105423660046134aa565b611363565b34801561055357600080fd5b50610294600a5481565b34801561056957600080fd5b50610278611411565b34801561057e57600080fd5b5061029461058d3660046134aa565b6115f1565b34801561059e57600080fd5b506105b26105ad3660046135a6565b6116d3565b60408051948552602085019390935291830152606082015260800161029e565b3480156105de57600080fd5b506105f26105ed3660046135a6565b6118f6565b60405161029e999897969594939291906135eb565b34801561061357600080fd5b506102786106223660046135a6565b611ecc565b34801561063357600080fd5b50610294600d5481565b34801561064957600080fd5b506102786106583660046135a6565b611f10565b34801561066957600080fd5b50610294600b5481565b34801561067f57600080fd5b5061027861068e36600461357a565b6122de565b6102786107d6565b3480156106a757600080fd5b506103dd6106b63660046135a6565b6008602052600090815260409020546001600160a01b031681565b3480156106dd57600080fd5b5061032e6106ec3660046135a6565b60076020526000908152604090205460ff1681565b34801561070d57600080fd5b50610278612502565b34801561072257600080fd5b506102946107313660046134aa565b61260c565b34801561074257600080fd5b50610278612679565b34801561075757600080fd5b50610294600f5481565b34801561076d57600080fd5b5061027861077c3660046134aa565b612753565b34801561078d57600080fd5b5061027861079c3660046135a6565b6127eb565b3480156107ad57600080fd5b506102786107bc3660046135a6565b612838565b3480156107cd57600080fd5b50610294612867565b6107de61296d565b6107e6612995565b600a54600c546107f69043613669565b1161086e5760405162461bcd60e51b815260206004820152603a60248201527f4e554d4245525f4f465f424c4f434b535f4254575f545820626c6f636b73206960448201527f73207265717569726564206265747765656e206465706f73697400000000000060648201526084015b60405180910390fd5b600d543410156108d05760405162461bcd60e51b815260206004820152602760248201527f46756e64732073686f756c64206265203e3d207468616e206465706f7369744c60448201526634b6b4ba26a4a760c91b6064820152608401610865565b6108d8611139565b6108e96108e3612867565b34612a05565b60145460129061090c5760405162461bcd60e51b815260040161086591906136b5565b50600080610918610a3d565b90506000610924610e6b565b6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016020604051808303818588803b15801561095e57600080fd5b505af1158015610972573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610997919061375d565b90508115806109a65750600254155b156109b3578092506109f7565b60006109be60025490565b6109cd8464e8d4a51000613776565b6109d791906137ab565b9050806109e98364e8d4a51000613776565b6109f391906137ab565b9350505b610a013384612a60565b43600c556040518181527f5c77db97122dd8c9d62f829c415e3e3a2c5ff855518cff951750ce07fa0cd4e39060200160405180910390a1505050565b601454600090601290610a635760405162461bcd60e51b815260040161086591906136b5565b5060005b601454811015610b43576008600060148381548110610a8857610a886137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03166302ee8de96040518163ffffffff1660e01b815260040160206040518083038186803b158015610aed57600080fd5b505afa158015610b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b25919061375d565b610b2f90836137d5565b915080610b3b816137ed565b915050610a67565b5090565b6005546001600160a01b03163314610b715760405162461bcd60e51b815260040161086590613808565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b158015610bba57600080fd5b505afa158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf2919061375d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610c3857600080fd5b505af1158015610c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c70919061383d565b5050565b606060038054610c8390613680565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf90613680565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b5050505050905090565b60606014805480602002602001604051908101604052809291908181526020018280548015610cfc57602002820191906000526020600020905b815481526020019060010190808311610d40575050505050905090565b6005546001600160a01b0316331480610d8057506010546001600160a01b031633145b610d9c5760405162461bcd60e51b81526004016108659061385f565b610da581612b3f565b6001600160a01b038216610dfb5760405162461bcd60e51b815260206004820181905260248201527f526f757465722063616e206e6f742062652061207a65726f20616464726573736044820152606401610865565b6000818152600860205260409081902054905163c0d7865560e01b81526001600160a01b0384811660048301529091169063c0d7865590602401600060405180830381600087803b158015610e4f57600080fd5b505af1158015610e63573d6000803e3d6000fd5b505050505050565b601454600090610ecd5760405162461bcd60e51b815260206004820152602760248201527f54686973207661756c7420646f6573206e6f74206861766520616e79207374726044820152666174656769657360c81b6064820152608401610865565b50600e546000908152600860205260409020546001600160a01b031690565b6005546001600160a01b03163314610f165760405162461bcd60e51b815260040161086590613808565b610f206000612bbb565b565b3360009081526006602052604090205443906110ee57601454601290610f5b5760405162461bcd60e51b815260040161086591906136b5565b50600254610fab5760405162461bcd60e51b815260206004820152601960248201527f546f74616c2073686172652076616c7565206973207a65726f000000000000006044820152606401610865565b6000821161100c5760405162461bcd60e51b815260206004820152602860248201527f416d6f756e74206f66207368617265732063616e206e6f742062652061207a65604482015267726f2076616c756560c01b6064820152608401610865565b611014611139565b600061101f60025490565b61102a846064613776565b6110399064e8d4a51000613776565b61104391906137ab565b905061104e60025490565b83111561109d5760405162461bcd60e51b815260206004820181905260248201527f50657263656e742063616e206e6f74206265206d6f7265207468616e203130306044820152606401610865565b6110a73384612c0d565b6110b13382612d5b565b6040517f9b03fe2597ba68323093f58db21a496f6639cdfb717bfc837078f99f41acf38e90600090a1503360009081526006602052604090205550565b6110f6612e14565b1561111e57601454601290610f5b5760405162461bcd60e51b815260040161086591906136b5565b601160405162461bcd60e51b815260040161086591906136b5565b611141612995565b6014546012906111645760405162461bcd60e51b815260040161086591906136b5565b5060005b60145481101561121b576008600060148381548110611189576111896137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663821c05766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050508080611213906137ed565b915050611168565b50565b6005546001600160a01b031633148061124157506010546001600160a01b031633145b61125d5760405162461bcd60e51b81526004016108659061385f565b611268838383612e38565b505050565b606060048054610c8390613680565b6005546001600160a01b031633146112a65760405162461bcd60e51b815260040161086590613808565b60005b60145481101561135c5760086000601483815481106112ca576112ca6137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316639bea590e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561133157600080fd5b505af1158015611345573d6000803e3d6000fd5b505050508080611354906137ed565b9150506112a9565b5043600b55565b6005546001600160a01b0316331461138d5760405162461bcd60e51b815260040161086590613808565b6001600160a01b0381166113ef5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6d656e742063616e206e6f742062652061207a65726f206164646044820152637265737360e01b6064820152608401610865565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b61141961296d565b611421612995565b611429611139565b60008060005b6014548110156115a0576008600060148381548110611450576114506137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b42a8e5560e01b81523360048201526001600160a01b039091169063b42a8e559060240160206040518083038186803b1580156114af57600080fd5b505afa1580156114c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e7919061375d565b9250821561158e576008600060148381548110611506576115066137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b06dd06f60e01b81523360048201526001600160a01b039091169063b06dd06f90602401600060405180830381600087803b15801561156757600080fd5b505af115801561157b573d6000803e3d6000fd5b50505050828261158b91906137d5565b91505b80611598816137ed565b91505061142f565b5060008111610c705760405162461bcd60e51b815260206004820152601e60248201527f596f7520646f6e2774206861766520616e792070656e64696e672059454c00006044820152606401610865565b6000805b6014548110156116cd576008600060148381548110611616576116166137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b42a8e5560e01b81526001600160a01b0385811660048301529091169063b42a8e559060240160206040518083038186803b15801561167757600080fd5b505afa15801561168b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116af919061375d565b6116b990836137d5565b9150806116c5816137ed565b9150506115f5565b50919050565b60008181526007602052604081205481908190819060139060ff1661170b5760405162461bcd60e51b815260040161086591906136b5565b5060008581526008602090815260409182902054825163d920a90160e01b815292516001600160a01b0390911692839263d920a90192600480840193829003018186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611793919061375d565b9450806001600160a01b031663ae4bbfc96040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ce57600080fd5b505afa1580156117e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611806919061375d565b9350806001600160a01b0316633750440d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611879919061375d565b9250806001600160a01b0316639b1b4d496040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ec919061375d565b9150509193509193565b600081815260076020526040812054819081908190819060609082908190819060139060ff166119395760405162461bcd60e51b815260040161086591906136b5565b5060008a8152600860209081526040918290205482516303e21fa960e61b815292516001600160a01b039091169263f887ea40926004808301939192829003018186803b15801561198957600080fd5b505afa15801561199d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c191906138a8565b60008b815260086020908152604091829020548251635fcbd28560e01b81529251939c506001600160a01b031692635fcbd285926004808201939291829003018186803b158015611a1157600080fd5b505afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906138a8565b60008b81526008602090815260409182902054825163d21220a760e01b81529251939b506001600160a01b03169263d21220a7926004808201939291829003018186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad191906138a8565b60008b815260086020908152604091829020548251630dfe168160e01b81529251939a506001600160a01b031692630dfe1681926004808201939291829003018186803b158015611b2157600080fd5b505afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5991906138a8565b60008b8152600860209081526040918290205482516336e9332d60e01b815292519399506001600160a01b0316926336e9332d926004808201939291829003018186803b158015611ba957600080fd5b505afa158015611bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be191906138a8565b60008b81526008602090815260409182902054825163a644d68560e01b815292519398506001600160a01b03169263a644d685926004808201939291829003018186803b158015611c3157600080fd5b505afa158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c69919061383d565b15611d045760008a815260086020908152604091829020548251633c41a11560e21b81529251611cfd936001600160a01b039092169263f10684549260048082019391829003018186803b158015611cc057600080fd5b505afa158015611cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf8919061375d565b613177565b9350611d26565b60405180604001604052806006815260200165139bc81c1a5960d21b81525093505b60008a81526008602090815260409182902054825163fc03916560e01b815292516001600160a01b039091169263fc039165926004808301939192829003018186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad919061375d565b60008b8152600860209081526040918290205482516302ee8de960e01b815292519395506001600160a01b0316926302ee8de9926004808201939291829003018186803b158015611dfd57600080fd5b505afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e35919061375d565b60008b815260086020908152604091829020548251639ad160e360e01b815292519394506001600160a01b031692639ad160e3926004808201939291829003018186803b158015611e8557600080fd5b505afa158015611e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebd919061375d565b92509193959799909294969850565b6005546001600160a01b0316331480611eef57506010546001600160a01b031633145b611f0b5760405162461bcd60e51b81526004016108659061385f565b600f55565b6005546001600160a01b0316331480611f3357506010546001600160a01b031633145b611f4f5760405162461bcd60e51b81526004016108659061385f565b611f5881612b3f565b611f60610e6b565b6000828152600860205260409020546001600160a01b0390811691161415611fd65760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f742072656d6f7665207468652063757272656e7420737472617460448201526265677960e81b6064820152608401610865565b6000818152600860209081526040918290205482516302ee8de960e01b815292516001600160a01b03909116926302ee8de9926004808301939192829003018186803b15801561202557600080fd5b505afa158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d919061375d565b156120b55760405162461bcd60e51b815260206004820152602260248201527f546f74616c206361706974616c20696e7465726e616c206973206e6f74207a65604482015261726f60f01b6064820152608401610865565b60008181526008602090815260409182902054825163fc03916560e01b815292516001600160a01b039091169263fc039165926004808301939192829003018186803b15801561210457600080fd5b505afa158015612118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213c919061375d565b156121895760405162461bcd60e51b815260206004820152601960248201527f546f74616c206361706974616c206973206e6f74207a65726f000000000000006044820152606401610865565b6000818152600760209081526040808320805460ff19908116909155600880845282852080546001600160a01b031686526009855292852080549092169091559284905291905280546001600160a01b03191690556014546001146122b45760005b601454811015610c70578160148281548110612209576122096137bf565b906000526020600020015414156122a25760145461222990600190613669565b811461227a576014805461223f90600190613669565b8154811061224f5761224f6137bf565b90600052602060002001546014828154811061226d5761226d6137bf565b6000918252602090912001555b601480548061228b5761228b6138c5565b600190038181906000526020600020016000905590555b806122ac816137ed565b9150506121eb565b60148054806122c5576122c56138c5565b6001900381819060005260206000200160009055905550565b6005546001600160a01b031633148061230157506010546001600160a01b031633145b61231d5760405162461bcd60e51b81526004016108659061385f565b6001600160a01b0382166123825760405162461bcd60e51b815260206004820152602660248201527f5468652073747261746567792063616e206e6f742062652061207a65726f206160448201526564647265737360d01b6064820152608401610865565b6000818152600860205260409020546001600160a01b0316156123e75760405162461bcd60e51b815260206004820152601a60248201527f54686973207374726174656779206973206e6f7420656d7074790000000000006044820152606401610865565b6001600160a01b03821660009081526009602052604090205460ff16156124505760405162461bcd60e51b815260206004820152601c60248201527f5468697320737472617465677920616c726561647920657869737473000000006044820152606401610865565b60008181526007602052604090205460ff166124d4576014805460018181019092557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec018290556000828152600760209081526040808320805460ff1990811686179091556001600160a01b03871684526009909252909120805490911690911790555b600090815260086020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6010546001600160a01b0316331461255c5760405162461bcd60e51b815260206004820152601c60248201527f5468652073656e646572206973206e6f7420676f7665726e616e6365000000006044820152606401610865565b60005b60145481101561121b576008600060148381548110612580576125806137bf565b60009182526020808320919091015483528201929092526040908101909120549051631bfc726f60e21b81523360048201526001600160a01b0390911690636ff1c9bc90602401600060405180830381600087803b1580156125e157600080fd5b505af11580156125f5573d6000803e3d6000fd5b505050508080612604906137ed565b91505061255f565b6001600160a01b03811660009081526006602052604081205461263157506000919050565b6001600160a01b0382166000908152600660205260408120546126549043613669565b9050600a81106126675750600092915050565b61267281600a613669565b9392505050565b6005546001600160a01b031633146126a35760405162461bcd60e51b815260040161086590613808565b60005b60145481101561121b5760086000601483815481106126c7576126c76137bf565b60009182526020808320919091015483528201929092526040908101909120549051630987b04f60e41b81523360048201526001600160a01b039091169063987b04f090602401600060405180830381600087803b15801561272857600080fd5b505af115801561273c573d6000803e3d6000fd5b50505050808061274b906137ed565b9150506126a6565b6005546001600160a01b0316331461277d5760405162461bcd60e51b815260040161086590613808565b6001600160a01b0381166127e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b61121b81612bbb565b6005546001600160a01b031633148061280e57506010546001600160a01b031633145b61282a5760405162461bcd60e51b81526004016108659061385f565b61283381612b3f565b600e55565b6005546001600160a01b031633146128625760405162461bcd60e51b815260040161086590613808565b600a55565b60145460009060129061288d5760405162461bcd60e51b815260040161086591906136b5565b5060005b601454811015610b435760086000601483815481106128b2576128b26137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663fc0391656040518163ffffffff1660e01b815260040160206040518083038186803b15801561291757600080fd5b505afa15801561292b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294f919061375d565b61295990836137d5565b915080612965816137ed565b915050612891565b612975612e14565b60119061121b5760405162461bcd60e51b815260040161086591906136b5565b600a54600b546129a59043613669565b11610f205760405162461bcd60e51b815260206004820152602a60248201527f4e554d4245525f4f465f424c4f434b535f4254575f545820626c6f636b7320696044820152691cc81c995c5d5a5c995960b21b6064820152608401610865565b600f54612a1282846137d5565b1115610c705760405162461bcd60e51b815260206004820152601e60248201527f4465706f736974206973206c696d6974656420627920636f6e747261637400006044820152606401610865565b6001600160a01b038216612ab65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610865565b8060026000828254612ac891906137d5565b90915550506001600160a01b03821660009081526020819052604081208054839290612af59084906137d5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b601454600110612b895760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f756768207374726174656769657360581b6044820152606401610865565b60008181526007602052604090205460139060ff16610c705760405162461bcd60e51b815260040161086591906136b5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216612c6d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610865565b6001600160a01b03821660009081526020819052604090205481811015612ce15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610865565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612d10908490613669565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60005b601454811015611268576008600060148381548110612d7f57612d7f6137bf565b6000918252602080832091909101548352820192909252604090810190912054905163072f436560e31b81526001600160a01b038581166004830152602482018590529091169063397a1b2890604401600060405180830381600087803b158015612de957600080fd5b505af1158015612dfd573d6000803e3d6000fd5b505050508080612e0c906137ed565b915050612d5e565b33600090815260066020526040812054600a90612e319043613669565b1015905090565b612e4183612b3f565b60008181526007602052604090205460ff16612eaa5760405162461bcd60e51b815260206004820152602260248201527f546865205f6e616d654964546f2076616c756520646f6573206e6f74206578696044820152611cdd60f21b6064820152608401610865565b600082118015612ebb575060648211155b612f375760405162461bcd60e51b815260206004820152604160248201527f546865205f616d6f756e74496e50657263656e742076616c756520736f756c6460448201527f206265206d6f7265207468616e203020616e64206c657373207468616e2031306064820152600360fc1b608482015260a401610865565b612f3f611139565b60008381526008602090815260408083205481516315ab88c960e31b815291516001600160a01b039091169263ad5c46489260048082019391829003018186803b158015612f8c57600080fd5b505afa158015612fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc491906138a8565b600085815260086020526040908190205490516308a960c160e31b8152600481018690529192506001600160a01b03169063454b060890602401600060405180830381600087803b15801561301857600080fd5b505af115801561302c573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03841691506370a082319060240160206040518083038186803b15801561307257600080fd5b505afa158015613086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130aa919061375d565b9050801561313d576000838152600860205260409020546130d8906001600160a01b0384811691168361327d565b6000838152600860205260408082205481516336bcdbf360e11b815291516001600160a01b0390911692636d79b7e6926004808201939182900301818387803b15801561312457600080fd5b505af1158015613138573d6000803e3d6000fd5b505050505b6040518481527ff62d3ca87d830abd296c5769ca4ad2d1e22910c4754d33689394d55287c033369060200160405180910390a15050505050565b60608161319b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156131c557806131af816137ed565b91506131be9050600a836137ab565b915061319f565b60008167ffffffffffffffff8111156131e0576131e06138db565b6040519080825280601f01601f19166020018201604052801561320a576020820181803683370190505b5090505b84156132755761321f600183613669565b915061322c600a866138f1565b6132379060306137d5565b60f81b81838151811061324c5761324c6137bf565b60200101906001600160f81b031916908160001a90535061326e600a866137ab565b945061320e565b949350505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526112689286929160009161330d91851690849061338a565b805190915015611268578080602001905181019061332b919061383d565b6112685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610865565b6060613275848460008585843b6133e35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610865565b600080866001600160a01b031685876040516133ff9190613905565b60006040518083038185875af1925050503d806000811461343c576040519150601f19603f3d011682016040523d82523d6000602084013e613441565b606091505b509150915061345182828661345c565b979650505050505050565b6060831561346b575081612672565b82511561347b5782518084602001fd5b8160405162461bcd60e51b81526004016108659190613523565b6001600160a01b038116811461121b57600080fd5b6000602082840312156134bc57600080fd5b813561267281613495565b60005b838110156134e25781810151838201526020016134ca565b838111156134f1576000848401525b50505050565b6000815180845261350f8160208601602086016134c7565b601f01601f19169290920160200192915050565b60208152600061267260208301846134f7565b6020808252825182820181905260009190848201906040850190845b8181101561356e57835183529284019291840191600101613552565b50909695505050505050565b6000806040838503121561358d57600080fd5b823561359881613495565b946020939093013593505050565b6000602082840312156135b857600080fd5b5035919050565b6000806000606084860312156135d457600080fd5b505081359360208301359350604090920135919050565b6001600160a01b038a811682528981166020830152888116604083015287811660608301528616608082015261012060a08201819052600090613630838201886134f7565b60c0840196909652505060e0810192909252610100909101529695505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561367b5761367b613653565b500390565b600181811c9082168061369457607f821691505b602082108114156116cd57634e487b7160e01b600052602260045260246000fd5b600060208083526000845481600182811c9150808316806136d757607f831692505b8583108114156136f557634e487b7160e01b85526022600452602485fd5b87860183815260200181801561371257600181146137235761374e565b60ff1986168252878201965061374e565b60008b81526020902060005b868110156137485781548482015290850190890161372f565b83019750505b50949998505050505050505050565b60006020828403121561376f57600080fd5b5051919050565b600081600019048311821515161561379057613790613653565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826137ba576137ba613795565b500490565b634e487b7160e01b600052603260045260246000fd5b600082198211156137e8576137e8613653565b500190565b600060001982141561380157613801613653565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561384f57600080fd5b8151801515811461267257600080fd5b60208082526029908201527f5468652073656e646572206973206e6f7420746865206f776e6572206f7220676040820152686f7665726e616e636560b81b606082015260800190565b6000602082840312156138ba57600080fd5b815161267281613495565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008261390057613900613795565b500690565b600082516139178184602087016134c7565b919091019291505056fea264697066735822122008273b71d8221ccc3f4edc3582a1ccfaf4973d0b4fbace3a196eb8b9eb956be764736f6c63430008090033446966666572656e6365206f6620626c6f636b73206973206c657373207468616e2052455155495245445f4e554d4245525f4f465f424c4f434b53546865204e616d65206f662073747261746567792077697468207468697320494420646f6573206e6f74206578697374
Deployed Bytecode
0x60806040526004361061026b5760003560e01c8063ab033ea911610144578063d0e30db0116100b6578063e941fa781161007a578063e941fa7814610736578063ecf708581461074b578063f2fde38b14610761578063f705c03b14610781578063f921215d146107a1578063fc039165146107c157600080fd5b8063d0e30db014610693578063d574ea3d1461069b578063d84dbb1c146106d1578063db2e21bc14610701578063e1a4877a1461071657600080fd5b8063bb91c33911610108578063bb91c339146105d2578063bdc8144b14610607578063c03601cc14610627578063c0cbbca61461063d578063c6cf43861461065d578063c9411e221461067357600080fd5b8063ab033ea914610527578063b032cf6c14610547578063b070a44f1461055d578063b42a8e5514610572578063b44d0b9f1461059257600080fd5b80635eb674b6116101dd578063745400c9116101a1578063745400c91461048a578063821c0576146104aa57806388c95018146104bf5780638da5cb5b146104df57806395d89b41146104fd5780639bea590e1461051257600080fd5b80635eb674b6146103f557806366f2b1a7146104155780636a1ceb2d1461042a57806370a082311461043f578063715018a61461047557600080fd5b80632d73fc081161022f5780632d73fc081461033e5780632d751e0814610354578063313ce5671461036957806351a5cc5b1461038557806354b35d001461039b5780635aa6e675146103bd57600080fd5b806302ee8de91461027f57806305131172146102a757806306fdde03146102c757806318160ddd146102e95780631c7b048d146102fe57600080fd5b3661027a576102786107d6565b005b600080fd5b34801561028b57600080fd5b50610294610a3d565b6040519081526020015b60405180910390f35b3480156102b357600080fd5b506102786102c23660046134aa565b610b47565b3480156102d357600080fd5b506102dc610c74565b60405161029e9190613523565b3480156102f557600080fd5b50600254610294565b34801561030a57600080fd5b5061032e6103193660046134aa565b60096020526000908152604090205460ff1681565b604051901515815260200161029e565b34801561034a57600080fd5b50610294600c5481565b34801561036057600080fd5b50601454610294565b34801561037557600080fd5b506040516012815260200161029e565b34801561039157600080fd5b50610294600e5481565b3480156103a757600080fd5b506103b0610d06565b60405161029e9190613536565b3480156103c957600080fd5b506010546103dd906001600160a01b031681565b6040516001600160a01b03909116815260200161029e565b34801561040157600080fd5b5061027861041036600461357a565b610d5d565b34801561042157600080fd5b50610294600a81565b34801561043657600080fd5b506103dd610e6b565b34801561044b57600080fd5b5061029461045a3660046134aa565b6001600160a01b031660009081526020819052604090205490565b34801561048157600080fd5b50610278610eec565b34801561049657600080fd5b506102786104a53660046135a6565b610f22565b3480156104b657600080fd5b50610278611139565b3480156104cb57600080fd5b506102786104da3660046135bf565b61121e565b3480156104eb57600080fd5b506005546001600160a01b03166103dd565b34801561050957600080fd5b506102dc61126d565b34801561051e57600080fd5b5061027861127c565b34801561053357600080fd5b506102786105423660046134aa565b611363565b34801561055357600080fd5b50610294600a5481565b34801561056957600080fd5b50610278611411565b34801561057e57600080fd5b5061029461058d3660046134aa565b6115f1565b34801561059e57600080fd5b506105b26105ad3660046135a6565b6116d3565b60408051948552602085019390935291830152606082015260800161029e565b3480156105de57600080fd5b506105f26105ed3660046135a6565b6118f6565b60405161029e999897969594939291906135eb565b34801561061357600080fd5b506102786106223660046135a6565b611ecc565b34801561063357600080fd5b50610294600d5481565b34801561064957600080fd5b506102786106583660046135a6565b611f10565b34801561066957600080fd5b50610294600b5481565b34801561067f57600080fd5b5061027861068e36600461357a565b6122de565b6102786107d6565b3480156106a757600080fd5b506103dd6106b63660046135a6565b6008602052600090815260409020546001600160a01b031681565b3480156106dd57600080fd5b5061032e6106ec3660046135a6565b60076020526000908152604090205460ff1681565b34801561070d57600080fd5b50610278612502565b34801561072257600080fd5b506102946107313660046134aa565b61260c565b34801561074257600080fd5b50610278612679565b34801561075757600080fd5b50610294600f5481565b34801561076d57600080fd5b5061027861077c3660046134aa565b612753565b34801561078d57600080fd5b5061027861079c3660046135a6565b6127eb565b3480156107ad57600080fd5b506102786107bc3660046135a6565b612838565b3480156107cd57600080fd5b50610294612867565b6107de61296d565b6107e6612995565b600a54600c546107f69043613669565b1161086e5760405162461bcd60e51b815260206004820152603a60248201527f4e554d4245525f4f465f424c4f434b535f4254575f545820626c6f636b73206960448201527f73207265717569726564206265747765656e206465706f73697400000000000060648201526084015b60405180910390fd5b600d543410156108d05760405162461bcd60e51b815260206004820152602760248201527f46756e64732073686f756c64206265203e3d207468616e206465706f7369744c60448201526634b6b4ba26a4a760c91b6064820152608401610865565b6108d8611139565b6108e96108e3612867565b34612a05565b60145460129061090c5760405162461bcd60e51b815260040161086591906136b5565b50600080610918610a3d565b90506000610924610e6b565b6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016020604051808303818588803b15801561095e57600080fd5b505af1158015610972573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610997919061375d565b90508115806109a65750600254155b156109b3578092506109f7565b60006109be60025490565b6109cd8464e8d4a51000613776565b6109d791906137ab565b9050806109e98364e8d4a51000613776565b6109f391906137ab565b9350505b610a013384612a60565b43600c556040518181527f5c77db97122dd8c9d62f829c415e3e3a2c5ff855518cff951750ce07fa0cd4e39060200160405180910390a1505050565b601454600090601290610a635760405162461bcd60e51b815260040161086591906136b5565b5060005b601454811015610b43576008600060148381548110610a8857610a886137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03166302ee8de96040518163ffffffff1660e01b815260040160206040518083038186803b158015610aed57600080fd5b505afa158015610b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b25919061375d565b610b2f90836137d5565b915080610b3b816137ed565b915050610a67565b5090565b6005546001600160a01b03163314610b715760405162461bcd60e51b815260040161086590613808565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b158015610bba57600080fd5b505afa158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf2919061375d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610c3857600080fd5b505af1158015610c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c70919061383d565b5050565b606060038054610c8390613680565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf90613680565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b5050505050905090565b60606014805480602002602001604051908101604052809291908181526020018280548015610cfc57602002820191906000526020600020905b815481526020019060010190808311610d40575050505050905090565b6005546001600160a01b0316331480610d8057506010546001600160a01b031633145b610d9c5760405162461bcd60e51b81526004016108659061385f565b610da581612b3f565b6001600160a01b038216610dfb5760405162461bcd60e51b815260206004820181905260248201527f526f757465722063616e206e6f742062652061207a65726f20616464726573736044820152606401610865565b6000818152600860205260409081902054905163c0d7865560e01b81526001600160a01b0384811660048301529091169063c0d7865590602401600060405180830381600087803b158015610e4f57600080fd5b505af1158015610e63573d6000803e3d6000fd5b505050505050565b601454600090610ecd5760405162461bcd60e51b815260206004820152602760248201527f54686973207661756c7420646f6573206e6f74206861766520616e79207374726044820152666174656769657360c81b6064820152608401610865565b50600e546000908152600860205260409020546001600160a01b031690565b6005546001600160a01b03163314610f165760405162461bcd60e51b815260040161086590613808565b610f206000612bbb565b565b3360009081526006602052604090205443906110ee57601454601290610f5b5760405162461bcd60e51b815260040161086591906136b5565b50600254610fab5760405162461bcd60e51b815260206004820152601960248201527f546f74616c2073686172652076616c7565206973207a65726f000000000000006044820152606401610865565b6000821161100c5760405162461bcd60e51b815260206004820152602860248201527f416d6f756e74206f66207368617265732063616e206e6f742062652061207a65604482015267726f2076616c756560c01b6064820152608401610865565b611014611139565b600061101f60025490565b61102a846064613776565b6110399064e8d4a51000613776565b61104391906137ab565b905061104e60025490565b83111561109d5760405162461bcd60e51b815260206004820181905260248201527f50657263656e742063616e206e6f74206265206d6f7265207468616e203130306044820152606401610865565b6110a73384612c0d565b6110b13382612d5b565b6040517f9b03fe2597ba68323093f58db21a496f6639cdfb717bfc837078f99f41acf38e90600090a1503360009081526006602052604090205550565b6110f6612e14565b1561111e57601454601290610f5b5760405162461bcd60e51b815260040161086591906136b5565b601160405162461bcd60e51b815260040161086591906136b5565b611141612995565b6014546012906111645760405162461bcd60e51b815260040161086591906136b5565b5060005b60145481101561121b576008600060148381548110611189576111896137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663821c05766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050508080611213906137ed565b915050611168565b50565b6005546001600160a01b031633148061124157506010546001600160a01b031633145b61125d5760405162461bcd60e51b81526004016108659061385f565b611268838383612e38565b505050565b606060048054610c8390613680565b6005546001600160a01b031633146112a65760405162461bcd60e51b815260040161086590613808565b60005b60145481101561135c5760086000601483815481106112ca576112ca6137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316639bea590e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561133157600080fd5b505af1158015611345573d6000803e3d6000fd5b505050508080611354906137ed565b9150506112a9565b5043600b55565b6005546001600160a01b0316331461138d5760405162461bcd60e51b815260040161086590613808565b6001600160a01b0381166113ef5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6d656e742063616e206e6f742062652061207a65726f206164646044820152637265737360e01b6064820152608401610865565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b61141961296d565b611421612995565b611429611139565b60008060005b6014548110156115a0576008600060148381548110611450576114506137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b42a8e5560e01b81523360048201526001600160a01b039091169063b42a8e559060240160206040518083038186803b1580156114af57600080fd5b505afa1580156114c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e7919061375d565b9250821561158e576008600060148381548110611506576115066137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b06dd06f60e01b81523360048201526001600160a01b039091169063b06dd06f90602401600060405180830381600087803b15801561156757600080fd5b505af115801561157b573d6000803e3d6000fd5b50505050828261158b91906137d5565b91505b80611598816137ed565b91505061142f565b5060008111610c705760405162461bcd60e51b815260206004820152601e60248201527f596f7520646f6e2774206861766520616e792070656e64696e672059454c00006044820152606401610865565b6000805b6014548110156116cd576008600060148381548110611616576116166137bf565b6000918252602080832091909101548352820192909252604090810190912054905163b42a8e5560e01b81526001600160a01b0385811660048301529091169063b42a8e559060240160206040518083038186803b15801561167757600080fd5b505afa15801561168b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116af919061375d565b6116b990836137d5565b9150806116c5816137ed565b9150506115f5565b50919050565b60008181526007602052604081205481908190819060139060ff1661170b5760405162461bcd60e51b815260040161086591906136b5565b5060008581526008602090815260409182902054825163d920a90160e01b815292516001600160a01b0390911692839263d920a90192600480840193829003018186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611793919061375d565b9450806001600160a01b031663ae4bbfc96040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ce57600080fd5b505afa1580156117e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611806919061375d565b9350806001600160a01b0316633750440d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611879919061375d565b9250806001600160a01b0316639b1b4d496040518163ffffffff1660e01b815260040160206040518083038186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ec919061375d565b9150509193509193565b600081815260076020526040812054819081908190819060609082908190819060139060ff166119395760405162461bcd60e51b815260040161086591906136b5565b5060008a8152600860209081526040918290205482516303e21fa960e61b815292516001600160a01b039091169263f887ea40926004808301939192829003018186803b15801561198957600080fd5b505afa15801561199d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c191906138a8565b60008b815260086020908152604091829020548251635fcbd28560e01b81529251939c506001600160a01b031692635fcbd285926004808201939291829003018186803b158015611a1157600080fd5b505afa158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906138a8565b60008b81526008602090815260409182902054825163d21220a760e01b81529251939b506001600160a01b03169263d21220a7926004808201939291829003018186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad191906138a8565b60008b815260086020908152604091829020548251630dfe168160e01b81529251939a506001600160a01b031692630dfe1681926004808201939291829003018186803b158015611b2157600080fd5b505afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5991906138a8565b60008b8152600860209081526040918290205482516336e9332d60e01b815292519399506001600160a01b0316926336e9332d926004808201939291829003018186803b158015611ba957600080fd5b505afa158015611bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be191906138a8565b60008b81526008602090815260409182902054825163a644d68560e01b815292519398506001600160a01b03169263a644d685926004808201939291829003018186803b158015611c3157600080fd5b505afa158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c69919061383d565b15611d045760008a815260086020908152604091829020548251633c41a11560e21b81529251611cfd936001600160a01b039092169263f10684549260048082019391829003018186803b158015611cc057600080fd5b505afa158015611cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf8919061375d565b613177565b9350611d26565b60405180604001604052806006815260200165139bc81c1a5960d21b81525093505b60008a81526008602090815260409182902054825163fc03916560e01b815292516001600160a01b039091169263fc039165926004808301939192829003018186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad919061375d565b60008b8152600860209081526040918290205482516302ee8de960e01b815292519395506001600160a01b0316926302ee8de9926004808201939291829003018186803b158015611dfd57600080fd5b505afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e35919061375d565b60008b815260086020908152604091829020548251639ad160e360e01b815292519394506001600160a01b031692639ad160e3926004808201939291829003018186803b158015611e8557600080fd5b505afa158015611e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebd919061375d565b92509193959799909294969850565b6005546001600160a01b0316331480611eef57506010546001600160a01b031633145b611f0b5760405162461bcd60e51b81526004016108659061385f565b600f55565b6005546001600160a01b0316331480611f3357506010546001600160a01b031633145b611f4f5760405162461bcd60e51b81526004016108659061385f565b611f5881612b3f565b611f60610e6b565b6000828152600860205260409020546001600160a01b0390811691161415611fd65760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f742072656d6f7665207468652063757272656e7420737472617460448201526265677960e81b6064820152608401610865565b6000818152600860209081526040918290205482516302ee8de960e01b815292516001600160a01b03909116926302ee8de9926004808301939192829003018186803b15801561202557600080fd5b505afa158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d919061375d565b156120b55760405162461bcd60e51b815260206004820152602260248201527f546f74616c206361706974616c20696e7465726e616c206973206e6f74207a65604482015261726f60f01b6064820152608401610865565b60008181526008602090815260409182902054825163fc03916560e01b815292516001600160a01b039091169263fc039165926004808301939192829003018186803b15801561210457600080fd5b505afa158015612118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213c919061375d565b156121895760405162461bcd60e51b815260206004820152601960248201527f546f74616c206361706974616c206973206e6f74207a65726f000000000000006044820152606401610865565b6000818152600760209081526040808320805460ff19908116909155600880845282852080546001600160a01b031686526009855292852080549092169091559284905291905280546001600160a01b03191690556014546001146122b45760005b601454811015610c70578160148281548110612209576122096137bf565b906000526020600020015414156122a25760145461222990600190613669565b811461227a576014805461223f90600190613669565b8154811061224f5761224f6137bf565b90600052602060002001546014828154811061226d5761226d6137bf565b6000918252602090912001555b601480548061228b5761228b6138c5565b600190038181906000526020600020016000905590555b806122ac816137ed565b9150506121eb565b60148054806122c5576122c56138c5565b6001900381819060005260206000200160009055905550565b6005546001600160a01b031633148061230157506010546001600160a01b031633145b61231d5760405162461bcd60e51b81526004016108659061385f565b6001600160a01b0382166123825760405162461bcd60e51b815260206004820152602660248201527f5468652073747261746567792063616e206e6f742062652061207a65726f206160448201526564647265737360d01b6064820152608401610865565b6000818152600860205260409020546001600160a01b0316156123e75760405162461bcd60e51b815260206004820152601a60248201527f54686973207374726174656779206973206e6f7420656d7074790000000000006044820152606401610865565b6001600160a01b03821660009081526009602052604090205460ff16156124505760405162461bcd60e51b815260206004820152601c60248201527f5468697320737472617465677920616c726561647920657869737473000000006044820152606401610865565b60008181526007602052604090205460ff166124d4576014805460018181019092557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec018290556000828152600760209081526040808320805460ff1990811686179091556001600160a01b03871684526009909252909120805490911690911790555b600090815260086020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6010546001600160a01b0316331461255c5760405162461bcd60e51b815260206004820152601c60248201527f5468652073656e646572206973206e6f7420676f7665726e616e6365000000006044820152606401610865565b60005b60145481101561121b576008600060148381548110612580576125806137bf565b60009182526020808320919091015483528201929092526040908101909120549051631bfc726f60e21b81523360048201526001600160a01b0390911690636ff1c9bc90602401600060405180830381600087803b1580156125e157600080fd5b505af11580156125f5573d6000803e3d6000fd5b505050508080612604906137ed565b91505061255f565b6001600160a01b03811660009081526006602052604081205461263157506000919050565b6001600160a01b0382166000908152600660205260408120546126549043613669565b9050600a81106126675750600092915050565b61267281600a613669565b9392505050565b6005546001600160a01b031633146126a35760405162461bcd60e51b815260040161086590613808565b60005b60145481101561121b5760086000601483815481106126c7576126c76137bf565b60009182526020808320919091015483528201929092526040908101909120549051630987b04f60e41b81523360048201526001600160a01b039091169063987b04f090602401600060405180830381600087803b15801561272857600080fd5b505af115801561273c573d6000803e3d6000fd5b50505050808061274b906137ed565b9150506126a6565b6005546001600160a01b0316331461277d5760405162461bcd60e51b815260040161086590613808565b6001600160a01b0381166127e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b61121b81612bbb565b6005546001600160a01b031633148061280e57506010546001600160a01b031633145b61282a5760405162461bcd60e51b81526004016108659061385f565b61283381612b3f565b600e55565b6005546001600160a01b031633146128625760405162461bcd60e51b815260040161086590613808565b600a55565b60145460009060129061288d5760405162461bcd60e51b815260040161086591906136b5565b5060005b601454811015610b435760086000601483815481106128b2576128b26137bf565b9060005260206000200154815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663fc0391656040518163ffffffff1660e01b815260040160206040518083038186803b15801561291757600080fd5b505afa15801561292b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294f919061375d565b61295990836137d5565b915080612965816137ed565b915050612891565b612975612e14565b60119061121b5760405162461bcd60e51b815260040161086591906136b5565b600a54600b546129a59043613669565b11610f205760405162461bcd60e51b815260206004820152602a60248201527f4e554d4245525f4f465f424c4f434b535f4254575f545820626c6f636b7320696044820152691cc81c995c5d5a5c995960b21b6064820152608401610865565b600f54612a1282846137d5565b1115610c705760405162461bcd60e51b815260206004820152601e60248201527f4465706f736974206973206c696d6974656420627920636f6e747261637400006044820152606401610865565b6001600160a01b038216612ab65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610865565b8060026000828254612ac891906137d5565b90915550506001600160a01b03821660009081526020819052604081208054839290612af59084906137d5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b601454600110612b895760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f756768207374726174656769657360581b6044820152606401610865565b60008181526007602052604090205460139060ff16610c705760405162461bcd60e51b815260040161086591906136b5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216612c6d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610865565b6001600160a01b03821660009081526020819052604090205481811015612ce15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610865565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612d10908490613669565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60005b601454811015611268576008600060148381548110612d7f57612d7f6137bf565b6000918252602080832091909101548352820192909252604090810190912054905163072f436560e31b81526001600160a01b038581166004830152602482018590529091169063397a1b2890604401600060405180830381600087803b158015612de957600080fd5b505af1158015612dfd573d6000803e3d6000fd5b505050508080612e0c906137ed565b915050612d5e565b33600090815260066020526040812054600a90612e319043613669565b1015905090565b612e4183612b3f565b60008181526007602052604090205460ff16612eaa5760405162461bcd60e51b815260206004820152602260248201527f546865205f6e616d654964546f2076616c756520646f6573206e6f74206578696044820152611cdd60f21b6064820152608401610865565b600082118015612ebb575060648211155b612f375760405162461bcd60e51b815260206004820152604160248201527f546865205f616d6f756e74496e50657263656e742076616c756520736f756c6460448201527f206265206d6f7265207468616e203020616e64206c657373207468616e2031306064820152600360fc1b608482015260a401610865565b612f3f611139565b60008381526008602090815260408083205481516315ab88c960e31b815291516001600160a01b039091169263ad5c46489260048082019391829003018186803b158015612f8c57600080fd5b505afa158015612fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc491906138a8565b600085815260086020526040908190205490516308a960c160e31b8152600481018690529192506001600160a01b03169063454b060890602401600060405180830381600087803b15801561301857600080fd5b505af115801561302c573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03841691506370a082319060240160206040518083038186803b15801561307257600080fd5b505afa158015613086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130aa919061375d565b9050801561313d576000838152600860205260409020546130d8906001600160a01b0384811691168361327d565b6000838152600860205260408082205481516336bcdbf360e11b815291516001600160a01b0390911692636d79b7e6926004808201939182900301818387803b15801561312457600080fd5b505af1158015613138573d6000803e3d6000fd5b505050505b6040518481527ff62d3ca87d830abd296c5769ca4ad2d1e22910c4754d33689394d55287c033369060200160405180910390a15050505050565b60608161319b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156131c557806131af816137ed565b91506131be9050600a836137ab565b915061319f565b60008167ffffffffffffffff8111156131e0576131e06138db565b6040519080825280601f01601f19166020018201604052801561320a576020820181803683370190505b5090505b84156132755761321f600183613669565b915061322c600a866138f1565b6132379060306137d5565b60f81b81838151811061324c5761324c6137bf565b60200101906001600160f81b031916908160001a90535061326e600a866137ab565b945061320e565b949350505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526112689286929160009161330d91851690849061338a565b805190915015611268578080602001905181019061332b919061383d565b6112685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610865565b6060613275848460008585843b6133e35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610865565b600080866001600160a01b031685876040516133ff9190613905565b60006040518083038185875af1925050503d806000811461343c576040519150601f19603f3d011682016040523d82523d6000602084013e613441565b606091505b509150915061345182828661345c565b979650505050505050565b6060831561346b575081612672565b82511561347b5782518084602001fd5b8160405162461bcd60e51b81526004016108659190613523565b6001600160a01b038116811461121b57600080fd5b6000602082840312156134bc57600080fd5b813561267281613495565b60005b838110156134e25781810151838201526020016134ca565b838111156134f1576000848401525b50505050565b6000815180845261350f8160208601602086016134c7565b601f01601f19169290920160200192915050565b60208152600061267260208301846134f7565b6020808252825182820181905260009190848201906040850190845b8181101561356e57835183529284019291840191600101613552565b50909695505050505050565b6000806040838503121561358d57600080fd5b823561359881613495565b946020939093013593505050565b6000602082840312156135b857600080fd5b5035919050565b6000806000606084860312156135d457600080fd5b505081359360208301359350604090920135919050565b6001600160a01b038a811682528981166020830152888116604083015287811660608301528616608082015261012060a08201819052600090613630838201886134f7565b60c0840196909652505060e0810192909252610100909101529695505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561367b5761367b613653565b500390565b600181811c9082168061369457607f821691505b602082108114156116cd57634e487b7160e01b600052602260045260246000fd5b600060208083526000845481600182811c9150808316806136d757607f831692505b8583108114156136f557634e487b7160e01b85526022600452602485fd5b87860183815260200181801561371257600181146137235761374e565b60ff1986168252878201965061374e565b60008b81526020902060005b868110156137485781548482015290850190890161372f565b83019750505b50949998505050505050505050565b60006020828403121561376f57600080fd5b5051919050565b600081600019048311821515161561379057613790613653565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826137ba576137ba613795565b500490565b634e487b7160e01b600052603260045260246000fd5b600082198211156137e8576137e8613653565b500190565b600060001982141561380157613801613653565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561384f57600080fd5b8151801515811461267257600080fd5b60208082526029908201527f5468652073656e646572206973206e6f7420746865206f776e6572206f7220676040820152686f7665726e616e636560b81b606082015260800190565b6000602082840312156138ba57600080fd5b815161267281613495565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008261390057613900613795565b500690565b600082516139178184602087016134c7565b919091019291505056fea264697066735822122008273b71d8221ccc3f4edc3582a1ccfaf4973d0b4fbace3a196eb8b9eb956be764736f6c63430008090033
Deployed Bytecode Sourcemap
33503:14111:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34944:9;:7;:9::i;:::-;33503:14111;;;;;41693:295;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;41693:295:0;;;;;;;;45270:167;;;;;;;;;;-1:-1:-1;45270:167:0;;;;;:::i;:::-;;:::i;18029:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18350:108::-;;;;;;;;;;-1:-1:-1;18438:12:0;;18350:108;;33787:45;;;;;;;;;;-1:-1:-1;33787:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1655:14:1;;1648:22;1630:41;;1618:2;1603:18;33787:45:0;1490:187:1;33999:46:0;;;;;;;;;;;;;;;;39181:91;;;;;;;;;;-1:-1:-1;39252:5:0;:12;39181:91;;18249:93;;;;;;;;;;-1:-1:-1;18249:93:0;;18332:2;1824:36:1;;1812:2;1797:18;18249:93:0;1682:184:1;34089:36:0;;;;;;;;;;;;;;;;39084:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34166:25::-;;;;;;;;;;-1:-1:-1;34166:25:0;;;;-1:-1:-1;;;;;34166:25:0;;;;;;-1:-1:-1;;;;;2672:32:1;;;2654:51;;2642:2;2627:18;34166:25:0;2508:203:1;44762:283:0;;;;;;;;;;-1:-1:-1;44762:283:0;;;;;:::i;:::-;;:::i;33841:54::-;;;;;;;;;;;;33893:2;33841:54;;39280:191;;;;;;;;;;;;;:::i;18466:127::-;;;;;;;;;;-1:-1:-1;18466:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;18567:18:0;18540:7;18567:18;;;;;;;;;;;;18466:127;13428:103;;;;;;;;;;;;;:::i;37074:578::-;;;;;;;;;;-1:-1:-1;37074:578:0;;;;;:::i;:::-;;:::i;41153:243::-;;;;;;;;;;;;;:::i;45053:209::-;;;;;;;;;;-1:-1:-1;45053:209:0;;;;;:::i;:::-;;:::i;12777:87::-;;;;;;;;;;-1:-1:-1;12850:6:0;;-1:-1:-1;;;;;12850:6:0;12777:87;;18137:104;;;;;;;;;;;;;:::i;42316:222::-;;;;;;;;;;;;;:::i;42750:228::-;;;;;;;;;;-1:-1:-1;42750:228:0;;;;;:::i;:::-;;:::i;33902:42::-;;;;;;;;;;;;;;;;37660:529;;;;;;;;;;;;;:::i;38361:235::-;;;;;;;;;;-1:-1:-1;38361:235:0;;;;;:::i;:::-;;:::i;40604:541::-;;;;;;;;;;-1:-1:-1;40604:541:0;;;;;:::i;:::-;;:::i;:::-;;;;3773:25:1;;;3829:2;3814:18;;3807:34;;;;3857:18;;;3850:34;3915:2;3900:18;;3893:34;3760:3;3745:19;40604:541:0;3542:391:1;39479:1117:0;;;;;;;;;;-1:-1:-1;39479:1117:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;42986:114::-;;;;;;;;;;-1:-1:-1;42986:114:0;;;;;:::i;:::-;;:::i;34052:30::-;;;;;;;;;;;;;;;;43679:1075;;;;;;;;;;-1:-1:-1;43679:1075:0;;;;;:::i;:::-;;:::i;33951:41::-;;;;;;;;;;;;;;;;43108:563;;;;;;;;;;-1:-1:-1;43108:563:0;;;;;:::i;:::-;;:::i;35967:1099::-;;;:::i;33735:45::-;;;;;;;;;;-1:-1:-1;33735:45:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;33735:45:0;;;33687:41;;;;;;;;;;-1:-1:-1;33687:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42546:196;;;;;;;;;;;;;:::i;38604:472::-;;;;;;;;;;-1:-1:-1;38604:472:0;;;;;:::i;:::-;;:::i;41996:186::-;;;;;;;;;;;;;:::i;34132:27::-;;;;;;;;;;;;;;;;13686:201;;;;;;;;;;-1:-1:-1;13686:201:0;;;;;:::i;:::-;;:::i;38197:156::-;;;;;;;;;;-1:-1:-1;38197:156:0;;;;;:::i;:::-;;:::i;42190:118::-;;;;;;;;;;-1:-1:-1;42190:118:0;;;;;:::i;:::-;;:::i;41406:279::-;;;;;;;;;;;;;:::i;35967:1099::-;35787:21;:19;:21::i;:::-;35819:24;:22;:24::i;:::-;36094:23:::1;::::0;36060:31:::1;::::0;36045:46:::1;::::0;:12:::1;:46;:::i;:::-;:72;36023:180;;;::::0;-1:-1:-1;;;36023:180:0;;5305:2:1;36023:180:0::1;::::0;::::1;5287:21:1::0;5344:2;5324:18;;;5317:30;5383:34;5363:18;;;5356:62;5454:28;5434:18;;;5427:56;5500:19;;36023:180:0::1;;;;;;;;;36235:15;;36222:9;:28;;36214:80;;;::::0;-1:-1:-1;;;36214:80:0;;5732:2:1;36214:80:0::1;::::0;::::1;5714:21:1::0;5771:2;5751:18;;;5744:30;5810:34;5790:18;;;5783:62;-1:-1:-1;;;5861:18:1;;;5854:37;5908:19;;36214:80:0::1;5530:403:1::0;36214:80:0::1;36305:14;:12;:14::i;:::-;36330:43;36344:17;:15;:17::i;:::-;36363:9;36330:13;:43::i;:::-;36392:5;:12:::0;36411:17:::1;::::0;36384:45:::1;;;;-1:-1:-1::0;;;36384:45:0::1;;;;;;;;:::i;:::-;;36440:14;36465:28:::0;36496:25:::1;:23;:25::i;:::-;36465:56;;36532:29;36574:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;36564:36:0::1;;36608:9;36564:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36532:88:::0;-1:-1:-1;36635:25:0;;;:47:::1;;-1:-1:-1::0;18438:12:0;;36664:18;36635:47:::1;36631:282;;;36708:21;36699:30;;36631:282;;;36762:19;36818:13;18438:12:::0;;;18350:108;36818:13:::1;36784:31;:20:::0;36808:6:::1;36784:31;:::i;:::-;:47;;;;:::i;:::-;36762:69:::0;-1:-1:-1;36762:69:0;36855:32:::1;:21:::0;36880:6:::1;36855:32;:::i;:::-;:46;;;;:::i;:::-;36846:55;;36747:166;36631:282;36923:25;36929:10;36941:6;36923:5;:25::i;:::-;36993:12;36959:31;:46:::0;37021:37:::1;::::0;160:25:1;;;37021:37:0::1;::::0;148:2:1;133:18;37021:37:0::1;;;;;;;36012:1054;;;35967:1099::o:0;41693:295::-;41790:5;:12;41749:20;;41809:17;;41782:45;;;;-1:-1:-1;;;41782:45:0;;;;;;;;:::i;:::-;;41843:9;41838:143;41862:5;:12;41858:16;;41838:143;;;41922:10;:20;41933:5;41939:1;41933:8;;;;;;;;:::i;:::-;;;;;;;;;41922:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41922:20:0;-1:-1:-1;;;;;41912:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41896:73;;;;:::i;:::-;;-1:-1:-1;41876:3:0;;;;:::i;:::-;;;;41838:143;;;;41693:295;:::o;45270:167::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;45389:39:::1;::::0;-1:-1:-1;;;45389:39:0;;45422:4:::1;45389:39;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;45344:23:0;::::1;::::0;::::1;::::0;45376:10:::1;::::0;45344:23;;45389:24:::1;::::0;2627:18:1;;45389:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45344:85;::::0;-1:-1:-1;;;;;;45344:85:0::1;::::0;;;;;;-1:-1:-1;;;;;9225:32:1;;;45344:85:0::1;::::0;::::1;9207:51:1::0;9274:18;;;9267:34;9180:18;;45344:85:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45270:167:::0;:::o;18029:100::-;18083:13;18116:5;18109:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18029:100;:::o;39084:89::-;39124:16;39160:5;39153:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39084:89;:::o;44762:283::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35035:23;;:53;;-1:-1:-1;35062:10:0;;-1:-1:-1;;;;;35062:10:0;12231;35062:26;35035:53;35013:144;;;;-1:-1:-1;;;35013:144:0;;;;;;;:::i;:::-;44869:25:::1;44886:7;44869:16;:25::i;:::-;-1:-1:-1::0;;;;;44913:24:0;::::1;44905:69;;;::::0;-1:-1:-1;;;44905:69:0;;10206:2:1;44905:69:0::1;::::0;::::1;10188:21:1::0;;;10225:18;;;10218:30;10284:34;10264:18;;;10257:62;10336:18;;44905:69:0::1;10004:356:1::0;44905:69:0::1;44995:19;::::0;;;:10:::1;:19;::::0;;;;;;;44985:52;;-1:-1:-1;;;44985:52:0;;-1:-1:-1;;;;;2672:32:1;;;44985:52:0::1;::::0;::::1;2654:51:1::0;44995:19:0;;::::1;::::0;44985:40:::1;::::0;2627:18:1;;44985:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44762:283:::0;;:::o;39280:191::-;39356:5;:12;39328:7;;39348:68;;;;-1:-1:-1;;;39348:68:0;;10567:2:1;39348:68:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;-1:-1:-1;;;10696:18:1;;;10689:37;10743:19;;39348:68:0;10365:403:1;39348:68:0;-1:-1:-1;39445:17:0;;39434:29;;;;:10;:29;;;;;;-1:-1:-1;;;;;39434:29:0;;39280:191::o;13428:103::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;13493:30:::1;13520:1;13493:18;:30::i;:::-;13428:103::o:0;37074:578::-;35416:10;35354:20;35403:24;;;:12;:24;;;;;;35377:12;;35400:339;;37157:5:::1;:12:::0;37176:17:::1;::::0;37149:45:::1;;;;-1:-1:-1::0;;;37149:45:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;18438:12:0;;37205:56:::1;;;::::0;-1:-1:-1;;;37205:56:0;;10975:2:1;37205:56:0::1;::::0;::::1;10957:21:1::0;11014:2;10994:18;;;10987:30;11053:27;11033:18;;;11026:55;11098:18;;37205:56:0::1;10773:349:1::0;37205:56:0::1;37290:1;37280:7;:11;37272:64;;;::::0;-1:-1:-1;;;37272:64:0;;11329:2:1;37272:64:0::1;::::0;::::1;11311:21:1::0;11368:2;11348:18;;;11341:30;11407:34;11387:18;;;11380:62;-1:-1:-1;;;11458:18:1;;;11451:38;11506:19;;37272:64:0::1;11127:404:1::0;37272:64:0::1;37347:14;:12;:14::i;:::-;37372:15;37415:13;18438:12:::0;;;18350:108;37415:13:::1;37390;:7:::0;37400:3:::1;37390:13;:::i;:::-;:22;::::0;37406:6:::1;37390:22;:::i;:::-;:38;;;;:::i;:::-;37372:56;;37458:13;18438:12:::0;;;18350:108;37458:13:::1;37447:7;:24;;37439:69;;;::::0;-1:-1:-1;;;37439:69:0;;11738:2:1;37439:69:0::1;::::0;::::1;11720:21:1::0;;;11757:18;;;11750:30;11816:34;11796:18;;;11789:62;11868:18;;37439:69:0::1;11536:356:1::0;37439:69:0::1;37519:26;37525:10;37537:7;37519:5;:26::i;:::-;37556:46;37582:10;37594:7;37556:25;:46::i;:::-;37618:26;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;35478:10:0;35465:24;;;;:12;:24;;;;;:39;-1:-1:-1;45270:167:0:o;35400:339::-;35540:21;:19;:21::i;:::-;35537:191;;;37157:5:::1;:12:::0;37176:17:::1;::::0;37149:45:::1;;;;-1:-1:-1::0;;;37149:45:0::1;;;;;;;;:::i;35537:191::-:0;35689:22;35682:30;;-1:-1:-1;;;35682:30:0;;;;;;;;:::i;41153:243::-;35915:24;:22;:24::i;:::-;41225:5:::1;:12:::0;41244:17:::1;::::0;41217:45:::1;;;;-1:-1:-1::0;;;41217:45:0::1;;;;;;;;:::i;:::-;;41278:9;41273:116;41297:5;:12:::0;41293:16;::::1;41273:116;;;41341:10;:20;41352:5;41358:1;41352:8;;;;;;;;:::i;:::-;;;;;;;;;41341:20;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41341:20:0::1;-1:-1:-1::0;;;;;41331:44:0::1;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41311:3;;;;;:::i;:::-;;;;41273:116;;;;41153:243::o:0;45053:209::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35035:23;;:53;;-1:-1:-1;35062:10:0;;-1:-1:-1;;;;;35062:10:0;12231;35062:26;35035:53;35013:144;;;;-1:-1:-1;;;35013:144:0;;;;;;;:::i;:::-;45204:50:::1;45213:11;45226:16;45244:9;45204:8;:50::i;:::-;45053:209:::0;;;:::o;18137:104::-;18193:13;18226:7;18219:14;;;;;:::i;42316:222::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42370:9:::1;42366:113;42389:5;:12:::0;42385:16;::::1;42366:113;;;42433:10;:20;42444:5;42450:1;42444:8;;;;;;;;:::i;:::-;;;;;;;;;42433:20;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42433:20:0::1;-1:-1:-1::0;;;;;42423:42:0::1;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42403:3;;;;;:::i;:::-;;;;42366:113;;;-1:-1:-1::0;42518:12:0::1;42489:26;:41:::0;42316:222::o;42750:228::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42846:25:0;::::1;42824:111;;;::::0;-1:-1:-1;;;42824:111:0;;12099:2:1;42824:111:0::1;::::0;::::1;12081:21:1::0;12138:2;12118:18;;;12111:30;12177:34;12157:18;;;12150:62;-1:-1:-1;;;12228:18:1;;;12221:34;12272:19;;42824:111:0::1;11897:400:1::0;42824:111:0::1;42946:10;:24:::0;;-1:-1:-1;;;;;;42946:24:0::1;-1:-1:-1::0;;;;;42946:24:0;;;::::1;::::0;;;::::1;::::0;;42750:228::o;37660:529::-;35787:21;:19;:21::i;:::-;35819:24;:22;:24::i;:::-;37709:14:::1;:12;:14::i;:::-;37734:18;37767:23:::0;37810:9:::1;37805:304;37825:5;:12:::0;37821:16;::::1;37805:304;;;37882:10;:20;37893:5;37899:1;37893:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;37882:20;;;::::1;::::0;;;;;;;;;;;;37872:57;;-1:-1:-1;;;37872:57:0;;37918:10:::1;37872:57;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;37882:20:0;;::::1;::::0;37872:45:::1;::::0;2627:18:1;;37872:57:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37859:70:::0;-1:-1:-1;37947:14:0;;37944:154:::1;;37992:10;:20;38003:5;38009:1;38003:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;37992:20;;;::::1;::::0;;;;;;;;;;;;37982:52;;-1:-1:-1;;;37982:52:0;;38023:10:::1;37982:52;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;37992:20:0;;::::1;::::0;37982:40:::1;::::0;2627:18:1;;37982:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38072:10;38053:29;;;;;:::i;:::-;;;37944:154;37839:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37805:304;;;;38145:1;38127:15;:19;38119:62;;;::::0;-1:-1:-1;;;38119:62:0;;12504:2:1;38119:62:0::1;::::0;::::1;12486:21:1::0;12543:2;12523:18;;;12516:30;12582:32;12562:18;;;12555:60;12632:18;;38119:62:0::1;12302:354:1::0;38361:235:0;38423:18;38459:9;38454:135;38474:5;:12;38470:16;;38454:135;;;38532:10;:20;38543:5;38549:1;38543:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;38532:20;;;;;;;;;;;;;;;;38522:55;;-1:-1:-1;;;38522:55:0;;-1:-1:-1;;;;;2672:32:1;;;38522:55:0;;;2654:51:1;38532:20:0;;;;38522:45;;2627:18:1;;38522:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38508:69;;;;:::i;:::-;;-1:-1:-1;38488:3:0;;;;:::i;:::-;;;;38454:135;;;;38361:235;;;:::o;40604:541::-;40675:19;40807:18;;;:9;:18;;;;;;40675:19;;;;;;40827:23;;40807:18;;40799:52;;;;-1:-1:-1;;;40799:52:0;;;;;;;;:::i;:::-;-1:-1:-1;40862:17:0;40882:19;;;:10;:19;;;;;;;;;;40926:33;;-1:-1:-1;;;40926:33:0;;;;-1:-1:-1;;;;;40882:19:0;;;;;;40926:31;;:33;;;;;;;;;;40882:19;40926:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40912:47;;40994:9;-1:-1:-1;;;;;40984:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40970:47;;41053:9;-1:-1:-1;;;;;41043:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41028:49;;41113:9;-1:-1:-1;;;;;41103:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41088:49;;40788:357;40604:541;;;;;:::o;39479:1117::-;39549:15;39816:18;;;:9;:18;;;;;;39549:15;;;;;;;;39678:18;;39549:15;;;;;;39836:23;;39816:18;;39808:52;;;;-1:-1:-1;;;39808:52:0;;;;;;;;:::i;:::-;-1:-1:-1;39891:19:0;;;;:10;:19;;;;;;;;;;39881:39;;-1:-1:-1;;;39881:39:0;;;;-1:-1:-1;;;;;39891:19:0;;;;39881:37;;:39;;;;;39891:19;;39881:39;;;;;39891:19;39881:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39952:19;;;;:10;:19;;;;;;;;;;39942:40;;-1:-1:-1;;;39942:40:0;;;;39871:49;;-1:-1:-1;;;;;;39952:19:0;;39942:38;;:40;;;;;39952:19;39942:40;;;;;;39952:19;39942:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40013:19;;;;:10;:19;;;;;;;;;;40003:39;;-1:-1:-1;;;40003:39:0;;;;39931:51;;-1:-1:-1;;;;;;40013:19:0;;40003:37;;:39;;;;;40013:19;40003:39;;;;;;40013:19;40003:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40073:19;;;;:10;:19;;;;;;;;;;40063:39;;-1:-1:-1;;;40063:39:0;;;;39993:49;;-1:-1:-1;;;;;;40073:19:0;;40063:37;;:39;;;;;40073:19;40063:39;;;;;;40073:19;40063:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40131:19;;;;:10;:19;;;;;;;;;;40121:37;;-1:-1:-1;;;40121:37:0;;;;40053:49;;-1:-1:-1;;;;;;40131:19:0;;40121:35;;:37;;;;;40131:19;40121:37;;;;;;40131:19;40121:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40182:19;;;;:10;:19;;;;;;;;;;40172:39;;-1:-1:-1;;;40172:39:0;;;;40113:45;;-1:-1:-1;;;;;;40182:19:0;;40172:37;;:39;;;;;40182:19;40172:39;;;;;;40182:19;40172:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40169:180;;;40262:19;;;;:10;:19;;;;;;;;;;40252:36;;-1:-1:-1;;;40252:36:0;;;;40235:54;;-1:-1:-1;;;;;40262:19:0;;;;40252:34;;:36;;;;;;;;;;;40262:19;40252:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40235:16;:54::i;:::-;40228:61;;40169:180;;;40322:15;;;;;;;;;;;;;-1:-1:-1;;;40322:15:0;;;;;40169:180;40385:19;;;;:10;:19;;;;;;;;;;40375:48;;-1:-1:-1;;;40375:48:0;;;;-1:-1:-1;;;;;40385:19:0;;;;40375:46;;:48;;;;;40385:19;;40375:48;;;;;40385:19;40375:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40468:19;;;;:10;:19;;;;;;;;;;40458:56;;-1:-1:-1;;;40458:56:0;;;;40359:64;;-1:-1:-1;;;;;;40468:19:0;;40458:54;;:56;;;;;40468:19;40458:56;;;;;;40468:19;40458:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40546:19;;;;:10;:19;;;;;;;;;;40536:52;;-1:-1:-1;;;40536:52:0;;;;40434:80;;-1:-1:-1;;;;;;40546:19:0;;40536:50;;:52;;;;;40546:19;40536:52;;;;;;40546:19;40536:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40525:63;;39479:1117;;;;;;;;;;;:::o;42986:114::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35035:23;;:53;;-1:-1:-1;35062:10:0;;-1:-1:-1;;;;;35062:10:0;12231;35062:26;35035:53;35013:144;;;;-1:-1:-1;;;35013:144:0;;;;;;;:::i;:::-;43070:12:::1;:22:::0;42986:114::o;43679:1075::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35035:23;;:53;;-1:-1:-1;35062:10:0;;-1:-1:-1;;;;;35062:10:0;12231;35062:26;35035:53;35013:144;;;;-1:-1:-1;;;35013:144:0;;;;;;;:::i;:::-;43760:25:::1;43777:7;43760:16;:25::i;:::-;43841:17;:15;:17::i;:::-;43818:19;::::0;;;:10:::1;:19;::::0;;;;;-1:-1:-1;;;;;43818:19:0;;::::1;:40:::0;::::1;;;43796:125;;;::::0;-1:-1:-1;;;43796:125:0;;13119:2:1;43796:125:0::1;::::0;::::1;13101:21:1::0;13158:2;13138:18;;;13131:30;13197:34;13177:18;;;13170:62;-1:-1:-1;;;13248:18:1;;;13241:33;13291:19;;43796:125:0::1;12917:399:1::0;43796:125:0::1;43950:19;::::0;;;:10:::1;:19;::::0;;;;;;;;;43940:56;;-1:-1:-1;;;43940:56:0;;;;-1:-1:-1;;;;;43950:19:0;;::::1;::::0;43940:54:::1;::::0;:56:::1;::::0;;::::1;::::0;43950:19;;43940:56;;;;;43950:19;43940:56;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61:::0;43932:131:::1;;;::::0;-1:-1:-1;;;43932:131:0;;13523:2:1;43932:131:0::1;::::0;::::1;13505:21:1::0;13562:2;13542:18;;;13535:30;13601:34;13581:18;;;13574:62;-1:-1:-1;;;13652:18:1;;;13645:32;13694:19;;43932:131:0::1;13321:398:1::0;43932:131:0::1;44092:19;::::0;;;:10:::1;:19;::::0;;;;;;;;;44082:48;;-1:-1:-1;;;44082:48:0;;;;-1:-1:-1;;;;;44092:19:0;;::::1;::::0;44082:46:::1;::::0;:48:::1;::::0;;::::1;::::0;44092:19;;44082:48;;;;;44092:19;44082:48;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53:::0;44074:114:::1;;;::::0;-1:-1:-1;;;44074:114:0;;13926:2:1;44074:114:0::1;::::0;::::1;13908:21:1::0;13965:2;13945:18;;;13938:30;14004:27;13984:18;;;13977:55;14049:18;;44074:114:0::1;13724:349:1::0;44074:114:0::1;44261:5;44240:18:::0;;;:9:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;44240:26:0;;::::1;::::0;;;44291:10:::1;:19:::0;;;;;;;;-1:-1:-1;;;;;44291:19:0::1;44277:34:::0;;:13:::1;:34:::0;;;;;:42;;;;::::1;::::0;;;44330:19;;;;;;;:32;;-1:-1:-1;;;;;;44330:32:0::1;::::0;;44376:5:::1;:12:::0;44240:26;44376:17:::1;44373:374;;44414:9;44410:282;44433:5;:12:::0;44429:16;::::1;44410:282;;;44485:7;44473:5;44479:1;44473:8;;;;;;;;:::i;:::-;;;;;;;;;:19;44470:207;;;44525:5;:12:::0;:14:::1;::::0;44538:1:::1;::::0;44525:14:::1;:::i;:::-;44520:1;:19;44517:107;;44579:5;44585:12:::0;;:14:::1;::::0;44598:1:::1;::::0;44585:14:::1;:::i;:::-;44579:21;;;;;;;;:::i;:::-;;;;;;;;;44568:5;44574:1;44568:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:32:::0;44517:107:::1;44646:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44470:207;44447:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44410:282;;44373:374;44724:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43679:1075:::0;:::o;43108:563::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35035:23;;:53;;-1:-1:-1;35062:10:0;;-1:-1:-1;;;;;35062:10:0;12231;35062:26;35035:53;35013:144;;;;-1:-1:-1;;;35013:144:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43216:26:0;::::1;43208:77;;;::::0;-1:-1:-1;;;43208:77:0;;14412:2:1;43208:77:0::1;::::0;::::1;14394:21:1::0;14451:2;14431:18;;;14424:30;14490:34;14470:18;;;14463:62;-1:-1:-1;;;14541:18:1;;;14534:36;14587:19;;43208:77:0::1;14210:402:1::0;43208:77:0::1;43335:1;43304:19:::0;;;:10:::1;:19;::::0;;;;;-1:-1:-1;;;;;43304:19:0::1;:33:::0;43296:72:::1;;;::::0;-1:-1:-1;;;43296:72:0;;14819:2:1;43296:72:0::1;::::0;::::1;14801:21:1::0;14858:2;14838:18;;;14831:30;14897:28;14877:18;;;14870:56;14943:18;;43296:72:0::1;14617:350:1::0;43296:72:0::1;-1:-1:-1::0;;;;;43388:27:0;::::1;;::::0;;;:13:::1;:27;::::0;;;;;::::1;;43387:28;43379:69;;;::::0;-1:-1:-1;;;43379:69:0;;15174:2:1;43379:69:0::1;::::0;::::1;15156:21:1::0;15213:2;15193:18;;;15186:30;15252;15232:18;;;15225:58;15300:18;;43379:69:0::1;14972:352:1::0;43379:69:0::1;43464:18;::::0;;;:9:::1;:18;::::0;;;;;::::1;;43459:160;;43499:5;:19:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;-1:-1:-1;43533:18:0;;;:9:::1;43499:19;43533:18:::0;;;;;;;:25;;-1:-1:-1;;43533:25:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;43573:27:0;::::1;::::0;;:13:::1;:27:::0;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;43459:160:::1;43629:19;::::0;;;:10:::1;:19;::::0;;;;:34;;-1:-1:-1;;;;;;43629:34:0::1;-1:-1:-1::0;;;;;43629:34:0;;;::::1;::::0;;;::::1;::::0;;43108:563::o;42546:196::-;35230:10;;-1:-1:-1;;;;;35230:10:0;12231;35230:26;35222:67;;;;-1:-1:-1;;;35222:67:0;;15531:2:1;35222:67:0;;;15513:21:1;15570:2;15550:18;;;15543:30;15609;15589:18;;;15582:58;15657:18;;35222:67:0;15329:352:1;35222:67:0;42613:9:::1;42608:127;42628:5;:12:::0;42624:16;::::1;42608:127;;;42672:10;:20;42683:5;42689:1;42683:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;42672:20;;;::::1;::::0;;;;;;;;;;;;42662:61;;-1:-1:-1;;;42662:61:0;;42712:10:::1;42662:61;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;42672:20:0;;::::1;::::0;42662:49:::1;::::0;2627:18:1;;42662:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42642:3;;;;;:::i;:::-;;;;42608:127;;38604:472:::0;-1:-1:-1;;;;;38773:22:0;;38671:7;38773:22;;;:12;:22;;;;;;38769:68;;-1:-1:-1;38824:1:0;;38604:472;-1:-1:-1;38604:472:0:o;38769:68::-;-1:-1:-1;;;;;38887:22:0;;38847;38887;;;:12;:22;;;;;;38872:37;;:12;:37;:::i;:::-;38847:62;;33893:2;38924:14;:43;38920:148;;-1:-1:-1;38989:1:0;;38604:472;-1:-1:-1;;38604:472:0:o;38920:148::-;39026:42;39054:14;33893:2;39026:42;:::i;:::-;39019:49;38604:472;-1:-1:-1;;;38604:472:0:o;41996:186::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42051:9:::1;42047:128;42070:5;:12:::0;42066:16;::::1;42047:128;;;42114:10;:20;42125:5;42131:1;42125:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;42114:20;;;::::1;::::0;;;;;;;;;;;;42104:59;;-1:-1:-1;;;42104:59:0;;42152:10:::1;42104:59;::::0;::::1;2654:51:1::0;-1:-1:-1;;;;;42114:20:0;;::::1;::::0;42104:47:::1;::::0;2627:18:1;;42104:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42084:3;;;;;:::i;:::-;;;;42047:128;;13686:201:::0;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13775:22:0;::::1;13767:73;;;::::0;-1:-1:-1;;;13767:73:0;;15888:2:1;13767:73:0::1;::::0;::::1;15870:21:1::0;15927:2;15907:18;;;15900:30;15966:34;15946:18;;;15939:62;-1:-1:-1;;;16017:18:1;;;16010:36;16063:19;;13767:73:0::1;15686:402:1::0;13767:73:0::1;13851:28;13870:8;13851:18;:28::i;38197:156::-:0;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;35035:23;;:53;;-1:-1:-1;35062:10:0;;-1:-1:-1;;;;;35062:10:0;12231;35062:26;35035:53;35013:144;;;;-1:-1:-1;;;35013:144:0;;;;;;;:::i;:::-;38282:25:::1;38299:7;38282:16;:25::i;:::-;38318:17;:27:::0;38197:156::o;42190:118::-;12850:6;;-1:-1:-1;;;;;12850:6:0;12231:10;12997:23;12989:68;;;;-1:-1:-1;;;12989:68:0;;;;;;;:::i;:::-;42267:23:::1;:33:::0;42190:118::o;41406:279::-;41495:5;:12;41454:20;;41514:17;;41487:45;;;;-1:-1:-1;;;41487:45:0;;;;;;;;:::i;:::-;;41548:9;41543:135;41567:5;:12;41563:16;;41543:135;;;41627:10;:20;41638:5;41644:1;41638:8;;;;;;;;:::i;:::-;;;;;;;;;41627:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41627:20:0;-1:-1:-1;;;;;41617:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41601:65;;;;:::i;:::-;;-1:-1:-1;41581:3:0;;;;:::i;:::-;;;;41543:135;;46038:118;46102:21;:19;:21::i;:::-;46125:22;46094:54;;;;;-1:-1:-1;;;46094:54:0;;;;;;;;:::i;45445:226::-;45570:23;;45541:26;;45526:41;;:12;:41;:::i;:::-;:67;45504:159;;;;-1:-1:-1;;;45504:159:0;;16295:2:1;45504:159:0;;;16277:21:1;16334:2;16314:18;;;16307:30;16373:34;16353:18;;;16346:62;-1:-1:-1;;;16424:18:1;;;16417:40;16474:19;;45504:159:0;16093:406:1;47421:190:0;47556:12;;47523:29;47539:13;47523;:29;:::i;:::-;:45;;47515:88;;;;-1:-1:-1;;;47515:88:0;;16706:2:1;47515:88:0;;;16688:21:1;16745:2;16725:18;;;16718:30;16784:32;16764:18;;;16757:60;16834:18;;47515:88:0;16504:354:1;18601:276:0;-1:-1:-1;;;;;18685:21:0;;18677:65;;;;-1:-1:-1;;;18677:65:0;;17065:2:1;18677:65:0;;;17047:21:1;17104:2;17084:18;;;17077:30;17143:33;17123:18;;;17116:61;17194:18;;18677:65:0;16863:355:1;18677:65:0;18771:6;18755:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18788:18:0;;:9;:18;;;;;;;;;;:28;;18810:6;;18788:9;:28;;18810:6;;18788:28;:::i;:::-;;;;-1:-1:-1;;18832:37:0;;160:25:1;;;-1:-1:-1;;;;;18832:37:0;;;18849:1;;18832:37;;148:2:1;133:18;18832:37:0;;;;;;;18601:276;;:::o;45679:189::-;45755:5;:12;45770:1;-1:-1:-1;45747:50:0;;;;-1:-1:-1;;;45747:50:0;;17425:2:1;45747:50:0;;;17407:21:1;17464:2;17444:18;;;17437:30;-1:-1:-1;;;17483:18:1;;;17476:51;17544:18;;45747:50:0;17223:345:1;45747:50:0;45816:18;;;;:9;:18;;;;;;45836:23;;45816:18;;45808:52;;;;-1:-1:-1;;;45808:52:0;;;;;;;;:::i;14047:191::-;14140:6;;;-1:-1:-1;;;;;14157:17:0;;;-1:-1:-1;;;;;;14157:17:0;;;;;;;14190:40;;14140:6;;;14157:17;14140:6;;14190:40;;14121:16;;14190:40;14110:128;14047:191;:::o;18885:468::-;-1:-1:-1;;;;;18969:21:0;;18961:67;;;;-1:-1:-1;;;18961:67:0;;17775:2:1;18961:67:0;;;17757:21:1;17814:2;17794:18;;;17787:30;17853:34;17833:18;;;17826:62;-1:-1:-1;;;17904:18:1;;;17897:31;17945:19;;18961:67:0;17573:397:1;18961:67:0;-1:-1:-1;;;;;19066:18:0;;19041:22;19066:18;;;;;;;;;;;19103:24;;;;19095:71;;;;-1:-1:-1;;;19095:71:0;;18177:2:1;19095:71:0;;;18159:21:1;18216:2;18196:18;;;18189:30;18255:34;18235:18;;;18228:62;-1:-1:-1;;;18306:18:1;;;18299:32;18348:19;;19095:71:0;17975:398:1;19095:71:0;-1:-1:-1;;;;;19202:18:0;;:9;:18;;;;;;;;;;19223:23;;;19202:44;;19268:12;:22;;19240:6;;19202:9;19268:22;;19240:6;;19268:22;:::i;:::-;;;;-1:-1:-1;;19308:37:0;;160:25:1;;;19334:1:0;;-1:-1:-1;;;;;19308:37:0;;;;;148:2:1;133:18;19308:37:0;;;;;;;18950:403;18885:468;;:::o;47180:233::-;47277:9;47272:134;47292:5;:12;47288:16;;47272:134;;;47336:10;:20;47347:5;47353:1;47347:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;47336:20;;;;;;;;;;;;;;;;47326:68;;-1:-1:-1;;;47326:68:0;;-1:-1:-1;;;;;9225:32:1;;;47326:68:0;;;9207:51:1;9274:18;;;9267:34;;;47336:20:0;;;;47326:47;;9180:18:1;;47326:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47306:3;;;;;:::i;:::-;;;;47272:134;;45876:154;45982:10;45930:4;45969:24;;;:12;:24;;;;;;33893:2;;45954:39;;:12;:39;:::i;:::-;:68;;45947:75;;45876:154;:::o;46164:1008::-;46330:29;46347:11;46330:16;:29::i;:::-;46378:20;;;;:9;:20;;;;;;;;46370:67;;;;-1:-1:-1;;;46370:67:0;;18859:2:1;46370:67:0;;;18841:21:1;18898:2;18878:18;;;18871:30;18937:34;18917:18;;;18910:62;-1:-1:-1;;;18988:18:1;;;18981:32;19030:19;;46370:67:0;18657:398:1;46370:67:0;46489:1;46470:16;:20;:47;;;;;46514:3;46494:16;:23;;46470:47;46448:162;;;;-1:-1:-1;;;46448:162:0;;19262:2:1;46448:162:0;;;19244:21:1;19301:2;19281:18;;;19274:30;19340:34;19320:18;;;19313:62;19411:34;19391:18;;;19384:62;-1:-1:-1;;;19462:19:1;;;19455:32;19504:19;;46448:162:0;19060:469:1;46448:162:0;46621:14;:12;:14::i;:::-;46646:12;46671:23;;;:10;:23;;;;;;;;;46661:41;;-1:-1:-1;;;46661:41:0;;;;-1:-1:-1;;;;;46671:23:0;;;;46661:39;;:41;;;;;;;;;;;46671:23;46661:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46772:23;;;;:10;:23;;;;;;;;46762:60;;-1:-1:-1;;;46762:60:0;;;;;160:25:1;;;46646:56:0;;-1:-1:-1;;;;;;46772:23:0;;46762:42;;133:18:1;;46762:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46852:37:0;;-1:-1:-1;;;46852:37:0;;46883:4;46852:37;;;2654:51:1;46833:16:0;;-1:-1:-1;;;;;;46852:22:0;;;-1:-1:-1;46852:22:0;;2627:18:1;;46852:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46833:56;-1:-1:-1;46903:12:0;;46900:217;;47007:21;;;;:10;:21;;;;;;46981:58;;-1:-1:-1;;;;;46981:25:0;;;;47007:21;47030:8;46981:25;:58::i;:::-;47064:21;;;;:10;:21;;;;;;;47054:51;;-1:-1:-1;;;47054:51:0;;;;-1:-1:-1;;;;;47064:21:0;;;;47054:49;;:51;;;;;;;;;;;47064:21;;47054:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46900:217;47132:32;;160:25:1;;;47132:32:0;;148:2:1;133:18;47132:32:0;;;;;;;46257:915;;46164:1008;;;:::o;30293:723::-;30349:13;30570:10;30566:53;;-1:-1:-1;;30597:10:0;;;;;;;;;;;;-1:-1:-1;;;30597:10:0;;;;;30293:723::o;30566:53::-;30644:5;30629:12;30685:78;30692:9;;30685:78;;30718:8;;;;:::i;:::-;;-1:-1:-1;30741:10:0;;-1:-1:-1;30749:2:0;30741:10;;:::i;:::-;;;30685:78;;;30773:19;30805:6;30795:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30795:17:0;;30773:39;;30823:154;30830:10;;30823:154;;30857:11;30867:1;30857:11;;:::i;:::-;;-1:-1:-1;30926:10:0;30934:2;30926:5;:10;:::i;:::-;30913:24;;:2;:24;:::i;:::-;30900:39;;30883:6;30890;30883:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;30883:56:0;;;;;;;;-1:-1:-1;30954:11:0;30963:2;30954:11;;:::i;:::-;;;30823:154;;;31001:6;30293:723;-1:-1:-1;;;;30293:723:0:o;14304:211::-;14448:58;;;-1:-1:-1;;;;;9225:32:1;;;14448:58:0;;;9207:51:1;9274:18;;;;9267:34;;;14448:58:0;;;;;;;;;;9180:18:1;;;;14448:58:0;;;;;;;;-1:-1:-1;;;;;14448:58:0;-1:-1:-1;;;14448:58:0;;;17327:69;;;;;;;;;;;;;;;;14421:86;;14441:5;;14448:58;-1:-1:-1;;17327:69:0;;:27;;;14448:58;;17327:27;:69::i;:::-;17411:17;;17301:95;;-1:-1:-1;17411:21:0;17407:179;;17508:10;17497:30;;;;;;;;;;;;:::i;:::-;17489:85;;;;-1:-1:-1;;;17489:85:0;;19985:2:1;17489:85:0;;;19967:21:1;20024:2;20004:18;;;19997:30;20063:34;20043:18;;;20036:62;-1:-1:-1;;;20114:18:1;;;20107:40;20164:19;;17489:85:0;19783:406:1;7593:229:0;7730:12;7762:52;7784:6;7792:4;7798:1;7801:12;7730;5110:20;;9000:60;;;;-1:-1:-1;;;9000:60:0;;20803:2:1;9000:60:0;;;20785:21:1;20842:2;20822:18;;;20815:30;20881:31;20861:18;;;20854:59;20930:18;;9000:60:0;20601:353:1;9000:60:0;9074:12;9088:23;9115:6;-1:-1:-1;;;;;9115:11:0;9134:5;9141:4;9115:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9073:73;;;;9164:51;9181:7;9190:10;9202:12;9164:16;:51::i;:::-;9157:58;8713:510;-1:-1:-1;;;;;;;8713:510:0:o;11399:712::-;11549:12;11578:7;11574:530;;;-1:-1:-1;11609:10:0;11602:17;;11574:530;11723:17;;:21;11719:374;;11921:10;11915:17;11982:15;11969:10;11965:2;11961:19;11954:44;11719:374;12064:12;12057:20;;-1:-1:-1;;;12057:20:0;;;;;;;;:::i;196:131:1:-;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;332:247;391:6;444:2;432:9;423:7;419:23;415:32;412:52;;;460:1;457;450:12;412:52;499:9;486:23;518:31;543:5;518:31;:::i;739:258::-;811:1;821:113;835:6;832:1;829:13;821:113;;;911:11;;;905:18;892:11;;;885:39;857:2;850:10;821:113;;;952:6;949:1;946:13;943:48;;;987:1;978:6;973:3;969:16;962:27;943:48;;739:258;;;:::o;1002:::-;1044:3;1082:5;1076:12;1109:6;1104:3;1097:19;1125:63;1181:6;1174:4;1169:3;1165:14;1158:4;1151:5;1147:16;1125:63;:::i;:::-;1242:2;1221:15;-1:-1:-1;;1217:29:1;1208:39;;;;1249:4;1204:50;;1002:258;-1:-1:-1;;1002:258:1:o;1265:220::-;1414:2;1403:9;1396:21;1377:4;1434:45;1475:2;1464:9;1460:18;1452:6;1434:45;:::i;1871:632::-;2042:2;2094:21;;;2164:13;;2067:18;;;2186:22;;;2013:4;;2042:2;2265:15;;;;2239:2;2224:18;;;2013:4;2308:169;2322:6;2319:1;2316:13;2308:169;;;2383:13;;2371:26;;2452:15;;;;2417:12;;;;2344:1;2337:9;2308:169;;;-1:-1:-1;2494:3:1;;1871:632;-1:-1:-1;;;;;;1871:632:1:o;2716:315::-;2784:6;2792;2845:2;2833:9;2824:7;2820:23;2816:32;2813:52;;;2861:1;2858;2851:12;2813:52;2900:9;2887:23;2919:31;2944:5;2919:31;:::i;:::-;2969:5;3021:2;3006:18;;;;2993:32;;-1:-1:-1;;;2716:315:1:o;3036:180::-;3095:6;3148:2;3136:9;3127:7;3123:23;3119:32;3116:52;;;3164:1;3161;3154:12;3116:52;-1:-1:-1;3187:23:1;;3036:180;-1:-1:-1;3036:180:1:o;3221:316::-;3298:6;3306;3314;3367:2;3355:9;3346:7;3342:23;3338:32;3335:52;;;3383:1;3380;3373:12;3335:52;-1:-1:-1;;3406:23:1;;;3476:2;3461:18;;3448:32;;-1:-1:-1;3527:2:1;3512:18;;;3499:32;;3221:316;-1:-1:-1;3221:316:1:o;3938:898::-;-1:-1:-1;;;;;4371:15:1;;;4353:34;;4423:15;;;4418:2;4403:18;;4396:43;4475:15;;;4470:2;4455:18;;4448:43;4527:15;;;4522:2;4507:18;;4500:43;4580:15;;4574:3;4559:19;;4552:44;4303:3;4333;4612:19;;4605:31;;;4274:4;;4653:45;4679:18;;;4671:6;4653:45;:::i;:::-;4729:3;4714:19;;4707:35;;;;-1:-1:-1;;4773:3:1;4758:19;;4751:35;;;;4817:3;4802:19;;;4795:35;4645:53;3938:898;-1:-1:-1;;;;;;3938:898:1:o;4841:127::-;4902:10;4897:3;4893:20;4890:1;4883:31;4933:4;4930:1;4923:15;4957:4;4954:1;4947:15;4973:125;5013:4;5041:1;5038;5035:8;5032:34;;;5046:18;;:::i;:::-;-1:-1:-1;5083:9:1;;4973:125::o;5938:380::-;6017:1;6013:12;;;;6060;;;6081:61;;6135:4;6127:6;6123:17;6113:27;;6081:61;6188:2;6180:6;6177:14;6157:18;6154:38;6151:161;;;6234:10;6229:3;6225:20;6222:1;6215:31;6269:4;6266:1;6259:15;6297:4;6294:1;6287:15;6449:1186;6558:4;6587:2;6616;6605:9;6598:21;6639:1;6672:6;6666:13;6702:3;6724:1;6752:9;6748:2;6744:18;6734:28;;6812:2;6801:9;6797:18;6834;6824:61;;6878:4;6870:6;6866:17;6856:27;;6824:61;6931:2;6923:6;6920:14;6900:18;6897:38;6894:165;;;-1:-1:-1;;;6958:33:1;;7014:4;7011:1;7004:15;7044:4;6965:3;7032:17;6894:165;7115:18;;;671:19;;;723:4;714:14;7158:18;7185:100;;;;7299:1;7294:315;;;;7151:458;;7185:100;-1:-1:-1;;7218:24:1;;7206:37;;7263:12;;;;-1:-1:-1;7185:100:1;;7294:315;6396:1;6389:14;;;6433:4;6420:18;;7389:1;7403:165;7417:6;7414:1;7411:13;7403:165;;;7495:14;;7482:11;;;7475:35;7538:16;;;;7432:10;;7403:165;;;7588:11;;;-1:-1:-1;;7151:458:1;-1:-1:-1;7626:3:1;;6449:1186;-1:-1:-1;;;;;;;;;6449:1186:1:o;7640:184::-;7710:6;7763:2;7751:9;7742:7;7738:23;7734:32;7731:52;;;7779:1;7776;7769:12;7731:52;-1:-1:-1;7802:16:1;;7640:184;-1:-1:-1;7640:184:1:o;7829:168::-;7869:7;7935:1;7931;7927:6;7923:14;7920:1;7917:21;7912:1;7905:9;7898:17;7894:45;7891:71;;;7942:18;;:::i;:::-;-1:-1:-1;7982:9:1;;7829:168::o;8002:127::-;8063:10;8058:3;8054:20;8051:1;8044:31;8094:4;8091:1;8084:15;8118:4;8115:1;8108:15;8134:120;8174:1;8200;8190:35;;8205:18;;:::i;:::-;-1:-1:-1;8239:9:1;;8134:120::o;8259:127::-;8320:10;8315:3;8311:20;8308:1;8301:31;8351:4;8348:1;8341:15;8375:4;8372:1;8365:15;8391:128;8431:3;8462:1;8458:6;8455:1;8452:13;8449:39;;;8468:18;;:::i;:::-;-1:-1:-1;8504:9:1;;8391:128::o;8524:135::-;8563:3;-1:-1:-1;;8584:17:1;;8581:43;;;8604:18;;:::i;:::-;-1:-1:-1;8651:1:1;8640:13;;8524:135::o;8664:356::-;8866:2;8848:21;;;8885:18;;;8878:30;8944:34;8939:2;8924:18;;8917:62;9011:2;8996:18;;8664:356::o;9312:277::-;9379:6;9432:2;9420:9;9411:7;9407:23;9403:32;9400:52;;;9448:1;9445;9438:12;9400:52;9480:9;9474:16;9533:5;9526:13;9519:21;9512:5;9509:32;9499:60;;9555:1;9552;9545:12;9594:405;9796:2;9778:21;;;9835:2;9815:18;;;9808:30;9874:34;9869:2;9854:18;;9847:62;-1:-1:-1;;;9940:2:1;9925:18;;9918:39;9989:3;9974:19;;9594:405::o;12661:251::-;12731:6;12784:2;12772:9;12763:7;12759:23;12755:32;12752:52;;;12800:1;12797;12790:12;12752:52;12832:9;12826:16;12851:31;12876:5;12851:31;:::i;14078:127::-;14139:10;14134:3;14130:20;14127:1;14120:31;14170:4;14167:1;14160:15;14194:4;14191:1;14184:15;19534:127;19595:10;19590:3;19586:20;19583:1;19576:31;19626:4;19623:1;19616:15;19650:4;19647:1;19640:15;19666:112;19698:1;19724;19714:35;;19729:18;;:::i;:::-;-1:-1:-1;19763:9:1;;19666:112::o;20959:274::-;21088:3;21126:6;21120:13;21142:53;21188:6;21183:3;21176:4;21168:6;21164:17;21142:53;:::i;:::-;21211:16;;;;;20959:274;-1:-1:-1;;20959:274:1:o
Swarm Source
ipfs://08273b71d8221ccc3f4edc3582a1ccfaf4973d0b4fbace3a196eb8b9eb956be7
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.