ETH Price: $3,182.69 (-8.02%)
Gas: 3 Gwei

Token

Bones (BONES)
 

Overview

Max Total Supply

755,100.733622685185183661 BONES

Holders

174

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
97.675 BONES

Value
$0.00
0x6478c54d7e93801950ef4970424d2e84bd1a7ea1
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BonesOfficial

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-26
*/

// SPDX-License-Identifier: MIT

/**
 *       $$$$$                                                                                                              
 *       $:::$                                                                                                              
 *   $$$$$:::$$$$$$ BBBBBBBBBBBBBBBBB        OOOOOOOOO     NNNNNNNN        NNNNNNNNEEEEEEEEEEEEEEEEEEEEEE   SSSSSSSSSSSSSSS 
 * $$::::::::::::::$B::::::::::::::::B     OO:::::::::OO   N:::::::N       N::::::NE::::::::::::::::::::E SS:::::::::::::::S
 *$:::::$$$$$$$::::$B::::::BBBBBB:::::B  OO:::::::::::::OO N::::::::N      N::::::NE::::::::::::::::::::ES:::::SSSSSS::::::S
 *$::::$       $$$$$BB:::::B     B:::::BO:::::::OOO:::::::ON:::::::::N     N::::::NEE::::::EEEEEEEEE::::ES:::::S     SSSSSSS
 *$::::$              B::::B     B:::::BO::::::O   O::::::ON::::::::::N    N::::::N  E:::::E       EEEEEES:::::S            
 *$::::$              B::::B     B:::::BO:::::O     O:::::ON:::::::::::N   N::::::N  E:::::E             S:::::S            
 *$:::::$$$$$$$$$     B::::BBBBBB:::::B O:::::O     O:::::ON:::::::N::::N  N::::::N  E::::::EEEEEEEEEE    S::::SSSS         
 * $$::::::::::::$$   B:::::::::::::BB  O:::::O     O:::::ON::::::N N::::N N::::::N  E:::::::::::::::E     SS::::::SSSSS    
 *   $$$$$$$$$:::::$  B::::BBBBBB:::::B O:::::O     O:::::ON::::::N  N::::N:::::::N  E:::::::::::::::E       SSS::::::::SS  
 *            $::::$  B::::B     B:::::BO:::::O     O:::::ON::::::N   N:::::::::::N  E::::::EEEEEEEEEE          SSSSSS::::S 
 *            $::::$  B::::B     B:::::BO:::::O     O:::::ON::::::N    N::::::::::N  E:::::E                         S:::::S
 *$$$$$       $::::$  B::::B     B:::::BO::::::O   O::::::ON::::::N     N:::::::::N  E:::::E       EEEEEE            S:::::S
 *$::::$$$$$$$:::::$BB:::::BBBBBB::::::BO:::::::OOO:::::::ON::::::N      N::::::::NEE::::::EEEEEEEE:::::ESSSSSSS     S:::::S
 *$::::::::::::::$$ B:::::::::::::::::B  OO:::::::::::::OO N::::::N       N:::::::NE::::::::::::::::::::ES::::::SSSSSS:::::S
 * $$$$$$:::$$$$$   B::::::::::::::::B     OO:::::::::OO   N::::::N        N::::::NE::::::::::::::::::::ES:::::::::::::::SS 
 *      $:::$       BBBBBBBBBBBBBBBBB        OOOOOOOOO     NNNNNNNN         NNNNNNNEEEEEEEEEEEEEEEEEEEEEE SSSSSSSSSSSSSSS   
 *      $$$$$                                                                                                               
 *            
 *     .-.
 *    (o.o)
 *     |=|
 *    __|__
 *  //.=|=.\\
 * // .=|=. \\
 * \\ .=|=. //
 *  \\(_=_)//
 *   (:| |:)
 *    || ||
 *    () ()
 *    || ||
 *    || ||
 *   ==' '==                                                                                                              
 *                                                                                                                                                                                                                                                 
 * 
 * $BONES is NOT an investment vehicle and holds no economic or monetary value. 
 * The sole purpose of $BONES is to allow functionality within the Spectral Skellies Ecosystem.
 * 
 * Dev: @White_Oak_Kong
 * Contract inspiration from CryptoHoots TWIGS
 */


// File: @openzeppelin/contracts/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



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() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/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



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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: contracts/BONESTestContract1.sol


pragma solidity ^0.8.0;

interface iSkellies {
    function balanceOf(address _user) external view returns(uint256);
    function ownerOf(uint256 _tokenId) external view returns(address);
    function totalSupply() external view returns (uint256);
}

contract BonesOfficial is ERC20("Bones", "BONES"), Ownable {
    struct ContractSettings {
        uint256 baseRate;
        uint256 initIssuance;
        uint256 start;
        uint256 end;
    }

    mapping(address => ContractSettings) public contractSettings;
    mapping(address => bool) public trustedContracts;

    uint256 constant public MAX_BASE_RATE = 10 ether;
    uint256 constant public MAX_INITIAL_ISSUANCE = 70 ether;

    // Prevents new contracts from being added or changes to disbursement if permanently locked
    bool public isLocked = false;
    mapping(bytes32 => uint256) public lastClaim;
    
    event RewardPaid(address indexed user, uint256 reward);

    constructor() {}

    /**
        - needs onlyOwner flag
        - needs to check that the baseRate and initIssuance are not greater than the max settings
        - require that contract isn't locked
     */
    function addContract(address _contractAddress, uint256 _baseRate, uint256 _initIssuance) public onlyOwner {
        require(_baseRate <= MAX_BASE_RATE && _initIssuance <= MAX_INITIAL_ISSUANCE, "baseRate or initIssuance exceeds max value.");
        require(!isLocked, "Cannot add any more contracts.");

        // add to trustedContracts
        trustedContracts[_contractAddress] = true;

        // initialize contractSettings
        contractSettings[_contractAddress] = ContractSettings({ 
            baseRate: _baseRate,
            initIssuance: _initIssuance,
            start: block.timestamp,
            end: type(uint256).max
        });
    }

    /**
        - sets an end date for when rewards officially end
     */
    function setEndDateForContract(address _contractAddress, uint256 _endTime) public onlyOwner {
        require(!isLocked, "Cannot modify end dates after lock");
        require(trustedContracts[_contractAddress], "Not a trusted contract");
        
        contractSettings[_contractAddress].end = _endTime;
    }

    function claimReward(address _contractAddress, uint256 _tokenId) public returns (uint256) {
        require(trustedContracts[_contractAddress], "Not a trusted contract.");
        require(contractSettings[_contractAddress].end > block.timestamp, "Time for claiming on that contract has expired.");
        require(iSkellies(_contractAddress).ownerOf(_tokenId) == msg.sender, "Caller does not own the token being claimed for.");

        // compute Bones to be claimed
        uint256 unclaimedReward = computeUnclaimedReward(_contractAddress, _tokenId);

        // update the lastClaim date for tokenId and contractAddress
        bytes32 lastClaimKey = keccak256(abi.encode(_contractAddress, _tokenId));
        lastClaim[lastClaimKey] = block.timestamp;

        // mint the tokens and distribute to msg.sender
        _mint(msg.sender, unclaimedReward);
        emit RewardPaid(msg.sender, unclaimedReward);

        return unclaimedReward;
    }

    function claimRewards(address _contractAddress, uint256[] calldata _tokenIds) public returns (uint256) {
        require(trustedContracts[_contractAddress], "Not a trusted contract.");
        require(contractSettings[_contractAddress].end > block.timestamp, "Time for claiming has expired");

        uint256 totalUnclaimedRewards = 0;

        for(uint256 i = 0; i < _tokenIds.length; i++) {
            uint256 _tokenId = _tokenIds[i];

            require(iSkellies(_contractAddress).ownerOf(_tokenId) == msg.sender, "Caller does not own the token being claimed for.");

            // compute Bones to be claimed
            uint256 unclaimedReward = computeUnclaimedReward(_contractAddress, _tokenId);
            totalUnclaimedRewards = totalUnclaimedRewards + unclaimedReward;

            // update the lastClaim date for tokenId and contractAddress
            bytes32 lastClaimKey = keccak256(abi.encode(_contractAddress, _tokenId));
            lastClaim[lastClaimKey] = block.timestamp;
        }

        // mint the tokens and distribute to msg.sender
        _mint(msg.sender, totalUnclaimedRewards);
        emit RewardPaid(msg.sender, totalUnclaimedRewards);

        return totalUnclaimedRewards;
    }

    function permanentlyLock() public onlyOwner {
        isLocked = true;
    }

    function getUnclaimedRewardAmount(address _contractAddress, uint256 _tokenId) public view returns (uint256) {
        require(trustedContracts[_contractAddress], "Not a trusted contract");

        uint256 unclaimedReward  = computeUnclaimedReward(_contractAddress, _tokenId);
        return unclaimedReward;
    }

    function getUnclaimedRewardsAmount(address _contractAddress, uint256[] calldata _tokenIds) public view returns (uint256) {
        require(trustedContracts[_contractAddress], "Not a trusted contract");

        uint256 totalUnclaimedRewards = 0;

        for(uint256 i = 0; i < _tokenIds.length; i++) {
            totalUnclaimedRewards += computeUnclaimedReward(_contractAddress, _tokenIds[i]);
        }

        return totalUnclaimedRewards;
    }

    function getTotalUnclaimedRewardsForContract(address _contractAddress) public view returns (uint256) {
        require(trustedContracts[_contractAddress], "Not a trusted contract");

        uint256 totalUnclaimedRewards = 0;
        uint256 totalSupply = iSkellies(_contractAddress).totalSupply();

        for(uint256 i = 0; i < totalSupply; i++) {
            totalUnclaimedRewards += computeUnclaimedReward(_contractAddress, i);
        }

        return totalUnclaimedRewards;
    }

    function getLastClaimedTime(address _contractAddress, uint256 _tokenId) public view returns (uint256) {
        require(trustedContracts[_contractAddress], "Not a trusted contract");

        bytes32 lastClaimKey = keccak256(abi.encode(_contractAddress, _tokenId));

        return lastClaim[lastClaimKey];
    }

    function computeAccumulatedReward(uint256 _lastClaimDate, uint256 _baseRate, uint256 currentTime) internal pure returns (uint256) {
        require(currentTime > _lastClaimDate, "Last claim date must be smaller than block timestamp");

        uint256 secondsElapsed = currentTime - _lastClaimDate;
        uint256 accumulatedReward = secondsElapsed * _baseRate / 1 days;

        return accumulatedReward;
    }
    //checks contract and returns an array containing the tokenids owned by the specified address 
    function TokensOfOwner(address _contractAddress, address address_) public view returns (uint[] memory) {
        require(trustedContracts[_contractAddress], "Not a trusted contract"); 
        uint _balance = iSkellies(_contractAddress).balanceOf(address_); // get balance of address
        uint contractMaxToken = iSkellies(_contractAddress).totalSupply(); //total supply of contract
        uint[] memory _tokens = new uint[](_balance); // initialize array 
        uint _index;
            for (uint id = 1; id <= contractMaxToken; id++) {
                if (address_ == iSkellies(_contractAddress).ownerOf(id)) { _tokens[_index] = id; _index++;}
            }
        return _tokens; 
    }
    

    function computeUnclaimedReward(address _contractAddress, uint256 _tokenId) internal view returns (uint256) {
        require(trustedContracts[_contractAddress], "Not a trusted contract");
        
        // Will revert if tokenId does not exist
        iSkellies(_contractAddress).ownerOf(_tokenId);

        // build the hash for lastClaim based on contractAddress and tokenId
        bytes32 lastClaimKey = keccak256(abi.encode(_contractAddress, _tokenId));
        uint256 lastClaimDate = lastClaim[lastClaimKey];
        uint256 baseRate = contractSettings[_contractAddress].baseRate;

        // if there has been a lastClaim, compute the value since lastClaim
        if (lastClaimDate != uint256(0)) {
            return computeAccumulatedReward(lastClaimDate, baseRate, block.timestamp);
        } 
        else {
            // if there has not been a lastClaim, add the initIssuance + computed value since contract startDate
            uint256 totalReward = computeAccumulatedReward(contractSettings[_contractAddress].start, baseRate, block.timestamp) + contractSettings[_contractAddress].initIssuance;

            return totalReward;
        }
    }
}

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":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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_BASE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_INITIAL_ISSUANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"address","name":"address_","type":"address"}],"name":"TokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_baseRate","type":"uint256"},{"internalType":"uint256","name":"_initIssuance","type":"uint256"}],"name":"addContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractSettings","outputs":[{"internalType":"uint256","name":"baseRate","type":"uint256"},{"internalType":"uint256","name":"initIssuance","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getLastClaimedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"getTotalUnclaimedRewardsForContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getUnclaimedRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getUnclaimedRewardsAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"lastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permanentlyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setEndDateForContract","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":"","type":"address"}],"name":"trustedContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526000600860006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600581526020017f426f6e65730000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f424f4e45530000000000000000000000000000000000000000000000000000008152508160039080519060200190620000b1929190620001c1565b508060049080519060200190620000ca929190620001c1565b505050620000ed620000e1620000f360201b60201c565b620000fb60201b60201c565b620002d6565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf9062000271565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b600060028204905060018216806200028a57607f821691505b60208210811415620002a157620002a0620002a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613af080620002e66000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a082311161010457806395fbf7ea116100a2578063b817cc6011610071578063b817cc60146105be578063dd62ed3e146105ee578063e5919a4f1461061e578063f2fde38b1461064e576101da565b806395fbf7ea1461050d578063a457c2d714610540578063a4e2d63414610570578063a9059cbb1461058e576101da565b80638da5cb5b116100de5780638da5cb5b146104855780638f33221e146104a357806390689c36146104bf57806395d89b41146104ef576101da565b806370a082311461042d578063715018a61461045d5780637bf9601414610467576101da565b806323b872dd1161017c5780633af7c6781161014b5780633af7c678146103a5578063511a9267146103c3578063543e0d16146103cd5780636bac8de2146103fd576101da565b806323b872dd146102f75780632a07e1bb14610327578063313ce567146103575780633950935114610375576101da565b8063174e31c4116101b8578063174e31c41461025d57806318160ddd1461028d578063220eecfb146102ab57806323947093146102c7576101da565b806305231dea146101df57806306fdde031461020f578063095ea7b31461022d575b600080fd5b6101f960048036038101906101f49190612992565b61066a565b6040516102069190613175565b60405180910390f35b61021761097a565b6040516102249190612ef3565b60405180910390f35b610247600480360381019061024291906129f2565b610a0c565b6040516102549190612ed8565b60405180910390f35b610277600480360381019061027291906129f2565b610a2a565b6040516102849190613175565b60405180910390f35b610295610ce8565b6040516102a29190613175565b60405180910390f35b6102c560048036038101906102c091906129f2565b610cf2565b005b6102e160048036038101906102dc91906128ff565b610e95565b6040516102ee9190612eb6565b60405180910390f35b610311600480360381019061030c919061293f565b61119a565b60405161031e9190612ed8565b60405180910390f35b610341600480360381019061033c91906128a5565b611292565b60405161034e9190613175565b60405180910390f35b61035f6113e3565b60405161036c91906131d5565b60405180910390f35b61038f600480360381019061038a91906129f2565b6113ec565b60405161039c9190612ed8565b60405180910390f35b6103ad611498565b6040516103ba9190613175565b60405180910390f35b6103cb6114a5565b005b6103e760048036038101906103e29190612992565b61153e565b6040516103f49190613175565b60405180910390f35b61041760048036038101906104129190612a85565b61162a565b6040516104249190613175565b60405180910390f35b610447600480360381019061044291906128a5565b611642565b6040516104549190613175565b60405180910390f35b61046561168a565b005b61046f611712565b60405161047c9190613175565b60405180910390f35b61048d61171e565b60405161049a9190612e72565b60405180910390f35b6104bd60048036038101906104b89190612a32565b611748565b005b6104d960048036038101906104d491906129f2565b61197c565b6040516104e69190613175565b60405180910390f35b6104f7611a54565b6040516105049190612ef3565b60405180910390f35b610527600480360381019061052291906128a5565b611ae6565b6040516105379493929190613190565b60405180910390f35b61055a600480360381019061055591906129f2565b611b16565b6040516105679190612ed8565b60405180910390f35b610578611c01565b6040516105859190612ed8565b60405180910390f35b6105a860048036038101906105a391906129f2565b611c14565b6040516105b59190612ed8565b60405180910390f35b6105d860048036038101906105d391906129f2565b611c32565b6040516105e59190613175565b60405180910390f35b610608600480360381019061060391906128ff565b611cd8565b6040516106159190613175565b60405180910390f35b610638600480360381019061063391906128a5565b611d5f565b6040516106459190612ed8565b60405180910390f35b610668600480360381019061066391906128a5565b611d7f565b005b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef90613015565b60405180910390fd5b42600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301541161077c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077390613035565b60405180910390fd5b6000805b848490508110156109165760008585838181106107a05761079f6134f4565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016107f99190613175565b60206040518083038186803b15801561081157600080fd5b505afa158015610825573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084991906128d2565b73ffffffffffffffffffffffffffffffffffffffff161461089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089690613055565b60405180910390fd5b60006108ab8883611e77565b905080846108b99190613245565b9350600088836040516020016108d0929190612e8d565b604051602081830303815290604052805190602001209050426009600083815260200190815260200160002081905550505050808061090e9061341e565b915050610780565b5061092133826120e4565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516109679190613175565b60405180910390a2809150509392505050565b606060038054610989906133ec565b80601f01602080910402602001604051908101604052809291908181526020018280546109b5906133ec565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b5050505050905090565b6000610a20610a19612244565b848461224c565b6001905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90613015565b60405180910390fd5b42600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015411610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390612f95565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610b8c9190613175565b60206040518083038186803b158015610ba457600080fd5b505afa158015610bb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdc91906128d2565b73ffffffffffffffffffffffffffffffffffffffff1614610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990613055565b60405180910390fd5b6000610c3e8484611e77565b905060008484604051602001610c55929190612e8d565b604051602081830303815290604052805190602001209050426009600083815260200190815260200160002081905550610c8f33836120e4565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048683604051610cd59190613175565b60405180910390a2819250505092915050565b6000600254905090565b610cfa612244565b73ffffffffffffffffffffffffffffffffffffffff16610d1861171e565b73ffffffffffffffffffffffffffffffffffffffff1614610d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6590612ff5565b60405180910390fd5b600860009054906101000a900460ff1615610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590613095565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e41906130f5565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505050565b6060600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a906130f5565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610f5e9190612e72565b60206040518083038186803b158015610f7657600080fd5b505afa158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae9190612ab2565b905060008473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ff857600080fd5b505afa15801561100c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110309190612ab2565b905060008267ffffffffffffffff81111561104e5761104d613523565b5b60405190808252806020026020018201604052801561107c5781602001602082028036833780820191505090505b509050600080600190505b83811161118c578773ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b81526004016110c79190613175565b60206040518083038186803b1580156110df57600080fd5b505afa1580156110f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111791906128d2565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415611179578083838151811061115e5761115d6134f4565b5b60200260200101818152505081806111759061341e565b9250505b80806111849061341e565b915050611087565b508194505050505092915050565b60006111a7848484612417565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006111f2612244565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126990612fd5565b60405180910390fd5b6112868561127e612244565b85840361224c565b60019150509392505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611320576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611317906130f5565b60405180910390fd5b6000808373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a19190612ab2565b905060005b818110156113d8576113b88582611e77565b836113c39190613245565b925080806113d09061341e565b9150506113a6565b508192505050919050565b60006012905090565b600061148e6113f9612244565b848460016000611407612244565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114899190613245565b61224c565b6001905092915050565b6803cb71f51fc558000081565b6114ad612244565b73ffffffffffffffffffffffffffffffffffffffff166114cb61171e565b73ffffffffffffffffffffffffffffffffffffffff1614611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890612ff5565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906130f5565b60405180910390fd5b6000805b8484905081101561161e576115fe868686848181106115f2576115f16134f4565b5b90506020020135611e77565b826116099190613245565b915080806116169061341e565b9150506115d0565b50809150509392505050565b60096020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611692612244565b73ffffffffffffffffffffffffffffffffffffffff166116b061171e565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90612ff5565b60405180910390fd5b6117106000612698565b565b678ac7230489e8000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611750612244565b73ffffffffffffffffffffffffffffffffffffffff1661176e61171e565b73ffffffffffffffffffffffffffffffffffffffff16146117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb90612ff5565b60405180910390fd5b678ac7230489e8000082111580156117e557506803cb71f51fc55800008111155b611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181b90612fb5565b60405180910390fd5b600860009054906101000a900460ff1615611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90613115565b60405180910390fd5b6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060405180608001604052808381526020018281526020014281526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a01906130f5565b60405180910390fd5b60008383604051602001611a1f929190612e8d565b604051602081830303815290604052805190602001209050600960008281526020019081526020016000205491505092915050565b606060048054611a63906133ec565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8f906133ec565b8015611adc5780601f10611ab157610100808354040283529160200191611adc565b820191906000526020600020905b815481529060010190602001808311611abf57829003601f168201915b5050505050905090565b60066020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b60008060016000611b25612244565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613135565b60405180910390fd5b611bf6611bed612244565b8585840361224c565b600191505092915050565b600860009054906101000a900460ff1681565b6000611c28611c21612244565b8484612417565b6001905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb7906130f5565b60405180910390fd5b6000611ccc8484611e77565b90508091505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b611d87612244565b73ffffffffffffffffffffffffffffffffffffffff16611da561171e565b73ffffffffffffffffffffffffffffffffffffffff1614611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df290612ff5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290612f35565b60405180910390fd5b611e7481612698565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc906130f5565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611f3e9190613175565b60206040518083038186803b158015611f5657600080fd5b505afa158015611f6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8e91906128d2565b5060008383604051602001611fa4929190612e8d565b6040516020818303038152906040528051906020012090506000600960008381526020019081526020016000205490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600082146120385761202e82824261275e565b93505050506120de565b6000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546120ca600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154844261275e565b6120d49190613245565b9050809450505050505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90613155565b60405180910390fd5b612160600083836127dc565b80600260008282546121729190613245565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c79190613245565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161222c9190613175565b60405180910390a3612240600083836127e1565b5050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b3906130b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390612f55565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161240a9190613175565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247e90613075565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90612f15565b60405180910390fd5b6125028383836127dc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f90612f75565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461261b9190613245565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161267f9190613175565b60405180910390a36126928484846127e1565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008382116127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799906130d5565b60405180910390fd5b600084836127b09190613326565b905060006201518085836127c491906132cc565b6127ce919061329b565b905080925050509392505050565b505050565b505050565b6000813590506127f581613a75565b92915050565b60008151905061280a81613a75565b92915050565b60008083601f84011261282657612825613557565b5b8235905067ffffffffffffffff81111561284357612842613552565b5b60208301915083602082028301111561285f5761285e61355c565b5b9250929050565b60008135905061287581613a8c565b92915050565b60008135905061288a81613aa3565b92915050565b60008151905061289f81613aa3565b92915050565b6000602082840312156128bb576128ba613566565b5b60006128c9848285016127e6565b91505092915050565b6000602082840312156128e8576128e7613566565b5b60006128f6848285016127fb565b91505092915050565b6000806040838503121561291657612915613566565b5b6000612924858286016127e6565b9250506020612935858286016127e6565b9150509250929050565b60008060006060848603121561295857612957613566565b5b6000612966868287016127e6565b9350506020612977868287016127e6565b92505060406129888682870161287b565b9150509250925092565b6000806000604084860312156129ab576129aa613566565b5b60006129b9868287016127e6565b935050602084013567ffffffffffffffff8111156129da576129d9613561565b5b6129e686828701612810565b92509250509250925092565b60008060408385031215612a0957612a08613566565b5b6000612a17858286016127e6565b9250506020612a288582860161287b565b9150509250929050565b600080600060608486031215612a4b57612a4a613566565b5b6000612a59868287016127e6565b9350506020612a6a8682870161287b565b9250506040612a7b8682870161287b565b9150509250925092565b600060208284031215612a9b57612a9a613566565b5b6000612aa984828501612866565b91505092915050565b600060208284031215612ac857612ac7613566565b5b6000612ad684828501612890565b91505092915050565b6000612aeb8383612e45565b60208301905092915050565b612b008161335a565b82525050565b6000612b1182613200565b612b1b8185613223565b9350612b26836131f0565b8060005b83811015612b57578151612b3e8882612adf565b9750612b4983613216565b925050600181019050612b2a565b5085935050505092915050565b612b6d8161336c565b82525050565b6000612b7e8261320b565b612b888185613234565b9350612b988185602086016133b9565b612ba18161356b565b840191505092915050565b6000612bb9602383613234565b9150612bc48261357c565b604082019050919050565b6000612bdc602683613234565b9150612be7826135cb565b604082019050919050565b6000612bff602283613234565b9150612c0a8261361a565b604082019050919050565b6000612c22602683613234565b9150612c2d82613669565b604082019050919050565b6000612c45602f83613234565b9150612c50826136b8565b604082019050919050565b6000612c68602b83613234565b9150612c7382613707565b604082019050919050565b6000612c8b602883613234565b9150612c9682613756565b604082019050919050565b6000612cae602083613234565b9150612cb9826137a5565b602082019050919050565b6000612cd1601783613234565b9150612cdc826137ce565b602082019050919050565b6000612cf4601d83613234565b9150612cff826137f7565b602082019050919050565b6000612d17603083613234565b9150612d2282613820565b604082019050919050565b6000612d3a602583613234565b9150612d458261386f565b604082019050919050565b6000612d5d602283613234565b9150612d68826138be565b604082019050919050565b6000612d80602483613234565b9150612d8b8261390d565b604082019050919050565b6000612da3603483613234565b9150612dae8261395c565b604082019050919050565b6000612dc6601683613234565b9150612dd1826139ab565b602082019050919050565b6000612de9601e83613234565b9150612df4826139d4565b602082019050919050565b6000612e0c602583613234565b9150612e17826139fd565b604082019050919050565b6000612e2f601f83613234565b9150612e3a82613a4c565b602082019050919050565b612e4e816133a2565b82525050565b612e5d816133a2565b82525050565b612e6c816133ac565b82525050565b6000602082019050612e876000830184612af7565b92915050565b6000604082019050612ea26000830185612af7565b612eaf6020830184612e54565b9392505050565b60006020820190508181036000830152612ed08184612b06565b905092915050565b6000602082019050612eed6000830184612b64565b92915050565b60006020820190508181036000830152612f0d8184612b73565b905092915050565b60006020820190508181036000830152612f2e81612bac565b9050919050565b60006020820190508181036000830152612f4e81612bcf565b9050919050565b60006020820190508181036000830152612f6e81612bf2565b9050919050565b60006020820190508181036000830152612f8e81612c15565b9050919050565b60006020820190508181036000830152612fae81612c38565b9050919050565b60006020820190508181036000830152612fce81612c5b565b9050919050565b60006020820190508181036000830152612fee81612c7e565b9050919050565b6000602082019050818103600083015261300e81612ca1565b9050919050565b6000602082019050818103600083015261302e81612cc4565b9050919050565b6000602082019050818103600083015261304e81612ce7565b9050919050565b6000602082019050818103600083015261306e81612d0a565b9050919050565b6000602082019050818103600083015261308e81612d2d565b9050919050565b600060208201905081810360008301526130ae81612d50565b9050919050565b600060208201905081810360008301526130ce81612d73565b9050919050565b600060208201905081810360008301526130ee81612d96565b9050919050565b6000602082019050818103600083015261310e81612db9565b9050919050565b6000602082019050818103600083015261312e81612ddc565b9050919050565b6000602082019050818103600083015261314e81612dff565b9050919050565b6000602082019050818103600083015261316e81612e22565b9050919050565b600060208201905061318a6000830184612e54565b92915050565b60006080820190506131a56000830187612e54565b6131b26020830186612e54565b6131bf6040830185612e54565b6131cc6060830184612e54565b95945050505050565b60006020820190506131ea6000830184612e63565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613250826133a2565b915061325b836133a2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132905761328f613467565b5b828201905092915050565b60006132a6826133a2565b91506132b1836133a2565b9250826132c1576132c0613496565b5b828204905092915050565b60006132d7826133a2565b91506132e2836133a2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561331b5761331a613467565b5b828202905092915050565b6000613331826133a2565b915061333c836133a2565b92508282101561334f5761334e613467565b5b828203905092915050565b600061336582613382565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156133d75780820151818401526020810190506133bc565b838111156133e6576000848401525b50505050565b6000600282049050600182168061340457607f821691505b60208210811415613418576134176134c5565b5b50919050565b6000613429826133a2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561345c5761345b613467565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f54696d6520666f7220636c61696d696e67206f6e207468617420636f6e74726160008201527f63742068617320657870697265642e0000000000000000000000000000000000602082015250565b7f6261736552617465206f7220696e697449737375616e6365206578636565647360008201527f206d61782076616c75652e000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f742061207472757374656420636f6e74726163742e000000000000000000600082015250565b7f54696d6520666f7220636c61696d696e67206861732065787069726564000000600082015250565b7f43616c6c657220646f6573206e6f74206f776e2074686520746f6b656e20626560008201527f696e6720636c61696d656420666f722e00000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d6f6469667920656e64206461746573206166746572206c6f60008201527f636b000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4c61737420636c61696d2064617465206d75737420626520736d616c6c65722060008201527f7468616e20626c6f636b2074696d657374616d70000000000000000000000000602082015250565b7f4e6f742061207472757374656420636f6e747261637400000000000000000000600082015250565b7f43616e6e6f742061646420616e79206d6f726520636f6e7472616374732e0000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613a7e8161335a565b8114613a8957600080fd5b50565b613a9581613378565b8114613aa057600080fd5b50565b613aac816133a2565b8114613ab757600080fd5b5056fea264697066735822122085e4774aa370f36e476a8a60f30bacb14ada6fa34b0a6b39fb3134f9778281df64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a082311161010457806395fbf7ea116100a2578063b817cc6011610071578063b817cc60146105be578063dd62ed3e146105ee578063e5919a4f1461061e578063f2fde38b1461064e576101da565b806395fbf7ea1461050d578063a457c2d714610540578063a4e2d63414610570578063a9059cbb1461058e576101da565b80638da5cb5b116100de5780638da5cb5b146104855780638f33221e146104a357806390689c36146104bf57806395d89b41146104ef576101da565b806370a082311461042d578063715018a61461045d5780637bf9601414610467576101da565b806323b872dd1161017c5780633af7c6781161014b5780633af7c678146103a5578063511a9267146103c3578063543e0d16146103cd5780636bac8de2146103fd576101da565b806323b872dd146102f75780632a07e1bb14610327578063313ce567146103575780633950935114610375576101da565b8063174e31c4116101b8578063174e31c41461025d57806318160ddd1461028d578063220eecfb146102ab57806323947093146102c7576101da565b806305231dea146101df57806306fdde031461020f578063095ea7b31461022d575b600080fd5b6101f960048036038101906101f49190612992565b61066a565b6040516102069190613175565b60405180910390f35b61021761097a565b6040516102249190612ef3565b60405180910390f35b610247600480360381019061024291906129f2565b610a0c565b6040516102549190612ed8565b60405180910390f35b610277600480360381019061027291906129f2565b610a2a565b6040516102849190613175565b60405180910390f35b610295610ce8565b6040516102a29190613175565b60405180910390f35b6102c560048036038101906102c091906129f2565b610cf2565b005b6102e160048036038101906102dc91906128ff565b610e95565b6040516102ee9190612eb6565b60405180910390f35b610311600480360381019061030c919061293f565b61119a565b60405161031e9190612ed8565b60405180910390f35b610341600480360381019061033c91906128a5565b611292565b60405161034e9190613175565b60405180910390f35b61035f6113e3565b60405161036c91906131d5565b60405180910390f35b61038f600480360381019061038a91906129f2565b6113ec565b60405161039c9190612ed8565b60405180910390f35b6103ad611498565b6040516103ba9190613175565b60405180910390f35b6103cb6114a5565b005b6103e760048036038101906103e29190612992565b61153e565b6040516103f49190613175565b60405180910390f35b61041760048036038101906104129190612a85565b61162a565b6040516104249190613175565b60405180910390f35b610447600480360381019061044291906128a5565b611642565b6040516104549190613175565b60405180910390f35b61046561168a565b005b61046f611712565b60405161047c9190613175565b60405180910390f35b61048d61171e565b60405161049a9190612e72565b60405180910390f35b6104bd60048036038101906104b89190612a32565b611748565b005b6104d960048036038101906104d491906129f2565b61197c565b6040516104e69190613175565b60405180910390f35b6104f7611a54565b6040516105049190612ef3565b60405180910390f35b610527600480360381019061052291906128a5565b611ae6565b6040516105379493929190613190565b60405180910390f35b61055a600480360381019061055591906129f2565b611b16565b6040516105679190612ed8565b60405180910390f35b610578611c01565b6040516105859190612ed8565b60405180910390f35b6105a860048036038101906105a391906129f2565b611c14565b6040516105b59190612ed8565b60405180910390f35b6105d860048036038101906105d391906129f2565b611c32565b6040516105e59190613175565b60405180910390f35b610608600480360381019061060391906128ff565b611cd8565b6040516106159190613175565b60405180910390f35b610638600480360381019061063391906128a5565b611d5f565b6040516106459190612ed8565b60405180910390f35b610668600480360381019061066391906128a5565b611d7f565b005b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef90613015565b60405180910390fd5b42600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301541161077c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077390613035565b60405180910390fd5b6000805b848490508110156109165760008585838181106107a05761079f6134f4565b5b9050602002013590503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016107f99190613175565b60206040518083038186803b15801561081157600080fd5b505afa158015610825573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084991906128d2565b73ffffffffffffffffffffffffffffffffffffffff161461089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089690613055565b60405180910390fd5b60006108ab8883611e77565b905080846108b99190613245565b9350600088836040516020016108d0929190612e8d565b604051602081830303815290604052805190602001209050426009600083815260200190815260200160002081905550505050808061090e9061341e565b915050610780565b5061092133826120e4565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516109679190613175565b60405180910390a2809150509392505050565b606060038054610989906133ec565b80601f01602080910402602001604051908101604052809291908181526020018280546109b5906133ec565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b5050505050905090565b6000610a20610a19612244565b848461224c565b6001905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90613015565b60405180910390fd5b42600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015411610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390612f95565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610b8c9190613175565b60206040518083038186803b158015610ba457600080fd5b505afa158015610bb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdc91906128d2565b73ffffffffffffffffffffffffffffffffffffffff1614610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990613055565b60405180910390fd5b6000610c3e8484611e77565b905060008484604051602001610c55929190612e8d565b604051602081830303815290604052805190602001209050426009600083815260200190815260200160002081905550610c8f33836120e4565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048683604051610cd59190613175565b60405180910390a2819250505092915050565b6000600254905090565b610cfa612244565b73ffffffffffffffffffffffffffffffffffffffff16610d1861171e565b73ffffffffffffffffffffffffffffffffffffffff1614610d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6590612ff5565b60405180910390fd5b600860009054906101000a900460ff1615610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590613095565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e41906130f5565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505050565b6060600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a906130f5565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610f5e9190612e72565b60206040518083038186803b158015610f7657600080fd5b505afa158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae9190612ab2565b905060008473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ff857600080fd5b505afa15801561100c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110309190612ab2565b905060008267ffffffffffffffff81111561104e5761104d613523565b5b60405190808252806020026020018201604052801561107c5781602001602082028036833780820191505090505b509050600080600190505b83811161118c578773ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b81526004016110c79190613175565b60206040518083038186803b1580156110df57600080fd5b505afa1580156110f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111791906128d2565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415611179578083838151811061115e5761115d6134f4565b5b60200260200101818152505081806111759061341e565b9250505b80806111849061341e565b915050611087565b508194505050505092915050565b60006111a7848484612417565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006111f2612244565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126990612fd5565b60405180910390fd5b6112868561127e612244565b85840361224c565b60019150509392505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611320576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611317906130f5565b60405180910390fd5b6000808373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a19190612ab2565b905060005b818110156113d8576113b88582611e77565b836113c39190613245565b925080806113d09061341e565b9150506113a6565b508192505050919050565b60006012905090565b600061148e6113f9612244565b848460016000611407612244565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114899190613245565b61224c565b6001905092915050565b6803cb71f51fc558000081565b6114ad612244565b73ffffffffffffffffffffffffffffffffffffffff166114cb61171e565b73ffffffffffffffffffffffffffffffffffffffff1614611521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151890612ff5565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906130f5565b60405180910390fd5b6000805b8484905081101561161e576115fe868686848181106115f2576115f16134f4565b5b90506020020135611e77565b826116099190613245565b915080806116169061341e565b9150506115d0565b50809150509392505050565b60096020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611692612244565b73ffffffffffffffffffffffffffffffffffffffff166116b061171e565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90612ff5565b60405180910390fd5b6117106000612698565b565b678ac7230489e8000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611750612244565b73ffffffffffffffffffffffffffffffffffffffff1661176e61171e565b73ffffffffffffffffffffffffffffffffffffffff16146117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb90612ff5565b60405180910390fd5b678ac7230489e8000082111580156117e557506803cb71f51fc55800008111155b611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181b90612fb5565b60405180910390fd5b600860009054906101000a900460ff1615611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90613115565b60405180910390fd5b6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060405180608001604052808381526020018281526020014281526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a01906130f5565b60405180910390fd5b60008383604051602001611a1f929190612e8d565b604051602081830303815290604052805190602001209050600960008281526020019081526020016000205491505092915050565b606060048054611a63906133ec565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8f906133ec565b8015611adc5780601f10611ab157610100808354040283529160200191611adc565b820191906000526020600020905b815481529060010190602001808311611abf57829003601f168201915b5050505050905090565b60066020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b60008060016000611b25612244565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613135565b60405180910390fd5b611bf6611bed612244565b8585840361224c565b600191505092915050565b600860009054906101000a900460ff1681565b6000611c28611c21612244565b8484612417565b6001905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb7906130f5565b60405180910390fd5b6000611ccc8484611e77565b90508091505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b611d87612244565b73ffffffffffffffffffffffffffffffffffffffff16611da561171e565b73ffffffffffffffffffffffffffffffffffffffff1614611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df290612ff5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290612f35565b60405180910390fd5b611e7481612698565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc906130f5565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611f3e9190613175565b60206040518083038186803b158015611f5657600080fd5b505afa158015611f6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8e91906128d2565b5060008383604051602001611fa4929190612e8d565b6040516020818303038152906040528051906020012090506000600960008381526020019081526020016000205490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600082146120385761202e82824261275e565b93505050506120de565b6000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546120ca600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154844261275e565b6120d49190613245565b9050809450505050505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90613155565b60405180910390fd5b612160600083836127dc565b80600260008282546121729190613245565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c79190613245565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161222c9190613175565b60405180910390a3612240600083836127e1565b5050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b3906130b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390612f55565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161240a9190613175565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247e90613075565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90612f15565b60405180910390fd5b6125028383836127dc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f90612f75565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461261b9190613245565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161267f9190613175565b60405180910390a36126928484846127e1565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008382116127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799906130d5565b60405180910390fd5b600084836127b09190613326565b905060006201518085836127c491906132cc565b6127ce919061329b565b905080925050509392505050565b505050565b505050565b6000813590506127f581613a75565b92915050565b60008151905061280a81613a75565b92915050565b60008083601f84011261282657612825613557565b5b8235905067ffffffffffffffff81111561284357612842613552565b5b60208301915083602082028301111561285f5761285e61355c565b5b9250929050565b60008135905061287581613a8c565b92915050565b60008135905061288a81613aa3565b92915050565b60008151905061289f81613aa3565b92915050565b6000602082840312156128bb576128ba613566565b5b60006128c9848285016127e6565b91505092915050565b6000602082840312156128e8576128e7613566565b5b60006128f6848285016127fb565b91505092915050565b6000806040838503121561291657612915613566565b5b6000612924858286016127e6565b9250506020612935858286016127e6565b9150509250929050565b60008060006060848603121561295857612957613566565b5b6000612966868287016127e6565b9350506020612977868287016127e6565b92505060406129888682870161287b565b9150509250925092565b6000806000604084860312156129ab576129aa613566565b5b60006129b9868287016127e6565b935050602084013567ffffffffffffffff8111156129da576129d9613561565b5b6129e686828701612810565b92509250509250925092565b60008060408385031215612a0957612a08613566565b5b6000612a17858286016127e6565b9250506020612a288582860161287b565b9150509250929050565b600080600060608486031215612a4b57612a4a613566565b5b6000612a59868287016127e6565b9350506020612a6a8682870161287b565b9250506040612a7b8682870161287b565b9150509250925092565b600060208284031215612a9b57612a9a613566565b5b6000612aa984828501612866565b91505092915050565b600060208284031215612ac857612ac7613566565b5b6000612ad684828501612890565b91505092915050565b6000612aeb8383612e45565b60208301905092915050565b612b008161335a565b82525050565b6000612b1182613200565b612b1b8185613223565b9350612b26836131f0565b8060005b83811015612b57578151612b3e8882612adf565b9750612b4983613216565b925050600181019050612b2a565b5085935050505092915050565b612b6d8161336c565b82525050565b6000612b7e8261320b565b612b888185613234565b9350612b988185602086016133b9565b612ba18161356b565b840191505092915050565b6000612bb9602383613234565b9150612bc48261357c565b604082019050919050565b6000612bdc602683613234565b9150612be7826135cb565b604082019050919050565b6000612bff602283613234565b9150612c0a8261361a565b604082019050919050565b6000612c22602683613234565b9150612c2d82613669565b604082019050919050565b6000612c45602f83613234565b9150612c50826136b8565b604082019050919050565b6000612c68602b83613234565b9150612c7382613707565b604082019050919050565b6000612c8b602883613234565b9150612c9682613756565b604082019050919050565b6000612cae602083613234565b9150612cb9826137a5565b602082019050919050565b6000612cd1601783613234565b9150612cdc826137ce565b602082019050919050565b6000612cf4601d83613234565b9150612cff826137f7565b602082019050919050565b6000612d17603083613234565b9150612d2282613820565b604082019050919050565b6000612d3a602583613234565b9150612d458261386f565b604082019050919050565b6000612d5d602283613234565b9150612d68826138be565b604082019050919050565b6000612d80602483613234565b9150612d8b8261390d565b604082019050919050565b6000612da3603483613234565b9150612dae8261395c565b604082019050919050565b6000612dc6601683613234565b9150612dd1826139ab565b602082019050919050565b6000612de9601e83613234565b9150612df4826139d4565b602082019050919050565b6000612e0c602583613234565b9150612e17826139fd565b604082019050919050565b6000612e2f601f83613234565b9150612e3a82613a4c565b602082019050919050565b612e4e816133a2565b82525050565b612e5d816133a2565b82525050565b612e6c816133ac565b82525050565b6000602082019050612e876000830184612af7565b92915050565b6000604082019050612ea26000830185612af7565b612eaf6020830184612e54565b9392505050565b60006020820190508181036000830152612ed08184612b06565b905092915050565b6000602082019050612eed6000830184612b64565b92915050565b60006020820190508181036000830152612f0d8184612b73565b905092915050565b60006020820190508181036000830152612f2e81612bac565b9050919050565b60006020820190508181036000830152612f4e81612bcf565b9050919050565b60006020820190508181036000830152612f6e81612bf2565b9050919050565b60006020820190508181036000830152612f8e81612c15565b9050919050565b60006020820190508181036000830152612fae81612c38565b9050919050565b60006020820190508181036000830152612fce81612c5b565b9050919050565b60006020820190508181036000830152612fee81612c7e565b9050919050565b6000602082019050818103600083015261300e81612ca1565b9050919050565b6000602082019050818103600083015261302e81612cc4565b9050919050565b6000602082019050818103600083015261304e81612ce7565b9050919050565b6000602082019050818103600083015261306e81612d0a565b9050919050565b6000602082019050818103600083015261308e81612d2d565b9050919050565b600060208201905081810360008301526130ae81612d50565b9050919050565b600060208201905081810360008301526130ce81612d73565b9050919050565b600060208201905081810360008301526130ee81612d96565b9050919050565b6000602082019050818103600083015261310e81612db9565b9050919050565b6000602082019050818103600083015261312e81612ddc565b9050919050565b6000602082019050818103600083015261314e81612dff565b9050919050565b6000602082019050818103600083015261316e81612e22565b9050919050565b600060208201905061318a6000830184612e54565b92915050565b60006080820190506131a56000830187612e54565b6131b26020830186612e54565b6131bf6040830185612e54565b6131cc6060830184612e54565b95945050505050565b60006020820190506131ea6000830184612e63565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613250826133a2565b915061325b836133a2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132905761328f613467565b5b828201905092915050565b60006132a6826133a2565b91506132b1836133a2565b9250826132c1576132c0613496565b5b828204905092915050565b60006132d7826133a2565b91506132e2836133a2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561331b5761331a613467565b5b828202905092915050565b6000613331826133a2565b915061333c836133a2565b92508282101561334f5761334e613467565b5b828203905092915050565b600061336582613382565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156133d75780820151818401526020810190506133bc565b838111156133e6576000848401525b50505050565b6000600282049050600182168061340457607f821691505b60208210811415613418576134176134c5565b5b50919050565b6000613429826133a2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561345c5761345b613467565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f54696d6520666f7220636c61696d696e67206f6e207468617420636f6e74726160008201527f63742068617320657870697265642e0000000000000000000000000000000000602082015250565b7f6261736552617465206f7220696e697449737375616e6365206578636565647360008201527f206d61782076616c75652e000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f742061207472757374656420636f6e74726163742e000000000000000000600082015250565b7f54696d6520666f7220636c61696d696e67206861732065787069726564000000600082015250565b7f43616c6c657220646f6573206e6f74206f776e2074686520746f6b656e20626560008201527f696e6720636c61696d656420666f722e00000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d6f6469667920656e64206461746573206166746572206c6f60008201527f636b000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4c61737420636c61696d2064617465206d75737420626520736d616c6c65722060008201527f7468616e20626c6f636b2074696d657374616d70000000000000000000000000602082015250565b7f4e6f742061207472757374656420636f6e747261637400000000000000000000600082015250565b7f43616e6e6f742061646420616e79206d6f726520636f6e7472616374732e0000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613a7e8161335a565b8114613a8957600080fd5b50565b613a9581613378565b8114613aa057600080fd5b50565b613aac816133a2565b8114613ab757600080fd5b5056fea264697066735822122085e4774aa370f36e476a8a60f30bacb14ada6fa34b0a6b39fb3134f9778281df64736f6c63430008070033

Deployed Bytecode Sourcemap

22219:8381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25200:1246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11952:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14119:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24225:967;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13072:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23900:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28692:706;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14770:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27335:498;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12914:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15671:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22608:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26454:78;;;:::i;:::-;;26867:460;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22804:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13243:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5756:94;;;:::i;:::-;;22553:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5105:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23143:671;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27841:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12171:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22429:60;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;16389:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22769:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13583:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26540:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13821:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22496:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6005:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25200:1246;25294:7;25322:16;:34;25339:16;25322:34;;;;;;;;;;;;;;;;;;;;;;;;;25314:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;25444:15;25403:16;:34;25420:16;25403:34;;;;;;;;;;;;;;;:38;;;:56;25395:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;25506:29;25556:9;25552:675;25575:9;;:16;;25571:1;:20;25552:675;;;25613:16;25632:9;;25642:1;25632:12;;;;;;;:::i;:::-;;;;;;;;25613:31;;25718:10;25669:59;;25679:16;25669:35;;;25705:8;25669:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;25661:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;25842:23;25868:50;25891:16;25909:8;25868:22;:50::i;:::-;25842:76;;25981:15;25957:21;:39;;;;:::i;:::-;25933:63;;26087:20;26131:16;26149:8;26120:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26110:49;;;;;;26087:72;;26200:15;26174:9;:23;26184:12;26174:23;;;;;;;;;;;:41;;;;25598:629;;;25593:3;;;;;:::i;:::-;;;;25552:675;;;;26296:40;26302:10;26314:21;26296:5;:40::i;:::-;26363:10;26352:45;;;26375:21;26352:45;;;;;;:::i;:::-;;;;;;;;26417:21;26410:28;;;25200:1246;;;;;:::o;11952:100::-;12006:13;12039:5;12032:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11952:100;:::o;14119:169::-;14202:4;14219:39;14228:12;:10;:12::i;:::-;14242:7;14251:6;14219:8;:39::i;:::-;14276:4;14269:11;;14119:169;;;;:::o;24225:967::-;24306:7;24334:16;:34;24351:16;24334:34;;;;;;;;;;;;;;;;;;;;;;;;;24326:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;24456:15;24415:16;:34;24432:16;24415:34;;;;;;;;;;;;;;;:38;;;:56;24407:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;24591:10;24542:59;;24552:16;24542:35;;;24578:8;24542:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;24534:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;24707:23;24733:50;24756:16;24774:8;24733:22;:50::i;:::-;24707:76;;24866:20;24910:16;24928:8;24899:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24889:49;;;;;;24866:72;;24975:15;24949:9;:23;24959:12;24949:23;;;;;;;;;;;:41;;;;25060:34;25066:10;25078:15;25060:5;:34::i;:::-;25121:10;25110:39;;;25133:15;25110:39;;;;;;:::i;:::-;;;;;;;;25169:15;25162:22;;;;24225:967;;;;:::o;13072:108::-;13133:7;13160:12;;13153:19;;13072:108;:::o;23900:317::-;5336:12;:10;:12::i;:::-;5325:23;;:7;:5;:7::i;:::-;:23;;;5317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24012:8:::1;;;;;;;;;;;24011:9;24003:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;24078:16;:34;24095:16;24078:34;;;;;;;;;;;;;;;;;;;;;;;;;24070:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;24201:8;24160:16;:34;24177:16;24160:34;;;;;;;;;;;;;;;:38;;:49;;;;23900:317:::0;;:::o;28692:706::-;28780:13;28814:16;:34;28831:16;28814:34;;;;;;;;;;;;;;;;;;;;;;;;;28806:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28887:13;28913:16;28903:37;;;28941:8;28903:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28887:63;;28987:21;29021:16;29011:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28987:65;;29090:21;29125:8;29114:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29090:44;;29166:11;29197:7;29207:1;29197:11;;29192:173;29216:16;29210:2;:22;29192:173;;29285:16;29275:35;;;29311:2;29275:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29263:51;;:8;:51;;;29259:91;;;29336:2;29318:7;29326:6;29318:15;;;;;;;;:::i;:::-;;;;;;;:20;;;;;29340:8;;;;;:::i;:::-;;;;29259:91;29234:4;;;;;:::i;:::-;;;;29192:173;;;;29382:7;29375:14;;;;;;28692:706;;;;:::o;14770:492::-;14910:4;14927:36;14937:6;14945:9;14956:6;14927:9;:36::i;:::-;14976:24;15003:11;:19;15015:6;15003:19;;;;;;;;;;;;;;;:33;15023:12;:10;:12::i;:::-;15003:33;;;;;;;;;;;;;;;;14976:60;;15075:6;15055:16;:26;;15047:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;15162:57;15171:6;15179:12;:10;:12::i;:::-;15212:6;15193:16;:25;15162:8;:57::i;:::-;15250:4;15243:11;;;14770:492;;;;;:::o;27335:498::-;27427:7;27455:16;:34;27472:16;27455:34;;;;;;;;;;;;;;;;;;;;;;;;;27447:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;27529:29;27573:19;27605:16;27595:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27573:63;;27653:9;27649:136;27672:11;27668:1;:15;27649:136;;;27730:43;27753:16;27771:1;27730:22;:43::i;:::-;27705:68;;;;;:::i;:::-;;;27685:3;;;;;:::i;:::-;;;;27649:136;;;;27804:21;27797:28;;;;27335:498;;;:::o;12914:93::-;12972:5;12997:2;12990:9;;12914:93;:::o;15671:215::-;15759:4;15776:80;15785:12;:10;:12::i;:::-;15799:7;15845:10;15808:11;:25;15820:12;:10;:12::i;:::-;15808:25;;;;;;;;;;;;;;;:34;15834:7;15808:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;15776:8;:80::i;:::-;15874:4;15867:11;;15671:215;;;;:::o;22608:55::-;22655:8;22608:55;:::o;26454:78::-;5336:12;:10;:12::i;:::-;5325:23;;:7;:5;:7::i;:::-;:23;;;5317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26520:4:::1;26509:8;;:15;;;;;;;;;;;;;;;;;;26454:78::o:0;26867:460::-;26979:7;27007:16;:34;27024:16;27007:34;;;;;;;;;;;;;;;;;;;;;;;;;26999:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;27081:29;27131:9;27127:152;27150:9;;:16;;27146:1;:20;27127:152;;;27213:54;27236:16;27254:9;;27264:1;27254:12;;;;;;;:::i;:::-;;;;;;;;27213:22;:54::i;:::-;27188:79;;;;;:::i;:::-;;;27168:3;;;;;:::i;:::-;;;;27127:152;;;;27298:21;27291:28;;;26867:460;;;;;:::o;22804:44::-;;;;;;;;;;;;;;;;;:::o;13243:127::-;13317:7;13344:9;:18;13354:7;13344:18;;;;;;;;;;;;;;;;13337:25;;13243:127;;;:::o;5756:94::-;5336:12;:10;:12::i;:::-;5325:23;;:7;:5;:7::i;:::-;:23;;;5317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5821:21:::1;5839:1;5821:9;:21::i;:::-;5756:94::o:0;22553:48::-;22593:8;22553:48;:::o;5105:87::-;5151:7;5178:6;;;;;;;;;;;5171:13;;5105:87;:::o;23143:671::-;5336:12;:10;:12::i;:::-;5325:23;;:7;:5;:7::i;:::-;:23;;;5317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22593:8:::1;23268:9;:26;;:67;;;;;22655:8;23298:13;:37;;23268:67;23260:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;23403:8;;;;;;;;;;;23402:9;23394:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;23532:4;23495:16;:34;23512:16;23495:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;23626:180;;;;;;;;23669:9;23626:180;;;;23707:13;23626:180;;;;23742:15;23626:180;;;;23777:17;23626:180;;::::0;23589:16:::1;:34;23606:16;23589:34;;;;;;;;;;;;;;;:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23143:671:::0;;;:::o;27841:318::-;27934:7;27962:16;:34;27979:16;27962:34;;;;;;;;;;;;;;;;;;;;;;;;;27954:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28036:20;28080:16;28098:8;28069:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28059:49;;;;;;28036:72;;28128:9;:23;28138:12;28128:23;;;;;;;;;;;;28121:30;;;27841:318;;;;:::o;12171:104::-;12227:13;12260:7;12253:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12171:104;:::o;22429:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16389:413::-;16482:4;16499:24;16526:11;:25;16538:12;:10;:12::i;:::-;16526:25;;;;;;;;;;;;;;;:34;16552:7;16526:34;;;;;;;;;;;;;;;;16499:61;;16599:15;16579:16;:35;;16571:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;16692:67;16701:12;:10;:12::i;:::-;16715:7;16743:15;16724:16;:34;16692:8;:67::i;:::-;16790:4;16783:11;;;16389:413;;;;:::o;22769:28::-;;;;;;;;;;;;;:::o;13583:175::-;13669:4;13686:42;13696:12;:10;:12::i;:::-;13710:9;13721:6;13686:9;:42::i;:::-;13746:4;13739:11;;13583:175;;;;:::o;26540:319::-;26639:7;26667:16;:34;26684:16;26667:34;;;;;;;;;;;;;;;;;;;;;;;;;26659:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;26741:23;26768:50;26791:16;26809:8;26768:22;:50::i;:::-;26741:77;;26836:15;26829:22;;;26540:319;;;;:::o;13821:151::-;13910:7;13937:11;:18;13949:5;13937:18;;;;;;;;;;;;;;;:27;13956:7;13937:27;;;;;;;;;;;;;;;;13930:34;;13821:151;;;;:::o;22496:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;6005:192::-;5336:12;:10;:12::i;:::-;5325:23;;:7;:5;:7::i;:::-;:23;;;5317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6114:1:::1;6094:22;;:8;:22;;;;6086:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6170:19;6180:8;6170:9;:19::i;:::-;6005:192:::0;:::o;29412:1185::-;29511:7;29539:16;:34;29556:16;29539:34;;;;;;;;;;;;;;;;;;;;;;;;;29531:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29681:16;29671:35;;;29707:8;29671:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29807:20;29851:16;29869:8;29840:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29830:49;;;;;;29807:72;;29890:21;29914:9;:23;29924:12;29914:23;;;;;;;;;;;;29890:47;;29948:16;29967;:34;29984:16;29967:34;;;;;;;;;;;;;;;:43;;;29948:62;;30129:1;30104:13;:27;30100:490;;30155:66;30180:13;30195:8;30205:15;30155:24;:66::i;:::-;30148:73;;;;;;;30100:490;30378:19;30496:16;:34;30513:16;30496:34;;;;;;;;;;;;;;;:47;;;30400:93;30425:16;:34;30442:16;30425:34;;;;;;;;;;;;;;;:40;;;30467:8;30477:15;30400:24;:93::i;:::-;:143;;;;:::i;:::-;30378:165;;30567:11;30560:18;;;;;;29412:1185;;;;;:::o;18312:399::-;18415:1;18396:21;;:7;:21;;;;18388:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;18466:49;18495:1;18499:7;18508:6;18466:20;:49::i;:::-;18544:6;18528:12;;:22;;;;;;;:::i;:::-;;;;;;;;18583:6;18561:9;:18;18571:7;18561:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;18626:7;18605:37;;18622:1;18605:37;;;18635:6;18605:37;;;;;;:::i;:::-;;;;;;;;18655:48;18683:1;18687:7;18696:6;18655:19;:48::i;:::-;18312:399;;:::o;3893:98::-;3946:7;3973:10;3966:17;;3893:98;:::o;20073:380::-;20226:1;20209:19;;:5;:19;;;;20201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20307:1;20288:21;;:7;:21;;;;20280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20391:6;20361:11;:18;20373:5;20361:18;;;;;;;;;;;;;;;:27;20380:7;20361:27;;;;;;;;;;;;;;;:36;;;;20429:7;20413:32;;20422:5;20413:32;;;20438:6;20413:32;;;;;;:::i;:::-;;;;;;;;20073:380;;;:::o;17292:733::-;17450:1;17432:20;;:6;:20;;;;17424:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;17534:1;17513:23;;:9;:23;;;;17505:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;17589:47;17610:6;17618:9;17629:6;17589:20;:47::i;:::-;17649:21;17673:9;:17;17683:6;17673:17;;;;;;;;;;;;;;;;17649:41;;17726:6;17709:13;:23;;17701:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;17847:6;17831:13;:22;17811:9;:17;17821:6;17811:17;;;;;;;;;;;;;;;:42;;;;17899:6;17875:9;:20;17885:9;17875:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;17940:9;17923:35;;17932:6;17923:35;;;17951:6;17923:35;;;;;;:::i;:::-;;;;;;;;17971:46;17991:6;17999:9;18010:6;17971:19;:46::i;:::-;17413:612;17292:733;;;:::o;6205:173::-;6261:16;6280:6;;;;;;;;;;;6261:25;;6306:8;6297:6;;:17;;;;;;;;;;;;;;;;;;6361:8;6330:40;;6351:8;6330:40;;;;;;;;;;;;6250:128;6205:173;:::o;28167:419::-;28288:7;28330:14;28316:11;:28;28308:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;28414:22;28453:14;28439:11;:28;;;;:::i;:::-;28414:53;;28478:25;28535:6;28523:9;28506:14;:26;;;;:::i;:::-;:35;;;;:::i;:::-;28478:63;;28561:17;28554:24;;;;28167:419;;;;;:::o;21053:125::-;;;;:::o;21782:124::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;318:568::-;391:8;401:6;451:3;444:4;436:6;432:17;428:27;418:122;;459:79;;:::i;:::-;418:122;572:6;559:20;549:30;;602:18;594:6;591:30;588:117;;;624:79;;:::i;:::-;588:117;738:4;730:6;726:17;714:29;;792:3;784:4;776:6;772:17;762:8;758:32;755:41;752:128;;;799:79;;:::i;:::-;752:128;318:568;;;;;:::o;892:139::-;938:5;976:6;963:20;954:29;;992:33;1019:5;992:33;:::i;:::-;892:139;;;;:::o;1037:::-;1083:5;1121:6;1108:20;1099:29;;1137:33;1164:5;1137:33;:::i;:::-;1037:139;;;;:::o;1182:143::-;1239:5;1270:6;1264:13;1255:22;;1286:33;1313:5;1286:33;:::i;:::-;1182:143;;;;:::o;1331:329::-;1390:6;1439:2;1427:9;1418:7;1414:23;1410:32;1407:119;;;1445:79;;:::i;:::-;1407:119;1565:1;1590:53;1635:7;1626:6;1615:9;1611:22;1590:53;:::i;:::-;1580:63;;1536:117;1331:329;;;;:::o;1666:351::-;1736:6;1785:2;1773:9;1764:7;1760:23;1756:32;1753:119;;;1791:79;;:::i;:::-;1753:119;1911:1;1936:64;1992:7;1983:6;1972:9;1968:22;1936:64;:::i;:::-;1926:74;;1882:128;1666:351;;;;:::o;2023:474::-;2091:6;2099;2148:2;2136:9;2127:7;2123:23;2119:32;2116:119;;;2154:79;;:::i;:::-;2116:119;2274:1;2299:53;2344:7;2335:6;2324:9;2320:22;2299:53;:::i;:::-;2289:63;;2245:117;2401:2;2427:53;2472:7;2463:6;2452:9;2448:22;2427:53;:::i;:::-;2417:63;;2372:118;2023:474;;;;;:::o;2503:619::-;2580:6;2588;2596;2645:2;2633:9;2624:7;2620:23;2616:32;2613:119;;;2651:79;;:::i;:::-;2613:119;2771:1;2796:53;2841:7;2832:6;2821:9;2817:22;2796:53;:::i;:::-;2786:63;;2742:117;2898:2;2924:53;2969:7;2960:6;2949:9;2945:22;2924:53;:::i;:::-;2914:63;;2869:118;3026:2;3052:53;3097:7;3088:6;3077:9;3073:22;3052:53;:::i;:::-;3042:63;;2997:118;2503:619;;;;;:::o;3128:704::-;3223:6;3231;3239;3288:2;3276:9;3267:7;3263:23;3259:32;3256:119;;;3294:79;;:::i;:::-;3256:119;3414:1;3439:53;3484:7;3475:6;3464:9;3460:22;3439:53;:::i;:::-;3429:63;;3385:117;3569:2;3558:9;3554:18;3541:32;3600:18;3592:6;3589:30;3586:117;;;3622:79;;:::i;:::-;3586:117;3735:80;3807:7;3798:6;3787:9;3783:22;3735:80;:::i;:::-;3717:98;;;;3512:313;3128:704;;;;;:::o;3838:474::-;3906:6;3914;3963:2;3951:9;3942:7;3938:23;3934:32;3931:119;;;3969:79;;:::i;:::-;3931:119;4089:1;4114:53;4159:7;4150:6;4139:9;4135:22;4114:53;:::i;:::-;4104:63;;4060:117;4216:2;4242:53;4287:7;4278:6;4267:9;4263:22;4242:53;:::i;:::-;4232:63;;4187:118;3838:474;;;;;:::o;4318:619::-;4395:6;4403;4411;4460:2;4448:9;4439:7;4435:23;4431:32;4428:119;;;4466:79;;:::i;:::-;4428:119;4586:1;4611:53;4656:7;4647:6;4636:9;4632:22;4611:53;:::i;:::-;4601:63;;4557:117;4713:2;4739:53;4784:7;4775:6;4764:9;4760:22;4739:53;:::i;:::-;4729:63;;4684:118;4841:2;4867:53;4912:7;4903:6;4892:9;4888:22;4867:53;:::i;:::-;4857:63;;4812:118;4318:619;;;;;:::o;4943:329::-;5002:6;5051:2;5039:9;5030:7;5026:23;5022:32;5019:119;;;5057:79;;:::i;:::-;5019:119;5177:1;5202:53;5247:7;5238:6;5227:9;5223:22;5202:53;:::i;:::-;5192:63;;5148:117;4943:329;;;;:::o;5278:351::-;5348:6;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:64;5604:7;5595:6;5584:9;5580:22;5548:64;:::i;:::-;5538:74;;5494:128;5278:351;;;;:::o;5635:179::-;5704:10;5725:46;5767:3;5759:6;5725:46;:::i;:::-;5803:4;5798:3;5794:14;5780:28;;5635:179;;;;:::o;5820:118::-;5907:24;5925:5;5907:24;:::i;:::-;5902:3;5895:37;5820:118;;:::o;5974:732::-;6093:3;6122:54;6170:5;6122:54;:::i;:::-;6192:86;6271:6;6266:3;6192:86;:::i;:::-;6185:93;;6302:56;6352:5;6302:56;:::i;:::-;6381:7;6412:1;6397:284;6422:6;6419:1;6416:13;6397:284;;;6498:6;6492:13;6525:63;6584:3;6569:13;6525:63;:::i;:::-;6518:70;;6611:60;6664:6;6611:60;:::i;:::-;6601:70;;6457:224;6444:1;6441;6437:9;6432:14;;6397:284;;;6401:14;6697:3;6690:10;;6098:608;;;5974:732;;;;:::o;6712:109::-;6793:21;6808:5;6793:21;:::i;:::-;6788:3;6781:34;6712:109;;:::o;6827:364::-;6915:3;6943:39;6976:5;6943:39;:::i;:::-;6998:71;7062:6;7057:3;6998:71;:::i;:::-;6991:78;;7078:52;7123:6;7118:3;7111:4;7104:5;7100:16;7078:52;:::i;:::-;7155:29;7177:6;7155:29;:::i;:::-;7150:3;7146:39;7139:46;;6919:272;6827:364;;;;:::o;7197:366::-;7339:3;7360:67;7424:2;7419:3;7360:67;:::i;:::-;7353:74;;7436:93;7525:3;7436:93;:::i;:::-;7554:2;7549:3;7545:12;7538:19;;7197:366;;;:::o;7569:::-;7711:3;7732:67;7796:2;7791:3;7732:67;:::i;:::-;7725:74;;7808:93;7897:3;7808:93;:::i;:::-;7926:2;7921:3;7917:12;7910:19;;7569:366;;;:::o;7941:::-;8083:3;8104:67;8168:2;8163:3;8104:67;:::i;:::-;8097:74;;8180:93;8269:3;8180:93;:::i;:::-;8298:2;8293:3;8289:12;8282:19;;7941:366;;;:::o;8313:::-;8455:3;8476:67;8540:2;8535:3;8476:67;:::i;:::-;8469:74;;8552:93;8641:3;8552:93;:::i;:::-;8670:2;8665:3;8661:12;8654:19;;8313:366;;;:::o;8685:::-;8827:3;8848:67;8912:2;8907:3;8848:67;:::i;:::-;8841:74;;8924:93;9013:3;8924:93;:::i;:::-;9042:2;9037:3;9033:12;9026:19;;8685:366;;;:::o;9057:::-;9199:3;9220:67;9284:2;9279:3;9220:67;:::i;:::-;9213:74;;9296:93;9385:3;9296:93;:::i;:::-;9414:2;9409:3;9405:12;9398:19;;9057:366;;;:::o;9429:::-;9571:3;9592:67;9656:2;9651:3;9592:67;:::i;:::-;9585:74;;9668:93;9757:3;9668:93;:::i;:::-;9786:2;9781:3;9777:12;9770:19;;9429:366;;;:::o;9801:::-;9943:3;9964:67;10028:2;10023:3;9964:67;:::i;:::-;9957:74;;10040:93;10129:3;10040:93;:::i;:::-;10158:2;10153:3;10149:12;10142:19;;9801:366;;;:::o;10173:::-;10315:3;10336:67;10400:2;10395:3;10336:67;:::i;:::-;10329:74;;10412:93;10501:3;10412:93;:::i;:::-;10530:2;10525:3;10521:12;10514:19;;10173:366;;;:::o;10545:::-;10687:3;10708:67;10772:2;10767:3;10708:67;:::i;:::-;10701:74;;10784:93;10873:3;10784:93;:::i;:::-;10902:2;10897:3;10893:12;10886:19;;10545:366;;;:::o;10917:::-;11059:3;11080:67;11144:2;11139:3;11080:67;:::i;:::-;11073:74;;11156:93;11245:3;11156:93;:::i;:::-;11274:2;11269:3;11265:12;11258:19;;10917:366;;;:::o;11289:::-;11431:3;11452:67;11516:2;11511:3;11452:67;:::i;:::-;11445:74;;11528:93;11617:3;11528:93;:::i;:::-;11646:2;11641:3;11637:12;11630:19;;11289:366;;;:::o;11661:::-;11803:3;11824:67;11888:2;11883:3;11824:67;:::i;:::-;11817:74;;11900:93;11989:3;11900:93;:::i;:::-;12018:2;12013:3;12009:12;12002:19;;11661:366;;;:::o;12033:::-;12175:3;12196:67;12260:2;12255:3;12196:67;:::i;:::-;12189:74;;12272:93;12361:3;12272:93;:::i;:::-;12390:2;12385:3;12381:12;12374:19;;12033:366;;;:::o;12405:::-;12547:3;12568:67;12632:2;12627:3;12568:67;:::i;:::-;12561:74;;12644:93;12733:3;12644:93;:::i;:::-;12762:2;12757:3;12753:12;12746:19;;12405:366;;;:::o;12777:::-;12919:3;12940:67;13004:2;12999:3;12940:67;:::i;:::-;12933:74;;13016:93;13105:3;13016:93;:::i;:::-;13134:2;13129:3;13125:12;13118:19;;12777:366;;;:::o;13149:::-;13291:3;13312:67;13376:2;13371:3;13312:67;:::i;:::-;13305:74;;13388:93;13477:3;13388:93;:::i;:::-;13506:2;13501:3;13497:12;13490:19;;13149:366;;;:::o;13521:::-;13663:3;13684:67;13748:2;13743:3;13684:67;:::i;:::-;13677:74;;13760:93;13849:3;13760:93;:::i;:::-;13878:2;13873:3;13869:12;13862:19;;13521:366;;;:::o;13893:::-;14035:3;14056:67;14120:2;14115:3;14056:67;:::i;:::-;14049:74;;14132:93;14221:3;14132:93;:::i;:::-;14250:2;14245:3;14241:12;14234:19;;13893:366;;;:::o;14265:108::-;14342:24;14360:5;14342:24;:::i;:::-;14337:3;14330:37;14265:108;;:::o;14379:118::-;14466:24;14484:5;14466:24;:::i;:::-;14461:3;14454:37;14379:118;;:::o;14503:112::-;14586:22;14602:5;14586:22;:::i;:::-;14581:3;14574:35;14503:112;;:::o;14621:222::-;14714:4;14752:2;14741:9;14737:18;14729:26;;14765:71;14833:1;14822:9;14818:17;14809:6;14765:71;:::i;:::-;14621:222;;;;:::o;14849:332::-;14970:4;15008:2;14997:9;14993:18;14985:26;;15021:71;15089:1;15078:9;15074:17;15065:6;15021:71;:::i;:::-;15102:72;15170:2;15159:9;15155:18;15146:6;15102:72;:::i;:::-;14849:332;;;;;:::o;15187:373::-;15330:4;15368:2;15357:9;15353:18;15345:26;;15417:9;15411:4;15407:20;15403:1;15392:9;15388:17;15381:47;15445:108;15548:4;15539:6;15445:108;:::i;:::-;15437:116;;15187:373;;;;:::o;15566:210::-;15653:4;15691:2;15680:9;15676:18;15668:26;;15704:65;15766:1;15755:9;15751:17;15742:6;15704:65;:::i;:::-;15566:210;;;;:::o;15782:313::-;15895:4;15933:2;15922:9;15918:18;15910:26;;15982:9;15976:4;15972:20;15968:1;15957:9;15953:17;15946:47;16010:78;16083:4;16074:6;16010:78;:::i;:::-;16002:86;;15782:313;;;;:::o;16101:419::-;16267:4;16305:2;16294:9;16290:18;16282:26;;16354:9;16348:4;16344:20;16340:1;16329:9;16325:17;16318:47;16382:131;16508:4;16382:131;:::i;:::-;16374:139;;16101:419;;;:::o;16526:::-;16692:4;16730:2;16719:9;16715:18;16707:26;;16779:9;16773:4;16769:20;16765:1;16754:9;16750:17;16743:47;16807:131;16933:4;16807:131;:::i;:::-;16799:139;;16526:419;;;:::o;16951:::-;17117:4;17155:2;17144:9;17140:18;17132:26;;17204:9;17198:4;17194:20;17190:1;17179:9;17175:17;17168:47;17232:131;17358:4;17232:131;:::i;:::-;17224:139;;16951:419;;;:::o;17376:::-;17542:4;17580:2;17569:9;17565:18;17557:26;;17629:9;17623:4;17619:20;17615:1;17604:9;17600:17;17593:47;17657:131;17783:4;17657:131;:::i;:::-;17649:139;;17376:419;;;:::o;17801:::-;17967:4;18005:2;17994:9;17990:18;17982:26;;18054:9;18048:4;18044:20;18040:1;18029:9;18025:17;18018:47;18082:131;18208:4;18082:131;:::i;:::-;18074:139;;17801:419;;;:::o;18226:::-;18392:4;18430:2;18419:9;18415:18;18407:26;;18479:9;18473:4;18469:20;18465:1;18454:9;18450:17;18443:47;18507:131;18633:4;18507:131;:::i;:::-;18499:139;;18226:419;;;:::o;18651:::-;18817:4;18855:2;18844:9;18840:18;18832:26;;18904:9;18898:4;18894:20;18890:1;18879:9;18875:17;18868:47;18932:131;19058:4;18932:131;:::i;:::-;18924:139;;18651:419;;;:::o;19076:::-;19242:4;19280:2;19269:9;19265:18;19257:26;;19329:9;19323:4;19319:20;19315:1;19304:9;19300:17;19293:47;19357:131;19483:4;19357:131;:::i;:::-;19349:139;;19076:419;;;:::o;19501:::-;19667:4;19705:2;19694:9;19690:18;19682:26;;19754:9;19748:4;19744:20;19740:1;19729:9;19725:17;19718:47;19782:131;19908:4;19782:131;:::i;:::-;19774:139;;19501:419;;;:::o;19926:::-;20092:4;20130:2;20119:9;20115:18;20107:26;;20179:9;20173:4;20169:20;20165:1;20154:9;20150:17;20143:47;20207:131;20333:4;20207:131;:::i;:::-;20199:139;;19926:419;;;:::o;20351:::-;20517:4;20555:2;20544:9;20540:18;20532:26;;20604:9;20598:4;20594:20;20590:1;20579:9;20575:17;20568:47;20632:131;20758:4;20632:131;:::i;:::-;20624:139;;20351:419;;;:::o;20776:::-;20942:4;20980:2;20969:9;20965:18;20957:26;;21029:9;21023:4;21019:20;21015:1;21004:9;21000:17;20993:47;21057:131;21183:4;21057:131;:::i;:::-;21049:139;;20776:419;;;:::o;21201:::-;21367:4;21405:2;21394:9;21390:18;21382:26;;21454:9;21448:4;21444:20;21440:1;21429:9;21425:17;21418:47;21482:131;21608:4;21482:131;:::i;:::-;21474:139;;21201:419;;;:::o;21626:::-;21792:4;21830:2;21819:9;21815:18;21807:26;;21879:9;21873:4;21869:20;21865:1;21854:9;21850:17;21843:47;21907:131;22033:4;21907:131;:::i;:::-;21899:139;;21626:419;;;:::o;22051:::-;22217:4;22255:2;22244:9;22240:18;22232:26;;22304:9;22298:4;22294:20;22290:1;22279:9;22275:17;22268:47;22332:131;22458:4;22332:131;:::i;:::-;22324:139;;22051:419;;;:::o;22476:::-;22642:4;22680:2;22669:9;22665:18;22657:26;;22729:9;22723:4;22719:20;22715:1;22704:9;22700:17;22693:47;22757:131;22883:4;22757:131;:::i;:::-;22749:139;;22476:419;;;:::o;22901:::-;23067:4;23105:2;23094:9;23090:18;23082:26;;23154:9;23148:4;23144:20;23140:1;23129:9;23125:17;23118:47;23182:131;23308:4;23182:131;:::i;:::-;23174:139;;22901:419;;;:::o;23326:::-;23492:4;23530:2;23519:9;23515:18;23507:26;;23579:9;23573:4;23569:20;23565:1;23554:9;23550:17;23543:47;23607:131;23733:4;23607:131;:::i;:::-;23599:139;;23326:419;;;:::o;23751:::-;23917:4;23955:2;23944:9;23940:18;23932:26;;24004:9;23998:4;23994:20;23990:1;23979:9;23975:17;23968:47;24032:131;24158:4;24032:131;:::i;:::-;24024:139;;23751:419;;;:::o;24176:222::-;24269:4;24307:2;24296:9;24292:18;24284:26;;24320:71;24388:1;24377:9;24373:17;24364:6;24320:71;:::i;:::-;24176:222;;;;:::o;24404:553::-;24581:4;24619:3;24608:9;24604:19;24596:27;;24633:71;24701:1;24690:9;24686:17;24677:6;24633:71;:::i;:::-;24714:72;24782:2;24771:9;24767:18;24758:6;24714:72;:::i;:::-;24796;24864:2;24853:9;24849:18;24840:6;24796:72;:::i;:::-;24878;24946:2;24935:9;24931:18;24922:6;24878:72;:::i;:::-;24404:553;;;;;;;:::o;24963:214::-;25052:4;25090:2;25079:9;25075:18;25067:26;;25103:67;25167:1;25156:9;25152:17;25143:6;25103:67;:::i;:::-;24963:214;;;;:::o;25264:132::-;25331:4;25354:3;25346:11;;25384:4;25379:3;25375:14;25367:22;;25264:132;;;:::o;25402:114::-;25469:6;25503:5;25497:12;25487:22;;25402:114;;;:::o;25522:99::-;25574:6;25608:5;25602:12;25592:22;;25522:99;;;:::o;25627:113::-;25697:4;25729;25724:3;25720:14;25712:22;;25627:113;;;:::o;25746:184::-;25845:11;25879:6;25874:3;25867:19;25919:4;25914:3;25910:14;25895:29;;25746:184;;;;:::o;25936:169::-;26020:11;26054:6;26049:3;26042:19;26094:4;26089:3;26085:14;26070:29;;25936:169;;;;:::o;26111:305::-;26151:3;26170:20;26188:1;26170:20;:::i;:::-;26165:25;;26204:20;26222:1;26204:20;:::i;:::-;26199:25;;26358:1;26290:66;26286:74;26283:1;26280:81;26277:107;;;26364:18;;:::i;:::-;26277:107;26408:1;26405;26401:9;26394:16;;26111:305;;;;:::o;26422:185::-;26462:1;26479:20;26497:1;26479:20;:::i;:::-;26474:25;;26513:20;26531:1;26513:20;:::i;:::-;26508:25;;26552:1;26542:35;;26557:18;;:::i;:::-;26542:35;26599:1;26596;26592:9;26587:14;;26422:185;;;;:::o;26613:348::-;26653:7;26676:20;26694:1;26676:20;:::i;:::-;26671:25;;26710:20;26728:1;26710:20;:::i;:::-;26705:25;;26898:1;26830:66;26826:74;26823:1;26820:81;26815:1;26808:9;26801:17;26797:105;26794:131;;;26905:18;;:::i;:::-;26794:131;26953:1;26950;26946:9;26935:20;;26613:348;;;;:::o;26967:191::-;27007:4;27027:20;27045:1;27027:20;:::i;:::-;27022:25;;27061:20;27079:1;27061:20;:::i;:::-;27056:25;;27100:1;27097;27094:8;27091:34;;;27105:18;;:::i;:::-;27091:34;27150:1;27147;27143:9;27135:17;;26967:191;;;;:::o;27164:96::-;27201:7;27230:24;27248:5;27230:24;:::i;:::-;27219:35;;27164:96;;;:::o;27266:90::-;27300:7;27343:5;27336:13;27329:21;27318:32;;27266:90;;;:::o;27362:77::-;27399:7;27428:5;27417:16;;27362:77;;;:::o;27445:126::-;27482:7;27522:42;27515:5;27511:54;27500:65;;27445:126;;;:::o;27577:77::-;27614:7;27643:5;27632:16;;27577:77;;;:::o;27660:86::-;27695:7;27735:4;27728:5;27724:16;27713:27;;27660:86;;;:::o;27752:307::-;27820:1;27830:113;27844:6;27841:1;27838:13;27830:113;;;27929:1;27924:3;27920:11;27914:18;27910:1;27905:3;27901:11;27894:39;27866:2;27863:1;27859:10;27854:15;;27830:113;;;27961:6;27958:1;27955:13;27952:101;;;28041:1;28032:6;28027:3;28023:16;28016:27;27952:101;27801:258;27752:307;;;:::o;28065:320::-;28109:6;28146:1;28140:4;28136:12;28126:22;;28193:1;28187:4;28183:12;28214:18;28204:81;;28270:4;28262:6;28258:17;28248:27;;28204:81;28332:2;28324:6;28321:14;28301:18;28298:38;28295:84;;;28351:18;;:::i;:::-;28295:84;28116:269;28065:320;;;:::o;28391:233::-;28430:3;28453:24;28471:5;28453:24;:::i;:::-;28444:33;;28499:66;28492:5;28489:77;28486:103;;;28569:18;;:::i;:::-;28486:103;28616:1;28609:5;28605:13;28598:20;;28391:233;;;:::o;28630:180::-;28678:77;28675:1;28668:88;28775:4;28772:1;28765:15;28799:4;28796:1;28789:15;28816:180;28864:77;28861:1;28854:88;28961:4;28958:1;28951:15;28985:4;28982:1;28975:15;29002:180;29050:77;29047:1;29040:88;29147:4;29144:1;29137:15;29171:4;29168:1;29161:15;29188:180;29236:77;29233:1;29226:88;29333:4;29330:1;29323:15;29357:4;29354:1;29347:15;29374:180;29422:77;29419:1;29412:88;29519:4;29516:1;29509:15;29543:4;29540:1;29533:15;29560:117;29669:1;29666;29659:12;29683:117;29792:1;29789;29782:12;29806:117;29915:1;29912;29905:12;29929:117;30038:1;30035;30028:12;30052:117;30161:1;30158;30151:12;30175:102;30216:6;30267:2;30263:7;30258:2;30251:5;30247:14;30243:28;30233:38;;30175:102;;;:::o;30283:222::-;30423:34;30419:1;30411:6;30407:14;30400:58;30492:5;30487:2;30479:6;30475:15;30468:30;30283:222;:::o;30511:225::-;30651:34;30647:1;30639:6;30635:14;30628:58;30720:8;30715:2;30707:6;30703:15;30696:33;30511:225;:::o;30742:221::-;30882:34;30878:1;30870:6;30866:14;30859:58;30951:4;30946:2;30938:6;30934:15;30927:29;30742:221;:::o;30969:225::-;31109:34;31105:1;31097:6;31093:14;31086:58;31178:8;31173:2;31165:6;31161:15;31154:33;30969:225;:::o;31200:234::-;31340:34;31336:1;31328:6;31324:14;31317:58;31409:17;31404:2;31396:6;31392:15;31385:42;31200:234;:::o;31440:230::-;31580:34;31576:1;31568:6;31564:14;31557:58;31649:13;31644:2;31636:6;31632:15;31625:38;31440:230;:::o;31676:227::-;31816:34;31812:1;31804:6;31800:14;31793:58;31885:10;31880:2;31872:6;31868:15;31861:35;31676:227;:::o;31909:182::-;32049:34;32045:1;32037:6;32033:14;32026:58;31909:182;:::o;32097:173::-;32237:25;32233:1;32225:6;32221:14;32214:49;32097:173;:::o;32276:179::-;32416:31;32412:1;32404:6;32400:14;32393:55;32276:179;:::o;32461:235::-;32601:34;32597:1;32589:6;32585:14;32578:58;32670:18;32665:2;32657:6;32653:15;32646:43;32461:235;:::o;32702:224::-;32842:34;32838:1;32830:6;32826:14;32819:58;32911:7;32906:2;32898:6;32894:15;32887:32;32702:224;:::o;32932:221::-;33072:34;33068:1;33060:6;33056:14;33049:58;33141:4;33136:2;33128:6;33124:15;33117:29;32932:221;:::o;33159:223::-;33299:34;33295:1;33287:6;33283:14;33276:58;33368:6;33363:2;33355:6;33351:15;33344:31;33159:223;:::o;33388:239::-;33528:34;33524:1;33516:6;33512:14;33505:58;33597:22;33592:2;33584:6;33580:15;33573:47;33388:239;:::o;33633:172::-;33773:24;33769:1;33761:6;33757:14;33750:48;33633:172;:::o;33811:180::-;33951:32;33947:1;33939:6;33935:14;33928:56;33811:180;:::o;33997:224::-;34137:34;34133:1;34125:6;34121:14;34114:58;34206:7;34201:2;34193:6;34189:15;34182:32;33997:224;:::o;34227:181::-;34367:33;34363:1;34355:6;34351:14;34344:57;34227:181;:::o;34414:122::-;34487:24;34505:5;34487:24;:::i;:::-;34480:5;34477:35;34467:63;;34526:1;34523;34516:12;34467:63;34414:122;:::o;34542:::-;34615:24;34633:5;34615:24;:::i;:::-;34608:5;34605:35;34595:63;;34654:1;34651;34644:12;34595:63;34542:122;:::o;34670:::-;34743:24;34761:5;34743:24;:::i;:::-;34736:5;34733:35;34723:63;;34782:1;34779;34772:12;34723:63;34670:122;:::o

Swarm Source

ipfs://85e4774aa370f36e476a8a60f30bacb14ada6fa34b0a6b39fb3134f9778281df
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.