ERC-20
Overview
Max Total Supply
29,494,979.1532719135 veLTX
Holders
867
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
100 veLTXValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LatticeGovernanceToken
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; contract LatticeGovernanceToken is ERC20, Ownable, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; IERC20 private ltxToken; struct LockupData { uint256 amountLocked; uint256 amountReleased; uint256 fromTimestamp; uint256 toTimestamp; bool withdrawn; } // Total LTX Locked uint256 private _totalLtxLockedSupply; // user => Total LTX Locked mapping(address => uint256) private _ltxLockedBalances; // lockupTime => tokenPercentageReleased mapping(uint256 => uint256) public lockupPoints; // user => slots.length mapping(address => uint256) public lockupSlots; // user => (slots[index] => lockupData) mapping(address => mapping(uint256 => LockupData)) public lockups; event Locked( address indexed user, uint256 indexed lockupTime, uint256 indexed lockupSlot, uint256 amountLocked, uint256 amountReleased, uint256 timestamp ); event Unlocked( address indexed user, uint256 indexed lockupSlot, uint256 amountUnlocked, uint256 amountReturned, uint256 timestamp ); event LockupPointSet( uint256 indexed lockupTime, uint256 indexed tokenPercentageReleased ); constructor(IERC20 _ltxToken) ERC20("LatticeGovernanceToken", "veLTX") { ltxToken = _ltxToken; } function transfer(address to, uint256 amount) public pure virtual override returns (bool) { revert("veLTX: The Lattice veLTX token is not transferable"); } function allowance(address owner, address spender) public pure virtual override returns (uint256) { revert("veLTX: The Lattice veLTX token is not transferable"); } function approve(address spender, uint256 amount) public pure virtual override returns (bool) { revert("veLTX: The Lattice veLTX token is not transferable"); } function transferFrom( address from, address to, uint256 amount ) public pure virtual override returns (bool) { revert("veLTX: The Lattice veLTX token is not transferable"); } function increaseAllowance(address spender, uint256 addedValue) public pure virtual override returns (bool) { revert("veLTX: The Lattice veLTX token is not transferable"); } function decreaseAllowance(address spender, uint256 subtractedValue) public pure virtual override returns (bool) { revert("veLTX: The Lattice veLTX token is not transferable"); } function totalLtxLockedSupply() public view virtual returns (uint256) { return _totalLtxLockedSupply; } function ltxLockedBalanceOf(address account) public view virtual returns (uint256) { return _ltxLockedBalances[account]; } function getUserLockups(address user, bool completed) public view virtual returns (LockupData[] memory) { uint256 _userSlots = lockupSlots[user]; uint256 _selectedLockups = 0; for (uint256 i = 0; i < _userSlots; i++) { LockupData memory _lockup = lockups[user][i]; if (_lockup.withdrawn == completed) { _selectedLockups++; } } LockupData[] memory _lockups = new LockupData[](_selectedLockups); uint256 _lockupsLength = 0; for (uint256 i = 0; i < _userSlots; i++) { LockupData memory _lockup = lockups[user][i]; if (_lockup.withdrawn == completed) { _lockups[_lockupsLength] = _lockup; _lockupsLength++; } } return _lockups; } function lock(uint256 _amount, uint256 _lockupTime) public nonReentrant whenNotPaused { require( lockupPoints[_lockupTime] != 0, "veLTX: Lockup point does not exist" ); LockupData memory _lockupData; _lockupData.amountLocked = _amount; _lockupData.amountReleased = _amount * lockupPoints[_lockupTime]; _lockupData.fromTimestamp = block.timestamp; _lockupData.toTimestamp = block.timestamp + _lockupTime; _lockupData.withdrawn = false; uint256 _lockupSlot = lockupSlots[address(msg.sender)]; lockupSlots[address(msg.sender)] = _lockupSlot + 1; lockups[address(msg.sender)][_lockupSlot] = _lockupData; ltxToken.safeTransferFrom( address(msg.sender), address(this), _lockupData.amountLocked ); _ltxLockedBalances[msg.sender] += _amount; _totalLtxLockedSupply += _amount; _mint(address(msg.sender), _lockupData.amountReleased); emit Locked( address(msg.sender), _lockupTime, _lockupSlot, _lockupData.amountLocked, _lockupData.amountReleased, block.timestamp ); } function unlock(uint256 _lockupSlot) public nonReentrant whenNotPaused { require( lockupSlots[address(msg.sender)] > _lockupSlot, "veLTX: Lockup slot not found" ); LockupData memory _lockupData = lockups[address(msg.sender)][ _lockupSlot ]; require(!_lockupData.withdrawn, "veLTX: Lockup slot already withdrawn"); require( _lockupData.toTimestamp <= block.timestamp, "veLTX: Lockup still in progress" ); require( ltxToken.balanceOf(address(this)) >= _lockupData.amountLocked, "veLTX: Funds pool exceeds balance limit" ); _burn(address(msg.sender), _lockupData.amountReleased); _totalLtxLockedSupply -= _lockupData.amountLocked; _ltxLockedBalances[msg.sender] -= _lockupData.amountLocked; ltxToken.safeTransfer(address(msg.sender), _lockupData.amountLocked); _lockupData.withdrawn = true; lockups[address(msg.sender)][_lockupSlot] = _lockupData; emit Unlocked( address(msg.sender), _lockupSlot, _lockupData.amountLocked, _lockupData.amountReleased, block.timestamp ); } function setLockupPoint( uint256 _lockupTime, uint256 _tokenPercentageReleased ) public onlyOwner { setLockupPoint(_lockupTime, _tokenPercentageReleased, false); } function setLockupPoint( uint256 _lockupTime, uint256 _tokenPercentageReleased, bool _force ) public onlyOwner { require( lockupPoints[_lockupTime] == 0 || _force, "veLTX: Lockup point is already set" ); lockupPoints[_lockupTime] = _tokenPercentageReleased; emit LockupPointSet(_lockupTime, _tokenPercentageReleased); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ 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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, 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) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - 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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_ltxToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"lockupTime","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"lockupSlot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLocked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReleased","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lockupTime","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenPercentageReleased","type":"uint256"}],"name":"LockupPointSet","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":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"lockupSlot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountUnlocked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReturned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"completed","type":"bool"}],"name":"getUserLockups","outputs":[{"components":[{"internalType":"uint256","name":"amountLocked","type":"uint256"},{"internalType":"uint256","name":"amountReleased","type":"uint256"},{"internalType":"uint256","name":"fromTimestamp","type":"uint256"},{"internalType":"uint256","name":"toTimestamp","type":"uint256"},{"internalType":"bool","name":"withdrawn","type":"bool"}],"internalType":"struct LatticeGovernanceToken.LockupData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lockupTime","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockupPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockupSlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockups","outputs":[{"internalType":"uint256","name":"amountLocked","type":"uint256"},{"internalType":"uint256","name":"amountReleased","type":"uint256"},{"internalType":"uint256","name":"fromTimestamp","type":"uint256"},{"internalType":"uint256","name":"toTimestamp","type":"uint256"},{"internalType":"bool","name":"withdrawn","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ltxLockedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockupTime","type":"uint256"},{"internalType":"uint256","name":"_tokenPercentageReleased","type":"uint256"},{"internalType":"bool","name":"_force","type":"bool"}],"name":"setLockupPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockupTime","type":"uint256"},{"internalType":"uint256","name":"_tokenPercentageReleased","type":"uint256"}],"name":"setLockupPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLtxLockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockupSlot","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620036543803806200365483398181016040528101906200003791906200035e565b6040518060400160405280601681526020017f4c617474696365476f7665726e616e6365546f6b656e000000000000000000008152506040518060400160405280600581526020017f76654c54580000000000000000000000000000000000000000000000000000008152508160039080519060200190620000bb92919062000230565b508060049080519060200190620000d492919062000230565b505050620000f7620000eb6200016260201b60201c565b6200016a60201b60201c565b60016006819055506000600760006101000a81548160ff02191690831515021790555080600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620003f5565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023e90620003bf565b90600052602060002090601f016020900481019282620002625760008555620002ae565b82601f106200027d57805160ff1916838001178555620002ae565b82800160010185558215620002ae579182015b82811115620002ad57825182559160200191906001019062000290565b5b509050620002bd9190620002c1565b5090565b5b80821115620002dc576000816000905550600101620002c2565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031282620002e5565b9050919050565b6000620003268262000305565b9050919050565b620003388162000319565b81146200034457600080fd5b50565b60008151905062000358816200032d565b92915050565b600060208284031215620003775762000376620002e0565b5b6000620003878482850162000347565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003d857607f821691505b60208210811415620003ef57620003ee62000390565b5b50919050565b61324f80620004056000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806367c76d74116100f9578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e146104c2578063f2fde38b146104f2578063f7cbabbe1461050e578063fae4988b1461053e576101a9565b8063a9059cbb14610442578063c93d0b1e14610472578063d338486c146104a6576101a9565b80638456cb59116100d35780638456cb59146103cc5780638da5cb5b146103d657806395d89b41146103f4578063a457c2d714610412576101a9565b806367c76d741461036257806370a0823114610392578063715018a6146103c2576101a9565b806339509351116101665780635c975abb116101405780635c975abb146102da578063619184f0146102f85780636198e33914610328578063645549c014610344576101a9565b806339509351146102845780633b569379146102b45780633f4ba83a146102d0576101a9565b806306fdde03146101ae578063095ea7b3146101cc5780631338736f146101fc57806318160ddd1461021857806323b872dd14610236578063313ce56714610266575b600080fd5b6101b661056e565b6040516101c3919061201f565b60405180910390f35b6101e660048036038101906101e191906120da565b610600565b6040516101f39190612135565b60405180910390f35b61021660048036038101906102119190612150565b61063d565b005b6102206109be565b60405161022d919061219f565b60405180910390f35b610250600480360381019061024b91906121ba565b6109c8565b60405161025d9190612135565b60405180910390f35b61026e610a05565b60405161027b9190612229565b60405180910390f35b61029e600480360381019061029991906120da565b610a0e565b6040516102ab9190612135565b60405180910390f35b6102ce60048036038101906102c99190612270565b610a4b565b005b6102d8610afc565b005b6102e2610b0e565b6040516102ef9190612135565b60405180910390f35b610312600480360381019061030d91906122c3565b610b25565b60405161031f919061219f565b60405180910390f35b610342600480360381019061033d91906122f0565b610b6e565b005b61034c61104e565b604051610359919061219f565b60405180910390f35b61037c600480360381019061037791906122f0565b611058565b604051610389919061219f565b60405180910390f35b6103ac60048036038101906103a791906122c3565b611070565b6040516103b9919061219f565b60405180910390f35b6103ca6110b8565b005b6103d46110cc565b005b6103de6110de565b6040516103eb919061232c565b60405180910390f35b6103fc611108565b604051610409919061201f565b60405180910390f35b61042c600480360381019061042791906120da565b61119a565b6040516104399190612135565b60405180910390f35b61045c600480360381019061045791906120da565b6111d7565b6040516104699190612135565b60405180910390f35b61048c600480360381019061048791906120da565b611214565b60405161049d959493929190612347565b60405180910390f35b6104c060048036038101906104bb9190612150565b611264565b005b6104dc60048036038101906104d7919061239a565b61127c565b6040516104e9919061219f565b60405180910390f35b61050c600480360381019061050791906122c3565b6112b9565b005b610528600480360381019061052391906122c3565b61133d565b604051610535919061219f565b60405180910390f35b610558600480360381019061055391906123da565b611355565b604051610565919061254f565b60405180910390f35b60606003805461057d906125a0565b80601f01602080910402602001604051908101604052809291908181526020018280546105a9906125a0565b80156105f65780601f106105cb576101008083540402835291602001916105f6565b820191906000526020600020905b8154815290600101906020018083116105d957829003601f168201915b5050505050905090565b60006040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063490612644565b60405180910390fd5b60026006541415610683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067a906126b0565b60405180910390fd5b60026006819055506106936115e3565b6000600a60008381526020019081526020016000205414156106ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e190612742565b60405180910390fd5b6106f2611f55565b82816000018181525050600a6000838152602001908152602001600020548361071b9190612791565b81602001818152505042816040018181525050814261073a91906127eb565b81606001818152505060008160800190151590811515815250506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001816107a591906127eb565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506108d733308460000151600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661162d909392919063ffffffff16565b83600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461092691906127eb565b92505081905550836008600082825461093f91906127eb565b925050819055506109543383602001516116b6565b80833373ffffffffffffffffffffffffffffffffffffffff167fa0b15b5afbd8adc1efc429bc38aa12b0f04d6b9b7ab93f6ec76d54603b4be0ee85600001518660200151426040516109a893929190612841565b60405180910390a4505060016006819055505050565b6000600254905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90612644565b60405180910390fd5b60006012905090565b60006040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4290612644565b60405180910390fd5b610a53611816565b6000600a6000858152602001908152602001600020541480610a725750805b610ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa8906128ea565b60405180910390fd5b81600a60008581526020019081526020016000208190555081837f9ad1bada0d2a593c22abd8700d86d0fe394180c0c778520852718a8581ba978d60405160405180910390a3505050565b610b04611816565b610b0c611894565b565b6000600760009054906101000a900460ff16905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60026006541415610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab906126b0565b60405180910390fd5b6002600681905550610bc46115e3565b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c90612956565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250509050806080015115610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d23906129e8565b60405180910390fd5b4281606001511115610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90612a54565b60405180910390fd5b8060000151600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dd3919061232c565b60206040518083038186803b158015610deb57600080fd5b505afa158015610dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e239190612a89565b1015610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90612b28565b60405180910390fd5b610e723382602001516118f7565b806000015160086000828254610e889190612b48565b925050819055508060000151600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ee29190612b48565b92505081905550610f3a338260000151600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ace9092919063ffffffff16565b600181608001901515908115158152505080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908315150217905550905050813373ffffffffffffffffffffffffffffffffffffffff167f643734e0ad4e750b789295ea0e25aa3568d141d6aefa7dd2700c0f55b6ce6a58836000015184602001514260405161103a93929190612841565b60405180910390a350600160068190555050565b6000600854905090565b600a6020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110c0611816565b6110ca6000611b54565b565b6110d4611816565b6110dc611c1a565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611117906125a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611143906125a0565b80156111905780601f1061116557610100808354040283529160200191611190565b820191906000526020600020905b81548152906001019060200180831161117357829003601f168201915b5050505050905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612644565b60405180910390fd5b60006040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b90612644565b60405180910390fd5b600c602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040160009054906101000a900460ff16905085565b61126c611816565b61127882826000610a4b565b5050565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b090612644565b60405180910390fd5b6112c1611816565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890612bee565b60405180910390fd5b61133a81611b54565b50565b600b6020528060005260406000206000915090505481565b60606000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000805b8281101561147c576000600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050905085151581608001511515141561146857828061146490612c0e565b9350505b50808061147490612c0e565b91505061139f565b5060008167ffffffffffffffff81111561149957611498612c57565b5b6040519080825280602002602001820160405280156114d257816020015b6114bf611f55565b8152602001906001900390816114b75790505b5090506000805b848110156115d5576000600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508715158160800151151514156115c157808484815181106115a7576115a6612c86565b5b602002602001018190525082806115bd90612c0e565b9350505b5080806115cd90612c0e565b9150506114d9565b508194505050505092915050565b6115eb610b0e565b1561162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290612d01565b60405180910390fd5b565b6116b0846323b872dd60e01b85858560405160240161164e93929190612d21565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611c7d565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171d90612da4565b60405180910390fd5b61173260008383611d44565b806002600082825461174491906127eb565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461179991906127eb565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117fe919061219f565b60405180910390a361181260008383611d49565b5050565b61181e611d4e565b73ffffffffffffffffffffffffffffffffffffffff1661183c6110de565b73ffffffffffffffffffffffffffffffffffffffff1614611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990612e10565b60405180910390fd5b565b61189c611d56565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118e0611d4e565b6040516118ed919061232c565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612ea2565b60405180910390fd5b61197382600083611d44565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090612f34565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611a509190612b48565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ab5919061219f565b60405180910390a3611ac983600084611d49565b505050565b611b4f8363a9059cbb60e01b8484604051602401611aed929190612f54565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611c7d565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c226115e3565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c66611d4e565b604051611c73919061232c565b60405180910390a1565b6000611cdf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611d9f9092919063ffffffff16565b9050600081511115611d3f5780806020019051810190611cff9190612f92565b611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3590613031565b60405180910390fd5b5b505050565b505050565b505050565b600033905090565b611d5e610b0e565b611d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d949061309d565b60405180910390fd5b565b6060611dae8484600085611db7565b90509392505050565b606082471015611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df39061312f565b60405180910390fd5b611e0585611ecb565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b9061319b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611e6d9190613202565b60006040518083038185875af1925050503d8060008114611eaa576040519150601f19603f3d011682016040523d82523d6000602084013e611eaf565b606091505b5091509150611ebf828286611eee565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315611efe57829050611f4e565b600083511115611f115782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f45919061201f565b60405180910390fd5b9392505050565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015611fc0578082015181840152602081019050611fa5565b83811115611fcf576000848401525b50505050565b6000601f19601f8301169050919050565b6000611ff182611f86565b611ffb8185611f91565b935061200b818560208601611fa2565b61201481611fd5565b840191505092915050565b600060208201905081810360008301526120398184611fe6565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061207182612046565b9050919050565b61208181612066565b811461208c57600080fd5b50565b60008135905061209e81612078565b92915050565b6000819050919050565b6120b7816120a4565b81146120c257600080fd5b50565b6000813590506120d4816120ae565b92915050565b600080604083850312156120f1576120f0612041565b5b60006120ff8582860161208f565b9250506020612110858286016120c5565b9150509250929050565b60008115159050919050565b61212f8161211a565b82525050565b600060208201905061214a6000830184612126565b92915050565b6000806040838503121561216757612166612041565b5b6000612175858286016120c5565b9250506020612186858286016120c5565b9150509250929050565b612199816120a4565b82525050565b60006020820190506121b46000830184612190565b92915050565b6000806000606084860312156121d3576121d2612041565b5b60006121e18682870161208f565b93505060206121f28682870161208f565b9250506040612203868287016120c5565b9150509250925092565b600060ff82169050919050565b6122238161220d565b82525050565b600060208201905061223e600083018461221a565b92915050565b61224d8161211a565b811461225857600080fd5b50565b60008135905061226a81612244565b92915050565b60008060006060848603121561228957612288612041565b5b6000612297868287016120c5565b93505060206122a8868287016120c5565b92505060406122b98682870161225b565b9150509250925092565b6000602082840312156122d9576122d8612041565b5b60006122e78482850161208f565b91505092915050565b60006020828403121561230657612305612041565b5b6000612314848285016120c5565b91505092915050565b61232681612066565b82525050565b6000602082019050612341600083018461231d565b92915050565b600060a08201905061235c6000830188612190565b6123696020830187612190565b6123766040830186612190565b6123836060830185612190565b6123906080830184612126565b9695505050505050565b600080604083850312156123b1576123b0612041565b5b60006123bf8582860161208f565b92505060206123d08582860161208f565b9150509250929050565b600080604083850312156123f1576123f0612041565b5b60006123ff8582860161208f565b92505060206124108582860161225b565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61244f816120a4565b82525050565b61245e8161211a565b82525050565b60a08201600082015161247a6000850182612446565b50602082015161248d6020850182612446565b5060408201516124a06040850182612446565b5060608201516124b36060850182612446565b5060808201516124c66080850182612455565b50505050565b60006124d88383612464565b60a08301905092915050565b6000602082019050919050565b60006124fc8261241a565b6125068185612425565b935061251183612436565b8060005b8381101561254257815161252988826124cc565b9750612534836124e4565b925050600181019050612515565b5085935050505092915050565b6000602082019050818103600083015261256981846124f1565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806125b857607f821691505b602082108114156125cc576125cb612571565b5b50919050565b7f76654c54583a20546865204c6174746963652076654c545820746f6b656e206960008201527f73206e6f74207472616e7366657261626c650000000000000000000000000000602082015250565b600061262e603283611f91565b9150612639826125d2565b604082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061269a601f83611f91565b91506126a582612664565b602082019050919050565b600060208201905081810360008301526126c98161268d565b9050919050565b7f76654c54583a204c6f636b757020706f696e7420646f6573206e6f742065786960008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b600061272c602283611f91565b9150612737826126d0565b604082019050919050565b6000602082019050818103600083015261275b8161271f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061279c826120a4565b91506127a7836120a4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127e0576127df612762565b5b828202905092915050565b60006127f6826120a4565b9150612801836120a4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561283657612835612762565b5b828201905092915050565b60006060820190506128566000830186612190565b6128636020830185612190565b6128706040830184612190565b949350505050565b7f76654c54583a204c6f636b757020706f696e7420697320616c7265616479207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b60006128d4602283611f91565b91506128df82612878565b604082019050919050565b60006020820190508181036000830152612903816128c7565b9050919050565b7f76654c54583a204c6f636b757020736c6f74206e6f7420666f756e6400000000600082015250565b6000612940601c83611f91565b915061294b8261290a565b602082019050919050565b6000602082019050818103600083015261296f81612933565b9050919050565b7f76654c54583a204c6f636b757020736c6f7420616c726561647920776974686460008201527f7261776e00000000000000000000000000000000000000000000000000000000602082015250565b60006129d2602483611f91565b91506129dd82612976565b604082019050919050565b60006020820190508181036000830152612a01816129c5565b9050919050565b7f76654c54583a204c6f636b7570207374696c6c20696e2070726f677265737300600082015250565b6000612a3e601f83611f91565b9150612a4982612a08565b602082019050919050565b60006020820190508181036000830152612a6d81612a31565b9050919050565b600081519050612a83816120ae565b92915050565b600060208284031215612a9f57612a9e612041565b5b6000612aad84828501612a74565b91505092915050565b7f76654c54583a2046756e647320706f6f6c20657863656564732062616c616e6360008201527f65206c696d697400000000000000000000000000000000000000000000000000602082015250565b6000612b12602783611f91565b9150612b1d82612ab6565b604082019050919050565b60006020820190508181036000830152612b4181612b05565b9050919050565b6000612b53826120a4565b9150612b5e836120a4565b925082821015612b7157612b70612762565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612bd8602683611f91565b9150612be382612b7c565b604082019050919050565b60006020820190508181036000830152612c0781612bcb565b9050919050565b6000612c19826120a4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4c57612c4b612762565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612ceb601083611f91565b9150612cf682612cb5565b602082019050919050565b60006020820190508181036000830152612d1a81612cde565b9050919050565b6000606082019050612d36600083018661231d565b612d43602083018561231d565b612d506040830184612190565b949350505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612d8e601f83611f91565b9150612d9982612d58565b602082019050919050565b60006020820190508181036000830152612dbd81612d81565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612dfa602083611f91565b9150612e0582612dc4565b602082019050919050565b60006020820190508181036000830152612e2981612ded565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e8c602183611f91565b9150612e9782612e30565b604082019050919050565b60006020820190508181036000830152612ebb81612e7f565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f1e602283611f91565b9150612f2982612ec2565b604082019050919050565b60006020820190508181036000830152612f4d81612f11565b9050919050565b6000604082019050612f69600083018561231d565b612f766020830184612190565b9392505050565b600081519050612f8c81612244565b92915050565b600060208284031215612fa857612fa7612041565b5b6000612fb684828501612f7d565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061301b602a83611f91565b915061302682612fbf565b604082019050919050565b6000602082019050818103600083015261304a8161300e565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613087601483611f91565b915061309282613051565b602082019050919050565b600060208201905081810360008301526130b68161307a565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613119602683611f91565b9150613124826130bd565b604082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613185601d83611f91565b91506131908261314f565b602082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b600081519050919050565b600081905092915050565b60006131dc826131bb565b6131e681856131c6565b93506131f6818560208601611fa2565b80840191505092915050565b600061320e82846131d1565b91508190509291505056fea264697066735822122037ed975734401dbebcd3e8dd99193cf78a1181ee95d4d23bcffc4647e42d7fbe64736f6c63430008090033000000000000000000000000a393473d64d2f9f026b60b6df7859a689715d092
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806367c76d74116100f9578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e146104c2578063f2fde38b146104f2578063f7cbabbe1461050e578063fae4988b1461053e576101a9565b8063a9059cbb14610442578063c93d0b1e14610472578063d338486c146104a6576101a9565b80638456cb59116100d35780638456cb59146103cc5780638da5cb5b146103d657806395d89b41146103f4578063a457c2d714610412576101a9565b806367c76d741461036257806370a0823114610392578063715018a6146103c2576101a9565b806339509351116101665780635c975abb116101405780635c975abb146102da578063619184f0146102f85780636198e33914610328578063645549c014610344576101a9565b806339509351146102845780633b569379146102b45780633f4ba83a146102d0576101a9565b806306fdde03146101ae578063095ea7b3146101cc5780631338736f146101fc57806318160ddd1461021857806323b872dd14610236578063313ce56714610266575b600080fd5b6101b661056e565b6040516101c3919061201f565b60405180910390f35b6101e660048036038101906101e191906120da565b610600565b6040516101f39190612135565b60405180910390f35b61021660048036038101906102119190612150565b61063d565b005b6102206109be565b60405161022d919061219f565b60405180910390f35b610250600480360381019061024b91906121ba565b6109c8565b60405161025d9190612135565b60405180910390f35b61026e610a05565b60405161027b9190612229565b60405180910390f35b61029e600480360381019061029991906120da565b610a0e565b6040516102ab9190612135565b60405180910390f35b6102ce60048036038101906102c99190612270565b610a4b565b005b6102d8610afc565b005b6102e2610b0e565b6040516102ef9190612135565b60405180910390f35b610312600480360381019061030d91906122c3565b610b25565b60405161031f919061219f565b60405180910390f35b610342600480360381019061033d91906122f0565b610b6e565b005b61034c61104e565b604051610359919061219f565b60405180910390f35b61037c600480360381019061037791906122f0565b611058565b604051610389919061219f565b60405180910390f35b6103ac60048036038101906103a791906122c3565b611070565b6040516103b9919061219f565b60405180910390f35b6103ca6110b8565b005b6103d46110cc565b005b6103de6110de565b6040516103eb919061232c565b60405180910390f35b6103fc611108565b604051610409919061201f565b60405180910390f35b61042c600480360381019061042791906120da565b61119a565b6040516104399190612135565b60405180910390f35b61045c600480360381019061045791906120da565b6111d7565b6040516104699190612135565b60405180910390f35b61048c600480360381019061048791906120da565b611214565b60405161049d959493929190612347565b60405180910390f35b6104c060048036038101906104bb9190612150565b611264565b005b6104dc60048036038101906104d7919061239a565b61127c565b6040516104e9919061219f565b60405180910390f35b61050c600480360381019061050791906122c3565b6112b9565b005b610528600480360381019061052391906122c3565b61133d565b604051610535919061219f565b60405180910390f35b610558600480360381019061055391906123da565b611355565b604051610565919061254f565b60405180910390f35b60606003805461057d906125a0565b80601f01602080910402602001604051908101604052809291908181526020018280546105a9906125a0565b80156105f65780601f106105cb576101008083540402835291602001916105f6565b820191906000526020600020905b8154815290600101906020018083116105d957829003601f168201915b5050505050905090565b60006040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063490612644565b60405180910390fd5b60026006541415610683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067a906126b0565b60405180910390fd5b60026006819055506106936115e3565b6000600a60008381526020019081526020016000205414156106ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e190612742565b60405180910390fd5b6106f2611f55565b82816000018181525050600a6000838152602001908152602001600020548361071b9190612791565b81602001818152505042816040018181525050814261073a91906127eb565b81606001818152505060008160800190151590811515815250506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001816107a591906127eb565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506108d733308460000151600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661162d909392919063ffffffff16565b83600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461092691906127eb565b92505081905550836008600082825461093f91906127eb565b925050819055506109543383602001516116b6565b80833373ffffffffffffffffffffffffffffffffffffffff167fa0b15b5afbd8adc1efc429bc38aa12b0f04d6b9b7ab93f6ec76d54603b4be0ee85600001518660200151426040516109a893929190612841565b60405180910390a4505060016006819055505050565b6000600254905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90612644565b60405180910390fd5b60006012905090565b60006040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4290612644565b60405180910390fd5b610a53611816565b6000600a6000858152602001908152602001600020541480610a725750805b610ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa8906128ea565b60405180910390fd5b81600a60008581526020019081526020016000208190555081837f9ad1bada0d2a593c22abd8700d86d0fe394180c0c778520852718a8581ba978d60405160405180910390a3505050565b610b04611816565b610b0c611894565b565b6000600760009054906101000a900460ff16905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60026006541415610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab906126b0565b60405180910390fd5b6002600681905550610bc46115e3565b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c90612956565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250509050806080015115610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d23906129e8565b60405180910390fd5b4281606001511115610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90612a54565b60405180910390fd5b8060000151600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dd3919061232c565b60206040518083038186803b158015610deb57600080fd5b505afa158015610dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e239190612a89565b1015610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90612b28565b60405180910390fd5b610e723382602001516118f7565b806000015160086000828254610e889190612b48565b925050819055508060000151600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ee29190612b48565b92505081905550610f3a338260000151600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ace9092919063ffffffff16565b600181608001901515908115158152505080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908315150217905550905050813373ffffffffffffffffffffffffffffffffffffffff167f643734e0ad4e750b789295ea0e25aa3568d141d6aefa7dd2700c0f55b6ce6a58836000015184602001514260405161103a93929190612841565b60405180910390a350600160068190555050565b6000600854905090565b600a6020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110c0611816565b6110ca6000611b54565b565b6110d4611816565b6110dc611c1a565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611117906125a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611143906125a0565b80156111905780601f1061116557610100808354040283529160200191611190565b820191906000526020600020905b81548152906001019060200180831161117357829003601f168201915b5050505050905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612644565b60405180910390fd5b60006040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b90612644565b60405180910390fd5b600c602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040160009054906101000a900460ff16905085565b61126c611816565b61127882826000610a4b565b5050565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b090612644565b60405180910390fd5b6112c1611816565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890612bee565b60405180910390fd5b61133a81611b54565b50565b600b6020528060005260406000206000915090505481565b60606000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000805b8281101561147c576000600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050905085151581608001511515141561146857828061146490612c0e565b9350505b50808061147490612c0e565b91505061139f565b5060008167ffffffffffffffff81111561149957611498612c57565b5b6040519080825280602002602001820160405280156114d257816020015b6114bf611f55565b8152602001906001900390816114b75790505b5090506000805b848110156115d5576000600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508715158160800151151514156115c157808484815181106115a7576115a6612c86565b5b602002602001018190525082806115bd90612c0e565b9350505b5080806115cd90612c0e565b9150506114d9565b508194505050505092915050565b6115eb610b0e565b1561162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290612d01565b60405180910390fd5b565b6116b0846323b872dd60e01b85858560405160240161164e93929190612d21565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611c7d565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171d90612da4565b60405180910390fd5b61173260008383611d44565b806002600082825461174491906127eb565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461179991906127eb565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117fe919061219f565b60405180910390a361181260008383611d49565b5050565b61181e611d4e565b73ffffffffffffffffffffffffffffffffffffffff1661183c6110de565b73ffffffffffffffffffffffffffffffffffffffff1614611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990612e10565b60405180910390fd5b565b61189c611d56565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118e0611d4e565b6040516118ed919061232c565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612ea2565b60405180910390fd5b61197382600083611d44565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090612f34565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611a509190612b48565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ab5919061219f565b60405180910390a3611ac983600084611d49565b505050565b611b4f8363a9059cbb60e01b8484604051602401611aed929190612f54565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611c7d565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c226115e3565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c66611d4e565b604051611c73919061232c565b60405180910390a1565b6000611cdf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611d9f9092919063ffffffff16565b9050600081511115611d3f5780806020019051810190611cff9190612f92565b611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3590613031565b60405180910390fd5b5b505050565b505050565b505050565b600033905090565b611d5e610b0e565b611d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d949061309d565b60405180910390fd5b565b6060611dae8484600085611db7565b90509392505050565b606082471015611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df39061312f565b60405180910390fd5b611e0585611ecb565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b9061319b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611e6d9190613202565b60006040518083038185875af1925050503d8060008114611eaa576040519150601f19603f3d011682016040523d82523d6000602084013e611eaf565b606091505b5091509150611ebf828286611eee565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315611efe57829050611f4e565b600083511115611f115782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f45919061201f565b60405180910390fd5b9392505050565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015611fc0578082015181840152602081019050611fa5565b83811115611fcf576000848401525b50505050565b6000601f19601f8301169050919050565b6000611ff182611f86565b611ffb8185611f91565b935061200b818560208601611fa2565b61201481611fd5565b840191505092915050565b600060208201905081810360008301526120398184611fe6565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061207182612046565b9050919050565b61208181612066565b811461208c57600080fd5b50565b60008135905061209e81612078565b92915050565b6000819050919050565b6120b7816120a4565b81146120c257600080fd5b50565b6000813590506120d4816120ae565b92915050565b600080604083850312156120f1576120f0612041565b5b60006120ff8582860161208f565b9250506020612110858286016120c5565b9150509250929050565b60008115159050919050565b61212f8161211a565b82525050565b600060208201905061214a6000830184612126565b92915050565b6000806040838503121561216757612166612041565b5b6000612175858286016120c5565b9250506020612186858286016120c5565b9150509250929050565b612199816120a4565b82525050565b60006020820190506121b46000830184612190565b92915050565b6000806000606084860312156121d3576121d2612041565b5b60006121e18682870161208f565b93505060206121f28682870161208f565b9250506040612203868287016120c5565b9150509250925092565b600060ff82169050919050565b6122238161220d565b82525050565b600060208201905061223e600083018461221a565b92915050565b61224d8161211a565b811461225857600080fd5b50565b60008135905061226a81612244565b92915050565b60008060006060848603121561228957612288612041565b5b6000612297868287016120c5565b93505060206122a8868287016120c5565b92505060406122b98682870161225b565b9150509250925092565b6000602082840312156122d9576122d8612041565b5b60006122e78482850161208f565b91505092915050565b60006020828403121561230657612305612041565b5b6000612314848285016120c5565b91505092915050565b61232681612066565b82525050565b6000602082019050612341600083018461231d565b92915050565b600060a08201905061235c6000830188612190565b6123696020830187612190565b6123766040830186612190565b6123836060830185612190565b6123906080830184612126565b9695505050505050565b600080604083850312156123b1576123b0612041565b5b60006123bf8582860161208f565b92505060206123d08582860161208f565b9150509250929050565b600080604083850312156123f1576123f0612041565b5b60006123ff8582860161208f565b92505060206124108582860161225b565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61244f816120a4565b82525050565b61245e8161211a565b82525050565b60a08201600082015161247a6000850182612446565b50602082015161248d6020850182612446565b5060408201516124a06040850182612446565b5060608201516124b36060850182612446565b5060808201516124c66080850182612455565b50505050565b60006124d88383612464565b60a08301905092915050565b6000602082019050919050565b60006124fc8261241a565b6125068185612425565b935061251183612436565b8060005b8381101561254257815161252988826124cc565b9750612534836124e4565b925050600181019050612515565b5085935050505092915050565b6000602082019050818103600083015261256981846124f1565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806125b857607f821691505b602082108114156125cc576125cb612571565b5b50919050565b7f76654c54583a20546865204c6174746963652076654c545820746f6b656e206960008201527f73206e6f74207472616e7366657261626c650000000000000000000000000000602082015250565b600061262e603283611f91565b9150612639826125d2565b604082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061269a601f83611f91565b91506126a582612664565b602082019050919050565b600060208201905081810360008301526126c98161268d565b9050919050565b7f76654c54583a204c6f636b757020706f696e7420646f6573206e6f742065786960008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b600061272c602283611f91565b9150612737826126d0565b604082019050919050565b6000602082019050818103600083015261275b8161271f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061279c826120a4565b91506127a7836120a4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127e0576127df612762565b5b828202905092915050565b60006127f6826120a4565b9150612801836120a4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561283657612835612762565b5b828201905092915050565b60006060820190506128566000830186612190565b6128636020830185612190565b6128706040830184612190565b949350505050565b7f76654c54583a204c6f636b757020706f696e7420697320616c7265616479207360008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b60006128d4602283611f91565b91506128df82612878565b604082019050919050565b60006020820190508181036000830152612903816128c7565b9050919050565b7f76654c54583a204c6f636b757020736c6f74206e6f7420666f756e6400000000600082015250565b6000612940601c83611f91565b915061294b8261290a565b602082019050919050565b6000602082019050818103600083015261296f81612933565b9050919050565b7f76654c54583a204c6f636b757020736c6f7420616c726561647920776974686460008201527f7261776e00000000000000000000000000000000000000000000000000000000602082015250565b60006129d2602483611f91565b91506129dd82612976565b604082019050919050565b60006020820190508181036000830152612a01816129c5565b9050919050565b7f76654c54583a204c6f636b7570207374696c6c20696e2070726f677265737300600082015250565b6000612a3e601f83611f91565b9150612a4982612a08565b602082019050919050565b60006020820190508181036000830152612a6d81612a31565b9050919050565b600081519050612a83816120ae565b92915050565b600060208284031215612a9f57612a9e612041565b5b6000612aad84828501612a74565b91505092915050565b7f76654c54583a2046756e647320706f6f6c20657863656564732062616c616e6360008201527f65206c696d697400000000000000000000000000000000000000000000000000602082015250565b6000612b12602783611f91565b9150612b1d82612ab6565b604082019050919050565b60006020820190508181036000830152612b4181612b05565b9050919050565b6000612b53826120a4565b9150612b5e836120a4565b925082821015612b7157612b70612762565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612bd8602683611f91565b9150612be382612b7c565b604082019050919050565b60006020820190508181036000830152612c0781612bcb565b9050919050565b6000612c19826120a4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4c57612c4b612762565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612ceb601083611f91565b9150612cf682612cb5565b602082019050919050565b60006020820190508181036000830152612d1a81612cde565b9050919050565b6000606082019050612d36600083018661231d565b612d43602083018561231d565b612d506040830184612190565b949350505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612d8e601f83611f91565b9150612d9982612d58565b602082019050919050565b60006020820190508181036000830152612dbd81612d81565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612dfa602083611f91565b9150612e0582612dc4565b602082019050919050565b60006020820190508181036000830152612e2981612ded565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e8c602183611f91565b9150612e9782612e30565b604082019050919050565b60006020820190508181036000830152612ebb81612e7f565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f1e602283611f91565b9150612f2982612ec2565b604082019050919050565b60006020820190508181036000830152612f4d81612f11565b9050919050565b6000604082019050612f69600083018561231d565b612f766020830184612190565b9392505050565b600081519050612f8c81612244565b92915050565b600060208284031215612fa857612fa7612041565b5b6000612fb684828501612f7d565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061301b602a83611f91565b915061302682612fbf565b604082019050919050565b6000602082019050818103600083015261304a8161300e565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613087601483611f91565b915061309282613051565b602082019050919050565b600060208201905081810360008301526130b68161307a565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613119602683611f91565b9150613124826130bd565b604082019050919050565b600060208201905081810360008301526131488161310c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613185601d83611f91565b91506131908261314f565b602082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b600081519050919050565b600081905092915050565b60006131dc826131bb565b6131e681856131c6565b93506131f6818560208601611fa2565b80840191505092915050565b600061320e82846131d1565b91508190509291505056fea264697066735822122037ed975734401dbebcd3e8dd99193cf78a1181ee95d4d23bcffc4647e42d7fbe64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a393473d64d2f9f026b60b6df7859a689715d092
-----Decoded View---------------
Arg [0] : _ltxToken (address): 0xa393473d64d2F9F026B60b6Df7859A689715d092
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a393473d64d2f9f026b60b6df7859a689715d092
Deployed Bytecode Sourcemap
408:7227:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2262:215:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4343:1273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3244:106:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2483:215:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3093:91:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2704:229:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7090:409;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7570:63;;;:::i;:::-;;1615:84:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3300:170:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5622:1261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3179:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;937:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3408:125:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;:::i;:::-;;7505:59:10;;;:::i;:::-;;1201:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2367:102:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2939:234:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1820:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1116:65;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;6889:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2037:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1019:46:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3476:861;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2156:98:3;2210:13;2242:5;2235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98;:::o;2262:215:10:-;2390:4;2410:60;;;;;;;;;;:::i;:::-;;;;;;;;4343:1273;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1239:19:1::1;:17;:19::i;:::-;4517:1:10::2;4488:12;:25;4501:11;4488:25;;;;;;;;;;;;:30;;4467:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;4589:29;;:::i;:::-;4655:7;4628:11;:24;;:34;;;::::0;::::2;4711:12;:25;4724:11;4711:25;;;;;;;;;;;;4701:7;:35;;;;:::i;:::-;4672:11;:26;;:64;;;::::0;::::2;4774:15;4746:11;:25;;:43;;;::::0;::::2;4843:11;4825:15;:29;;;;:::i;:::-;4799:11;:23;;:55;;;::::0;::::2;4888:5;4864:11;:21;;:29;;;;;;;;;::::0;::::2;4904:19;4926:11;:32;4946:10;4926:32;;;;;;;;;;;;;;;;4904:54;;5017:1;5003:11;:15;;;;:::i;:::-;4968:11;:32;4988:10;4968:32;;;;;;;;;;;;;;;:50;;;;5073:11;5029:7;:28;5045:10;5029:28;;;;;;;;;;;;;;;:41;5058:11;5029:41;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5095:133;5142:10;5175:4;5194:11;:24;;;5095:8;;;;;;;;;;;:25;;;;:133;;;;;;:::i;:::-;5273:7;5239:18;:30;5258:10;5239:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;5315:7;5290:21;;:32;;;;;;;:::i;:::-;;;;;;;;5333:54;5347:10;5360:11;:26;;;5333:5;:54::i;:::-;5481:11;5456;5431:10;5403:206;;;5506:11;:24;;;5544:11;:26;;;5584:15;5403:206;;;;;;;;:::i;:::-;;;;;;;;4457:1159;;1701:1:2::0;2628:7;:22;;;;4343:1273:10;;:::o;3244:106:3:-;3305:7;3331:12;;3324:19;;3244:106;:::o;2483:215:10:-;2615:4;2631:60;;;;;;;;;;:::i;:::-;;;;;;;;3093:91:3;3151:5;3175:2;3168:9;;3093:91;:::o;2704:229:10:-;2846:4;2866:60;;;;;;;;;;:::i;:::-;;;;;;;;7090:409;1094:13:0;:11;:13::i;:::-;7289:1:10::1;7260:12;:25;7273:11;7260:25;;;;;;;;;;;;:30;:40;;;;7294:6;7260:40;7239:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;7399:24;7371:12;:25;7384:11;7371:25;;;;;;;;;;;:52;;;;7467:24;7454:11;7439:53;;;;;;;;;;7090:409:::0;;;:::o;7570:63::-;1094:13:0;:11;:13::i;:::-;7616:10:10::1;:8;:10::i;:::-;7570:63::o:0;1615:84:1:-;1662:4;1685:7;;;;;;;;;;;1678:14;;1615:84;:::o;3300:170:10:-;3406:7;3436:18;:27;3455:7;3436:27;;;;;;;;;;;;;;;;3429:34;;3300:170;;;:::o;5622:1261::-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1239:19:1::1;:17;:19::i;:::-;5759:11:10::2;5724;:32;5744:10;5724:32;;;;;;;;;;;;;;;;:46;5703:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;5835:29;5867:7;:28;5883:10;5867:28;;;;;;;;;;;;;;;:63;5909:11;5867:63;;;;;;;;;;;5835:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;5950:11;:21;;;5949:22;5941:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6071:15;6044:11;:23;;;:42;;6023:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;6212:11;:24;;;6175:8;;;;;;;;;;;:18;;;6202:4;6175:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;6154:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;6312:54;6326:10;6339:11;:26;;;6312:5;:54::i;:::-;6402:11;:24;;;6377:21;;:49;;;;;;;:::i;:::-;;;;;;;;6470:11;:24;;;6436:18;:30;6455:10;6436:30;;;;;;;;;;;;;;;;:58;;;;;;;:::i;:::-;;;;;;;;6505:68;6535:10;6548:11;:24;;;6505:8;;;;;;;;;;;:21;;;;:68;;;;;:::i;:::-;6608:4;6584:11;:21;;:28;;;;;;;;;::::0;::::2;6666:11;6622:7;:28;6638:10;6622:28;;;;;;;;;;;;;;;:41;6651:11;6622:41;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6748:11;6723:10;6693:183;;;6773:11;:24;;;6811:11;:26;;;6851:15;6693:183;;;;;;;;:::i;:::-;;;;;;;;5693:1190;1701:1:2::0;2628:7;:22;;;;5622:1261:10;:::o;3179:115::-;3240:7;3266:21;;3259:28;;3179:115;:::o;937:47::-;;;;;;;;;;;;;;;;;:::o;3408:125:3:-;3482:7;3508:9;:18;3518:7;3508:18;;;;;;;;;;;;;;;;3501:25;;3408:125;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;7505:59:10:-;1094:13:0;:11;:13::i;:::-;7549:8:10::1;:6;:8::i;:::-;7505:59::o:0;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;2367:102:3:-;2423:13;2455:7;2448:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2367:102;:::o;2939:234:10:-;3086:4;3106:60;;;;;;;;;;:::i;:::-;;;;;;;;1820:211;1944:4;1964:60;;;;;;;;;;:::i;:::-;;;;;;;;1116:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6889:195::-;1094:13:0;:11;:13::i;:::-;7017:60:10::1;7032:11;7045:24;7071:5;7017:14;:60::i;:::-;6889:195:::0;;:::o;2037:219::-;2166:7;2189:60;;;;;;;;;;:::i;:::-;;;;;;;;2081:198:0;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1019:46:10:-;;;;;;;;;;;;;;;;;:::o;3476:861::-;3591:19;3626:18;3647:11;:17;3659:4;3647:17;;;;;;;;;;;;;;;;3626:38;;3674:24;3718:9;3713:210;3737:10;3733:1;:14;3713:210;;;3768:25;3796:7;:13;3804:4;3796:13;;;;;;;;;;;;;;;:16;3810:1;3796:16;;;;;;;;;;;3768:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3851:9;3830:30;;:7;:17;;;:30;;;3826:87;;;3880:18;;;;;:::i;:::-;;;;3826:87;3754:169;3749:3;;;;;:::i;:::-;;;;3713:210;;;;3933:28;3981:16;3964:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3933:65;;4008:22;4050:9;4045:260;4069:10;4065:1;:14;4045:260;;;4100:25;4128:7;:13;4136:4;4128:13;;;;;;;;;;;;;;;:16;4142:1;4128:16;;;;;;;;;;;4100:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4183:9;4162:30;;:7;:17;;;:30;;;4158:137;;;4239:7;4212:8;4221:14;4212:24;;;;;;;;:::i;:::-;;;;;;;:34;;;;4264:16;;;;;:::i;:::-;;;;4158:137;4086:219;4081:3;;;;;:::i;:::-;;;;4045:260;;;;4322:8;4315:15;;;;;;3476:861;;;;:::o;1767:106:1:-;1837:8;:6;:8::i;:::-;1836:9;1828:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1767:106::o;974:241:7:-;1112:96;1132:5;1162:27;;;1191:4;1197:2;1201:5;1139:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1112:19;:96::i;:::-;974:241;;;;:::o;8402:389:3:-;8504:1;8485:21;;:7;:21;;;;8477:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;8553:49;8582:1;8586:7;8595:6;8553:20;:49::i;:::-;8629:6;8613:12;;:22;;;;;;;:::i;:::-;;;;;;;;8667:6;8645:9;:18;8655:7;8645:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;8709:7;8688:37;;8705:1;8688:37;;;8718:6;8688:37;;;;;;:::i;:::-;;;;;;;;8736:48;8764:1;8768:7;8777:6;8736:19;:48::i;:::-;8402:389;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;2433:117:1:-;1486:16;:14;:16::i;:::-;2501:5:::1;2491:7;;:15;;;;;;;;;;;;;;;;;;2521:22;2530:12;:10;:12::i;:::-;2521:22;;;;;;:::i;:::-;;;;;;;;2433:117::o:0;9111:576:3:-;9213:1;9194:21;;:7;:21;;;;9186:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;9264:49;9285:7;9302:1;9306:6;9264:20;:49::i;:::-;9324:22;9349:9;:18;9359:7;9349:18;;;;;;;;;;;;;;;;9324:43;;9403:6;9385:14;:24;;9377:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9520:6;9503:14;:23;9482:9;:18;9492:7;9482:18;;;;;;;;;;;;;;;:44;;;;9562:6;9546:12;;:22;;;;;;;:::i;:::-;;;;;;;;9610:1;9584:37;;9593:7;9584:37;;;9614:6;9584:37;;;;;;:::i;:::-;;;;;;;;9632:48;9652:7;9669:1;9673:6;9632:19;:48::i;:::-;9176:511;9111:576;;:::o;763:205:7:-;875:86;895:5;925:23;;;950:2;954:5;902:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:19;:86::i;:::-;763:205;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;2186:115:1:-;1239:19;:17;:19::i;:::-;2255:4:::1;2245:7;;:14;;;;;;;;;;;;;;;;;;2274:20;2281:12;:10;:12::i;:::-;2274:20;;;;;;:::i;:::-;;;;;;;;2186:115::o:0;3747:706:7:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4166:95;;4295:1;4275:10;:17;:21;4271:176;;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4271:176;3817:636;3747:706;;:::o;11786:121:3:-;;;;:::o;12495:120::-;;;;:::o;640:96:9:-;693:7;719:10;712:17;;640:96;:::o;1945:106:1:-;2011:8;:6;:8::i;:::-;2003:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1945:106::o;3861:223:8:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;:::o;4948:499::-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5236:18;5247:6;5236:10;:18::i;:::-;5228:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;;;;4948:499;;;;;;:::o;1175:320::-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;7561:742::-;7707:12;7735:7;7731:566;;;7765:10;7758:17;;;;7731:566;7896:1;7876:10;:17;:21;7872:415;;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;7872:415;8259:12;8252:20;;;;;;;;;;;:::i;:::-;;;;;;;;7561:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:11:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:474::-;3562:6;3570;3619:2;3607:9;3598:7;3594:23;3590:32;3587:119;;;3625:79;;:::i;:::-;3587:119;3745:1;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3716:117;3872:2;3898:53;3943:7;3934:6;3923:9;3919:22;3898:53;:::i;:::-;3888:63;;3843:118;3494:474;;;;;:::o;3974:118::-;4061:24;4079:5;4061:24;:::i;:::-;4056:3;4049:37;3974:118;;:::o;4098:222::-;4191:4;4229:2;4218:9;4214:18;4206:26;;4242:71;4310:1;4299:9;4295:17;4286:6;4242:71;:::i;:::-;4098:222;;;;:::o;4326:619::-;4403:6;4411;4419;4468:2;4456:9;4447:7;4443:23;4439:32;4436:119;;;4474:79;;:::i;:::-;4436:119;4594:1;4619:53;4664:7;4655:6;4644:9;4640:22;4619:53;:::i;:::-;4609:63;;4565:117;4721:2;4747:53;4792:7;4783:6;4772:9;4768:22;4747:53;:::i;:::-;4737:63;;4692:118;4849:2;4875:53;4920:7;4911:6;4900:9;4896:22;4875:53;:::i;:::-;4865:63;;4820:118;4326:619;;;;;:::o;4951:86::-;4986:7;5026:4;5019:5;5015:16;5004:27;;4951:86;;;:::o;5043:112::-;5126:22;5142:5;5126:22;:::i;:::-;5121:3;5114:35;5043:112;;:::o;5161:214::-;5250:4;5288:2;5277:9;5273:18;5265:26;;5301:67;5365:1;5354:9;5350:17;5341:6;5301:67;:::i;:::-;5161:214;;;;:::o;5381:116::-;5451:21;5466:5;5451:21;:::i;:::-;5444:5;5441:32;5431:60;;5487:1;5484;5477:12;5431:60;5381:116;:::o;5503:133::-;5546:5;5584:6;5571:20;5562:29;;5600:30;5624:5;5600:30;:::i;:::-;5503:133;;;;:::o;5642:613::-;5716:6;5724;5732;5781:2;5769:9;5760:7;5756:23;5752:32;5749:119;;;5787:79;;:::i;:::-;5749:119;5907:1;5932:53;5977:7;5968:6;5957:9;5953:22;5932:53;:::i;:::-;5922:63;;5878:117;6034:2;6060:53;6105:7;6096:6;6085:9;6081:22;6060:53;:::i;:::-;6050:63;;6005:118;6162:2;6188:50;6230:7;6221:6;6210:9;6206:22;6188:50;:::i;:::-;6178:60;;6133:115;5642:613;;;;;:::o;6261:329::-;6320:6;6369:2;6357:9;6348:7;6344:23;6340:32;6337:119;;;6375:79;;:::i;:::-;6337:119;6495:1;6520:53;6565:7;6556:6;6545:9;6541:22;6520:53;:::i;:::-;6510:63;;6466:117;6261:329;;;;:::o;6596:::-;6655:6;6704:2;6692:9;6683:7;6679:23;6675:32;6672:119;;;6710:79;;:::i;:::-;6672:119;6830:1;6855:53;6900:7;6891:6;6880:9;6876:22;6855:53;:::i;:::-;6845:63;;6801:117;6596:329;;;;:::o;6931:118::-;7018:24;7036:5;7018:24;:::i;:::-;7013:3;7006:37;6931:118;;:::o;7055:222::-;7148:4;7186:2;7175:9;7171:18;7163:26;;7199:71;7267:1;7256:9;7252:17;7243:6;7199:71;:::i;:::-;7055:222;;;;:::o;7283:652::-;7482:4;7520:3;7509:9;7505:19;7497:27;;7534:71;7602:1;7591:9;7587:17;7578:6;7534:71;:::i;:::-;7615:72;7683:2;7672:9;7668:18;7659:6;7615:72;:::i;:::-;7697;7765:2;7754:9;7750:18;7741:6;7697:72;:::i;:::-;7779;7847:2;7836:9;7832:18;7823:6;7779:72;:::i;:::-;7861:67;7923:3;7912:9;7908:19;7899:6;7861:67;:::i;:::-;7283:652;;;;;;;;:::o;7941:474::-;8009:6;8017;8066:2;8054:9;8045:7;8041:23;8037:32;8034:119;;;8072:79;;:::i;:::-;8034:119;8192:1;8217:53;8262:7;8253:6;8242:9;8238:22;8217:53;:::i;:::-;8207:63;;8163:117;8319:2;8345:53;8390:7;8381:6;8370:9;8366:22;8345:53;:::i;:::-;8335:63;;8290:118;7941:474;;;;;:::o;8421:468::-;8486:6;8494;8543:2;8531:9;8522:7;8518:23;8514:32;8511:119;;;8549:79;;:::i;:::-;8511:119;8669:1;8694:53;8739:7;8730:6;8719:9;8715:22;8694:53;:::i;:::-;8684:63;;8640:117;8796:2;8822:50;8864:7;8855:6;8844:9;8840:22;8822:50;:::i;:::-;8812:60;;8767:115;8421:468;;;;;:::o;8895:142::-;8990:6;9024:5;9018:12;9008:22;;8895:142;;;:::o;9043:212::-;9170:11;9204:6;9199:3;9192:19;9244:4;9239:3;9235:14;9220:29;;9043:212;;;;:::o;9261:160::-;9356:4;9379:3;9371:11;;9409:4;9404:3;9400:14;9392:22;;9261:160;;;:::o;9427:108::-;9504:24;9522:5;9504:24;:::i;:::-;9499:3;9492:37;9427:108;;:::o;9541:99::-;9612:21;9627:5;9612:21;:::i;:::-;9607:3;9600:34;9541:99;;:::o;9738:1058::-;9881:4;9876:3;9872:14;9976:4;9969:5;9965:16;9959:23;9995:63;10052:4;10047:3;10043:14;10029:12;9995:63;:::i;:::-;9896:172;10160:4;10153:5;10149:16;10143:23;10179:63;10236:4;10231:3;10227:14;10213:12;10179:63;:::i;:::-;10078:174;10343:4;10336:5;10332:16;10326:23;10362:63;10419:4;10414:3;10410:14;10396:12;10362:63;:::i;:::-;10262:173;10524:4;10517:5;10513:16;10507:23;10543:63;10600:4;10595:3;10591:14;10577:12;10543:63;:::i;:::-;10445:171;10703:4;10696:5;10692:16;10686:23;10722:57;10773:4;10768:3;10764:14;10750:12;10722:57;:::i;:::-;10626:163;9850:946;9738:1058;;:::o;10802:291::-;10927:10;10948:102;11046:3;11038:6;10948:102;:::i;:::-;11082:4;11077:3;11073:14;11059:28;;10802:291;;;;:::o;11099:141::-;11197:4;11229;11224:3;11220:14;11212:22;;11099:141;;;:::o;11342:956::-;11517:3;11546:82;11622:5;11546:82;:::i;:::-;11644:114;11751:6;11746:3;11644:114;:::i;:::-;11637:121;;11782:84;11860:5;11782:84;:::i;:::-;11889:7;11920:1;11905:368;11930:6;11927:1;11924:13;11905:368;;;12006:6;12000:13;12033:119;12148:3;12133:13;12033:119;:::i;:::-;12026:126;;12175:88;12256:6;12175:88;:::i;:::-;12165:98;;11965:308;11952:1;11949;11945:9;11940:14;;11905:368;;;11909:14;12289:3;12282:10;;11522:776;;;11342:956;;;;:::o;12304:485::-;12503:4;12541:2;12530:9;12526:18;12518:26;;12590:9;12584:4;12580:20;12576:1;12565:9;12561:17;12554:47;12618:164;12777:4;12768:6;12618:164;:::i;:::-;12610:172;;12304:485;;;;:::o;12795:180::-;12843:77;12840:1;12833:88;12940:4;12937:1;12930:15;12964:4;12961:1;12954:15;12981:320;13025:6;13062:1;13056:4;13052:12;13042:22;;13109:1;13103:4;13099:12;13130:18;13120:81;;13186:4;13178:6;13174:17;13164:27;;13120:81;13248:2;13240:6;13237:14;13217:18;13214:38;13211:84;;;13267:18;;:::i;:::-;13211:84;13032:269;12981:320;;;:::o;13307:237::-;13447:34;13443:1;13435:6;13431:14;13424:58;13516:20;13511:2;13503:6;13499:15;13492:45;13307:237;:::o;13550:366::-;13692:3;13713:67;13777:2;13772:3;13713:67;:::i;:::-;13706:74;;13789:93;13878:3;13789:93;:::i;:::-;13907:2;13902:3;13898:12;13891:19;;13550:366;;;:::o;13922:419::-;14088:4;14126:2;14115:9;14111:18;14103:26;;14175:9;14169:4;14165:20;14161:1;14150:9;14146:17;14139:47;14203:131;14329:4;14203:131;:::i;:::-;14195:139;;13922:419;;;:::o;14347:181::-;14487:33;14483:1;14475:6;14471:14;14464:57;14347:181;:::o;14534:366::-;14676:3;14697:67;14761:2;14756:3;14697:67;:::i;:::-;14690:74;;14773:93;14862:3;14773:93;:::i;:::-;14891:2;14886:3;14882:12;14875:19;;14534:366;;;:::o;14906:419::-;15072:4;15110:2;15099:9;15095:18;15087:26;;15159:9;15153:4;15149:20;15145:1;15134:9;15130:17;15123:47;15187:131;15313:4;15187:131;:::i;:::-;15179:139;;14906:419;;;:::o;15331:221::-;15471:34;15467:1;15459:6;15455:14;15448:58;15540:4;15535:2;15527:6;15523:15;15516:29;15331:221;:::o;15558:366::-;15700:3;15721:67;15785:2;15780:3;15721:67;:::i;:::-;15714:74;;15797:93;15886:3;15797:93;:::i;:::-;15915:2;15910:3;15906:12;15899:19;;15558:366;;;:::o;15930:419::-;16096:4;16134:2;16123:9;16119:18;16111:26;;16183:9;16177:4;16173:20;16169:1;16158:9;16154:17;16147:47;16211:131;16337:4;16211:131;:::i;:::-;16203:139;;15930:419;;;:::o;16355:180::-;16403:77;16400:1;16393:88;16500:4;16497:1;16490:15;16524:4;16521:1;16514:15;16541:348;16581:7;16604:20;16622:1;16604:20;:::i;:::-;16599:25;;16638:20;16656:1;16638:20;:::i;:::-;16633:25;;16826:1;16758:66;16754:74;16751:1;16748:81;16743:1;16736:9;16729:17;16725:105;16722:131;;;16833:18;;:::i;:::-;16722:131;16881:1;16878;16874:9;16863:20;;16541:348;;;;:::o;16895:305::-;16935:3;16954:20;16972:1;16954:20;:::i;:::-;16949:25;;16988:20;17006:1;16988:20;:::i;:::-;16983:25;;17142:1;17074:66;17070:74;17067:1;17064:81;17061:107;;;17148:18;;:::i;:::-;17061:107;17192:1;17189;17185:9;17178:16;;16895:305;;;;:::o;17206:442::-;17355:4;17393:2;17382:9;17378:18;17370:26;;17406:71;17474:1;17463:9;17459:17;17450:6;17406:71;:::i;:::-;17487:72;17555:2;17544:9;17540:18;17531:6;17487:72;:::i;:::-;17569;17637:2;17626:9;17622:18;17613:6;17569:72;:::i;:::-;17206:442;;;;;;:::o;17654:221::-;17794:34;17790:1;17782:6;17778:14;17771:58;17863:4;17858:2;17850:6;17846:15;17839:29;17654:221;:::o;17881:366::-;18023:3;18044:67;18108:2;18103:3;18044:67;:::i;:::-;18037:74;;18120:93;18209:3;18120:93;:::i;:::-;18238:2;18233:3;18229:12;18222:19;;17881:366;;;:::o;18253:419::-;18419:4;18457:2;18446:9;18442:18;18434:26;;18506:9;18500:4;18496:20;18492:1;18481:9;18477:17;18470:47;18534:131;18660:4;18534:131;:::i;:::-;18526:139;;18253:419;;;:::o;18678:178::-;18818:30;18814:1;18806:6;18802:14;18795:54;18678:178;:::o;18862:366::-;19004:3;19025:67;19089:2;19084:3;19025:67;:::i;:::-;19018:74;;19101:93;19190:3;19101:93;:::i;:::-;19219:2;19214:3;19210:12;19203:19;;18862:366;;;:::o;19234:419::-;19400:4;19438:2;19427:9;19423:18;19415:26;;19487:9;19481:4;19477:20;19473:1;19462:9;19458:17;19451:47;19515:131;19641:4;19515:131;:::i;:::-;19507:139;;19234:419;;;:::o;19659:223::-;19799:34;19795:1;19787:6;19783:14;19776:58;19868:6;19863:2;19855:6;19851:15;19844:31;19659:223;:::o;19888:366::-;20030:3;20051:67;20115:2;20110:3;20051:67;:::i;:::-;20044:74;;20127:93;20216:3;20127:93;:::i;:::-;20245:2;20240:3;20236:12;20229:19;;19888:366;;;:::o;20260:419::-;20426:4;20464:2;20453:9;20449:18;20441:26;;20513:9;20507:4;20503:20;20499:1;20488:9;20484:17;20477:47;20541:131;20667:4;20541:131;:::i;:::-;20533:139;;20260:419;;;:::o;20685:181::-;20825:33;20821:1;20813:6;20809:14;20802:57;20685:181;:::o;20872:366::-;21014:3;21035:67;21099:2;21094:3;21035:67;:::i;:::-;21028:74;;21111:93;21200:3;21111:93;:::i;:::-;21229:2;21224:3;21220:12;21213:19;;20872:366;;;:::o;21244:419::-;21410:4;21448:2;21437:9;21433:18;21425:26;;21497:9;21491:4;21487:20;21483:1;21472:9;21468:17;21461:47;21525:131;21651:4;21525:131;:::i;:::-;21517:139;;21244:419;;;:::o;21669:143::-;21726:5;21757:6;21751:13;21742:22;;21773:33;21800:5;21773:33;:::i;:::-;21669:143;;;;:::o;21818:351::-;21888:6;21937:2;21925:9;21916:7;21912:23;21908:32;21905:119;;;21943:79;;:::i;:::-;21905:119;22063:1;22088:64;22144:7;22135:6;22124:9;22120:22;22088:64;:::i;:::-;22078:74;;22034:128;21818:351;;;;:::o;22175:226::-;22315:34;22311:1;22303:6;22299:14;22292:58;22384:9;22379:2;22371:6;22367:15;22360:34;22175:226;:::o;22407:366::-;22549:3;22570:67;22634:2;22629:3;22570:67;:::i;:::-;22563:74;;22646:93;22735:3;22646:93;:::i;:::-;22764:2;22759:3;22755:12;22748:19;;22407:366;;;:::o;22779:419::-;22945:4;22983:2;22972:9;22968:18;22960:26;;23032:9;23026:4;23022:20;23018:1;23007:9;23003:17;22996:47;23060:131;23186:4;23060:131;:::i;:::-;23052:139;;22779:419;;;:::o;23204:191::-;23244:4;23264:20;23282:1;23264:20;:::i;:::-;23259:25;;23298:20;23316:1;23298:20;:::i;:::-;23293:25;;23337:1;23334;23331:8;23328:34;;;23342:18;;:::i;:::-;23328:34;23387:1;23384;23380:9;23372:17;;23204:191;;;;:::o;23401:225::-;23541:34;23537:1;23529:6;23525:14;23518:58;23610:8;23605:2;23597:6;23593:15;23586:33;23401:225;:::o;23632:366::-;23774:3;23795:67;23859:2;23854:3;23795:67;:::i;:::-;23788:74;;23871:93;23960:3;23871:93;:::i;:::-;23989:2;23984:3;23980:12;23973:19;;23632:366;;;:::o;24004:419::-;24170:4;24208:2;24197:9;24193:18;24185:26;;24257:9;24251:4;24247:20;24243:1;24232:9;24228:17;24221:47;24285:131;24411:4;24285:131;:::i;:::-;24277:139;;24004:419;;;:::o;24429:233::-;24468:3;24491:24;24509:5;24491:24;:::i;:::-;24482:33;;24537:66;24530:5;24527:77;24524:103;;;24607:18;;:::i;:::-;24524:103;24654:1;24647:5;24643:13;24636:20;;24429:233;;;:::o;24668:180::-;24716:77;24713:1;24706:88;24813:4;24810:1;24803:15;24837:4;24834:1;24827:15;24854:180;24902:77;24899:1;24892:88;24999:4;24996:1;24989:15;25023:4;25020:1;25013:15;25040:166;25180:18;25176:1;25168:6;25164:14;25157:42;25040:166;:::o;25212:366::-;25354:3;25375:67;25439:2;25434:3;25375:67;:::i;:::-;25368:74;;25451:93;25540:3;25451:93;:::i;:::-;25569:2;25564:3;25560:12;25553:19;;25212:366;;;:::o;25584:419::-;25750:4;25788:2;25777:9;25773:18;25765:26;;25837:9;25831:4;25827:20;25823:1;25812:9;25808:17;25801:47;25865:131;25991:4;25865:131;:::i;:::-;25857:139;;25584:419;;;:::o;26009:442::-;26158:4;26196:2;26185:9;26181:18;26173:26;;26209:71;26277:1;26266:9;26262:17;26253:6;26209:71;:::i;:::-;26290:72;26358:2;26347:9;26343:18;26334:6;26290:72;:::i;:::-;26372;26440:2;26429:9;26425:18;26416:6;26372:72;:::i;:::-;26009:442;;;;;;:::o;26457:181::-;26597:33;26593:1;26585:6;26581:14;26574:57;26457:181;:::o;26644:366::-;26786:3;26807:67;26871:2;26866:3;26807:67;:::i;:::-;26800:74;;26883:93;26972:3;26883:93;:::i;:::-;27001:2;26996:3;26992:12;26985:19;;26644:366;;;:::o;27016:419::-;27182:4;27220:2;27209:9;27205:18;27197:26;;27269:9;27263:4;27259:20;27255:1;27244:9;27240:17;27233:47;27297:131;27423:4;27297:131;:::i;:::-;27289:139;;27016:419;;;:::o;27441:182::-;27581:34;27577:1;27569:6;27565:14;27558:58;27441:182;:::o;27629:366::-;27771:3;27792:67;27856:2;27851:3;27792:67;:::i;:::-;27785:74;;27868:93;27957:3;27868:93;:::i;:::-;27986:2;27981:3;27977:12;27970:19;;27629:366;;;:::o;28001:419::-;28167:4;28205:2;28194:9;28190:18;28182:26;;28254:9;28248:4;28244:20;28240:1;28229:9;28225:17;28218:47;28282:131;28408:4;28282:131;:::i;:::-;28274:139;;28001:419;;;:::o;28426:220::-;28566:34;28562:1;28554:6;28550:14;28543:58;28635:3;28630:2;28622:6;28618:15;28611:28;28426:220;:::o;28652:366::-;28794:3;28815:67;28879:2;28874:3;28815:67;:::i;:::-;28808:74;;28891:93;28980:3;28891:93;:::i;:::-;29009:2;29004:3;29000:12;28993:19;;28652:366;;;:::o;29024:419::-;29190:4;29228:2;29217:9;29213:18;29205:26;;29277:9;29271:4;29267:20;29263:1;29252:9;29248:17;29241:47;29305:131;29431:4;29305:131;:::i;:::-;29297:139;;29024:419;;;:::o;29449:221::-;29589:34;29585:1;29577:6;29573:14;29566:58;29658:4;29653:2;29645:6;29641:15;29634:29;29449:221;:::o;29676:366::-;29818:3;29839:67;29903:2;29898:3;29839:67;:::i;:::-;29832:74;;29915:93;30004:3;29915:93;:::i;:::-;30033:2;30028:3;30024:12;30017:19;;29676:366;;;:::o;30048:419::-;30214:4;30252:2;30241:9;30237:18;30229:26;;30301:9;30295:4;30291:20;30287:1;30276:9;30272:17;30265:47;30329:131;30455:4;30329:131;:::i;:::-;30321:139;;30048:419;;;:::o;30473:332::-;30594:4;30632:2;30621:9;30617:18;30609:26;;30645:71;30713:1;30702:9;30698:17;30689:6;30645:71;:::i;:::-;30726:72;30794:2;30783:9;30779:18;30770:6;30726:72;:::i;:::-;30473:332;;;;;:::o;30811:137::-;30865:5;30896:6;30890:13;30881:22;;30912:30;30936:5;30912:30;:::i;:::-;30811:137;;;;:::o;30954:345::-;31021:6;31070:2;31058:9;31049:7;31045:23;31041:32;31038:119;;;31076:79;;:::i;:::-;31038:119;31196:1;31221:61;31274:7;31265:6;31254:9;31250:22;31221:61;:::i;:::-;31211:71;;31167:125;30954:345;;;;:::o;31305:229::-;31445:34;31441:1;31433:6;31429:14;31422:58;31514:12;31509:2;31501:6;31497:15;31490:37;31305:229;:::o;31540:366::-;31682:3;31703:67;31767:2;31762:3;31703:67;:::i;:::-;31696:74;;31779:93;31868:3;31779:93;:::i;:::-;31897:2;31892:3;31888:12;31881:19;;31540:366;;;:::o;31912:419::-;32078:4;32116:2;32105:9;32101:18;32093:26;;32165:9;32159:4;32155:20;32151:1;32140:9;32136:17;32129:47;32193:131;32319:4;32193:131;:::i;:::-;32185:139;;31912:419;;;:::o;32337:170::-;32477:22;32473:1;32465:6;32461:14;32454:46;32337:170;:::o;32513:366::-;32655:3;32676:67;32740:2;32735:3;32676:67;:::i;:::-;32669:74;;32752:93;32841:3;32752:93;:::i;:::-;32870:2;32865:3;32861:12;32854:19;;32513:366;;;:::o;32885:419::-;33051:4;33089:2;33078:9;33074:18;33066:26;;33138:9;33132:4;33128:20;33124:1;33113:9;33109:17;33102:47;33166:131;33292:4;33166:131;:::i;:::-;33158:139;;32885:419;;;:::o;33310:225::-;33450:34;33446:1;33438:6;33434:14;33427:58;33519:8;33514:2;33506:6;33502:15;33495:33;33310:225;:::o;33541:366::-;33683:3;33704:67;33768:2;33763:3;33704:67;:::i;:::-;33697:74;;33780:93;33869:3;33780:93;:::i;:::-;33898:2;33893:3;33889:12;33882:19;;33541:366;;;:::o;33913:419::-;34079:4;34117:2;34106:9;34102:18;34094:26;;34166:9;34160:4;34156:20;34152:1;34141:9;34137:17;34130:47;34194:131;34320:4;34194:131;:::i;:::-;34186:139;;33913:419;;;:::o;34338:179::-;34478:31;34474:1;34466:6;34462:14;34455:55;34338:179;:::o;34523:366::-;34665:3;34686:67;34750:2;34745:3;34686:67;:::i;:::-;34679:74;;34762:93;34851:3;34762:93;:::i;:::-;34880:2;34875:3;34871:12;34864:19;;34523:366;;;:::o;34895:419::-;35061:4;35099:2;35088:9;35084:18;35076:26;;35148:9;35142:4;35138:20;35134:1;35123:9;35119:17;35112:47;35176:131;35302:4;35176:131;:::i;:::-;35168:139;;34895:419;;;:::o;35320:98::-;35371:6;35405:5;35399:12;35389:22;;35320:98;;;:::o;35424:147::-;35525:11;35562:3;35547:18;;35424:147;;;;:::o;35577:373::-;35681:3;35709:38;35741:5;35709:38;:::i;:::-;35763:88;35844:6;35839:3;35763:88;:::i;:::-;35756:95;;35860:52;35905:6;35900:3;35893:4;35886:5;35882:16;35860:52;:::i;:::-;35937:6;35932:3;35928:16;35921:23;;35685:265;35577:373;;;;:::o;35956:271::-;36086:3;36108:93;36197:3;36188:6;36108:93;:::i;:::-;36101:100;;36218:3;36211:10;;35956:271;;;;:::o
Swarm Source
ipfs://37ed975734401dbebcd3e8dd99193cf78a1181ee95d4d23bcffc4647e42d7fbe
Loading...
Loading
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.