ETH Price: $2,932.30 (+0.10%)
Gas: 4 Gwei

Token

EDUM (EDUM)
 

Overview

Max Total Supply

1,500,000,000 EDUM

Holders

253 (0.00%)

Market

Price

$0.82 @ 0.000280 ETH (+1.08%)

Onchain Market Cap

$1,232,212,500.00

Circulating Supply Market Cap

$2,968,197.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
LBank: Hot Wallet 3
Balance
30,345 EDUM

Value
$24,927.66 ( ~8.5011 Eth) [0.0020%]
0x120051a72966950b8ce12eb5496b5d1eeec1541b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

EDUM Project aims to establish a web 3.0 blockchain ecosystem in the education field that enables learners to acquire practical economic value through innovative systems of reward, certification, and intellectual property.

Market

Volume (24H):$259,076.00
Market Capitalization:$2,968,197.00
Circulating Supply:3,613,320.00 EDUM
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EDUM

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at Etherscan.io on 2023-03-09
*/

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev 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);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// 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);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @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);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @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.openzeppelin.com/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;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 {}
}

// File: contracts/EDUM.sol


pragma solidity ^0.8.0;



contract EDUM is ERC20, Ownable {
    // Initial totalSupply
    uint256 private constant TOTAL_SUPPLY = 2000000000;

    /**
     * @dev transferWithLocked function can only be called by a controller 
     */
    modifier onlyController {
        require(isController[_msgSender()]);
        _;
    }

    /**
     * @dev Lockup event 
     * @param addr 수신 주소 
     * @param amount Lockup 수량
     * @param timestamp Release 시간
     *        isListed == true  -> 절대 시간
     *        isListed == false -> listingDate 상대 시간   간 
     * @param isListed transferPreTimelock(상장 전), transferTimelock(상장 후) 구분
     */   
    event Locked(address indexed addr, uint256 amount, uint timestamp, bool isListed);
    
    /**
     * @dev Lising event 
     * @param timestamp Listing Date
     */   
    event Listing(uint timestamp);

    /**
     * @dev Specify the lockup quantity and release time. 
     * @dev Lockup Lockup quantity 
     * @dev releaseTime Release time
     */
    struct TokenLockInfo {
        uint256 amount;                 // locked amount
        uint256 releaseTime;            // unix timestamp
    }

    /**
     * @dev Account 별 Lockup 정보 저장 
     * @dev minReleaeTime lockInfo 리스트 중 가장 작은 releaseTime 값.
     *      transferPreTimelock 함수 호출 시에는 0 으로 세팅 됨. (_refactoringPreTimelock 세팅 됨) 
     *      transferTimeLock 호출 시에는 값이 세팅 됨
     * @dev lockInfo TokenLockInfo 배열
     */
    struct TokenLockState {
        uint256 minReleaseTime;
        TokenLockInfo[] lockInfo;     // Multiple token locks can exist
    }

    // mapping for TokenLockState 
    mapping(address => TokenLockState) public lockStates;

    // Mapping from controllers to controller status.
    mapping(address => bool) internal isController;

    // Array of controllers.
    address[] internal controllers;  

    // 상장 일 
    uint256 listingDate = 0;

    /**
     * @dev Initialize EDUM.
     *      총 발행량은 20억개 (추가 상장 불가)
     */
    constructor() ERC20('EDUM', 'EDUM') {
        _mint(_msgSender(), TOTAL_SUPPLY*10**decimals());
    }

    /**
     * @dev 상장일 설정. 한번만 불릴 수 있음 
     *      transferPreTimelock 의 ReleaseTime 이 확정 됨
     * @param _listingDate 상장일
     */
    function setListingDate(uint _listingDate) external onlyOwner {
        require(listingDate == 0, "listingDate already set");

        // listingDate = block.timestamp;
        if (_listingDate == 0) {
            listingDate = block.timestamp;
        } else {
            listingDate = _listingDate;
        }

        emit Listing(listingDate);
    }

    /**
     * @dev Get listingDate 
     * @return listingDate Date of listing
     */
    function getListingDate() public view returns(uint256) {
        return listingDate;
    }

    /**
     * @dev Set list of controllers.
     * @param controllerList List of controller addresses.
     */
    function setControllers(address[] memory controllerList) public onlyOwner {
        uint ii;
        for (ii = 0; ii < controllers.length; ii++) {
            isController[controllers[ii]] = false;
        }
        for (ii = 0; ii < controllerList.length; ii++) {
            isController[controllerList[ii]] = true;
        }
        controllers = controllerList;
    }    

    /**
     * @dev Get list of controllers.
     * @return List of address of all the controllers.
     */
    function getControllers() public view returns(address[] memory) {
        return controllers;
    }    

    /**
     * @dev don't send eth directly to token contract 
     */
    receive() external payable {
        revert("Don't accept ETH");
    }

   /**
    * @dev transferPreTimelock 으로 추가 된 Lockup ReleaseTime 정보를 세팅.
    *      _beforeTransfer / transferTimelock 에서 호출. 
    * @param _addr address.
    */
    function _refactoringPreTimelock(address _addr) internal {
        uint length = lockStates[_addr].lockInfo.length;
        // transferPreTimelock 호출이 된 상태 && 상장 후 첫번째 호출 시에만 진행 됨. 
        if ((length > 0) &&                                 // 처리할 내용이 있는가
            (lockStates[_addr].minReleaseTime == 0) &&      // transferPreTimelock 인가 & 이미 처리가 되었는가  
            (listingDate > 0))                              // 상장된 상태인가
        {
            uint releaseTime;
            for (uint ii = 0; ii < length; /* unchecked inc */) {
                releaseTime = lockStates[_addr].lockInfo[ii].releaseTime + listingDate; 
                lockStates[_addr].lockInfo[ii].releaseTime = releaseTime; 
                if (lockStates[_addr].minReleaseTime == 0 || lockStates[_addr].minReleaseTime > releaseTime) {
                   lockStates[_addr].minReleaseTime = releaseTime; 
                }
                unchecked {
                    ii++;
                }
            }
        }
    }

   /**
    * @dev Release 된 Lock 정보를 삭제 
    * @param _addr address.
    */
    function _releaseLockInfo(address _addr) internal {
        uint256 lockCount = 0;
        uint256 lockLength;

        // 상장이 되지 않은 상태에서는 Release 될 Lock 정보는 없음. 
        if (listingDate==0) return;

        // transferPreTimelock 정보 refactoring 
        _refactoringPreTimelock(_addr);

        // 현재 시점에서 Release 할 Lock 정보는 없음.
        if (lockStates[_addr].minReleaseTime > block.timestamp) return;

        lockStates[_addr].minReleaseTime = 0;
        lockLength = lockStates[_addr].lockInfo.length; 
        for (uint256 ii = 0; ii < lockLength; /* unchecked inc */) {
            // 아직 Release 시간이 되지 않은 상태 이면 남겨둔다.
            if (lockStates[_addr].lockInfo[ii].releaseTime > block.timestamp) {   
                // Update minReleaseTime
                if ((lockStates[_addr].minReleaseTime == 0) || 
                    (lockStates[_addr].minReleaseTime > lockStates[_addr].lockInfo[ii].releaseTime)) 
                {
                    lockStates[_addr].minReleaseTime = lockStates[_addr].lockInfo[ii].releaseTime;
                }
                lockStates[_addr].lockInfo[lockCount] = lockStates[_addr].lockInfo[ii];
                unchecked {
                    lockCount++;
                }
            }
            unchecked {
                ii++;
            }
        }

        if (lockCount == 0) {
            // 모든 Lock 정보가 삭제되었을 경우 
            delete lockStates[_addr];
        } else {
            // 삭제된 Lock 정보 수 만큰 Pop 
            uint256 removeCount = lockStates[_addr].lockInfo.length - lockCount;            
            for (uint256 ii = 0; ii < removeCount; /* unchecked inc */) {
                lockStates[_addr].lockInfo.pop();
                unchecked {
                    ii++;
                }
            }
        }
    }

  /**
   * @dev Get the amount of locked tokens 
   * @param _addr address.
   * @return totalLocked Amount of locked tokens.
   */
    function getLockedBalance(address _addr) public view returns (uint256) {
        uint256 totalLocked = 0;
        uint256 lockLength;
        uint256 releaseTime;

        lockLength = lockStates[_addr].lockInfo.length; 
        for (uint256 ii = 0; ii < lockLength; /* unchecked inc */) {
            if (listingDate == 0) {
                // 아직 상장이 되지 않은 상태이면 무조건 Lock 상태
                totalLocked += lockStates[_addr].lockInfo[ii].amount;
            } else {
                releaseTime = lockStates[_addr].lockInfo[ii].releaseTime;
                // 상장 후 _refactoringPreTimelock 이 호출되지 않았을 경우 listingDate 기준으로 ReleaseTime 계산
                if (lockStates[_addr].minReleaseTime == 0) {
                    releaseTime += listingDate;
                }

                if (releaseTime > block.timestamp) {
                    totalLocked += lockStates[_addr].lockInfo[ii].amount;
                }
            }
            unchecked {
                ii++;
            }
        }

        return totalLocked;
    }

   /**
    * @dev Hook that is called before any transfer of tokens. 
    * @param from The address to transfer from.
    * @param to The address to transfer to.
    * @param amount The amount to be transferred.
    */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override {
        super._beforeTokenTransfer(from, to, amount);

        // Release 되어야 할 Lock 정보 삭제
        _releaseLockInfo(from);

        if (from != address(0)) {       // Skip when mint
            uint256 locked = getLockedBalance(from);
            uint256 accountBalance = balanceOf(from);
            require(accountBalance - locked >= amount, "Transfer amount exeeds balance or some amounts are locked.");
        }
    }

   /**
    * @dev 토큰 Lock 전송. 상장 후 호출 가능. 
    * @param _addr The address to transfer to.
    * @param _amount The amount to be transferred.
    * @param _releaseTime The timestamp to unlock token.
    * @return The result of transferTimelock
    */
    function transferTimelock(address _addr, uint256[] memory _amount, uint256[] memory _releaseTime)
        external
        onlyController
        returns(bool)
    {
        require(listingDate > 0, "Token is not listed");
        return _transferTimelock(_addr, _amount, _releaseTime);
    }

   /**
    * @dev 토큰 Lock 전송. 상장 전 호출 가능. 
    * @param _addr The address to transfer to.
    * @param _amount The amount to be transferred.
    * @param _releaseTime The timestamp to unlock token.
    * @return The result of transferPreTimelock
    */
    function transferPreTimelock(address _addr, uint256[] memory _amount, uint256[] memory _releaseTime)
        external
        onlyController
        returns(bool)
    {
        require(listingDate == 0, "Token is listed");
        return _transferTimelock(_addr, _amount, _releaseTime);
    }

   /**
    * @dev 토큰 Lock 전송
    * @param _addr The address to transfer to.
    * @param _amount The amount to be transferred.
    * @param _releaseTime The timestamp to unlock token.
    * @return The result of transferTimelock
    */
    function _transferTimelock(address _addr, uint256[] memory _amount, uint256[] memory _releaseTime) 
        internal
        onlyController 
        returns (bool)
    {
        require(_amount.length == _releaseTime.length, "amount and releaeTime must have save length");

        uint ii;
        uint256 totalAmount = 0;
        uint256 amountLength = 0;

        // transferPreTimelock 정보가 있을 경우 Release 정보 업데이트
        _refactoringPreTimelock(_addr);

        amountLength = _amount.length; 
        for (ii = 0; ii < amountLength; /* unchecked inc */) {
            totalAmount += _amount[ii]; 

            // Add lockInfo
            lockStates[_addr].lockInfo.push(TokenLockInfo(_amount[ii], _releaseTime[ii]));

            // If token is listed, update minReleaseTime
            if (listingDate > 0) {
                if ((lockStates[_addr].minReleaseTime == 0) || (lockStates[_addr].minReleaseTime > _releaseTime[ii])) {
                    lockStates[_addr].minReleaseTime = _releaseTime[ii];
                }
            }
            emit Locked(_addr, _amount[ii], _releaseTime[ii], listingDate>0);

            unchecked {
                ii++;
            }
        }

        transfer(_addr, totalAmount);

        return true;
    }

   /**
    * @dev 계정별 TokenLockState 정보 리턴 
    * @param _addr address
    * @return The TokenLockState of _addr
    */
    function getTokenlockStates(address _addr) external view returns(TokenLockState memory) {
        return lockStates[_addr];
    }

   /**
    * @dev Multiple transfer function (onlyOwner)
    * @param _to address list 
    * @param _amount amount list 
    */
    function multiTransfer(address[] memory _to, uint256[] memory _amount) external onlyOwner {
        uint transferCount = _to.length;

        require(_to.length == _amount.length, "to and amount must have save length");

        for (uint ii = 0; ii < transferCount; ) {
            transfer(_to[ii], _amount[ii]);
            unchecked {
                ii++;
            }
        }
    }

   /**
    * @dev Destroy amount of tokens from account 
    * @dev Reduce totalSupply 
    * @dev A locked amount of token cannot be burned. 
    * @param _amount Amount to burn 
    */
    function burn(uint256 _amount) external {
        _burn(_msgSender(), _amount);
    }

    /*
    /////////////////////////////////
    // for test
    /////////////////////////////////
    function getLockedCount(address _account) public view returns (uint) {
        return lockStates[_account].lockInfo.length;
    }

    event Dummy(uint value);
    function dummy() public {
        emit Dummy(0);
    }
    */
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Listing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isListed","type":"bool"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[],"name":"getControllers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getListingDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getLockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getTokenlockStates","outputs":[{"components":[{"internalType":"uint256","name":"minReleaseTime","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"releaseTime","type":"uint256"}],"internalType":"struct EDUM.TokenLockInfo[]","name":"lockInfo","type":"tuple[]"}],"internalType":"struct EDUM.TokenLockState","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockStates","outputs":[{"internalType":"uint256","name":"minReleaseTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"controllerList","type":"address[]"}],"name":"setControllers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingDate","type":"uint256"}],"name":"setListingDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"uint256[]","name":"_releaseTime","type":"uint256[]"}],"name":"transferPreTimelock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"uint256[]","name":"_releaseTime","type":"uint256[]"}],"name":"transferTimelock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006009553480156200001657600080fd5b506040518060400160405280600481526020017f4544554d000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4544554d0000000000000000000000000000000000000000000000000000000081525081600390805190602001906200009b929190620010b6565b508060049080519060200190620000b4929190620010b6565b505050620000d7620000cb6200012c60201b60201c565b6200013460201b60201c565b62000126620000eb6200012c60201b60201c565b620000fb620001fa60201b60201c565b600a6200010991906200139a565b63773594006200011a9190620014d7565b6200020360201b60201c565b6200162b565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000276576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026d9062001292565b60405180910390fd5b6200028a600083836200037160201b60201c565b80600260008282546200029e9190620012e2565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003519190620012b4565b60405180910390a36200036d600083836200045460201b60201c565b5050565b620003898383836200045960201b6200139f1760201c565b6200039a836200045e60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200044f576000620003e28462000acb60201b60201c565b90506000620003f78562000d8660201b60201c565b905082828262000408919062001538565b10156200044c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004439062001270565b60405180910390fd5b50505b505050565b505050565b505050565b6000808060095414156200047457505062000ac8565b620004858362000dce60201b60201c565b42600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115620004d857505062000ac8565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050905060005b81811015620009425742600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018281548110620005f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154111562000934576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541480620007285750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018181548110620006d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b156200080257600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018181548110620007a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181815481106200087d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101848154811062000906577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600082015481600001556001820154816001015590505082806001019350505b80806001019150506200056b565b506000821415620009af57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000620009a7919062001147565b505062000ac5565b600082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054905062000a04919062001538565b905060005b8181101562000ac257600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548062000a8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055808060010191505062000a09565b50505b50505b50565b60008060009050600080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050915060005b8281101562000d7a576000600954141562000bd757600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101818154811062000bb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600001548462000bcf9190620012e2565b935062000d6c565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101818154811062000c52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015491506000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141562000cc5576009548262000cc29190620012e2565b91505b4282111562000d6b57600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101818154811062000d49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600001548462000d689190620012e2565b93505b5b808060010191505062000b20565b50829350505050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050905060008111801562000e6b57506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b801562000e7a57506000600954115b15620010b257600080600090505b82811015620010af57600954600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101828154811062000f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015462000f2d9190620012e2565b915081600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101828154811062000fab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101819055506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154148062001053575081600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b15620010a15781600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b808060010191505062000e88565b50505b5050565b828054620010c4906200158a565b90600052602060002090601f016020900481019282620010e8576000855562001134565b82601f106200110357805160ff191683800117855562001134565b8280016001018555821562001134579182015b828111156200113357825182559160200191906001019062001116565b5b5090506200114391906200116d565b5090565b50805460008255600202906000526020600020908101906200116a91906200118c565b50565b5b80821115620011885760008160009055506001016200116e565b5090565b5b80821115620011b1576000808201600090556001820160009055506002016200118d565b5090565b6000620011c4603a83620012d1565b91507f5472616e7366657220616d6f756e74206578656564732062616c616e6365206f60008301527f7220736f6d6520616d6f756e747320617265206c6f636b65642e0000000000006020830152604082019050919050565b60006200122c601f83620012d1565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6200126a8162001573565b82525050565b600060208201905081810360008301526200128b81620011b5565b9050919050565b60006020820190508181036000830152620012ad816200121d565b9050919050565b6000602082019050620012cb60008301846200125f565b92915050565b600082825260208201905092915050565b6000620012ef8262001573565b9150620012fc8362001573565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620013345762001333620015c0565b5b828201905092915050565b6000808291508390505b60018511156200139157808604811115620013695762001368620015c0565b5b6001851615620013795780820291505b808102905062001389856200161e565b945062001349565b94509492505050565b6000620013a78262001573565b9150620013b4836200157d565b9250620013e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620013eb565b905092915050565b600082620013fd5760019050620014d0565b816200140d5760009050620014d0565b8160018114620014265760028114620014315762001467565b6001915050620014d0565b60ff841115620014465762001445620015c0565b5b8360020a91508482111562001460576200145f620015c0565b5b50620014d0565b5060208310610133831016604e8410600b8410161715620014a15782820a9050838111156200149b576200149a620015c0565b5b620014d0565b620014b084848460016200133f565b92509050818404811115620014ca57620014c9620015c0565b5b81810290505b9392505050565b6000620014e48262001573565b9150620014f18362001573565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200152d576200152c620015c0565b5b828202905092915050565b6000620015458262001573565b9150620015528362001573565b925082821015620015685762001567620015c0565b5b828203905092915050565b6000819050919050565b600060ff82169050919050565b60006002820490506001821680620015a357607f821691505b60208210811415620015ba57620015b9620015ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b613dd0806200163b6000396000f3fe60806040526004361061016a5760003560e01c806389812784116100d1578063c40868931161008a578063dd62ed3e11610064578063dd62ed3e146105d0578063ea74838a1461060d578063eecb4d5014610636578063f2fde38b14610673576101aa565b8063c408689314610519578063caedf82a14610556578063d0a2451614610593576101aa565b806389812784146103f55780638da5cb5b1461041e57806395d89b4114610449578063a457c2d714610474578063a9059cbb146104b1578063b4e8a6c4146104ee576101aa565b806337580f901161012357806337580f90146102d3578063395093511461031057806342966c681461034d5780635e2545141461037657806370a08231146103a1578063715018a6146103de576101aa565b806306fdde03146101af578063095ea7b3146101da57806318160ddd146102175780631e89d5451461024257806323b872dd1461026b578063313ce567146102a8576101aa565b366101aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a19061387b565b60405180910390fd5b600080fd5b3480156101bb57600080fd5b506101c461069c565b6040516101d19190613739565b60405180910390f35b3480156101e657600080fd5b5061020160048036038101906101fc9190612d9c565b61072e565b60405161020e919061371e565b60405180910390f35b34801561022357600080fd5b5061022c610751565b60405161023991906139bd565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190612e19565b61075b565b005b34801561027757600080fd5b50610292600480360381019061028d9190612cce565b610856565b60405161029f919061371e565b60405180910390f35b3480156102b457600080fd5b506102bd610885565b6040516102ca9190613a0f565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c69565b61088e565b60405161030791906139bd565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612d9c565b6108ac565b604051610344919061371e565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190612e85565b6108e3565b005b34801561038257600080fd5b5061038b6108f7565b60405161039891906139bd565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190612c69565b610901565b6040516103d591906139bd565b60405180910390f35b3480156103ea57600080fd5b506103f3610949565b005b34801561040157600080fd5b5061041c60048036038101906104179190612e85565b61095d565b005b34801561042a57600080fd5b50610433610a03565b60405161044091906136e1565b60405180910390f35b34801561045557600080fd5b5061045e610a2d565b60405161046b9190613739565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612d9c565b610abf565b6040516104a8919061371e565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612d9c565b610b36565b6040516104e5919061371e565b60405180910390f35b3480156104fa57600080fd5b50610503610b59565b60405161051091906136fc565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190612c69565b610be7565b60405161054d91906139bd565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190612c69565b610e93565b60405161058a919061399b565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190612d1d565b610f69565b6040516105c7919061371e565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190612c92565b611021565b60405161060491906139bd565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190612dd8565b6110a8565b005b34801561064257600080fd5b5061065d60048036038101906106589190612d1d565b611263565b60405161066a919061371e565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612c69565b61131b565b005b6060600380546106ab90613c53565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790613c53565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050505050905090565b6000806107396113a4565b90506107468185856113ac565b600191505092915050565b6000600254905090565b610763611577565b60008251905081518351146107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a4906137db565b60405180910390fd5b60005b81811015610850576108428482815181106107f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848381518110610835577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610b36565b5080806001019150506107b0565b50505050565b6000806108616113a4565b905061086e8582856115f5565b610879858585611681565b60019150509392505050565b60006012905090565b60066020528060005260406000206000915090508060000154905081565b6000806108b76113a4565b90506108d88185856108c98589611021565b6108d39190613b41565b6113ac565b600191505092915050565b6108f46108ee6113a4565b826118f9565b50565b6000600954905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610951611577565b61095b6000611ac7565b565b610965611577565b6000600954146109aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a19061393b565b60405180910390fd5b60008114156109bf57426009819055506109c7565b806009819055505b7fed32b583cb1083a600ce13f8afeaad016433a603b22330252b5826dd17eb60a26009546040516109f891906139bd565b60405180910390a150565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a3c90613c53565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6890613c53565b8015610ab55780601f10610a8a57610100808354040283529160200191610ab5565b820191906000526020600020905b815481529060010190602001808311610a9857829003601f168201915b5050505050905090565b600080610aca6113a4565b90506000610ad88286611021565b905083811015610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b149061397b565b60405180910390fd5b610b2a82868684036113ac565b60019250505092915050565b600080610b416113a4565b9050610b4e818585611681565b600191505092915050565b60606008805480602002602001604051908101604052809291908181526020018280548015610bdd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610b93575b5050505050905090565b60008060009050600080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050915060005b82811015610e875760006009541415610ced57600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018181548110610cc9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000015484610ce69190613b41565b9350610e7a565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018181548110610d67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015491506000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610dd75760095482610dd49190613b41565b91505b42821115610e7957600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018181548110610e59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000015484610e769190613b41565b93505b5b8080600101915050610c3c565b50829350505050919050565b610e9b612a07565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020016000905b82821015610f5a57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610f14565b50505050815250509050919050565b600060076000610f776113a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fc857600080fd5b60006009541461100d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110049061389b565b60405180910390fd5b611018848484611b8d565b90509392505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6110b0611577565b60005b60088054905081101561118f5760006007600060088481548110611100577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061118790613c85565b9150506110b3565b600090505b8151811015611248576001600760008484815181106111dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061124090613c85565b915050611194565b816008908051906020019061125e929190612a21565b505050565b6000600760006112716113a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112c257600080fd5b600060095411611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe9061385b565b60405180910390fd5b611312848484611b8d565b90509392505050565b611323611577565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a9061379b565b60405180910390fd5b61139c81611ac7565b50565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561141c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114139061391b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906137bb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161156a91906139bd565b60405180910390a3505050565b61157f6113a4565b73ffffffffffffffffffffffffffffffffffffffff1661159d610a03565b73ffffffffffffffffffffffffffffffffffffffff16146115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea906138bb565b60405180910390fd5b565b60006116018484611021565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461167b578181101561166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906137fb565b60405180910390fd5b61167a84848484036113ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e8906138fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611761576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117589061375b565b60405180910390fd5b61176c83838361201f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e99061383b565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118e091906139bd565b60405180910390a36118f38484846120d7565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611969576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611960906138db565b60405180910390fd5b6119758260008361201f565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f29061377b565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611aae91906139bd565b60405180910390a3611ac2836000846120d7565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060076000611b9b6113a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bec57600080fd5b8151835114611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c279061395b565b60405180910390fd5b600080600090506000611c42876120dc565b85519050600092505b8083101561200657858381518110611c8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015182611c9f9190613b41565b9150600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016040518060400160405280888681518110611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001878681518110611d6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505060006009541115611f22576000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541480611e945750848381518110611e47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b15611f2157848381518110611ed2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b5b8673ffffffffffffffffffffffffffffffffffffffff167fca8d506eda84f8ed07c2908ae102299d34888ef5e19b97f56e4d6fcd1104c31e878581518110611f93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151878681518110611fd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600060095411604051611ff1939291906139d8565b60405180910390a28280600101935050611c4b565b6120108783610b36565b50600193505050509392505050565b61202a83838361139f565b612033836123b9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120d257600061207284610be7565b9050600061207f85610901565b905082828261208e9190613b97565b10156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c69061381b565b60405180910390fd5b50505b505050565b505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050905060008111801561217857506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b801561218657506000600954115b156123b557600080600090505b828110156123b257600954600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018281548110612218577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101546122349190613b41565b915081600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481106122b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101819055506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541480612358575081600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b156123a55781600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b8080600101915050612193565b50505b5050565b6000808060095414156123cd575050612a04565b6123d6836120dc565b42600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115612427575050612a04565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050905060005b818110156128875742600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101828154811061253d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154111561287a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414806126725750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101818154811061261b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b1561274a57600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181815481106126f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181815481106127c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101848154811061284c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600082015481600001556001820154816001015590505082806001019350505b80806001019150506124ba565b5060008214156128f057600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006128e99190612aab565b5050612a01565b600082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490506129439190613b97565b905060005b818110156129fe57600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806129c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090600202016000808201600090556001820160009055505090558080600101915050612948565b50505b50505b50565b604051806040016040528060008152602001606081525090565b828054828255906000526020600020908101928215612a9a579160200282015b82811115612a995782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612a41565b5b509050612aa79190612acf565b5090565b5080546000825560020290600052602060002090810190612acc9190612aec565b50565b5b80821115612ae8576000816000905550600101612ad0565b5090565b5b80821115612b0f57600080820160009055600182016000905550600201612aed565b5090565b6000612b26612b2184613a5b565b613a2a565b90508083825260208201905082856020860282011115612b4557600080fd5b60005b85811015612b755781612b5b8882612beb565b845260208401935060208301925050600181019050612b48565b5050509392505050565b6000612b92612b8d84613a87565b613a2a565b90508083825260208201905082856020860282011115612bb157600080fd5b60005b85811015612be15781612bc78882612c54565b845260208401935060208301925050600181019050612bb4565b5050509392505050565b600081359050612bfa81613d6c565b92915050565b600082601f830112612c1157600080fd5b8135612c21848260208601612b13565b91505092915050565b600082601f830112612c3b57600080fd5b8135612c4b848260208601612b7f565b91505092915050565b600081359050612c6381613d83565b92915050565b600060208284031215612c7b57600080fd5b6000612c8984828501612beb565b91505092915050565b60008060408385031215612ca557600080fd5b6000612cb385828601612beb565b9250506020612cc485828601612beb565b9150509250929050565b600080600060608486031215612ce357600080fd5b6000612cf186828701612beb565b9350506020612d0286828701612beb565b9250506040612d1386828701612c54565b9150509250925092565b600080600060608486031215612d3257600080fd5b6000612d4086828701612beb565b935050602084013567ffffffffffffffff811115612d5d57600080fd5b612d6986828701612c2a565b925050604084013567ffffffffffffffff811115612d8657600080fd5b612d9286828701612c2a565b9150509250925092565b60008060408385031215612daf57600080fd5b6000612dbd85828601612beb565b9250506020612dce85828601612c54565b9150509250929050565b600060208284031215612dea57600080fd5b600082013567ffffffffffffffff811115612e0457600080fd5b612e1084828501612c00565b91505092915050565b60008060408385031215612e2c57600080fd5b600083013567ffffffffffffffff811115612e4657600080fd5b612e5285828601612c00565b925050602083013567ffffffffffffffff811115612e6f57600080fd5b612e7b85828601612c2a565b9150509250929050565b600060208284031215612e9757600080fd5b6000612ea584828501612c54565b91505092915050565b6000612eba8383612ede565b60208301905092915050565b6000612ed28383613648565b60408301905092915050565b612ee781613bcb565b82525050565b612ef681613bcb565b82525050565b6000612f0782613ad3565b612f118185613b0e565b9350612f1c83613ab3565b8060005b83811015612f4d578151612f348882612eae565b9750612f3f83613af4565b925050600181019050612f20565b5085935050505092915050565b6000612f6582613ade565b612f6f8185613b1f565b9350612f7a83613ac3565b8060005b83811015612fab578151612f928882612ec6565b9750612f9d83613b01565b925050600181019050612f7e565b5085935050505092915050565b612fc181613bdd565b82525050565b6000612fd282613ae9565b612fdc8185613b30565b9350612fec818560208601613c20565b612ff581613d5b565b840191505092915050565b600061300d602383613b30565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613073602283613b30565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130d9602683613b30565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061313f602283613b30565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131a5602383613b30565b91507f746f20616e6420616d6f756e74206d75737420686176652073617665206c656e60008301527f67746800000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061320b601d83613b30565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b600061324b603a83613b30565b91507f5472616e7366657220616d6f756e74206578656564732062616c616e6365206f60008301527f7220736f6d6520616d6f756e747320617265206c6f636b65642e0000000000006020830152604082019050919050565b60006132b1602683613b30565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613317601383613b30565b91507f546f6b656e206973206e6f74206c6973746564000000000000000000000000006000830152602082019050919050565b6000613357601083613b30565b91507f446f6e27742061636365707420455448000000000000000000000000000000006000830152602082019050919050565b6000613397600f83613b30565b91507f546f6b656e206973206c697374656400000000000000000000000000000000006000830152602082019050919050565b60006133d7602083613b30565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613417602183613b30565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061347d602583613b30565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134e3602483613b30565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613549601783613b30565b91507f6c697374696e674461746520616c7265616479207365740000000000000000006000830152602082019050919050565b6000613589602b83613b30565b91507f616d6f756e7420616e642072656c65616554696d65206d75737420686176652060008301527f73617665206c656e6774680000000000000000000000000000000000000000006020830152604082019050919050565b60006135ef602583613b30565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60408201600082015161365e60008501826136b4565b50602082015161367160208501826136b4565b50505050565b600060408301600083015161368f60008601826136b4565b50602083015184820360208601526136a78282612f5a565b9150508091505092915050565b6136bd81613c09565b82525050565b6136cc81613c09565b82525050565b6136db81613c13565b82525050565b60006020820190506136f66000830184612eed565b92915050565b600060208201905081810360008301526137168184612efc565b905092915050565b60006020820190506137336000830184612fb8565b92915050565b600060208201905081810360008301526137538184612fc7565b905092915050565b6000602082019050818103600083015261377481613000565b9050919050565b6000602082019050818103600083015261379481613066565b9050919050565b600060208201905081810360008301526137b4816130cc565b9050919050565b600060208201905081810360008301526137d481613132565b9050919050565b600060208201905081810360008301526137f481613198565b9050919050565b60006020820190508181036000830152613814816131fe565b9050919050565b600060208201905081810360008301526138348161323e565b9050919050565b60006020820190508181036000830152613854816132a4565b9050919050565b600060208201905081810360008301526138748161330a565b9050919050565b600060208201905081810360008301526138948161334a565b9050919050565b600060208201905081810360008301526138b48161338a565b9050919050565b600060208201905081810360008301526138d4816133ca565b9050919050565b600060208201905081810360008301526138f48161340a565b9050919050565b6000602082019050818103600083015261391481613470565b9050919050565b60006020820190508181036000830152613934816134d6565b9050919050565b600060208201905081810360008301526139548161353c565b9050919050565b600060208201905081810360008301526139748161357c565b9050919050565b60006020820190508181036000830152613994816135e2565b9050919050565b600060208201905081810360008301526139b58184613677565b905092915050565b60006020820190506139d260008301846136c3565b92915050565b60006060820190506139ed60008301866136c3565b6139fa60208301856136c3565b613a076040830184612fb8565b949350505050565b6000602082019050613a2460008301846136d2565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613a5157613a50613d2c565b5b8060405250919050565b600067ffffffffffffffff821115613a7657613a75613d2c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613aa257613aa1613d2c565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613b4c82613c09565b9150613b5783613c09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b8c57613b8b613cce565b5b828201905092915050565b6000613ba282613c09565b9150613bad83613c09565b925082821015613bc057613bbf613cce565b5b828203905092915050565b6000613bd682613be9565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613c3e578082015181840152602081019050613c23565b83811115613c4d576000848401525b50505050565b60006002820490506001821680613c6b57607f821691505b60208210811415613c7f57613c7e613cfd565b5b50919050565b6000613c9082613c09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cc357613cc2613cce565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613d7581613bcb565b8114613d8057600080fd5b50565b613d8c81613c09565b8114613d9757600080fd5b5056fea2646970667358221220366efeb1b76c11ed3e2e2b3d9b356278ccfd039e24fd7bd95dd1481c301ca9ea64736f6c63430008000033

Deployed Bytecode

0x60806040526004361061016a5760003560e01c806389812784116100d1578063c40868931161008a578063dd62ed3e11610064578063dd62ed3e146105d0578063ea74838a1461060d578063eecb4d5014610636578063f2fde38b14610673576101aa565b8063c408689314610519578063caedf82a14610556578063d0a2451614610593576101aa565b806389812784146103f55780638da5cb5b1461041e57806395d89b4114610449578063a457c2d714610474578063a9059cbb146104b1578063b4e8a6c4146104ee576101aa565b806337580f901161012357806337580f90146102d3578063395093511461031057806342966c681461034d5780635e2545141461037657806370a08231146103a1578063715018a6146103de576101aa565b806306fdde03146101af578063095ea7b3146101da57806318160ddd146102175780631e89d5451461024257806323b872dd1461026b578063313ce567146102a8576101aa565b366101aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a19061387b565b60405180910390fd5b600080fd5b3480156101bb57600080fd5b506101c461069c565b6040516101d19190613739565b60405180910390f35b3480156101e657600080fd5b5061020160048036038101906101fc9190612d9c565b61072e565b60405161020e919061371e565b60405180910390f35b34801561022357600080fd5b5061022c610751565b60405161023991906139bd565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190612e19565b61075b565b005b34801561027757600080fd5b50610292600480360381019061028d9190612cce565b610856565b60405161029f919061371e565b60405180910390f35b3480156102b457600080fd5b506102bd610885565b6040516102ca9190613a0f565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612c69565b61088e565b60405161030791906139bd565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612d9c565b6108ac565b604051610344919061371e565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190612e85565b6108e3565b005b34801561038257600080fd5b5061038b6108f7565b60405161039891906139bd565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190612c69565b610901565b6040516103d591906139bd565b60405180910390f35b3480156103ea57600080fd5b506103f3610949565b005b34801561040157600080fd5b5061041c60048036038101906104179190612e85565b61095d565b005b34801561042a57600080fd5b50610433610a03565b60405161044091906136e1565b60405180910390f35b34801561045557600080fd5b5061045e610a2d565b60405161046b9190613739565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612d9c565b610abf565b6040516104a8919061371e565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612d9c565b610b36565b6040516104e5919061371e565b60405180910390f35b3480156104fa57600080fd5b50610503610b59565b60405161051091906136fc565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190612c69565b610be7565b60405161054d91906139bd565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190612c69565b610e93565b60405161058a919061399b565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190612d1d565b610f69565b6040516105c7919061371e565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190612c92565b611021565b60405161060491906139bd565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190612dd8565b6110a8565b005b34801561064257600080fd5b5061065d60048036038101906106589190612d1d565b611263565b60405161066a919061371e565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612c69565b61131b565b005b6060600380546106ab90613c53565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790613c53565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050505050905090565b6000806107396113a4565b90506107468185856113ac565b600191505092915050565b6000600254905090565b610763611577565b60008251905081518351146107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a4906137db565b60405180910390fd5b60005b81811015610850576108428482815181106107f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848381518110610835577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610b36565b5080806001019150506107b0565b50505050565b6000806108616113a4565b905061086e8582856115f5565b610879858585611681565b60019150509392505050565b60006012905090565b60066020528060005260406000206000915090508060000154905081565b6000806108b76113a4565b90506108d88185856108c98589611021565b6108d39190613b41565b6113ac565b600191505092915050565b6108f46108ee6113a4565b826118f9565b50565b6000600954905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610951611577565b61095b6000611ac7565b565b610965611577565b6000600954146109aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a19061393b565b60405180910390fd5b60008114156109bf57426009819055506109c7565b806009819055505b7fed32b583cb1083a600ce13f8afeaad016433a603b22330252b5826dd17eb60a26009546040516109f891906139bd565b60405180910390a150565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a3c90613c53565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6890613c53565b8015610ab55780601f10610a8a57610100808354040283529160200191610ab5565b820191906000526020600020905b815481529060010190602001808311610a9857829003601f168201915b5050505050905090565b600080610aca6113a4565b90506000610ad88286611021565b905083811015610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b149061397b565b60405180910390fd5b610b2a82868684036113ac565b60019250505092915050565b600080610b416113a4565b9050610b4e818585611681565b600191505092915050565b60606008805480602002602001604051908101604052809291908181526020018280548015610bdd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610b93575b5050505050905090565b60008060009050600080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050915060005b82811015610e875760006009541415610ced57600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018181548110610cc9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000015484610ce69190613b41565b9350610e7a565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018181548110610d67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001015491506000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610dd75760095482610dd49190613b41565b91505b42821115610e7957600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018181548110610e59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000015484610e769190613b41565b93505b5b8080600101915050610c3c565b50829350505050919050565b610e9b612a07565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020016000905b82821015610f5a57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610f14565b50505050815250509050919050565b600060076000610f776113a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610fc857600080fd5b60006009541461100d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110049061389b565b60405180910390fd5b611018848484611b8d565b90509392505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6110b0611577565b60005b60088054905081101561118f5760006007600060088481548110611100577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061118790613c85565b9150506110b3565b600090505b8151811015611248576001600760008484815181106111dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061124090613c85565b915050611194565b816008908051906020019061125e929190612a21565b505050565b6000600760006112716113a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112c257600080fd5b600060095411611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe9061385b565b60405180910390fd5b611312848484611b8d565b90509392505050565b611323611577565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a9061379b565b60405180910390fd5b61139c81611ac7565b50565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561141c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114139061391b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906137bb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161156a91906139bd565b60405180910390a3505050565b61157f6113a4565b73ffffffffffffffffffffffffffffffffffffffff1661159d610a03565b73ffffffffffffffffffffffffffffffffffffffff16146115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea906138bb565b60405180910390fd5b565b60006116018484611021565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461167b578181101561166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906137fb565b60405180910390fd5b61167a84848484036113ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e8906138fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611761576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117589061375b565b60405180910390fd5b61176c83838361201f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e99061383b565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118e091906139bd565b60405180910390a36118f38484846120d7565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611969576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611960906138db565b60405180910390fd5b6119758260008361201f565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f29061377b565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611aae91906139bd565b60405180910390a3611ac2836000846120d7565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060076000611b9b6113a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611bec57600080fd5b8151835114611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c279061395b565b60405180910390fd5b600080600090506000611c42876120dc565b85519050600092505b8083101561200657858381518110611c8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015182611c9f9190613b41565b9150600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016040518060400160405280888681518110611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001878681518110611d6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505060006009541115611f22576000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541480611e945750848381518110611e47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b15611f2157848381518110611ed2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b5b8673ffffffffffffffffffffffffffffffffffffffff167fca8d506eda84f8ed07c2908ae102299d34888ef5e19b97f56e4d6fcd1104c31e878581518110611f93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151878681518110611fd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600060095411604051611ff1939291906139d8565b60405180910390a28280600101935050611c4b565b6120108783610b36565b50600193505050509392505050565b61202a83838361139f565b612033836123b9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120d257600061207284610be7565b9050600061207f85610901565b905082828261208e9190613b97565b10156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c69061381b565b60405180910390fd5b50505b505050565b505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050905060008111801561217857506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b801561218657506000600954115b156123b557600080600090505b828110156123b257600954600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018281548110612218577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101546122349190613b41565b915081600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481106122b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101819055506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541480612358575081600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b156123a55781600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b8080600101915050612193565b50505b5050565b6000808060095414156123cd575050612a04565b6123d6836120dc565b42600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115612427575050612a04565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050905060005b818110156128875742600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101828154811061253d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154111561287a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414806126725750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101818154811061261b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b1561274a57600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181815481106126f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020160010154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181815481106127c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101848154811061284c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600082015481600001556001820154816001015590505082806001019350505b80806001019150506124ba565b5060008214156128f057600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006128e99190612aab565b5050612a01565b600082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805490506129439190613b97565b905060005b818110156129fe57600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806129c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090600202016000808201600090556001820160009055505090558080600101915050612948565b50505b50505b50565b604051806040016040528060008152602001606081525090565b828054828255906000526020600020908101928215612a9a579160200282015b82811115612a995782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612a41565b5b509050612aa79190612acf565b5090565b5080546000825560020290600052602060002090810190612acc9190612aec565b50565b5b80821115612ae8576000816000905550600101612ad0565b5090565b5b80821115612b0f57600080820160009055600182016000905550600201612aed565b5090565b6000612b26612b2184613a5b565b613a2a565b90508083825260208201905082856020860282011115612b4557600080fd5b60005b85811015612b755781612b5b8882612beb565b845260208401935060208301925050600181019050612b48565b5050509392505050565b6000612b92612b8d84613a87565b613a2a565b90508083825260208201905082856020860282011115612bb157600080fd5b60005b85811015612be15781612bc78882612c54565b845260208401935060208301925050600181019050612bb4565b5050509392505050565b600081359050612bfa81613d6c565b92915050565b600082601f830112612c1157600080fd5b8135612c21848260208601612b13565b91505092915050565b600082601f830112612c3b57600080fd5b8135612c4b848260208601612b7f565b91505092915050565b600081359050612c6381613d83565b92915050565b600060208284031215612c7b57600080fd5b6000612c8984828501612beb565b91505092915050565b60008060408385031215612ca557600080fd5b6000612cb385828601612beb565b9250506020612cc485828601612beb565b9150509250929050565b600080600060608486031215612ce357600080fd5b6000612cf186828701612beb565b9350506020612d0286828701612beb565b9250506040612d1386828701612c54565b9150509250925092565b600080600060608486031215612d3257600080fd5b6000612d4086828701612beb565b935050602084013567ffffffffffffffff811115612d5d57600080fd5b612d6986828701612c2a565b925050604084013567ffffffffffffffff811115612d8657600080fd5b612d9286828701612c2a565b9150509250925092565b60008060408385031215612daf57600080fd5b6000612dbd85828601612beb565b9250506020612dce85828601612c54565b9150509250929050565b600060208284031215612dea57600080fd5b600082013567ffffffffffffffff811115612e0457600080fd5b612e1084828501612c00565b91505092915050565b60008060408385031215612e2c57600080fd5b600083013567ffffffffffffffff811115612e4657600080fd5b612e5285828601612c00565b925050602083013567ffffffffffffffff811115612e6f57600080fd5b612e7b85828601612c2a565b9150509250929050565b600060208284031215612e9757600080fd5b6000612ea584828501612c54565b91505092915050565b6000612eba8383612ede565b60208301905092915050565b6000612ed28383613648565b60408301905092915050565b612ee781613bcb565b82525050565b612ef681613bcb565b82525050565b6000612f0782613ad3565b612f118185613b0e565b9350612f1c83613ab3565b8060005b83811015612f4d578151612f348882612eae565b9750612f3f83613af4565b925050600181019050612f20565b5085935050505092915050565b6000612f6582613ade565b612f6f8185613b1f565b9350612f7a83613ac3565b8060005b83811015612fab578151612f928882612ec6565b9750612f9d83613b01565b925050600181019050612f7e565b5085935050505092915050565b612fc181613bdd565b82525050565b6000612fd282613ae9565b612fdc8185613b30565b9350612fec818560208601613c20565b612ff581613d5b565b840191505092915050565b600061300d602383613b30565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613073602283613b30565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130d9602683613b30565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061313f602283613b30565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131a5602383613b30565b91507f746f20616e6420616d6f756e74206d75737420686176652073617665206c656e60008301527f67746800000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061320b601d83613b30565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b600061324b603a83613b30565b91507f5472616e7366657220616d6f756e74206578656564732062616c616e6365206f60008301527f7220736f6d6520616d6f756e747320617265206c6f636b65642e0000000000006020830152604082019050919050565b60006132b1602683613b30565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613317601383613b30565b91507f546f6b656e206973206e6f74206c6973746564000000000000000000000000006000830152602082019050919050565b6000613357601083613b30565b91507f446f6e27742061636365707420455448000000000000000000000000000000006000830152602082019050919050565b6000613397600f83613b30565b91507f546f6b656e206973206c697374656400000000000000000000000000000000006000830152602082019050919050565b60006133d7602083613b30565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613417602183613b30565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061347d602583613b30565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134e3602483613b30565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613549601783613b30565b91507f6c697374696e674461746520616c7265616479207365740000000000000000006000830152602082019050919050565b6000613589602b83613b30565b91507f616d6f756e7420616e642072656c65616554696d65206d75737420686176652060008301527f73617665206c656e6774680000000000000000000000000000000000000000006020830152604082019050919050565b60006135ef602583613b30565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60408201600082015161365e60008501826136b4565b50602082015161367160208501826136b4565b50505050565b600060408301600083015161368f60008601826136b4565b50602083015184820360208601526136a78282612f5a565b9150508091505092915050565b6136bd81613c09565b82525050565b6136cc81613c09565b82525050565b6136db81613c13565b82525050565b60006020820190506136f66000830184612eed565b92915050565b600060208201905081810360008301526137168184612efc565b905092915050565b60006020820190506137336000830184612fb8565b92915050565b600060208201905081810360008301526137538184612fc7565b905092915050565b6000602082019050818103600083015261377481613000565b9050919050565b6000602082019050818103600083015261379481613066565b9050919050565b600060208201905081810360008301526137b4816130cc565b9050919050565b600060208201905081810360008301526137d481613132565b9050919050565b600060208201905081810360008301526137f481613198565b9050919050565b60006020820190508181036000830152613814816131fe565b9050919050565b600060208201905081810360008301526138348161323e565b9050919050565b60006020820190508181036000830152613854816132a4565b9050919050565b600060208201905081810360008301526138748161330a565b9050919050565b600060208201905081810360008301526138948161334a565b9050919050565b600060208201905081810360008301526138b48161338a565b9050919050565b600060208201905081810360008301526138d4816133ca565b9050919050565b600060208201905081810360008301526138f48161340a565b9050919050565b6000602082019050818103600083015261391481613470565b9050919050565b60006020820190508181036000830152613934816134d6565b9050919050565b600060208201905081810360008301526139548161353c565b9050919050565b600060208201905081810360008301526139748161357c565b9050919050565b60006020820190508181036000830152613994816135e2565b9050919050565b600060208201905081810360008301526139b58184613677565b905092915050565b60006020820190506139d260008301846136c3565b92915050565b60006060820190506139ed60008301866136c3565b6139fa60208301856136c3565b613a076040830184612fb8565b949350505050565b6000602082019050613a2460008301846136d2565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613a5157613a50613d2c565b5b8060405250919050565b600067ffffffffffffffff821115613a7657613a75613d2c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613aa257613aa1613d2c565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613b4c82613c09565b9150613b5783613c09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b8c57613b8b613cce565b5b828201905092915050565b6000613ba282613c09565b9150613bad83613c09565b925082821015613bc057613bbf613cce565b5b828203905092915050565b6000613bd682613be9565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613c3e578082015181840152602081019050613c23565b83811115613c4d576000848401525b50505050565b60006002820490506001821680613c6b57607f821691505b60208210811415613c7f57613c7e613cfd565b5b50919050565b6000613c9082613c09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cc357613cc2613cce565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613d7581613bcb565b8114613d8057600080fd5b50565b613d8c81613c09565b8114613d9757600080fd5b5056fea2646970667358221220366efeb1b76c11ed3e2e2b3d9b356278ccfd039e24fd7bd95dd1481c301ca9ea64736f6c63430008000033

Deployed Bytecode Sourcemap

20603:13532:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24472:26;;;;;;;;;;:::i;:::-;;;;;;;;20603:13532;;;;9351:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11702:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10471:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33099:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12483:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10313:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22368:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13187:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33701:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23527:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10642:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2776:103;;;;;;;;;;;;;:::i;:::-;;23063:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2128:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9570:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13928:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10975:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24247:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28028:1126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32826:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30804:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11231:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23743:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30215:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3034:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9351:100;9405:13;9438:5;9431:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9351:100;:::o;11702:201::-;11785:4;11802:13;11818:12;:10;:12::i;:::-;11802:28;;11841:32;11850:5;11857:7;11866:6;11841:8;:32::i;:::-;11891:4;11884:11;;;11702:201;;;;:::o;10471:108::-;10532:7;10559:12;;10552:19;;10471:108;:::o;33099:401::-;2014:13;:11;:13::i;:::-;33200:18:::1;33221:3;:10;33200:31;;33266:7;:14;33252:3;:10;:28;33244:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33338:7;33333:160;33356:13;33351:2;:18;33333:160;;;33388:30;33397:3;33401:2;33397:7;;;;;;;;;;;;;;;;;;;;;;33406;33414:2;33406:11;;;;;;;;;;;;;;;;;;;;;;33388:8;:30::i;:::-;;33462:4;;;;;;;33333:160;;;;2038:1;33099:401:::0;;:::o;12483:295::-;12614:4;12631:15;12649:12;:10;:12::i;:::-;12631:30;;12672:38;12688:4;12694:7;12703:6;12672:15;:38::i;:::-;12721:27;12731:4;12737:2;12741:6;12721:9;:27::i;:::-;12766:4;12759:11;;;12483:295;;;;;:::o;10313:93::-;10371:5;10396:2;10389:9;;10313:93;:::o;22368:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;13187:238::-;13275:4;13292:13;13308:12;:10;:12::i;:::-;13292:28;;13331:64;13340:5;13347:7;13384:10;13356:25;13366:5;13373:7;13356:9;:25::i;:::-;:38;;;;:::i;:::-;13331:8;:64::i;:::-;13413:4;13406:11;;;13187:238;;;;:::o;33701:87::-;33752:28;33758:12;:10;:12::i;:::-;33772:7;33752:5;:28::i;:::-;33701:87;:::o;23527:92::-;23573:7;23600:11;;23593:18;;23527:92;:::o;10642:127::-;10716:7;10743:9;:18;10753:7;10743:18;;;;;;;;;;;;;;;;10736:25;;10642:127;;;:::o;2776:103::-;2014:13;:11;:13::i;:::-;2841:30:::1;2868:1;2841:18;:30::i;:::-;2776:103::o:0;23063:364::-;2014:13;:11;:13::i;:::-;23159:1:::1;23144:11;;:16;23136:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;23264:1;23248:12;:17;23244:138;;;23296:15;23282:11;:29;;;;23244:138;;;23358:12;23344:11;:26;;;;23244:138;23399:20;23407:11;;23399:20;;;;;;:::i;:::-;;;;;;;;23063:364:::0;:::o;2128:87::-;2174:7;2201:6;;;;;;;;;;;2194:13;;2128:87;:::o;9570:104::-;9626:13;9659:7;9652:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9570:104;:::o;13928:436::-;14021:4;14038:13;14054:12;:10;:12::i;:::-;14038:28;;14077:24;14104:25;14114:5;14121:7;14104:9;:25::i;:::-;14077:52;;14168:15;14148:16;:35;;14140:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14261:60;14270:5;14277:7;14305:15;14286:16;:34;14261:8;:60::i;:::-;14352:4;14345:11;;;;13928:436;;;;:::o;10975:193::-;11054:4;11071:13;11087:12;:10;:12::i;:::-;11071:28;;11110;11120:5;11127:2;11131:6;11110:9;:28::i;:::-;11156:4;11149:11;;;10975:193;;;;:::o;24247:101::-;24293:16;24329:11;24322:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24247:101;:::o;28028:1126::-;28090:7;28110:19;28132:1;28110:23;;28144:18;28173:19;28218:10;:17;28229:5;28218:17;;;;;;;;;;;;;;;:26;;:33;;;;28205:46;;28268:10;28263:853;28289:10;28284:2;:15;28263:853;;;28356:1;28341:11;;:16;28337:705;;;28479:10;:17;28490:5;28479:17;;;;;;;;;;;;;;;:26;;28506:2;28479:30;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;28464:52;;;;;:::i;:::-;;;28337:705;;;28571:10;:17;28582:5;28571:17;;;;;;;;;;;;;;;:26;;28598:2;28571:30;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;28557:56;;28805:1;28769:10;:17;28780:5;28769:17;;;;;;;;;;;;;;;:32;;;:37;28765:112;;;28846:11;;28831:26;;;;;:::i;:::-;;;28765:112;28915:15;28901:11;:29;28897:130;;;28970:10;:17;28981:5;28970:17;;;;;;;;;;;;;;;:26;;28997:2;28970:30;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;28955:52;;;;;:::i;:::-;;;28897:130;28337:705;29085:4;;;;;;;28263:853;;;;29135:11;29128:18;;;;;28028:1126;;;:::o;32826:131::-;32891:21;;:::i;:::-;32932:10;:17;32943:5;32932:17;;;;;;;;;;;;;;;32925:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32826:131;;;:::o;30804:299::-;30964:4;20867:12;:26;20880:12;:10;:12::i;:::-;20867:26;;;;;;;;;;;;;;;;;;;;;;;;;20859:35;;;;;;31009:1:::1;30994:11;;:16;30986:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;31048:47;31066:5;31073:7;31082:12;31048:17;:47::i;:::-;31041:54;;30804:299:::0;;;;;:::o;11231:151::-;11320:7;11347:11;:18;11359:5;11347:18;;;;;;;;;;;;;;;:27;11366:7;11347:27;;;;;;;;;;;;;;;;11340:34;;11231:151;;;;:::o;23743:380::-;2014:13;:11;:13::i;:::-;23828:7:::1;23846:108;23864:11;:18;;;;23859:2;:23;23846:108;;;23937:5;23905:12;:29;23918:11;23930:2;23918:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23905:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;23884:4;;;;;:::i;:::-;;;;23846:108;;;23974:1;23969:6;;23964:113;23982:14;:21;23977:2;:26;23964:113;;;24061:4;24026:12;:32;24039:14;24054:2;24039:18;;;;;;;;;;;;;;;;;;;;;;24026:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;24005:4;;;;;:::i;:::-;;;;23964:113;;;24101:14;24087:11;:28;;;;;;;;;;;;:::i;:::-;;2038:1;23743:380:::0;:::o;30215:299::-;30372:4;20867:12;:26;20880:12;:10;:12::i;:::-;20867:26;;;;;;;;;;;;;;;;;;;;;;;;;20859:35;;;;;;30416:1:::1;30402:11;;:15;30394:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;30459;30477:5;30484:7;30493:12;30459:17;:47::i;:::-;30452:54;;30215:299:::0;;;;;:::o;3034:201::-;2014:13;:11;:13::i;:::-;3143:1:::1;3123:22;;:8;:22;;;;3115:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3199:28;3218:8;3199:18;:28::i;:::-;3034:201:::0;:::o;19679:125::-;;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;17955:380::-;18108:1;18091:19;;:5;:19;;;;18083:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18189:1;18170:21;;:7;:21;;;;18162:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18273:6;18243:11;:18;18255:5;18243:18;;;;;;;;;;;;;;;:27;18262:7;18243:27;;;;;;;;;;;;;;;:36;;;;18311:7;18295:32;;18304:5;18295:32;;;18320:6;18295:32;;;;;;:::i;:::-;;;;;;;;17955:380;;;:::o;2293:132::-;2368:12;:10;:12::i;:::-;2357:23;;:7;:5;:7::i;:::-;:23;;;2349:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2293:132::o;18626:453::-;18761:24;18788:25;18798:5;18805:7;18788:9;:25::i;:::-;18761:52;;18848:17;18828:16;:37;18824:248;;18910:6;18890:16;:26;;18882:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18994:51;19003:5;19010:7;19038:6;19019:16;:25;18994:8;:51::i;:::-;18824:248;18626:453;;;;:::o;14834:840::-;14981:1;14965:18;;:4;:18;;;;14957:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15058:1;15044:16;;:2;:16;;;;15036:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;15113:38;15134:4;15140:2;15144:6;15113:20;:38::i;:::-;15164:19;15186:9;:15;15196:4;15186:15;;;;;;;;;;;;;;;;15164:37;;15235:6;15220:11;:21;;15212:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15352:6;15338:11;:20;15320:9;:15;15330:4;15320:15;;;;;;;;;;;;;;;:38;;;;15555:6;15538:9;:13;15548:2;15538:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;15605:2;15590:26;;15599:4;15590:26;;;15609:6;15590:26;;;;;;:::i;:::-;;;;;;;;15629:37;15649:4;15655:2;15659:6;15629:19;:37::i;:::-;14834:840;;;;:::o;16842:675::-;16945:1;16926:21;;:7;:21;;;;16918:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16998:49;17019:7;17036:1;17040:6;16998:20;:49::i;:::-;17060:22;17085:9;:18;17095:7;17085:18;;;;;;;;;;;;;;;;17060:43;;17140:6;17122:14;:24;;17114:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;17259:6;17242:14;:23;17221:9;:18;17231:7;17221:18;;;;;;;;;;;;;;;:44;;;;17376:6;17360:12;;:22;;;;;;;;;;;17437:1;17411:37;;17420:7;17411:37;;;17441:6;17411:37;;;;;;:::i;:::-;;;;;;;;17461:48;17481:7;17498:1;17502:6;17461:19;:48::i;:::-;16842:675;;;:::o;3395:191::-;3469:16;3488:6;;;;;;;;;;;3469:25;;3514:8;3505:6;;:17;;;;;;;;;;;;;;;;;;3569:8;3538:40;;3559:8;3538:40;;;;;;;;;;;;3395:191;;:::o;31362:1317::-;31523:4;20867:12;:26;20880:12;:10;:12::i;:::-;20867:26;;;;;;;;;;;;;;;;;;;;;;;;;20859:35;;;;;;31571:12:::1;:19;31553:7;:14;:37;31545:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;31651:7;31669:19:::0;31691:1:::1;31669:23;;31703:20;31824:30;31848:5;31824:23;:30::i;:::-;31882:7;:14;31867:29;;31918:1;31913:6;;31908:699;31926:12;31921:2;:17;31908:699;;;31991:7;31999:2;31991:11;;;;;;;;;;;;;;;;;;;;;;31976:26;;;;;:::i;:::-;;;32049:10;:17;32060:5;32049:17;;;;;;;;;;;;;;;:26;;32081:44;;;;;;;;32095:7;32103:2;32095:11;;;;;;;;;;;;;;;;;;;;;;32081:44;;;;32108:12;32121:2;32108:16;;;;;;;;;;;;;;;;;;;;;;32081:44;;::::0;32049:77:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32219:1;32205:11;;:15;32201:251;;;32282:1;32246:10;:17;32257:5;32246:17;;;;;;;;;;;;;;;:32;;;:37;32245:96;;;;32324:12;32337:2;32324:16;;;;;;;;;;;;;;;;;;;;;;32289:10;:17;32300:5;32289:17;;;;;;;;;;;;;;;:32;;;:51;32245:96;32241:196;;;32401:12;32414:2;32401:16;;;;;;;;;;;;;;;;;;;;;;32366:10;:17;32377:5;32366:17;;;;;;;;;;;;;;;:32;;:51;;;;32241:196;32201:251;32478:5;32471:59;;;32485:7;32493:2;32485:11;;;;;;;;;;;;;;;;;;;;;;32498:12;32511:2;32498:16;;;;;;;;;;;;;;;;;;;;;;32528:1;32516:11;;:13;32471:59;;;;;;;;:::i;:::-;;;;;;;;32576:4;;;;;;;31908:699;;;32619:28;32628:5;32635:11;32619:8;:28::i;:::-;;32667:4;32660:11;;;;;31362:1317:::0;;;;;:::o;29387:541::-;29488:44;29515:4;29521:2;29525:6;29488:26;:44::i;:::-;29598:22;29615:4;29598:16;:22::i;:::-;29653:1;29637:18;;:4;:18;;;29633:288;;29696:14;29713:22;29730:4;29713:16;:22::i;:::-;29696:39;;29750:22;29775:15;29785:4;29775:9;:15::i;:::-;29750:40;;29840:6;29830;29813:14;:23;;;;:::i;:::-;:33;;29805:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;29633:288;;;29387:541;;;:::o;20408:124::-;;;;:::o;24709:1112::-;24777:11;24791:10;:17;24802:5;24791:17;;;;;;;;;;;;;;;:26;;:33;;;;24777:47;;24956:1;24947:6;:10;24946:133;;;;;25077:1;25041:10;:17;25052:5;25041:17;;;;;;;;;;;;;;;:32;;;:37;24946:133;:236;;;;;25180:1;25166:11;;:15;24946:236;24942:872;;;25263:16;25299:7;25309:1;25299:11;;25294:509;25317:6;25312:2;:11;25294:509;;;25424:11;;25379:10;:17;25390:5;25379:17;;;;;;;;;;;;;;;:26;;25406:2;25379:30;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;:56;;;;:::i;:::-;25365:70;;25500:11;25455:10;:17;25466:5;25455:17;;;;;;;;;;;;;;;:26;;25482:2;25455:30;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;:56;;;;25571:1;25535:10;:17;25546:5;25535:17;;;;;;;;;;;;;;;:32;;;:37;:87;;;;25611:11;25576:10;:17;25587:5;25576:17;;;;;;;;;;;;;;;:32;;;:46;25535:87;25531:182;;;25681:11;25646:10;:17;25657:5;25646:17;;;;;;;;;;;;;;;:32;;:46;;;;25531:182;25764:4;;;;;;;25294:509;;;;24942:872;;24709:1112;;:::o;25921:1962::-;25982:17;26014:18;26150:1;26137:11;;:14;26133:27;;;26153:7;;;;26133:27;26224:30;26248:5;26224:23;:30::i;:::-;26373:15;26338:10;:17;26349:5;26338:17;;;;;;;;;;;;;;;:32;;;:50;26334:63;;;26390:7;;;;26334:63;26444:1;26409:10;:17;26420:5;26409:17;;;;;;;;;;;;;;;:32;;:36;;;;26469:10;:17;26480:5;26469:17;;;;;;;;;;;;;;;:26;;:33;;;;26456:46;;26519:10;26514:835;26540:10;26535:2;:15;26514:835;;;26720:15;26675:10;:17;26686:5;26675:17;;;;;;;;;;;;;;;:26;;26702:2;26675:30;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;:60;26671:604;;;26842:1;26806:10;:17;26817:5;26806:17;;;;;;;;;;;;;;;:32;;;:37;26805:144;;;;26906:10;:17;26917:5;26906:17;;;;;;;;;;;;;;;:26;;26933:2;26906:30;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;26871:10;:17;26882:5;26871:17;;;;;;;;;;;;;;;:32;;;:77;26805:144;26801:288;;;27027:10;:17;27038:5;27027:17;;;;;;;;;;;;;;;:26;;27054:2;27027:30;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;26992:10;:17;27003:5;26992:17;;;;;;;;;;;;;;;:32;;:77;;;;26801:288;27147:10;:17;27158:5;27147:17;;;;;;;;;;;;;;;:26;;27174:2;27147:30;;;;;;;;;;;;;;;;;;;;;;;;;;27107:10;:17;27118:5;27107:17;;;;;;;;;;;;;;;:26;;27134:9;27107:37;;;;;;;;;;;;;;;;;;;;;;;;;;:70;;;;;;;;;;;;;;;;;;;27229:11;;;;;;;26671:604;27318:4;;;;;;;26514:835;;;;27378:1;27365:9;:14;27361:515;;;27465:10;:17;27476:5;27465:17;;;;;;;;;;;;;;;;27458:24;;;;;;;;;;;;;;:::i;:::-;;;27361:515;;;27569:19;27627:9;27591:10;:17;27602:5;27591:17;;;;;;;;;;;;;;;:26;;:33;;;;:45;;;;:::i;:::-;27569:67;;27668:10;27663:202;27689:11;27684:2;:16;27663:202;;;27742:10;:17;27753:5;27742:17;;;;;;;;;;;;;;;:26;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27826:4;;;;;;;27663:202;;;;27361:515;;25921:1962;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:139::-;;1381:6;1368:20;1359:29;;1397:33;1424:5;1397:33;:::i;:::-;1349:87;;;;:::o;1459:303::-;;1579:3;1572:4;1564:6;1560:17;1556:27;1546:2;;1597:1;1594;1587:12;1546:2;1637:6;1624:20;1662:94;1752:3;1744:6;1737:4;1729:6;1725:17;1662:94;:::i;:::-;1653:103;;1536:226;;;;;:::o;1785:303::-;;1905:3;1898:4;1890:6;1886:17;1882:27;1872:2;;1923:1;1920;1913:12;1872:2;1963:6;1950:20;1988:94;2078:3;2070:6;2063:4;2055:6;2051:17;1988:94;:::i;:::-;1979:103;;1862:226;;;;;:::o;2094:139::-;;2178:6;2165:20;2156:29;;2194:33;2221:5;2194:33;:::i;:::-;2146:87;;;;:::o;2239:262::-;;2347:2;2335:9;2326:7;2322:23;2318:32;2315:2;;;2363:1;2360;2353:12;2315:2;2406:1;2431:53;2476:7;2467:6;2456:9;2452:22;2431:53;:::i;:::-;2421:63;;2377:117;2305:196;;;;:::o;2507:407::-;;;2632:2;2620:9;2611:7;2607:23;2603:32;2600:2;;;2648:1;2645;2638:12;2600:2;2691:1;2716:53;2761:7;2752:6;2741:9;2737:22;2716:53;:::i;:::-;2706:63;;2662:117;2818:2;2844:53;2889:7;2880:6;2869:9;2865:22;2844:53;:::i;:::-;2834:63;;2789:118;2590:324;;;;;:::o;2920:552::-;;;;3062:2;3050:9;3041:7;3037:23;3033:32;3030:2;;;3078:1;3075;3068:12;3030:2;3121:1;3146:53;3191:7;3182:6;3171:9;3167:22;3146:53;:::i;:::-;3136:63;;3092:117;3248:2;3274:53;3319:7;3310:6;3299:9;3295:22;3274:53;:::i;:::-;3264:63;;3219:118;3376:2;3402:53;3447:7;3438:6;3427:9;3423:22;3402:53;:::i;:::-;3392:63;;3347:118;3020:452;;;;;:::o;3478:838::-;;;;3670:2;3658:9;3649:7;3645:23;3641:32;3638:2;;;3686:1;3683;3676:12;3638:2;3729:1;3754:53;3799:7;3790:6;3779:9;3775:22;3754:53;:::i;:::-;3744:63;;3700:117;3884:2;3873:9;3869:18;3856:32;3915:18;3907:6;3904:30;3901:2;;;3947:1;3944;3937:12;3901:2;3975:78;4045:7;4036:6;4025:9;4021:22;3975:78;:::i;:::-;3965:88;;3827:236;4130:2;4119:9;4115:18;4102:32;4161:18;4153:6;4150:30;4147:2;;;4193:1;4190;4183:12;4147:2;4221:78;4291:7;4282:6;4271:9;4267:22;4221:78;:::i;:::-;4211:88;;4073:236;3628:688;;;;;:::o;4322:407::-;;;4447:2;4435:9;4426:7;4422:23;4418:32;4415:2;;;4463:1;4460;4453:12;4415:2;4506:1;4531:53;4576:7;4567:6;4556:9;4552:22;4531:53;:::i;:::-;4521:63;;4477:117;4633:2;4659:53;4704:7;4695:6;4684:9;4680:22;4659:53;:::i;:::-;4649:63;;4604:118;4405:324;;;;;:::o;4735:405::-;;4868:2;4856:9;4847:7;4843:23;4839:32;4836:2;;;4884:1;4881;4874:12;4836:2;4955:1;4944:9;4940:17;4927:31;4985:18;4977:6;4974:30;4971:2;;;5017:1;5014;5007:12;4971:2;5045:78;5115:7;5106:6;5095:9;5091:22;5045:78;:::i;:::-;5035:88;;4898:235;4826:314;;;;:::o;5146:693::-;;;5321:2;5309:9;5300:7;5296:23;5292:32;5289:2;;;5337:1;5334;5327:12;5289:2;5408:1;5397:9;5393:17;5380:31;5438:18;5430:6;5427:30;5424:2;;;5470:1;5467;5460:12;5424:2;5498:78;5568:7;5559:6;5548:9;5544:22;5498:78;:::i;:::-;5488:88;;5351:235;5653:2;5642:9;5638:18;5625:32;5684:18;5676:6;5673:30;5670:2;;;5716:1;5713;5706:12;5670:2;5744:78;5814:7;5805:6;5794:9;5790:22;5744:78;:::i;:::-;5734:88;;5596:236;5279:560;;;;;:::o;5845:262::-;;5953:2;5941:9;5932:7;5928:23;5924:32;5921:2;;;5969:1;5966;5959:12;5921:2;6012:1;6037:53;6082:7;6073:6;6062:9;6058:22;6037:53;:::i;:::-;6027:63;;5983:117;5911:196;;;;:::o;6113:179::-;;6203:46;6245:3;6237:6;6203:46;:::i;:::-;6281:4;6276:3;6272:14;6258:28;;6193:99;;;;:::o;6298:299::-;;6448:106;6550:3;6542:6;6448:106;:::i;:::-;6586:4;6581:3;6577:14;6563:28;;6438:159;;;;:::o;6603:108::-;6680:24;6698:5;6680:24;:::i;:::-;6675:3;6668:37;6658:53;;:::o;6717:118::-;6804:24;6822:5;6804:24;:::i;:::-;6799:3;6792:37;6782:53;;:::o;6871:732::-;;7019:54;7067:5;7019:54;:::i;:::-;7089:86;7168:6;7163:3;7089:86;:::i;:::-;7082:93;;7199:56;7249:5;7199:56;:::i;:::-;7278:7;7309:1;7294:284;7319:6;7316:1;7313:13;7294:284;;;7395:6;7389:13;7422:63;7481:3;7466:13;7422:63;:::i;:::-;7415:70;;7508:60;7561:6;7508:60;:::i;:::-;7498:70;;7354:224;7341:1;7338;7334:9;7329:14;;7294:284;;;7298:14;7594:3;7587:10;;6995:608;;;;;;;:::o;7675:952::-;;7873:84;7951:5;7873:84;:::i;:::-;7973:106;8072:6;8067:3;7973:106;:::i;:::-;7966:113;;8103:86;8183:5;8103:86;:::i;:::-;8212:7;8243:1;8228:374;8253:6;8250:1;8247:13;8228:374;;;8329:6;8323:13;8356:123;8475:3;8460:13;8356:123;:::i;:::-;8349:130;;8502:90;8585:6;8502:90;:::i;:::-;8492:100;;8288:314;8275:1;8272;8268:9;8263:14;;8228:374;;;8232:14;8618:3;8611:10;;7849:778;;;;;;;:::o;8633:109::-;8714:21;8729:5;8714:21;:::i;:::-;8709:3;8702:34;8692:50;;:::o;8748:364::-;;8864:39;8897:5;8864:39;:::i;:::-;8919:71;8983:6;8978:3;8919:71;:::i;:::-;8912:78;;8999:52;9044:6;9039:3;9032:4;9025:5;9021:16;8999:52;:::i;:::-;9076:29;9098:6;9076:29;:::i;:::-;9071:3;9067:39;9060:46;;8840:272;;;;;:::o;9118:367::-;;9281:67;9345:2;9340:3;9281:67;:::i;:::-;9274:74;;9378:34;9374:1;9369:3;9365:11;9358:55;9444:5;9439:2;9434:3;9430:12;9423:27;9476:2;9471:3;9467:12;9460:19;;9264:221;;;:::o;9491:366::-;;9654:67;9718:2;9713:3;9654:67;:::i;:::-;9647:74;;9751:34;9747:1;9742:3;9738:11;9731:55;9817:4;9812:2;9807:3;9803:12;9796:26;9848:2;9843:3;9839:12;9832:19;;9637:220;;;:::o;9863:370::-;;10026:67;10090:2;10085:3;10026:67;:::i;:::-;10019:74;;10123:34;10119:1;10114:3;10110:11;10103:55;10189:8;10184:2;10179:3;10175:12;10168:30;10224:2;10219:3;10215:12;10208:19;;10009:224;;;:::o;10239:366::-;;10402:67;10466:2;10461:3;10402:67;:::i;:::-;10395:74;;10499:34;10495:1;10490:3;10486:11;10479:55;10565:4;10560:2;10555:3;10551:12;10544:26;10596:2;10591:3;10587:12;10580:19;;10385:220;;;:::o;10611:367::-;;10774:67;10838:2;10833:3;10774:67;:::i;:::-;10767:74;;10871:34;10867:1;10862:3;10858:11;10851:55;10937:5;10932:2;10927:3;10923:12;10916:27;10969:2;10964:3;10960:12;10953:19;;10757:221;;;:::o;10984:327::-;;11147:67;11211:2;11206:3;11147:67;:::i;:::-;11140:74;;11244:31;11240:1;11235:3;11231:11;11224:52;11302:2;11297:3;11293:12;11286:19;;11130:181;;;:::o;11317:390::-;;11480:67;11544:2;11539:3;11480:67;:::i;:::-;11473:74;;11577:34;11573:1;11568:3;11564:11;11557:55;11643:28;11638:2;11633:3;11629:12;11622:50;11698:2;11693:3;11689:12;11682:19;;11463:244;;;:::o;11713:370::-;;11876:67;11940:2;11935:3;11876:67;:::i;:::-;11869:74;;11973:34;11969:1;11964:3;11960:11;11953:55;12039:8;12034:2;12029:3;12025:12;12018:30;12074:2;12069:3;12065:12;12058:19;;11859:224;;;:::o;12089:317::-;;12252:67;12316:2;12311:3;12252:67;:::i;:::-;12245:74;;12349:21;12345:1;12340:3;12336:11;12329:42;12397:2;12392:3;12388:12;12381:19;;12235:171;;;:::o;12412:314::-;;12575:67;12639:2;12634:3;12575:67;:::i;:::-;12568:74;;12672:18;12668:1;12663:3;12659:11;12652:39;12717:2;12712:3;12708:12;12701:19;;12558:168;;;:::o;12732:313::-;;12895:67;12959:2;12954:3;12895:67;:::i;:::-;12888:74;;12992:17;12988:1;12983:3;12979:11;12972:38;13036:2;13031:3;13027:12;13020:19;;12878:167;;;:::o;13051:330::-;;13214:67;13278:2;13273:3;13214:67;:::i;:::-;13207:74;;13311:34;13307:1;13302:3;13298:11;13291:55;13372:2;13367:3;13363:12;13356:19;;13197:184;;;:::o;13387:365::-;;13550:67;13614:2;13609:3;13550:67;:::i;:::-;13543:74;;13647:34;13643:1;13638:3;13634:11;13627:55;13713:3;13708:2;13703:3;13699:12;13692:25;13743:2;13738:3;13734:12;13727:19;;13533:219;;;:::o;13758:369::-;;13921:67;13985:2;13980:3;13921:67;:::i;:::-;13914:74;;14018:34;14014:1;14009:3;14005:11;13998:55;14084:7;14079:2;14074:3;14070:12;14063:29;14118:2;14113:3;14109:12;14102:19;;13904:223;;;:::o;14133:368::-;;14296:67;14360:2;14355:3;14296:67;:::i;:::-;14289:74;;14393:34;14389:1;14384:3;14380:11;14373:55;14459:6;14454:2;14449:3;14445:12;14438:28;14492:2;14487:3;14483:12;14476:19;;14279:222;;;:::o;14507:321::-;;14670:67;14734:2;14729:3;14670:67;:::i;:::-;14663:74;;14767:25;14763:1;14758:3;14754:11;14747:46;14819:2;14814:3;14810:12;14803:19;;14653:175;;;:::o;14834:375::-;;14997:67;15061:2;15056:3;14997:67;:::i;:::-;14990:74;;15094:34;15090:1;15085:3;15081:11;15074:55;15160:13;15155:2;15150:3;15146:12;15139:35;15200:2;15195:3;15191:12;15184:19;;14980:229;;;:::o;15215:369::-;;15378:67;15442:2;15437:3;15378:67;:::i;:::-;15371:74;;15475:34;15471:1;15466:3;15462:11;15455:55;15541:7;15536:2;15531:3;15527:12;15520:29;15575:2;15570:3;15566:12;15559:19;;15361:223;;;:::o;15652:516::-;15799:4;15794:3;15790:14;15888:4;15881:5;15877:16;15871:23;15907:63;15964:4;15959:3;15955:14;15941:12;15907:63;:::i;:::-;15814:166;16069:4;16062:5;16058:16;16052:23;16088:63;16145:4;16140:3;16136:14;16122:12;16088:63;:::i;:::-;15990:171;15768:400;;;:::o;16238:722::-;;16405:4;16400:3;16396:14;16502:4;16495:5;16491:16;16485:23;16521:63;16578:4;16573:3;16569:14;16555:12;16521:63;:::i;:::-;16420:174;16680:4;16673:5;16669:16;16663:23;16733:3;16727:4;16723:14;16716:4;16711:3;16707:14;16700:38;16759:163;16917:4;16903:12;16759:163;:::i;:::-;16751:171;;16604:329;16950:4;16943:11;;16374:586;;;;;:::o;16966:108::-;17043:24;17061:5;17043:24;:::i;:::-;17038:3;17031:37;17021:53;;:::o;17080:118::-;17167:24;17185:5;17167:24;:::i;:::-;17162:3;17155:37;17145:53;;:::o;17204:112::-;17287:22;17303:5;17287:22;:::i;:::-;17282:3;17275:35;17265:51;;:::o;17322:222::-;;17453:2;17442:9;17438:18;17430:26;;17466:71;17534:1;17523:9;17519:17;17510:6;17466:71;:::i;:::-;17420:124;;;;:::o;17550:373::-;;17731:2;17720:9;17716:18;17708:26;;17780:9;17774:4;17770:20;17766:1;17755:9;17751:17;17744:47;17808:108;17911:4;17902:6;17808:108;:::i;:::-;17800:116;;17698:225;;;;:::o;17929:210::-;;18054:2;18043:9;18039:18;18031:26;;18067:65;18129:1;18118:9;18114:17;18105:6;18067:65;:::i;:::-;18021:118;;;;:::o;18145:313::-;;18296:2;18285:9;18281:18;18273:26;;18345:9;18339:4;18335:20;18331:1;18320:9;18316:17;18309:47;18373:78;18446:4;18437:6;18373:78;:::i;:::-;18365:86;;18263:195;;;;:::o;18464:419::-;;18668:2;18657:9;18653:18;18645:26;;18717:9;18711:4;18707:20;18703:1;18692:9;18688:17;18681:47;18745:131;18871:4;18745:131;:::i;:::-;18737:139;;18635:248;;;:::o;18889:419::-;;19093:2;19082:9;19078:18;19070:26;;19142:9;19136:4;19132:20;19128:1;19117:9;19113:17;19106:47;19170:131;19296:4;19170:131;:::i;:::-;19162:139;;19060:248;;;:::o;19314:419::-;;19518:2;19507:9;19503:18;19495:26;;19567:9;19561:4;19557:20;19553:1;19542:9;19538:17;19531:47;19595:131;19721:4;19595:131;:::i;:::-;19587:139;;19485:248;;;:::o;19739:419::-;;19943:2;19932:9;19928:18;19920:26;;19992:9;19986:4;19982:20;19978:1;19967:9;19963:17;19956:47;20020:131;20146:4;20020:131;:::i;:::-;20012:139;;19910:248;;;:::o;20164:419::-;;20368:2;20357:9;20353:18;20345:26;;20417:9;20411:4;20407:20;20403:1;20392:9;20388:17;20381:47;20445:131;20571:4;20445:131;:::i;:::-;20437:139;;20335:248;;;:::o;20589:419::-;;20793:2;20782:9;20778:18;20770:26;;20842:9;20836:4;20832:20;20828:1;20817:9;20813:17;20806:47;20870:131;20996:4;20870:131;:::i;:::-;20862:139;;20760:248;;;:::o;21014:419::-;;21218:2;21207:9;21203:18;21195:26;;21267:9;21261:4;21257:20;21253:1;21242:9;21238:17;21231:47;21295:131;21421:4;21295:131;:::i;:::-;21287:139;;21185:248;;;:::o;21439:419::-;;21643:2;21632:9;21628:18;21620:26;;21692:9;21686:4;21682:20;21678:1;21667:9;21663:17;21656:47;21720:131;21846:4;21720:131;:::i;:::-;21712:139;;21610:248;;;:::o;21864:419::-;;22068:2;22057:9;22053:18;22045:26;;22117:9;22111:4;22107:20;22103:1;22092:9;22088:17;22081:47;22145:131;22271:4;22145:131;:::i;:::-;22137:139;;22035:248;;;:::o;22289:419::-;;22493:2;22482:9;22478:18;22470:26;;22542:9;22536:4;22532:20;22528:1;22517:9;22513:17;22506:47;22570:131;22696:4;22570:131;:::i;:::-;22562:139;;22460:248;;;:::o;22714:419::-;;22918:2;22907:9;22903:18;22895:26;;22967:9;22961:4;22957:20;22953:1;22942:9;22938:17;22931:47;22995:131;23121:4;22995:131;:::i;:::-;22987:139;;22885:248;;;:::o;23139:419::-;;23343:2;23332:9;23328:18;23320:26;;23392:9;23386:4;23382:20;23378:1;23367:9;23363:17;23356:47;23420:131;23546:4;23420:131;:::i;:::-;23412:139;;23310:248;;;:::o;23564:419::-;;23768:2;23757:9;23753:18;23745:26;;23817:9;23811:4;23807:20;23803:1;23792:9;23788:17;23781:47;23845:131;23971:4;23845:131;:::i;:::-;23837:139;;23735:248;;;:::o;23989:419::-;;24193:2;24182:9;24178:18;24170:26;;24242:9;24236:4;24232:20;24228:1;24217:9;24213:17;24206:47;24270:131;24396:4;24270:131;:::i;:::-;24262:139;;24160:248;;;:::o;24414:419::-;;24618:2;24607:9;24603:18;24595:26;;24667:9;24661:4;24657:20;24653:1;24642:9;24638:17;24631:47;24695:131;24821:4;24695:131;:::i;:::-;24687:139;;24585:248;;;:::o;24839:419::-;;25043:2;25032:9;25028:18;25020:26;;25092:9;25086:4;25082:20;25078:1;25067:9;25063:17;25056:47;25120:131;25246:4;25120:131;:::i;:::-;25112:139;;25010:248;;;:::o;25264:419::-;;25468:2;25457:9;25453:18;25445:26;;25517:9;25511:4;25507:20;25503:1;25492:9;25488:17;25481:47;25545:131;25671:4;25545:131;:::i;:::-;25537:139;;25435:248;;;:::o;25689:419::-;;25893:2;25882:9;25878:18;25870:26;;25942:9;25936:4;25932:20;25928:1;25917:9;25913:17;25906:47;25970:131;26096:4;25970:131;:::i;:::-;25962:139;;25860:248;;;:::o;26114:397::-;;26307:2;26296:9;26292:18;26284:26;;26356:9;26350:4;26346:20;26342:1;26331:9;26327:17;26320:47;26384:120;26499:4;26490:6;26384:120;:::i;:::-;26376:128;;26274:237;;;;:::o;26517:222::-;;26648:2;26637:9;26633:18;26625:26;;26661:71;26729:1;26718:9;26714:17;26705:6;26661:71;:::i;:::-;26615:124;;;;:::o;26745:430::-;;26926:2;26915:9;26911:18;26903:26;;26939:71;27007:1;26996:9;26992:17;26983:6;26939:71;:::i;:::-;27020:72;27088:2;27077:9;27073:18;27064:6;27020:72;:::i;:::-;27102:66;27164:2;27153:9;27149:18;27140:6;27102:66;:::i;:::-;26893:282;;;;;;:::o;27181:214::-;;27308:2;27297:9;27293:18;27285:26;;27321:67;27385:1;27374:9;27370:17;27361:6;27321:67;:::i;:::-;27275:120;;;;:::o;27401:283::-;;27467:2;27461:9;27451:19;;27509:4;27501:6;27497:17;27616:6;27604:10;27601:22;27580:18;27568:10;27565:34;27562:62;27559:2;;;27627:18;;:::i;:::-;27559:2;27667:10;27663:2;27656:22;27441:243;;;;:::o;27690:311::-;;27857:18;27849:6;27846:30;27843:2;;;27879:18;;:::i;:::-;27843:2;27929:4;27921:6;27917:17;27909:25;;27989:4;27983;27979:15;27971:23;;27772:229;;;:::o;28007:311::-;;28174:18;28166:6;28163:30;28160:2;;;28196:18;;:::i;:::-;28160:2;28246:4;28238:6;28234:17;28226:25;;28306:4;28300;28296:15;28288:23;;28089:229;;;:::o;28324:132::-;;28414:3;28406:11;;28444:4;28439:3;28435:14;28427:22;;28396:60;;;:::o;28462:162::-;;28582:3;28574:11;;28612:4;28607:3;28603:14;28595:22;;28564:60;;;:::o;28630:114::-;;28731:5;28725:12;28715:22;;28704:40;;;:::o;28750:144::-;;28881:5;28875:12;28865:22;;28854:40;;;:::o;28900:99::-;;28986:5;28980:12;28970:22;;28959:40;;;:::o;29005:113::-;;29107:4;29102:3;29098:14;29090:22;;29080:38;;;:::o;29124:143::-;;29256:4;29251:3;29247:14;29239:22;;29229:38;;;:::o;29273:184::-;;29406:6;29401:3;29394:19;29446:4;29441:3;29437:14;29422:29;;29384:73;;;;:::o;29463:204::-;;29616:6;29611:3;29604:19;29656:4;29651:3;29647:14;29632:29;;29594:73;;;;:::o;29673:169::-;;29791:6;29786:3;29779:19;29831:4;29826:3;29822:14;29807:29;;29769:73;;;;:::o;29848:305::-;;29907:20;29925:1;29907:20;:::i;:::-;29902:25;;29941:20;29959:1;29941:20;:::i;:::-;29936:25;;30095:1;30027:66;30023:74;30020:1;30017:81;30014:2;;;30101:18;;:::i;:::-;30014:2;30145:1;30142;30138:9;30131:16;;29892:261;;;;:::o;30159:191::-;;30219:20;30237:1;30219:20;:::i;:::-;30214:25;;30253:20;30271:1;30253:20;:::i;:::-;30248:25;;30292:1;30289;30286:8;30283:2;;;30297:18;;:::i;:::-;30283:2;30342:1;30339;30335:9;30327:17;;30204:146;;;;:::o;30356:96::-;;30422:24;30440:5;30422:24;:::i;:::-;30411:35;;30401:51;;;:::o;30458:90::-;;30535:5;30528:13;30521:21;30510:32;;30500:48;;;:::o;30554:126::-;;30631:42;30624:5;30620:54;30609:65;;30599:81;;;:::o;30686:77::-;;30752:5;30741:16;;30731:32;;;:::o;30769:86::-;;30844:4;30837:5;30833:16;30822:27;;30812:43;;;:::o;30861:307::-;30929:1;30939:113;30953:6;30950:1;30947:13;30939:113;;;31038:1;31033:3;31029:11;31023:18;31019:1;31014:3;31010:11;31003:39;30975:2;30972:1;30968:10;30963:15;;30939:113;;;31070:6;31067:1;31064:13;31061:2;;;31150:1;31141:6;31136:3;31132:16;31125:27;31061:2;30910:258;;;;:::o;31174:320::-;;31255:1;31249:4;31245:12;31235:22;;31302:1;31296:4;31292:12;31323:18;31313:2;;31379:4;31371:6;31367:17;31357:27;;31313:2;31441;31433:6;31430:14;31410:18;31407:38;31404:2;;;31460:18;;:::i;:::-;31404:2;31225:269;;;;:::o;31500:233::-;;31562:24;31580:5;31562:24;:::i;:::-;31553:33;;31608:66;31601:5;31598:77;31595:2;;;31678:18;;:::i;:::-;31595:2;31725:1;31718:5;31714:13;31707:20;;31543:190;;;:::o;31739:180::-;31787:77;31784:1;31777:88;31884:4;31881:1;31874:15;31908:4;31905:1;31898:15;31925:180;31973:77;31970:1;31963:88;32070:4;32067:1;32060:15;32094:4;32091:1;32084:15;32111:180;32159:77;32156:1;32149:88;32256:4;32253:1;32246:15;32280:4;32277:1;32270:15;32297:102;;32389:2;32385:7;32380:2;32373:5;32369:14;32365:28;32355:38;;32345:54;;;:::o;32405:122::-;32478:24;32496:5;32478:24;:::i;:::-;32471:5;32468:35;32458:2;;32517:1;32514;32507:12;32458:2;32448:79;:::o;32533:122::-;32606:24;32624:5;32606:24;:::i;:::-;32599:5;32596:35;32586:2;;32645:1;32642;32635:12;32586:2;32576:79;:::o

Swarm Source

ipfs://366efeb1b76c11ed3e2e2b3d9b356278ccfd039e24fd7bd95dd1481c301ca9ea
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.