ETH Price: $3,425.49 (-1.63%)
Gas: 7 Gwei

Token

Zombie Frens Key to the City (ZFKEY)
 

Overview

Max Total Supply

342 ZFKEY

Holders

182

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 ZFKEY
0x9eCa510062bDFcdfC37EF7AF34247E04028C86de
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:
KeyToTheCity

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 22 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 2 of 22 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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 3 of 22 : IBrainsDistributor.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.4;

interface IBrainsDistributor {
    function burnBrainsFor(address holder, uint256 amount) external;
    function mintBrainsFor(address holder, uint256 amount) external;
    function remainingBrains() external view returns (uint256 amount);
}

File 4 of 22 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 5 of 22 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 6 of 22 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 7 of 22 : KeyToTheCity.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.4;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC721, ERC721, ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import {Whitelist} from "./Whitelist.sol";
import {IKeyClaimable} from "./IKeyClaimable.sol";
import {IBrainsDistributor} from "./IBrainsDistributor.sol";

contract KeyToTheCity is Ownable, Pausable, ERC721Enumerable, Whitelist {

    struct KeyClaim {
        bool cityClaimed;
        bool pixelClaimed;
        bool threeDClaimed;
        bool humanClaimed;
        bool brainsClaimed;
    }

    string private baseURI;

    IERC20 public brains;
    IERC721 public zombies;
    IKeyClaimable public cities;
    IKeyClaimable public humans;
    IKeyClaimable public pixels;
    IKeyClaimable public threeD;

    IBrainsDistributor public distributor;

    mapping(address => uint8) public whitelistMintedKeys;
    mapping(uint256 => KeyClaim) public keyClaims;
    mapping(address => bool) public holderWhitelistClaims;

    bool public publicSaleActive;
    bool public holderWhitelistActive;
    bool public pixelsClaimable;
    bool public threeDClaimable;

    uint256 public mintPrice;
    uint256 public maxBrainsPerKey = 10000;

    uint256 public constant MAX_KEYS = 10000;

    constructor(address genesis) ERC721("Zombie Frens Key to the City", "ZFKEY") {
        zombies = IERC721(genesis);
        mintPrice = 0.035 ether;
        holderWhitelistActive = true;
    }

    function init(address _distributor, address _cities, address _humans, address _brains) external onlyOwner {
        distributor = IBrainsDistributor(_distributor);
        cities = IKeyClaimable(_cities);
        humans = IKeyClaimable(_humans);
        brains = IERC20(_brains);
    }

    function claimMany(uint256[] calldata tokenIds) external whenNotPaused {
        for(uint256 i=0;i<tokenIds.length;++i) {
            claim(tokenIds[i]);
        }
    }

    function claim(uint256 tokenId) public whenNotPaused ownsKey(tokenId) {
        if(keyClaims[tokenId].cityClaimed && keyClaims[tokenId].humanClaimed && keyClaims[tokenId].brainsClaimed) {
            revert("key_already_claimed");
        }
        require(address(cities) != address(0x0), "cities_address_not_defined");
        require(address(humans) != address(0x0), "humans_address_not_defined");
        require(address(brains) != address(0x0), "brains_address_not_defined");
        if(!keyClaims[tokenId].cityClaimed && isInPercentile(tokenId, 30)) {
            keyClaims[tokenId].cityClaimed = true;
            cities.claimKeyFor(msg.sender);
        } else {
            keyClaims[tokenId].cityClaimed = true;
        }
        if(!keyClaims[tokenId].humanClaimed) {
            if(isInPercentile(tokenId, 10)) {
                keyClaims[tokenId].humanClaimed = true;
                humans.claimKeyFor(msg.sender);
            } else {
                keyClaims[tokenId].humanClaimed = true;
            }
        }
        if(!keyClaims[tokenId].brainsClaimed) {
            uint256 brainsAmount = random(tokenId) % maxBrainsPerKey;
            if(brainsAmount > distributor.remainingBrains()) {
                brainsAmount = distributor.remainingBrains();
            } 
            keyClaims[tokenId].brainsClaimed = true;
            if(brainsAmount == 0) return;
            distributor.mintBrainsFor(msg.sender, brainsAmount);
        }
    }

    function set3DClaimable(address _threeD) external onlyOwner {
        threeDClaimable = true;
        threeD = IKeyClaimable(_threeD);
    }

    function setPixelClaimable(address _pixel) external onlyOwner {
        pixelsClaimable = true;
        pixels = IKeyClaimable(_pixel);
    }

    function claim3D(uint256 tokenId) external whenNotPaused ownsKey(tokenId) {
        require(threeDClaimable, "3d_not_claimable");
        require(address(threeD) != address(0x0), "address_not_defined");
        require(!keyClaims[tokenId].threeDClaimed, "3D_already_claimed");
        keyClaims[tokenId].threeDClaimed = true;
        threeD.claimKeyFor(msg.sender);
    }

    function claimPixel(uint256 tokenId) external whenNotPaused ownsKey(tokenId) {
        require(pixelsClaimable, "pixel_not_claimable");
        require(address(pixels) != address(0x0), "address_not_defined");
        require(!keyClaims[tokenId].pixelClaimed, "pixel_already_claimed");
        keyClaims[tokenId].pixelClaimed = true;
        pixels.claimKeyFor(msg.sender);
    }

    function mint(bytes32[] calldata merkleProof, uint8 amount) external payable whenNotPaused {
        require(amount > 0, "amount_zero");
        require(totalSupply() + amount <= MAX_KEYS, "max_keys_minted");
        require(holderWhitelistActive || whitelistActive || publicSaleActive, "no_active_sale");
        if(!whitelistActive) {
            require(msg.value >= getMintCost(amount), "not_enough_ether");
        }
        if(holderWhitelistActive) {
            claimHolderWhitelist(amount);
        } else if(whitelistActive) {
            claimWhitelist(merkleProof);
        } else if(publicSaleActive) {
            for(uint256 i=0;i<amount;++i) {
                _safeMint(msg.sender, totalSupply());
            }
        }
    }

    function mintFor(address to, uint8 amount) external onlyOwner {
        for(uint256 i=0;i<amount;++i) {
            _safeMint(to, totalSupply());
        }
    }

    function updateWhitelistMerkle(bytes32 merkleRoot_) external onlyOwner {
        require(merkleRoot_ != 0x0, "invalid_merkle_root");
        bytes32 currentRoot = _merkleRoot;
        _merkleRoot = merkleRoot_;

        emit WhitelistMerkleRootUpdated(currentRoot, _merkleRoot);
    }

    function claimWhitelist(bytes32[] calldata merkleProof) internal whenNotPaused _canMintWhitelist(merkleProof) {
        require(!holderWhitelistClaims[msg.sender], "already_claimed");
        _safeMint(msg.sender, totalSupply());
        holderWhitelistClaims[msg.sender] = true;
    }

    function claimHolderWhitelist(uint8 amount) internal whenNotPaused {
        uint256 owned = totalOwned();
        uint256 claimed = whitelistMintedKeys[msg.sender];
        require(claimed + amount <= owned, "exceeds_owned_zombies");
        uint256 tokenId = totalSupply();
        for(uint256 i=0;i<amount;++i) {
            _safeMint(msg.sender, tokenId + i);
            whitelistMintedKeys[msg.sender] += 1;
        }
    }

    function setWhitelistSale() external onlyOwner {
        holderWhitelistActive = false;
        publicSaleActive = false;
        whitelistActive =  true;
    }

    function setPublicSale(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
        whitelistActive =  false;
        holderWhitelistActive = false;
        publicSaleActive = true;
    }

    function setHolderWhitelistActive() external onlyOwner {
        require(!holderWhitelistActive, "whitelist_active");
        publicSaleActive = false;
        whitelistActive = false;
        holderWhitelistActive = true;
    }

    function flipPublicSale() external onlyOwner {
        publicSaleActive = !publicSaleActive;
    }

    function updateDistributor(address _distributor) external onlyOwner {
        distributor = IBrainsDistributor(_distributor);
    }

    function updateMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

    function isInPercentile(uint256 tokenId, uint16 percentile) internal view returns (bool inPercentile) {
        uint256 thirtyPercent = type(uint16).max / 100 * percentile;
        return (uint16(random(tokenId)) < thirtyPercent);
    }

    function random(uint256 tokenId) internal view returns (uint256 number) {
        number = uint256(keccak256(abi.encodePacked(block.timestamp, block.coinbase, block.difficulty, msg.sender, tokenId)));
    }

    function getMintCost(uint256 amount) internal view returns (uint256 cost) {
        cost = amount * mintPrice;
    }

    function totalOwned() internal view returns (uint256 balance) {
        balance = zombies.balanceOf(msg.sender);
    }

    function setBaseURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        require(_owner != address(0), "owner_zero_address");
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount <= 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function withdraw() external onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    modifier ownsKey(uint256 tokenId) {
        require(totalSupply() >= tokenId, "token_does_not_exist");
        require(ownerOf(tokenId) == msg.sender, "caller_does_not_own");
        _;
    }
}

File 8 of 22 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

File 9 of 22 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 10 of 22 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 11 of 22 : Whitelist.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.4;

import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

/// @author tempest-sol
abstract contract Whitelist {

    bool public whitelistActive;

    bytes32 internal _merkleRoot;

    event WhitelistMerkleRootUpdated(bytes32 oldMerkleRoot, bytes32 newMerkleRoot);

    event WhitelistStatusFlipped(bool oldStatus, bool newStatus);

    function whitelistData(bytes32[] calldata _merkleProof) private view returns (bool valid) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        valid = MerkleProof.verify(_merkleProof, _merkleRoot, leaf);
    }

    modifier _canMintWhitelist(bytes32[] calldata merkleProof) {
        bool isValid = whitelistData(merkleProof);
        require(isValid, "not_whitelisted");
        _;
    }
}

File 12 of 22 : IKeyClaimable.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.4;

interface IKeyClaimable {
    function claimKeyFor(address owner) external;
    function claimKeysFor(address owner, uint8 amount) external;
}

File 13 of 22 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}

File 14 of 22 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 15 of 22 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 16 of 22 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 17 of 22 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 18 of 22 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 19 of 22 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 20 of 22 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 21 of 22 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 22 of 22 : IBrains.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.12;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IBrains is IERC20 {
    function mint(address holder, uint256 amount) external;
    function burn(address holder, uint256 amount) external;
}

Settings
{
  "metadata": {
    "bytecodeHash": "none"
  },
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"genesis","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"oldMerkleRoot","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"WhitelistMerkleRootUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"oldStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"WhitelistStatusFlipped","type":"event"},{"inputs":[],"name":"MAX_KEYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"brains","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cities","outputs":[{"internalType":"contract IKeyClaimable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim3D","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimPixel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract IBrainsDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderWhitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderWhitelistClaims","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"humans","outputs":[{"internalType":"contract IKeyClaimable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"address","name":"_cities","type":"address"},{"internalType":"address","name":"_humans","type":"address"},{"internalType":"address","name":"_brains","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"keyClaims","outputs":[{"internalType":"bool","name":"cityClaimed","type":"bool"},{"internalType":"bool","name":"pixelClaimed","type":"bool"},{"internalType":"bool","name":"threeDClaimed","type":"bool"},{"internalType":"bool","name":"humanClaimed","type":"bool"},{"internalType":"bool","name":"brainsClaimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBrainsPerKey","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixels","outputs":[{"internalType":"contract IKeyClaimable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixelsClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_threeD","type":"address"}],"name":"set3DClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setHolderWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pixel","type":"address"}],"name":"setPixelClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threeD","outputs":[{"internalType":"contract IKeyClaimable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threeDClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"}],"name":"updateDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"updateMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"updateWhitelistMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintedKeys","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zombies","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052612710601a553480156200001757600080fd5b5060405162004489380380620044898339810160408190526200003a916200021f565b6040518060400160405280601c81526020017f5a6f6d626965204672656e73204b657920746f20746865204369747900000000815250604051806040016040528060058152602001645a464b455960d81b815250620000a8620000a26200012560201b60201c565b62000129565b6000805460ff60a01b191690558151620000ca90600190602085019062000179565b508051620000e090600290602084019062000179565b5050600f80546001600160a01b039093166001600160a01b03199093169290921790915550667c5850872380006019556018805461ff0019166101001790556200028e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001879062000251565b90600052602060002090601f016020900481019282620001ab5760008555620001f6565b82601f10620001c657805160ff1916838001178555620001f6565b82800160010185558215620001f6579182015b82811115620001f6578251825591602001919060010190620001d9565b506200020492915062000208565b5090565b5b8082111562000204576000815560010162000209565b6000602082840312156200023257600080fd5b81516001600160a01b03811681146200024a57600080fd5b9392505050565b600181811c908216806200026657607f821691505b602082108114156200028857634e487b7160e01b600052602260045260246000fd5b50919050565b6141eb806200029e6000396000f3fe6080604052600436106103755760003560e01c80637e79a565116101d1578063bc8893b411610102578063cef216e2116100a0578063e985e9c51161006f578063e985e9c514610a81578063f22c64bd14610aca578063f2fde38b14610ae0578063f85317c614610b0057600080fd5b8063cef216e214610a0c578063d78055dc14610a21578063e209e02f14610a41578063e3e184eb14610a6157600080fd5b8063c470db1c116100dc578063c470db1c14610986578063c87b56dd1461099c578063c97c6c49146109bc578063c9d87e69146109ec57600080fd5b8063bc8893b41461092c578063bfe1092814610946578063c010d2d21461096657600080fd5b80639d9fabec1161016f578063aa88ee6611610149578063aa88ee6614610842578063ab72e0bf146108cc578063b88d4fde146108ec578063bc30a6181461090c57600080fd5b80639d9fabec146107c0578063a22cb46514610802578063a34101ea1461082257600080fd5b80638a3ce0ab116101ab5780638a3ce0ab146107585780638da5cb5b1461076d578063925489a81461078b57806395d89b41146107ab57600080fd5b80637e79a565146106f65780638462151c14610716578063880846051461074357600080fd5b80633eee5eb8116102ab5780635c975abb11610249578063662ad59b11610223578063662ad59b1461068b5780636817c76c146106ab57806370a08231146106c1578063715018a6146106e157600080fd5b80635c975abb1461062c5780635f7966e11461064b5780636352211e1461066b57600080fd5b80634f6ccce7116102855780634f6ccce7146105ac57806351d8b423146105cc57806355f804b3146105ec57806359bad07c1461060c57600080fd5b80633eee5eb81461055857806342842e0e1461056b57806346ee89d61461058b57600080fd5b80630c1f1e9e1161031857806323b872dd116102f257806323b872dd146104e35780632f745c5914610503578063379607f5146105235780633ccfd60b1461054357600080fd5b80630c1f1e9e1461048557806313cd8fb0146104a457806318160ddd146104c457600080fd5b806306552ff31161035457806306552ff3146103eb57806306fdde031461040b578063081812fc1461042d578063095ea7b31461046557600080fd5b8062728e461461037a57806301ffc9a71461039c57806302ce5813146103d1575b600080fd5b34801561038657600080fd5b5061039a610395366004613ac6565b610b20565b005b3480156103a857600080fd5b506103bc6103b7366004613af5565b610b72565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b50600b546103bc9060ff1681565b3480156103f757600080fd5b5061039a610406366004613b2e565b610bb6565b34801561041757600080fd5b50610420610c4e565b6040516103c89190613bda565b34801561043957600080fd5b5061044d610448366004613ac6565b610ce0565b6040516001600160a01b0390911681526020016103c8565b34801561047157600080fd5b5061039a610480366004613bed565b610d75565b34801561049157600080fd5b506018546103bc90610100900460ff1681565b3480156104b057600080fd5b5061039a6104bf366004613ac6565b610ea7565b3480156104d057600080fd5b506009545b6040519081526020016103c8565b3480156104ef57600080fd5b5061039a6104fe366004613c17565b61113f565b34801561050f57600080fd5b506104d561051e366004613bed565b6111c6565b34801561052f57600080fd5b5061039a61053e366004613ac6565b61126e565b34801561054f57600080fd5b5061039a6118da565b61039a610566366004613cb0565b611951565b34801561057757600080fd5b5061039a610586366004613c17565b611b9e565b34801561059757600080fd5b506018546103bc906301000000900460ff1681565b3480156105b857600080fd5b506104d56105c7366004613ac6565b611bb9565b3480156105d857600080fd5b5060115461044d906001600160a01b031681565b3480156105f857600080fd5b5061039a610607366004613d90565b611c5d565b34801561061857600080fd5b50600e5461044d906001600160a01b031681565b34801561063857600080fd5b50600054600160a01b900460ff166103bc565b34801561065757600080fd5b50600f5461044d906001600160a01b031681565b34801561067757600080fd5b5061044d610686366004613ac6565b611cb8565b34801561069757600080fd5b5060125461044d906001600160a01b031681565b3480156106b757600080fd5b506104d560195481565b3480156106cd57600080fd5b506104d56106dc366004613dd9565b611d43565b3480156106ed57600080fd5b5061039a611ddd565b34801561070257600080fd5b5060135461044d906001600160a01b031681565b34801561072257600080fd5b50610736610731366004613dd9565b611e31565b6040516103c89190613df4565b34801561074f57600080fd5b5061039a611f49565b34801561076457600080fd5b5061039a611fa5565b34801561077957600080fd5b506000546001600160a01b031661044d565b34801561079757600080fd5b5061039a6107a6366004613e38565b612060565b3480156107b757600080fd5b506104206120e9565b3480156107cc57600080fd5b506107f06107db366004613dd9565b60156020526000908152604090205460ff1681565b60405160ff90911681526020016103c8565b34801561080e57600080fd5b5061039a61081d366004613e7a565b6120f8565b34801561082e57600080fd5b5061039a61083d366004613dd9565b612103565b34801561084e57600080fd5b5061089a61085d366004613ac6565b60166020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000009091041685565b60408051951515865293151560208601529115159284019290925290151560608301521515608082015260a0016103c8565b3480156108d857600080fd5b5061039a6108e7366004613ac6565b61217f565b3480156108f857600080fd5b5061039a610907366004613eb6565b612259565b34801561091857600080fd5b5061039a610927366004613dd9565b6122e1565b34801561093857600080fd5b506018546103bc9060ff1681565b34801561095257600080fd5b5060145461044d906001600160a01b031681565b34801561097257600080fd5b506018546103bc9062010000900460ff1681565b34801561099257600080fd5b506104d561271081565b3480156109a857600080fd5b506104206109b7366004613ac6565b61234b565b3480156109c857600080fd5b506103bc6109d7366004613dd9565b60176020526000908152604090205460ff1681565b3480156109f857600080fd5b5060105461044d906001600160a01b031681565b348015610a1857600080fd5b5061039a612434565b348015610a2d57600080fd5b5061039a610a3c366004613f32565b612496565b348015610a4d57600080fd5b5061039a610a5c366004613dd9565b612509565b348015610a6d57600080fd5b5061039a610a7c366004613ac6565b612587565b348015610a8d57600080fd5b506103bc610a9c366004613f65565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610ad657600080fd5b506104d5601a5481565b348015610aec57600080fd5b5061039a610afb366004613dd9565b6125ec565b348015610b0c57600080fd5b5061039a610b1b366004613ac6565b6126bc565b6000546001600160a01b03163314610b6d5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf83398151915260448201526064015b60405180910390fd5b601955565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610bb05750610bb082612926565b92915050565b6000546001600160a01b03163314610bfe5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601480546001600160a01b039586166001600160a01b03199182161790915560108054948616948216949094179093556011805492851692841692909217909155600e8054919093169116179055565b606060018054610c5d90613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8990613f8f565b8015610cd65780601f10610cab57610100808354040283529160200191610cd6565b820191906000526020600020905b815481529060010190602001808311610cb957829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610d595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b64565b506000908152600560205260409020546001600160a01b031690565b6000610d8082611cb8565b9050806001600160a01b0316836001600160a01b03161415610e0a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b64565b336001600160a01b0382161480610e265750610e268133610a9c565b610e985760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b64565b610ea283836129c1565b505050565b600054600160a01b900460ff1615610ef45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b8080610eff60095490565b1015610f4d5760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b33610f5782611cb8565b6001600160a01b031614610fad5760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b60185462010000900460ff166110055760405162461bcd60e51b815260206004820152601360248201527f706978656c5f6e6f745f636c61696d61626c65000000000000000000000000006044820152606401610b64565b6012546001600160a01b031661105d5760405162461bcd60e51b815260206004820152601360248201527f616464726573735f6e6f745f646566696e6564000000000000000000000000006044820152606401610b64565b600082815260166020526040902054610100900460ff16156110c15760405162461bcd60e51b815260206004820152601560248201527f706978656c5f616c72656164795f636c61696d656400000000000000000000006044820152606401610b64565b60008281526016602052604090819020805461ff00191661010017905560125490516304190d0560e31b81523360048201526001600160a01b03909116906320c86828906024015b600060405180830381600087803b15801561112357600080fd5b505af1158015611137573d6000803e3d6000fd5b505050505050565b6111493382612a2f565b6111bb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b64565b610ea2838383612b26565b60006111d183611d43565b82106112455760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b64565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600054600160a01b900460ff16156112bb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b80806112c660095490565b10156113145760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b3361131e82611cb8565b6001600160a01b0316146113745760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b60008281526016602052604090205460ff1680156113a757506000828152601660205260409020546301000000900460ff165b80156113c95750600082815260166020526040902054640100000000900460ff165b156114165760405162461bcd60e51b815260206004820152601360248201527f6b65795f616c72656164795f636c61696d6564000000000000000000000000006044820152606401610b64565b6010546001600160a01b031661146e5760405162461bcd60e51b815260206004820152601a60248201527f6369746965735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b6011546001600160a01b03166114c65760405162461bcd60e51b815260206004820152601a60248201527f68756d616e735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b600e546001600160a01b031661151e5760405162461bcd60e51b815260206004820152601a60248201527f627261696e735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b60008281526016602052604090205460ff16158015611543575061154382601e612cfe565b156115c45760008281526016602052604090819020805460ff1916600117905560105490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401600060405180830381600087803b1580156115a757600080fd5b505af11580156115bb573d6000803e3d6000fd5b505050506115de565b6000828152601660205260409020805460ff191660011790555b6000828152601660205260409020546301000000900460ff166116ad5761160682600a612cfe565b1561168d5760008281526016602052604090819020805463ff0000001916630100000017905560115490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401600060405180830381600087803b15801561167057600080fd5b505af1158015611684573d6000803e3d6000fd5b505050506116ad565b6000828152601660205260409020805463ff000000191663010000001790555b600082815260166020526040902054640100000000900460ff166118d657601a5460408051426020808301919091526bffffffffffffffffffffffff1941606090811b82168486015244605485015233901b16607483015260888083018790528351808403909101815260a89092019092528051910120600091906117329190613fda565b9050601460009054906101000a90046001600160a01b03166001600160a01b031663604e53bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190613fee565b81111561182c57601460009054906101000a90046001600160a01b03166001600160a01b031663604e53bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118299190613fee565b90505b6000838152601660205260409020805464ff0000000019166401000000001790558061185757505050565b6014546040517ffdd59fb0000000000000000000000000000000000000000000000000000000008152336004820152602481018390526001600160a01b039091169063fdd59fb090604401600060405180830381600087803b1580156118bc57600080fd5b505af11580156118d0573d6000803e3d6000fd5b50505050505b5050565b6000546001600160a01b031633146119225760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6040514790339082156108fc029083906000818181858888f193505050501580156118d6573d6000803e3d6000fd5b600054600160a01b900460ff161561199e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b60008160ff16116119f15760405162461bcd60e51b815260206004820152600b60248201527f616d6f756e745f7a65726f0000000000000000000000000000000000000000006044820152606401610b64565b6127108160ff16611a0160095490565b611a0b919061401d565b1115611a595760405162461bcd60e51b815260206004820152600f60248201527f6d61785f6b6579735f6d696e74656400000000000000000000000000000000006044820152606401610b64565b601854610100900460ff1680611a715750600b5460ff165b80611a7e575060185460ff165b611aca5760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f6163746976655f73616c650000000000000000000000000000000000006044820152606401610b64565b600b5460ff16611b2f57611ae08160ff16612d87565b341015611b2f5760405162461bcd60e51b815260206004820152601060248201527f6e6f745f656e6f7567685f6574686572000000000000000000000000000000006044820152606401610b64565b601854610100900460ff1615611b4857610ea281612d97565b600b5460ff1615611b5d57610ea28383612edf565b60185460ff1615610ea25760005b8160ff16811015611b9857611b8833611b8360095490565b613017565b611b9181614035565b9050611b6b565b50505050565b610ea283838360405180602001604052806000815250612259565b6000611bc460095490565b8210611c385760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b64565b60098281548110611c4b57611c4b614050565b90600052602060002001549050919050565b6000546001600160a01b03163314611ca55760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b80516118d690600d906020840190613a2d565b6000818152600360205260408120546001600160a01b031680610bb05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b64565b60006001600160a01b038216611dc15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b64565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e255760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b611e2f6000613031565b565b60606001600160a01b038216611e895760405162461bcd60e51b815260206004820152601260248201527f6f776e65725f7a65726f5f6164647265737300000000000000000000000000006044820152606401610b64565b6000611e9483611d43565b905060008111611eb85760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115611ed357611ed3613d04565b604051908082528060200260200182016040528015611efc578160200160208202803683370190505b50905060005b82811015611eb057611f1485826111c6565b828281518110611f2657611f26614050565b602090810291909101015280611f3b81614035565b915050611f02565b50919050565b6000546001600160a01b03163314611f915760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805460ff19811660ff90911615179055565b6000546001600160a01b03163314611fed5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601854610100900460ff16156120455760405162461bcd60e51b815260206004820152601060248201527f77686974656c6973745f616374697665000000000000000000000000000000006044820152606401610b64565b60188054600b805460ff1916905561ffff1916610100179055565b600054600160a01b900460ff16156120ad5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b60005b81811015610ea2576120d98383838181106120cd576120cd614050565b9050602002013561126e565b6120e281614035565b90506120b0565b606060028054610c5d90613f8f565b6118d6338383613081565b6000546001600160a01b0316331461214b5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805462ff0000191662010000179055601280546001600160a01b039092166001600160a01b0319909216919091179055565b6000546001600160a01b031633146121c75760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b806122145760405162461bcd60e51b815260206004820152601360248201527f696e76616c69645f6d65726b6c655f726f6f74000000000000000000000000006044820152606401610b64565b600c80549082905560408051828152602081018490527fdcb1e348ba8cda63787073d01657a7f6e113519a1ea18699595731e5a31bedf2910160405180910390a15050565b6122633383612a2f565b6122d55760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b64565b611b9884848484613150565b6000546001600160a01b031633146123295760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600360205260409020546060906001600160a01b03166123d85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b64565b60006123e26131ce565b90506000815111612402576040518060200160405280600081525061242d565b8061240c846131dd565b60405160200161241d929190614066565b6040516020818303038152906040525b9392505050565b6000546001600160a01b0316331461247c5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805461ffff19169055600b805460ff19166001179055565b6000546001600160a01b031633146124de5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b60005b8160ff16811015610ea2576124f983611b8360095490565b61250281614035565b90506124e1565b6000546001600160a01b031633146125515760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805463ff00000019166301000000179055601380546001600160a01b039092166001600160a01b0319909216919091179055565b6000546001600160a01b031633146125cf5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601955600b805460ff191690556018805461ffff19166001179055565b6000546001600160a01b031633146126345760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6001600160a01b0381166126b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b64565b6126b981613031565b50565b600054600160a01b900460ff16156127095760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b808061271460095490565b10156127625760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b3361276c82611cb8565b6001600160a01b0316146127c25760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b6018546301000000900460ff1661281b5760405162461bcd60e51b815260206004820152601060248201527f33645f6e6f745f636c61696d61626c65000000000000000000000000000000006044820152606401610b64565b6013546001600160a01b03166128735760405162461bcd60e51b815260206004820152601360248201527f616464726573735f6e6f745f646566696e6564000000000000000000000000006044820152606401610b64565b60008281526016602052604090205462010000900460ff16156128d85760405162461bcd60e51b815260206004820152601260248201527f33445f616c72656164795f636c61696d656400000000000000000000000000006044820152606401610b64565b60008281526016602052604090819020805462ff000019166201000017905560135490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401611109565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061298957506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610bb057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610bb0565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129f682611cb8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316612aa85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b64565b6000612ab383611cb8565b9050806001600160a01b0316846001600160a01b03161480612aee5750836001600160a01b0316612ae384610ce0565b6001600160a01b0316145b80612b1e57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b3982611cb8565b6001600160a01b031614612bb55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b64565b6001600160a01b038216612c305760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b64565b612c3b83838361330f565b612c466000826129c1565b6001600160a01b0383166000908152600460205260408120805460019290612c6f908490614095565b90915550506001600160a01b0382166000908152600460205260408120805460019290612c9d90849061401d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008082612d0f606461ffff6140ac565b612d1991906140cd565b60408051426020808301919091526bffffffffffffffffffffffff1941606090811b82168486015244605485015233901b16607483015260888083018990528351808403909101815260a8909201909252805191012061ffff919091169150819061ffff1610949350505050565b600060195482610bb091906140f7565b600054600160a01b900460ff1615612de45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b6000612dee6133c7565b3360009081526015602052604090205490915060ff908116908290612e159085168361401d565b1115612e635760405162461bcd60e51b815260206004820152601560248201527f657863656564735f6f776e65645f7a6f6d6269657300000000000000000000006044820152606401610b64565b6000612e6e60095490565b905060005b8460ff16811015612ed857612e8c33611b83838561401d565b336000908152601560205260408120805460019290612eaf90849060ff16614116565b92506101000a81548160ff021916908360ff16021790555080612ed190614035565b9050612e73565b5050505050565b600054600160a01b900460ff1615612f2c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b81816000612f3a8383613452565b905080612f895760405162461bcd60e51b815260206004820152600f60248201527f6e6f745f77686974656c697374656400000000000000000000000000000000006044820152606401610b64565b3360009081526017602052604090205460ff1615612fe95760405162461bcd60e51b815260206004820152600f60248201527f616c72656164795f636c61696d656400000000000000000000000000000000006044820152606401610b64565b612ff633611b8360095490565b5050336000908152601760205260409020805460ff19166001179055505050565b6118d68282604051806020016040528060008152506134ce565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156130e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b64565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61315b848484612b26565b6131678484848461354c565b611b985760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b6060600d8054610c5d90613f8f565b60608161321d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613247578061323181614035565b91506132409050600a8361413b565b9150613221565b60008167ffffffffffffffff81111561326257613262613d04565b6040519080825280601f01601f19166020018201604052801561328c576020820181803683370190505b5090505b8415612b1e576132a1600183614095565b91506132ae600a86613fda565b6132b990603061401d565b60f81b8183815181106132ce576132ce614050565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613308600a8661413b565b9450613290565b6001600160a01b03831661336a5761336581600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b61338d565b816001600160a01b0316836001600160a01b03161461338d5761338d8382613695565b6001600160a01b0382166133a457610ea281613732565b826001600160a01b0316826001600160a01b031614610ea257610ea282826137e1565b600f546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344d9190613fee565b905090565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190603401604051602081830303815290604052805190602001209050612b1e84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050613825565b6134d8838361383b565b6134e5600084848461354c565b610ea25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b60006001600160a01b0384163b1561368a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061359090339089908890889060040161414f565b6020604051808303816000875af19250505080156135cb575060408051601f3d908101601f191682019092526135c89181019061418b565b60015b613670573d8080156135f9576040519150601f19603f3d011682016040523d82523d6000602084013e6135fe565b606091505b5080516136685760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612b1e565b506001949350505050565b600060016136a284611d43565b6136ac9190614095565b6000838152600860205260409020549091508082146136ff576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061374490600190614095565b6000838152600a60205260408120546009805493945090928490811061376c5761376c614050565b90600052602060002001549050806009838154811061378d5761378d614050565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806137c5576137c56141a8565b6001900381819060005260206000200160009055905550505050565b60006137ec83611d43565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6000826138328584613989565b14949350505050565b6001600160a01b0382166138915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b64565b6000818152600360205260409020546001600160a01b0316156138f65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b64565b6139026000838361330f565b6001600160a01b038216600090815260046020526040812080546001929061392b90849061401d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611eb05760008582815181106139ab576139ab614050565b602002602001015190508083116139ed576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613a1a565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080613a2581614035565b91505061398e565b828054613a3990613f8f565b90600052602060002090601f016020900481019282613a5b5760008555613aa1565b82601f10613a7457805160ff1916838001178555613aa1565b82800160010185558215613aa1579182015b82811115613aa1578251825591602001919060010190613a86565b50613aad929150613ab1565b5090565b5b80821115613aad5760008155600101613ab2565b600060208284031215613ad857600080fd5b5035919050565b6001600160e01b0319811681146126b957600080fd5b600060208284031215613b0757600080fd5b813561242d81613adf565b80356001600160a01b0381168114613b2957600080fd5b919050565b60008060008060808587031215613b4457600080fd5b613b4d85613b12565b9350613b5b60208601613b12565b9250613b6960408601613b12565b9150613b7760608601613b12565b905092959194509250565b60005b83811015613b9d578181015183820152602001613b85565b83811115611b985750506000910152565b60008151808452613bc6816020860160208601613b82565b601f01601f19169290920160200192915050565b60208152600061242d6020830184613bae565b60008060408385031215613c0057600080fd5b613c0983613b12565b946020939093013593505050565b600080600060608486031215613c2c57600080fd5b613c3584613b12565b9250613c4360208501613b12565b9150604084013590509250925092565b60008083601f840112613c6557600080fd5b50813567ffffffffffffffff811115613c7d57600080fd5b6020830191508360208260051b8501011115613c9857600080fd5b9250929050565b803560ff81168114613b2957600080fd5b600080600060408486031215613cc557600080fd5b833567ffffffffffffffff811115613cdc57600080fd5b613ce886828701613c53565b9094509250613cfb905060208501613c9f565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613d3557613d35613d04565b604051601f8501601f19908116603f01168101908282118183101715613d5d57613d5d613d04565b81604052809350858152868686011115613d7657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613da257600080fd5b813567ffffffffffffffff811115613db957600080fd5b8201601f81018413613dca57600080fd5b612b1e84823560208401613d1a565b600060208284031215613deb57600080fd5b61242d82613b12565b6020808252825182820181905260009190848201906040850190845b81811015613e2c57835183529284019291840191600101613e10565b50909695505050505050565b60008060208385031215613e4b57600080fd5b823567ffffffffffffffff811115613e6257600080fd5b613e6e85828601613c53565b90969095509350505050565b60008060408385031215613e8d57600080fd5b613e9683613b12565b915060208301358015158114613eab57600080fd5b809150509250929050565b60008060008060808587031215613ecc57600080fd5b613ed585613b12565b9350613ee360208601613b12565b925060408501359150606085013567ffffffffffffffff811115613f0657600080fd5b8501601f81018713613f1757600080fd5b613f2687823560208401613d1a565b91505092959194509250565b60008060408385031215613f4557600080fd5b613f4e83613b12565b9150613f5c60208401613c9f565b90509250929050565b60008060408385031215613f7857600080fd5b613f8183613b12565b9150613f5c60208401613b12565b600181811c90821680613fa357607f821691505b60208210811415611f4357634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613fe957613fe9613fc4565b500690565b60006020828403121561400057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561403057614030614007565b500190565b600060001982141561404957614049614007565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008351614078818460208801613b82565b83519083019061408c818360208801613b82565b01949350505050565b6000828210156140a7576140a7614007565b500390565b600061ffff808416806140c1576140c1613fc4565b92169190910492915050565b600061ffff808316818516818304811182151516156140ee576140ee614007565b02949350505050565b600081600019048311821515161561411157614111614007565b500290565b600060ff821660ff84168060ff0382111561413357614133614007565b019392505050565b60008261414a5761414a613fc4565b500490565b60006001600160a01b038087168352808616602084015250836040830152608060608301526141816080830184613bae565b9695505050505050565b60006020828403121561419d57600080fd5b815161242d81613adf565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a164736f6c634300080c000a000000000000000000000000daf2760578f4bcc52b1f451b5b8b04d3dc49c9fb

Deployed Bytecode

0x6080604052600436106103755760003560e01c80637e79a565116101d1578063bc8893b411610102578063cef216e2116100a0578063e985e9c51161006f578063e985e9c514610a81578063f22c64bd14610aca578063f2fde38b14610ae0578063f85317c614610b0057600080fd5b8063cef216e214610a0c578063d78055dc14610a21578063e209e02f14610a41578063e3e184eb14610a6157600080fd5b8063c470db1c116100dc578063c470db1c14610986578063c87b56dd1461099c578063c97c6c49146109bc578063c9d87e69146109ec57600080fd5b8063bc8893b41461092c578063bfe1092814610946578063c010d2d21461096657600080fd5b80639d9fabec1161016f578063aa88ee6611610149578063aa88ee6614610842578063ab72e0bf146108cc578063b88d4fde146108ec578063bc30a6181461090c57600080fd5b80639d9fabec146107c0578063a22cb46514610802578063a34101ea1461082257600080fd5b80638a3ce0ab116101ab5780638a3ce0ab146107585780638da5cb5b1461076d578063925489a81461078b57806395d89b41146107ab57600080fd5b80637e79a565146106f65780638462151c14610716578063880846051461074357600080fd5b80633eee5eb8116102ab5780635c975abb11610249578063662ad59b11610223578063662ad59b1461068b5780636817c76c146106ab57806370a08231146106c1578063715018a6146106e157600080fd5b80635c975abb1461062c5780635f7966e11461064b5780636352211e1461066b57600080fd5b80634f6ccce7116102855780634f6ccce7146105ac57806351d8b423146105cc57806355f804b3146105ec57806359bad07c1461060c57600080fd5b80633eee5eb81461055857806342842e0e1461056b57806346ee89d61461058b57600080fd5b80630c1f1e9e1161031857806323b872dd116102f257806323b872dd146104e35780632f745c5914610503578063379607f5146105235780633ccfd60b1461054357600080fd5b80630c1f1e9e1461048557806313cd8fb0146104a457806318160ddd146104c457600080fd5b806306552ff31161035457806306552ff3146103eb57806306fdde031461040b578063081812fc1461042d578063095ea7b31461046557600080fd5b8062728e461461037a57806301ffc9a71461039c57806302ce5813146103d1575b600080fd5b34801561038657600080fd5b5061039a610395366004613ac6565b610b20565b005b3480156103a857600080fd5b506103bc6103b7366004613af5565b610b72565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b50600b546103bc9060ff1681565b3480156103f757600080fd5b5061039a610406366004613b2e565b610bb6565b34801561041757600080fd5b50610420610c4e565b6040516103c89190613bda565b34801561043957600080fd5b5061044d610448366004613ac6565b610ce0565b6040516001600160a01b0390911681526020016103c8565b34801561047157600080fd5b5061039a610480366004613bed565b610d75565b34801561049157600080fd5b506018546103bc90610100900460ff1681565b3480156104b057600080fd5b5061039a6104bf366004613ac6565b610ea7565b3480156104d057600080fd5b506009545b6040519081526020016103c8565b3480156104ef57600080fd5b5061039a6104fe366004613c17565b61113f565b34801561050f57600080fd5b506104d561051e366004613bed565b6111c6565b34801561052f57600080fd5b5061039a61053e366004613ac6565b61126e565b34801561054f57600080fd5b5061039a6118da565b61039a610566366004613cb0565b611951565b34801561057757600080fd5b5061039a610586366004613c17565b611b9e565b34801561059757600080fd5b506018546103bc906301000000900460ff1681565b3480156105b857600080fd5b506104d56105c7366004613ac6565b611bb9565b3480156105d857600080fd5b5060115461044d906001600160a01b031681565b3480156105f857600080fd5b5061039a610607366004613d90565b611c5d565b34801561061857600080fd5b50600e5461044d906001600160a01b031681565b34801561063857600080fd5b50600054600160a01b900460ff166103bc565b34801561065757600080fd5b50600f5461044d906001600160a01b031681565b34801561067757600080fd5b5061044d610686366004613ac6565b611cb8565b34801561069757600080fd5b5060125461044d906001600160a01b031681565b3480156106b757600080fd5b506104d560195481565b3480156106cd57600080fd5b506104d56106dc366004613dd9565b611d43565b3480156106ed57600080fd5b5061039a611ddd565b34801561070257600080fd5b5060135461044d906001600160a01b031681565b34801561072257600080fd5b50610736610731366004613dd9565b611e31565b6040516103c89190613df4565b34801561074f57600080fd5b5061039a611f49565b34801561076457600080fd5b5061039a611fa5565b34801561077957600080fd5b506000546001600160a01b031661044d565b34801561079757600080fd5b5061039a6107a6366004613e38565b612060565b3480156107b757600080fd5b506104206120e9565b3480156107cc57600080fd5b506107f06107db366004613dd9565b60156020526000908152604090205460ff1681565b60405160ff90911681526020016103c8565b34801561080e57600080fd5b5061039a61081d366004613e7a565b6120f8565b34801561082e57600080fd5b5061039a61083d366004613dd9565b612103565b34801561084e57600080fd5b5061089a61085d366004613ac6565b60166020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000009091041685565b60408051951515865293151560208601529115159284019290925290151560608301521515608082015260a0016103c8565b3480156108d857600080fd5b5061039a6108e7366004613ac6565b61217f565b3480156108f857600080fd5b5061039a610907366004613eb6565b612259565b34801561091857600080fd5b5061039a610927366004613dd9565b6122e1565b34801561093857600080fd5b506018546103bc9060ff1681565b34801561095257600080fd5b5060145461044d906001600160a01b031681565b34801561097257600080fd5b506018546103bc9062010000900460ff1681565b34801561099257600080fd5b506104d561271081565b3480156109a857600080fd5b506104206109b7366004613ac6565b61234b565b3480156109c857600080fd5b506103bc6109d7366004613dd9565b60176020526000908152604090205460ff1681565b3480156109f857600080fd5b5060105461044d906001600160a01b031681565b348015610a1857600080fd5b5061039a612434565b348015610a2d57600080fd5b5061039a610a3c366004613f32565b612496565b348015610a4d57600080fd5b5061039a610a5c366004613dd9565b612509565b348015610a6d57600080fd5b5061039a610a7c366004613ac6565b612587565b348015610a8d57600080fd5b506103bc610a9c366004613f65565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610ad657600080fd5b506104d5601a5481565b348015610aec57600080fd5b5061039a610afb366004613dd9565b6125ec565b348015610b0c57600080fd5b5061039a610b1b366004613ac6565b6126bc565b6000546001600160a01b03163314610b6d5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf83398151915260448201526064015b60405180910390fd5b601955565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610bb05750610bb082612926565b92915050565b6000546001600160a01b03163314610bfe5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601480546001600160a01b039586166001600160a01b03199182161790915560108054948616948216949094179093556011805492851692841692909217909155600e8054919093169116179055565b606060018054610c5d90613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8990613f8f565b8015610cd65780601f10610cab57610100808354040283529160200191610cd6565b820191906000526020600020905b815481529060010190602001808311610cb957829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610d595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b64565b506000908152600560205260409020546001600160a01b031690565b6000610d8082611cb8565b9050806001600160a01b0316836001600160a01b03161415610e0a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b64565b336001600160a01b0382161480610e265750610e268133610a9c565b610e985760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b64565b610ea283836129c1565b505050565b600054600160a01b900460ff1615610ef45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b8080610eff60095490565b1015610f4d5760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b33610f5782611cb8565b6001600160a01b031614610fad5760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b60185462010000900460ff166110055760405162461bcd60e51b815260206004820152601360248201527f706978656c5f6e6f745f636c61696d61626c65000000000000000000000000006044820152606401610b64565b6012546001600160a01b031661105d5760405162461bcd60e51b815260206004820152601360248201527f616464726573735f6e6f745f646566696e6564000000000000000000000000006044820152606401610b64565b600082815260166020526040902054610100900460ff16156110c15760405162461bcd60e51b815260206004820152601560248201527f706978656c5f616c72656164795f636c61696d656400000000000000000000006044820152606401610b64565b60008281526016602052604090819020805461ff00191661010017905560125490516304190d0560e31b81523360048201526001600160a01b03909116906320c86828906024015b600060405180830381600087803b15801561112357600080fd5b505af1158015611137573d6000803e3d6000fd5b505050505050565b6111493382612a2f565b6111bb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b64565b610ea2838383612b26565b60006111d183611d43565b82106112455760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b64565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600054600160a01b900460ff16156112bb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b80806112c660095490565b10156113145760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b3361131e82611cb8565b6001600160a01b0316146113745760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b60008281526016602052604090205460ff1680156113a757506000828152601660205260409020546301000000900460ff165b80156113c95750600082815260166020526040902054640100000000900460ff165b156114165760405162461bcd60e51b815260206004820152601360248201527f6b65795f616c72656164795f636c61696d6564000000000000000000000000006044820152606401610b64565b6010546001600160a01b031661146e5760405162461bcd60e51b815260206004820152601a60248201527f6369746965735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b6011546001600160a01b03166114c65760405162461bcd60e51b815260206004820152601a60248201527f68756d616e735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b600e546001600160a01b031661151e5760405162461bcd60e51b815260206004820152601a60248201527f627261696e735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b60008281526016602052604090205460ff16158015611543575061154382601e612cfe565b156115c45760008281526016602052604090819020805460ff1916600117905560105490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401600060405180830381600087803b1580156115a757600080fd5b505af11580156115bb573d6000803e3d6000fd5b505050506115de565b6000828152601660205260409020805460ff191660011790555b6000828152601660205260409020546301000000900460ff166116ad5761160682600a612cfe565b1561168d5760008281526016602052604090819020805463ff0000001916630100000017905560115490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401600060405180830381600087803b15801561167057600080fd5b505af1158015611684573d6000803e3d6000fd5b505050506116ad565b6000828152601660205260409020805463ff000000191663010000001790555b600082815260166020526040902054640100000000900460ff166118d657601a5460408051426020808301919091526bffffffffffffffffffffffff1941606090811b82168486015244605485015233901b16607483015260888083018790528351808403909101815260a89092019092528051910120600091906117329190613fda565b9050601460009054906101000a90046001600160a01b03166001600160a01b031663604e53bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190613fee565b81111561182c57601460009054906101000a90046001600160a01b03166001600160a01b031663604e53bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118299190613fee565b90505b6000838152601660205260409020805464ff0000000019166401000000001790558061185757505050565b6014546040517ffdd59fb0000000000000000000000000000000000000000000000000000000008152336004820152602481018390526001600160a01b039091169063fdd59fb090604401600060405180830381600087803b1580156118bc57600080fd5b505af11580156118d0573d6000803e3d6000fd5b50505050505b5050565b6000546001600160a01b031633146119225760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6040514790339082156108fc029083906000818181858888f193505050501580156118d6573d6000803e3d6000fd5b600054600160a01b900460ff161561199e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b60008160ff16116119f15760405162461bcd60e51b815260206004820152600b60248201527f616d6f756e745f7a65726f0000000000000000000000000000000000000000006044820152606401610b64565b6127108160ff16611a0160095490565b611a0b919061401d565b1115611a595760405162461bcd60e51b815260206004820152600f60248201527f6d61785f6b6579735f6d696e74656400000000000000000000000000000000006044820152606401610b64565b601854610100900460ff1680611a715750600b5460ff165b80611a7e575060185460ff165b611aca5760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f6163746976655f73616c650000000000000000000000000000000000006044820152606401610b64565b600b5460ff16611b2f57611ae08160ff16612d87565b341015611b2f5760405162461bcd60e51b815260206004820152601060248201527f6e6f745f656e6f7567685f6574686572000000000000000000000000000000006044820152606401610b64565b601854610100900460ff1615611b4857610ea281612d97565b600b5460ff1615611b5d57610ea28383612edf565b60185460ff1615610ea25760005b8160ff16811015611b9857611b8833611b8360095490565b613017565b611b9181614035565b9050611b6b565b50505050565b610ea283838360405180602001604052806000815250612259565b6000611bc460095490565b8210611c385760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b64565b60098281548110611c4b57611c4b614050565b90600052602060002001549050919050565b6000546001600160a01b03163314611ca55760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b80516118d690600d906020840190613a2d565b6000818152600360205260408120546001600160a01b031680610bb05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b64565b60006001600160a01b038216611dc15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b64565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e255760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b611e2f6000613031565b565b60606001600160a01b038216611e895760405162461bcd60e51b815260206004820152601260248201527f6f776e65725f7a65726f5f6164647265737300000000000000000000000000006044820152606401610b64565b6000611e9483611d43565b905060008111611eb85760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115611ed357611ed3613d04565b604051908082528060200260200182016040528015611efc578160200160208202803683370190505b50905060005b82811015611eb057611f1485826111c6565b828281518110611f2657611f26614050565b602090810291909101015280611f3b81614035565b915050611f02565b50919050565b6000546001600160a01b03163314611f915760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805460ff19811660ff90911615179055565b6000546001600160a01b03163314611fed5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601854610100900460ff16156120455760405162461bcd60e51b815260206004820152601060248201527f77686974656c6973745f616374697665000000000000000000000000000000006044820152606401610b64565b60188054600b805460ff1916905561ffff1916610100179055565b600054600160a01b900460ff16156120ad5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b60005b81811015610ea2576120d98383838181106120cd576120cd614050565b9050602002013561126e565b6120e281614035565b90506120b0565b606060028054610c5d90613f8f565b6118d6338383613081565b6000546001600160a01b0316331461214b5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805462ff0000191662010000179055601280546001600160a01b039092166001600160a01b0319909216919091179055565b6000546001600160a01b031633146121c75760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b806122145760405162461bcd60e51b815260206004820152601360248201527f696e76616c69645f6d65726b6c655f726f6f74000000000000000000000000006044820152606401610b64565b600c80549082905560408051828152602081018490527fdcb1e348ba8cda63787073d01657a7f6e113519a1ea18699595731e5a31bedf2910160405180910390a15050565b6122633383612a2f565b6122d55760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b64565b611b9884848484613150565b6000546001600160a01b031633146123295760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600360205260409020546060906001600160a01b03166123d85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b64565b60006123e26131ce565b90506000815111612402576040518060200160405280600081525061242d565b8061240c846131dd565b60405160200161241d929190614066565b6040516020818303038152906040525b9392505050565b6000546001600160a01b0316331461247c5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805461ffff19169055600b805460ff19166001179055565b6000546001600160a01b031633146124de5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b60005b8160ff16811015610ea2576124f983611b8360095490565b61250281614035565b90506124e1565b6000546001600160a01b031633146125515760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805463ff00000019166301000000179055601380546001600160a01b039092166001600160a01b0319909216919091179055565b6000546001600160a01b031633146125cf5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601955600b805460ff191690556018805461ffff19166001179055565b6000546001600160a01b031633146126345760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6001600160a01b0381166126b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b64565b6126b981613031565b50565b600054600160a01b900460ff16156127095760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b808061271460095490565b10156127625760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b3361276c82611cb8565b6001600160a01b0316146127c25760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b6018546301000000900460ff1661281b5760405162461bcd60e51b815260206004820152601060248201527f33645f6e6f745f636c61696d61626c65000000000000000000000000000000006044820152606401610b64565b6013546001600160a01b03166128735760405162461bcd60e51b815260206004820152601360248201527f616464726573735f6e6f745f646566696e6564000000000000000000000000006044820152606401610b64565b60008281526016602052604090205462010000900460ff16156128d85760405162461bcd60e51b815260206004820152601260248201527f33445f616c72656164795f636c61696d656400000000000000000000000000006044820152606401610b64565b60008281526016602052604090819020805462ff000019166201000017905560135490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401611109565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061298957506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610bb057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610bb0565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129f682611cb8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316612aa85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b64565b6000612ab383611cb8565b9050806001600160a01b0316846001600160a01b03161480612aee5750836001600160a01b0316612ae384610ce0565b6001600160a01b0316145b80612b1e57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b3982611cb8565b6001600160a01b031614612bb55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b64565b6001600160a01b038216612c305760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b64565b612c3b83838361330f565b612c466000826129c1565b6001600160a01b0383166000908152600460205260408120805460019290612c6f908490614095565b90915550506001600160a01b0382166000908152600460205260408120805460019290612c9d90849061401d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008082612d0f606461ffff6140ac565b612d1991906140cd565b60408051426020808301919091526bffffffffffffffffffffffff1941606090811b82168486015244605485015233901b16607483015260888083018990528351808403909101815260a8909201909252805191012061ffff919091169150819061ffff1610949350505050565b600060195482610bb091906140f7565b600054600160a01b900460ff1615612de45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b6000612dee6133c7565b3360009081526015602052604090205490915060ff908116908290612e159085168361401d565b1115612e635760405162461bcd60e51b815260206004820152601560248201527f657863656564735f6f776e65645f7a6f6d6269657300000000000000000000006044820152606401610b64565b6000612e6e60095490565b905060005b8460ff16811015612ed857612e8c33611b83838561401d565b336000908152601560205260408120805460019290612eaf90849060ff16614116565b92506101000a81548160ff021916908360ff16021790555080612ed190614035565b9050612e73565b5050505050565b600054600160a01b900460ff1615612f2c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b81816000612f3a8383613452565b905080612f895760405162461bcd60e51b815260206004820152600f60248201527f6e6f745f77686974656c697374656400000000000000000000000000000000006044820152606401610b64565b3360009081526017602052604090205460ff1615612fe95760405162461bcd60e51b815260206004820152600f60248201527f616c72656164795f636c61696d656400000000000000000000000000000000006044820152606401610b64565b612ff633611b8360095490565b5050336000908152601760205260409020805460ff19166001179055505050565b6118d68282604051806020016040528060008152506134ce565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156130e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b64565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61315b848484612b26565b6131678484848461354c565b611b985760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b6060600d8054610c5d90613f8f565b60608161321d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613247578061323181614035565b91506132409050600a8361413b565b9150613221565b60008167ffffffffffffffff81111561326257613262613d04565b6040519080825280601f01601f19166020018201604052801561328c576020820181803683370190505b5090505b8415612b1e576132a1600183614095565b91506132ae600a86613fda565b6132b990603061401d565b60f81b8183815181106132ce576132ce614050565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613308600a8661413b565b9450613290565b6001600160a01b03831661336a5761336581600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b61338d565b816001600160a01b0316836001600160a01b03161461338d5761338d8382613695565b6001600160a01b0382166133a457610ea281613732565b826001600160a01b0316826001600160a01b031614610ea257610ea282826137e1565b600f546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344d9190613fee565b905090565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190603401604051602081830303815290604052805190602001209050612b1e84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050613825565b6134d8838361383b565b6134e5600084848461354c565b610ea25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b60006001600160a01b0384163b1561368a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061359090339089908890889060040161414f565b6020604051808303816000875af19250505080156135cb575060408051601f3d908101601f191682019092526135c89181019061418b565b60015b613670573d8080156135f9576040519150601f19603f3d011682016040523d82523d6000602084013e6135fe565b606091505b5080516136685760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612b1e565b506001949350505050565b600060016136a284611d43565b6136ac9190614095565b6000838152600860205260409020549091508082146136ff576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061374490600190614095565b6000838152600a60205260408120546009805493945090928490811061376c5761376c614050565b90600052602060002001549050806009838154811061378d5761378d614050565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806137c5576137c56141a8565b6001900381819060005260206000200160009055905550505050565b60006137ec83611d43565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6000826138328584613989565b14949350505050565b6001600160a01b0382166138915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b64565b6000818152600360205260409020546001600160a01b0316156138f65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b64565b6139026000838361330f565b6001600160a01b038216600090815260046020526040812080546001929061392b90849061401d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611eb05760008582815181106139ab576139ab614050565b602002602001015190508083116139ed576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613a1a565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080613a2581614035565b91505061398e565b828054613a3990613f8f565b90600052602060002090601f016020900481019282613a5b5760008555613aa1565b82601f10613a7457805160ff1916838001178555613aa1565b82800160010185558215613aa1579182015b82811115613aa1578251825591602001919060010190613a86565b50613aad929150613ab1565b5090565b5b80821115613aad5760008155600101613ab2565b600060208284031215613ad857600080fd5b5035919050565b6001600160e01b0319811681146126b957600080fd5b600060208284031215613b0757600080fd5b813561242d81613adf565b80356001600160a01b0381168114613b2957600080fd5b919050565b60008060008060808587031215613b4457600080fd5b613b4d85613b12565b9350613b5b60208601613b12565b9250613b6960408601613b12565b9150613b7760608601613b12565b905092959194509250565b60005b83811015613b9d578181015183820152602001613b85565b83811115611b985750506000910152565b60008151808452613bc6816020860160208601613b82565b601f01601f19169290920160200192915050565b60208152600061242d6020830184613bae565b60008060408385031215613c0057600080fd5b613c0983613b12565b946020939093013593505050565b600080600060608486031215613c2c57600080fd5b613c3584613b12565b9250613c4360208501613b12565b9150604084013590509250925092565b60008083601f840112613c6557600080fd5b50813567ffffffffffffffff811115613c7d57600080fd5b6020830191508360208260051b8501011115613c9857600080fd5b9250929050565b803560ff81168114613b2957600080fd5b600080600060408486031215613cc557600080fd5b833567ffffffffffffffff811115613cdc57600080fd5b613ce886828701613c53565b9094509250613cfb905060208501613c9f565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613d3557613d35613d04565b604051601f8501601f19908116603f01168101908282118183101715613d5d57613d5d613d04565b81604052809350858152868686011115613d7657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613da257600080fd5b813567ffffffffffffffff811115613db957600080fd5b8201601f81018413613dca57600080fd5b612b1e84823560208401613d1a565b600060208284031215613deb57600080fd5b61242d82613b12565b6020808252825182820181905260009190848201906040850190845b81811015613e2c57835183529284019291840191600101613e10565b50909695505050505050565b60008060208385031215613e4b57600080fd5b823567ffffffffffffffff811115613e6257600080fd5b613e6e85828601613c53565b90969095509350505050565b60008060408385031215613e8d57600080fd5b613e9683613b12565b915060208301358015158114613eab57600080fd5b809150509250929050565b60008060008060808587031215613ecc57600080fd5b613ed585613b12565b9350613ee360208601613b12565b925060408501359150606085013567ffffffffffffffff811115613f0657600080fd5b8501601f81018713613f1757600080fd5b613f2687823560208401613d1a565b91505092959194509250565b60008060408385031215613f4557600080fd5b613f4e83613b12565b9150613f5c60208401613c9f565b90509250929050565b60008060408385031215613f7857600080fd5b613f8183613b12565b9150613f5c60208401613b12565b600181811c90821680613fa357607f821691505b60208210811415611f4357634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613fe957613fe9613fc4565b500690565b60006020828403121561400057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561403057614030614007565b500190565b600060001982141561404957614049614007565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008351614078818460208801613b82565b83519083019061408c818360208801613b82565b01949350505050565b6000828210156140a7576140a7614007565b500390565b600061ffff808416806140c1576140c1613fc4565b92169190910492915050565b600061ffff808316818516818304811182151516156140ee576140ee614007565b02949350505050565b600081600019048311821515161561411157614111614007565b500290565b600060ff821660ff84168060ff0382111561413357614133614007565b019392505050565b60008261414a5761414a613fc4565b500490565b60006001600160a01b038087168352808616602084015250836040830152608060608301526141816080830184613bae565b9695505050505050565b60006020828403121561419d57600080fd5b815161242d81613adf565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a164736f6c634300080c000a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000daf2760578f4bcc52b1f451b5b8b04d3dc49c9fb

-----Decoded View---------------
Arg [0] : genesis (address): 0xDAF2760578f4bCc52B1F451b5b8b04d3Dc49c9FB

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000daf2760578f4bcc52b1f451b5b8b04d3dc49c9fb


Deployed Bytecode Sourcemap

569:9089:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7664:105;;;;;;;;;;-1:-1:-1;7664:105:20;;;;;:::i;:::-;;:::i;:::-;;990:222:8;;;;;;;;;;-1:-1:-1;990:222:8;;;;;:::i;:::-;;:::i;:::-;;;796:14:22;;789:22;771:41;;759:2;744:18;990:222:8;;;;;;;;227:27:21;;;;;;;;;;-1:-1:-1;227:27:21;;;;;;;;1742:290:20;;;;;;;;;;-1:-1:-1;1742:290:20;;;;;:::i;:::-;;:::i;2473:98:5:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3984:217::-;;;;;;;;;;-1:-1:-1;3984:217:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2353:55:22;;;2335:74;;2323:2;2308:18;3984:217:5;2189:226:22;3522:401:5;;;;;;;;;;-1:-1:-1;3522:401:5;;;;;:::i;:::-;;:::i;1302:33:20:-;;;;;;;;;;-1:-1:-1;1302:33:20;;;;;;;;;;;4409:384;;;;;;;;;;-1:-1:-1;4409:384:20;;;;;:::i;:::-;;:::i;1615:111:8:-;;;;;;;;;;-1:-1:-1;1702:10:8;:17;1615:111;;;2825:25:22;;;2813:2;2798:18;1615:111:8;2679:177:22;4711:330:5;;;;;;;;;;-1:-1:-1;4711:330:5;;;;;:::i;:::-;;:::i;1291:253:8:-;;;;;;;;;;-1:-1:-1;1291:253:8;;;;;:::i;:::-;;:::i;2221:1492:20:-;;;;;;;;;;-1:-1:-1;2221:1492:20;;;;;:::i;:::-;;:::i;9310:142::-;;;;;;;;;;;;;:::i;4801:759::-;;;;;;:::i;:::-;;:::i;5107:179:5:-;;;;;;;;;;-1:-1:-1;5107:179:5;;;;;:::i;:::-;;:::i;1376:27:20:-;;;;;;;;;;-1:-1:-1;1376:27:20;;;;;;;;;;;1798:230:8;;;;;;;;;;-1:-1:-1;1798:230:8;;;;;:::i;:::-;;:::i;944:27:20:-;;;;;;;;;;-1:-1:-1;944:27:20;;;;-1:-1:-1;;;;;944:27:20;;;8494:90;;;;;;;;;;-1:-1:-1;8494:90:20;;;;;:::i;:::-;;:::i;854:20::-;;;;;;;;;;-1:-1:-1;854:20:20;;;;-1:-1:-1;;;;;854:20:20;;;1098:84:1;;;;;;;;;;-1:-1:-1;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1098:84;;881:22:20;;;;;;;;;;-1:-1:-1;881:22:20;;;;-1:-1:-1;;;;;881:22:20;;;2176:235:5;;;;;;;;;;-1:-1:-1;2176:235:5;;;;;:::i;:::-;;:::i;978:27:20:-;;;;;;;;;;-1:-1:-1;978:27:20;;;;-1:-1:-1;;;;;978:27:20;;;1412:24;;;;;;;;;;;;;;;;1914:205:5;;;;;;;;;;-1:-1:-1;1914:205:5;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;1012:27:20:-;;;;;;;;;;-1:-1:-1;1012:27:20;;;;-1:-1:-1;;;;;1012:27:20;;;8700:602;;;;;;;;;;-1:-1:-1;8700:602:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7415:100::-;;;;;;;;;;;;;:::i;7174:233::-;;;;;;;;;;;;;:::i;1036:85:0:-;;;;;;;;;;-1:-1:-1;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;1036:85;;2040:173:20;;;;;;;;;;-1:-1:-1;2040:173:20;;;;;:::i;:::-;;:::i;2635:102:5:-;;;;;;;;;;;;;:::i;1094:52:20:-;;;;;;;;;;-1:-1:-1;1094:52:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7708:4:22;7696:17;;;7678:36;;7666:2;7651:18;1094:52:20;7536:184:22;4268:153:5;;;;;;;;;;-1:-1:-1;4268:153:5;;;;;:::i;:::-;;:::i;3872:144:20:-;;;;;;;;;;-1:-1:-1;3872:144:20;;;;;:::i;:::-;;:::i;1153:45::-;;;;;;;;;;-1:-1:-1;1153:45:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8331:14:22;;8324:22;8306:41;;8390:14;;8383:22;8378:2;8363:18;;8356:50;8449:14;;8442:22;8422:18;;;8415:50;;;;8508:14;;8501:22;8496:2;8481:18;;8474:50;8568:14;8561:22;8555:3;8540:19;;8533:51;8293:3;8278:19;1153:45:20;8077:513:22;5741:290:20;;;;;;;;;;-1:-1:-1;5741:290:20;;;;;:::i;:::-;;:::i;5352:320:5:-;;;;;;;;;;-1:-1:-1;5352:320:5;;;;;:::i;:::-;;:::i;7523:133:20:-;;;;;;;;;;-1:-1:-1;7523:133:20;;;;;:::i;:::-;;:::i;1267:28::-;;;;;;;;;;-1:-1:-1;1267:28:20;;;;;;;;1048:37;;;;;;;;;;-1:-1:-1;1048:37:20;;;;-1:-1:-1;;;;;1048:37:20;;;1342:27;;;;;;;;;;-1:-1:-1;1342:27:20;;;;;;;;;;;1490:40;;;;;;;;;;;;1525:5;1490:40;;2803:329:5;;;;;;;;;;-1:-1:-1;2803:329:5;;;;;:::i;:::-;;:::i;1205:53:20:-;;;;;;;;;;-1:-1:-1;1205:53:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;910:27;;;;;;;;;;-1:-1:-1;910:27:20;;;;-1:-1:-1;;;;;910:27:20;;;6782:164;;;;;;;;;;;;;:::i;5568:165::-;;;;;;;;;;-1:-1:-1;5568:165:20;;;;;:::i;:::-;;:::i;3721:143::-;;;;;;;;;;-1:-1:-1;3721:143:20;;;;;:::i;:::-;;:::i;6954:212::-;;;;;;;;;;-1:-1:-1;6954:212:20;;;;;:::i;:::-;;:::i;4487:162:5:-;;;;;;;;;;-1:-1:-1;4487:162:5;;;;;:::i;:::-;-1:-1:-1;;;;;4607:25:5;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4487:162;1443:38:20;;;;;;;;;;;;;;;;1918:198:0;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;4024:377:20:-;;;;;;;;;;-1:-1:-1;4024:377:20;;;;;:::i;:::-;;:::i;7664:105::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;;;;;;;;;7739:9:20::1;:22:::0;7664:105::o;990:222:8:-;1092:4;-1:-1:-1;;;;;;1115:50:8;;1130:35;1115:50;;:90;;;1169:36;1193:11;1169:23;:36::i;:::-;1108:97;990:222;-1:-1:-1;;990:222:8:o;1742:290:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;1859:11:20::1;:46:::0;;-1:-1:-1;;;;;1859:46:20;;::::1;-1:-1:-1::0;;;;;;1859:46:20;;::::1;;::::0;;;1916:6:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;1958:6:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;2000:6:::1;:24:::0;;;;;::::1;::::0;::::1;;::::0;;1742:290::o;2473:98:5:-;2527:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:98;:::o;3984:217::-;4060:7;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:5;4079:73;;;;-1:-1:-1;;;4079:73:5;;11241:2:22;4079:73:5;;;11223:21:22;11280:2;11260:18;;;11253:30;11319:34;11299:18;;;11292:62;-1:-1:-1;;;11370:18:22;;;11363:42;11422:19;;4079:73:5;11039:408:22;4079:73:5;-1:-1:-1;4170:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4170:24:5;;3984:217::o;3522:401::-;3602:13;3618:23;3633:7;3618:14;:23::i;:::-;3602:39;;3665:5;-1:-1:-1;;;;;3659:11:5;:2;-1:-1:-1;;;;;3659:11:5;;;3651:57;;;;-1:-1:-1;;;3651:57:5;;11654:2:22;3651:57:5;;;11636:21:22;11693:2;11673:18;;;11666:30;11732:34;11712:18;;;11705:62;11803:3;11783:18;;;11776:31;11824:19;;3651:57:5;11452:397:22;3651:57:5;719:10:12;-1:-1:-1;;;;;3740:21:5;;;;:62;;-1:-1:-1;3765:37:5;3782:5;719:10:12;4487:162:5;:::i;3765:37::-;3719:165;;;;-1:-1:-1;;;3719:165:5;;12056:2:22;3719:165:5;;;12038:21:22;12095:2;12075:18;;;12068:30;12134:34;12114:18;;;12107:62;12205:26;12185:18;;;12178:54;12249:19;;3719:165:5;11854:420:22;3719:165:5;3895:21;3904:2;3908:7;3895:8;:21::i;:::-;3592:331;3522:401;;:::o;4409:384:20:-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;4477:7:20::1;9530;9513:13;1702:10:8::0;:17;;1615:111;9513:13:20::1;:24;;9505:57;;;::::0;-1:-1:-1;;;9505:57:20;;12826:2:22;9505:57:20::1;::::0;::::1;12808:21:22::0;12865:2;12845:18;;;12838:30;12904:22;12884:18;;;12877:50;12944:18;;9505:57:20::1;12624:344:22::0;9505:57:20::1;9601:10;9581:16;9589:7:::0;9581::::1;:16::i;:::-;-1:-1:-1::0;;;;;9581:30:20::1;;9573:62;;;::::0;-1:-1:-1;;;9573:62:20;;13175:2:22;9573:62:20::1;::::0;::::1;13157:21:22::0;13214:2;13194:18;;;13187:30;13253:21;13233:18;;;13226:49;13292:18;;9573:62:20::1;12973:343:22::0;9573:62:20::1;4505:15:::2;::::0;;;::::2;;;4497:47;;;::::0;-1:-1:-1;;;4497:47:20;;13523:2:22;4497:47:20::2;::::0;::::2;13505:21:22::0;13562:2;13542:18;;;13535:30;13601:21;13581:18;;;13574:49;13640:18;;4497:47:20::2;13321:343:22::0;4497:47:20::2;4571:6;::::0;-1:-1:-1;;;;;4571:6:20::2;4555:63;;;::::0;-1:-1:-1;;;4555:63:20;;13871:2:22;4555:63:20::2;::::0;::::2;13853:21:22::0;13910:2;13890:18;;;13883:30;13949:21;13929:18;;;13922:49;13988:18;;4555:63:20::2;13669:343:22::0;4555:63:20::2;4638:18;::::0;;;:9:::2;:18;::::0;;;;:31;::::2;::::0;::::2;;;4637:32;4629:66;;;::::0;-1:-1:-1;;;4629:66:20;;14219:2:22;4629:66:20::2;::::0;::::2;14201:21:22::0;14258:2;14238:18;;;14231:30;14297:23;14277:18;;;14270:51;14338:18;;4629:66:20::2;14017:345:22::0;4629:66:20::2;4706:18;::::0;;;:9:::2;:18;::::0;;;;;;:38;;-1:-1:-1;;4706:38:20::2;;;::::0;;4755:6:::2;::::0;:30;;-1:-1:-1;;;4755:30:20;;4774:10:::2;4755:30;::::0;::::2;2335:74:22::0;-1:-1:-1;;;;;4755:6:20;;::::2;::::0;:18:::2;::::0;2308::22;;4755:30:20::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;1451:1:1::1;4409:384:20::0;:::o;4711:330:5:-;4900:41;719:10:12;4933:7:5;4900:18;:41::i;:::-;4892:103;;;;-1:-1:-1;;;4892:103:5;;14569:2:22;4892:103:5;;;14551:21:22;14608:2;14588:18;;;14581:30;14647:34;14627:18;;;14620:62;14718:19;14698:18;;;14691:47;14755:19;;4892:103:5;14367:413:22;4892:103:5;5006:28;5016:4;5022:2;5026:7;5006:9;:28::i;1291:253:8:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;-1:-1:-1;;;1407:87:8;;14987:2:22;1407:87:8;;;14969:21:22;15026:2;15006:18;;;14999:30;15065:34;15045:18;;;15038:62;15136:13;15116:18;;;15109:41;15167:19;;1407:87:8;14785:407:22;1407:87:8;-1:-1:-1;;;;;;1511:19:8;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1291:253::o;2221:1492:20:-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;2282:7:20::1;9530;9513:13;1702:10:8::0;:17;;1615:111;9513:13:20::1;:24;;9505:57;;;::::0;-1:-1:-1;;;9505:57:20;;12826:2:22;9505:57:20::1;::::0;::::1;12808:21:22::0;12865:2;12845:18;;;12838:30;12904:22;12884:18;;;12877:50;12944:18;;9505:57:20::1;12624:344:22::0;9505:57:20::1;9601:10;9581:16;9589:7:::0;9581::::1;:16::i;:::-;-1:-1:-1::0;;;;;9581:30:20::1;;9573:62;;;::::0;-1:-1:-1;;;9573:62:20;;13175:2:22;9573:62:20::1;::::0;::::1;13157:21:22::0;13214:2;13194:18;;;13187:30;13253:21;13233:18;;;13226:49;13292:18;;9573:62:20::1;12973:343:22::0;9573:62:20::1;2305:18:::2;::::0;;;:9:::2;:18;::::0;;;;:30;::::2;;:65:::0;::::2;;;-1:-1:-1::0;2339:18:20::2;::::0;;;:9:::2;:18;::::0;;;;:31;;;::::2;;;2305:65;:101;;;;-1:-1:-1::0;2374:18:20::2;::::0;;;:9:::2;:18;::::0;;;;:32;;;::::2;;;2305:101;2302:162;;;2423:29;::::0;-1:-1:-1;;;2423:29:20;;15399:2:22;2423:29:20::2;::::0;::::2;15381:21:22::0;15438:2;15418:18;;;15411:30;15477:21;15457:18;;;15450:49;15516:18;;2423:29:20::2;15197:343:22::0;2302:162:20::2;2490:6;::::0;-1:-1:-1;;;;;2490:6:20::2;2474:70;;;::::0;-1:-1:-1;;;2474:70:20;;15747:2:22;2474:70:20::2;::::0;::::2;15729:21:22::0;15786:2;15766:18;;;15759:30;15825:28;15805:18;;;15798:56;15871:18;;2474:70:20::2;15545:350:22::0;2474:70:20::2;2571:6;::::0;-1:-1:-1;;;;;2571:6:20::2;2555:70;;;::::0;-1:-1:-1;;;2555:70:20;;16102:2:22;2555:70:20::2;::::0;::::2;16084:21:22::0;16141:2;16121:18;;;16114:30;16180:28;16160:18;;;16153:56;16226:18;;2555:70:20::2;15900:350:22::0;2555:70:20::2;2652:6;::::0;-1:-1:-1;;;;;2652:6:20::2;2636:70;;;::::0;-1:-1:-1;;;2636:70:20;;16457:2:22;2636:70:20::2;::::0;::::2;16439:21:22::0;16496:2;16476:18;;;16469:30;16535:28;16515:18;;;16508:56;16581:18;;2636:70:20::2;16255:350:22::0;2636:70:20::2;2721:18;::::0;;;:9:::2;:18;::::0;;;;:30;::::2;;2720:31;:62:::0;::::2;;;;2755:27;2770:7;2779:2;2755:14;:27::i;:::-;2717:246;;;2799:18;::::0;;;:9:::2;:18;::::0;;;;;;:37;;-1:-1:-1;;2799:37:20::2;2832:4;2799:37;::::0;;2851:6:::2;::::0;:30;;-1:-1:-1;;;2851:30:20;;2870:10:::2;2851:30;::::0;::::2;2335:74:22::0;-1:-1:-1;;;;;2851:6:20;;::::2;::::0;:18:::2;::::0;2308::22;;2851:30:20::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;2717:246;;;2914:18;::::0;;;:9:::2;:18;::::0;;;;:37;;-1:-1:-1;;2914:37:20::2;2947:4;2914:37;::::0;;2717:246:::2;2977:18;::::0;;;:9:::2;:18;::::0;;;;:31;;;::::2;;;2973:296;;3028:27;3043:7;3052:2;3028:14;:27::i;:::-;3025:233;;;3076:18;::::0;;;:9:::2;:18;::::0;;;;;;:38;;-1:-1:-1;;3076:38:20::2;::::0;::::2;::::0;;3133:6:::2;::::0;:30;;-1:-1:-1;;;3133:30:20;;3152:10:::2;3133:30;::::0;::::2;2335:74:22::0;-1:-1:-1;;;;;3133:6:20;;::::2;::::0;:18:::2;::::0;2308::22;;3133:30:20::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;3025:233;;;3204:18;::::0;;;:9:::2;:18;::::0;;;;:38;;-1:-1:-1;;3204:38:20::2;::::0;::::2;::::0;;3025:233:::2;3283:18;::::0;;;:9:::2;:18;::::0;;;;:32;;;::::2;;;3279:427;;3373:15;::::0;8134:88;;;8151:15;8134:88;;;;26017:19:22;;;;-1:-1:-1;;8168:14:20;26124:2:22;26120:15;;;26116:24;;26102:12;;;26095:46;8184:16:20;26157:12:22;;;26150:28;8202:10:20;26212:15:22;;26208:24;26194:12;;;26187:46;26249:13;;;;26242:29;;;8134:88:20;;;;;;;;;;26287:13:22;;;;8134:88:20;;;8124:99;;;;;3332:20:::2;::::0;3373:15;3355:33:::2;;;;:::i;:::-;3332:56;;3421:11;;;;;;;;;-1:-1:-1::0;;;;;3421:11:20::2;-1:-1:-1::0;;;;;3421:27:20::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3406:12;:44;3403:128;;;3486:11;;;;;;;;;-1:-1:-1::0;;;;;3486:11:20::2;-1:-1:-1::0;;;;;3486:27:20::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3471:44;;3403:128;3546:18;::::0;;;:9:::2;:18;::::0;;;;:39;;-1:-1:-1;;3546:39:20::2;::::0;::::2;::::0;;3603:17;3600:29:::2;;3622:7;1451:1:1::1;2221:1492:20::0;:::o;3600:29::-:2;3643:11;::::0;:51:::2;::::0;;;;3669:10:::2;3643:51;::::0;::::2;17279:74:22::0;17369:18;;;17362:34;;;-1:-1:-1;;;;;3643:11:20;;::::2;::::0;:25:::2;::::0;17252:18:22;;3643:51:20::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;3317:389;3279:427;1451:1:1::1;2221:1492:20::0;:::o;9310:142::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;9407:37:20::1;::::0;9375:21:::1;::::0;9415:10:::1;::::0;9407:37;::::1;;;::::0;9375:21;;9360:12:::1;9407:37:::0;9360:12;9407:37;9375:21;9415:10;9407:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;4801:759:::0;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;4920:1:20::1;4911:6;:10;;;4903:34;;;::::0;-1:-1:-1;;;4903:34:20;;17609:2:22;4903:34:20::1;::::0;::::1;17591:21:22::0;17648:2;17628:18;;;17621:30;17687:13;17667:18;;;17660:41;17718:18;;4903:34:20::1;17407:335:22::0;4903:34:20::1;1525:5;4972:6;4956:22;;:13;1702:10:8::0;:17;;1615:111;4956:13:20::1;:22;;;;:::i;:::-;:34;;4948:62;;;::::0;-1:-1:-1;;;4948:62:20;;18271:2:22;4948:62:20::1;::::0;::::1;18253:21:22::0;18310:2;18290:18;;;18283:30;18349:17;18329:18;;;18322:45;18384:18;;4948:62:20::1;18069:339:22::0;4948:62:20::1;5029:21;::::0;::::1;::::0;::::1;;;::::0;:40:::1;;-1:-1:-1::0;5054:15:20::1;::::0;::::1;;5029:40;:60;;;-1:-1:-1::0;5073:16:20::1;::::0;::::1;;5029:60;5021:87;;;::::0;-1:-1:-1;;;5021:87:20;;18615:2:22;5021:87:20::1;::::0;::::1;18597:21:22::0;18654:2;18634:18;;;18627:30;18693:16;18673:18;;;18666:44;18727:18;;5021:87:20::1;18413:338:22::0;5021:87:20::1;5123:15;::::0;::::1;;5119:109;;5176:19;5188:6;5176:19;;:11;:19::i;:::-;5163:9;:32;;5155:61;;;::::0;-1:-1:-1;;;5155:61:20;;18958:2:22;5155:61:20::1;::::0;::::1;18940:21:22::0;18997:2;18977:18;;;18970:30;19036:18;19016;;;19009:46;19072:18;;5155:61:20::1;18756:340:22::0;5155:61:20::1;5241:21;::::0;::::1;::::0;::::1;;;5238:315;;;5279:28;5300:6;5279:20;:28::i;5238:315::-;5328:15;::::0;::::1;;5325:228;;;5360:27;5375:11;;5360:14;:27::i;5325:228::-;5408:16;::::0;::::1;;5405:148;;;5445:9;5441:101;5459:6;5457:8;;:1;:8;5441:101;;;5490:36;5500:10;5512:13;1702:10:8::0;:17;;1615:111;5512:13:20::1;5490:9;:36::i;:::-;5466:3;::::0;::::1;:::i;:::-;;;5441:101;;;;4801:759:::0;;;:::o;5107:179:5:-;5240:39;5257:4;5263:2;5267:7;5240:39;;;;;;;;;;;;:16;:39::i;1798:230:8:-;1873:7;1908:30;1702:10;:17;;1615:111;1908:30;1900:5;:38;1892:95;;;;-1:-1:-1;;;1892:95:8;;19443:2:22;1892:95:8;;;19425:21:22;19482:2;19462:18;;;19455:30;19521:34;19501:18;;;19494:62;19592:14;19572:18;;;19565:42;19624:19;;1892:95:8;19241:408:22;1892:95:8;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;1997:24;;1798:230;;;:::o;8494:90:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;8563:13:20;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;2176:235:5:-:0;2248:7;2283:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2283:16:5;2317:19;2309:73;;;;-1:-1:-1;;;2309:73:5;;20045:2:22;2309:73:5;;;20027:21:22;20084:2;20064:18;;;20057:30;20123:34;20103:18;;;20096:62;20194:11;20174:18;;;20167:39;20223:19;;2309:73:5;19843:405:22;1914:205:5;1986:7;-1:-1:-1;;;;;2013:19:5;;2005:74;;;;-1:-1:-1;;;2005:74:5;;20455:2:22;2005:74:5;;;20437:21:22;20494:2;20474:18;;;20467:30;20533:34;20513:18;;;20506:62;20604:12;20584:18;;;20577:40;20634:19;;2005:74:5;20253:406:22;2005:74:5;-1:-1:-1;;;;;;2096:16:5;;;;;:9;:16;;;;;;;1914:205::o;1668:101:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;8700:602:20:-;8762:16;-1:-1:-1;;;;;8799:20:20;;8791:51;;;;-1:-1:-1;;;8791:51:20;;20866:2:22;8791:51:20;;;20848:21:22;20905:2;20885:18;;;20878:30;20944:20;20924:18;;;20917:48;20982:18;;8791:51:20;20664:342:22;8791:51:20;8853:18;8874:17;8884:6;8874:9;:17::i;:::-;8853:38;;8920:1;8906:10;:15;8902:393;;8983:16;;;8997:1;8983:16;;;;;;;;;;;-1:-1:-1;8976:23:20;8700:602;-1:-1:-1;;;8700:602:20:o;8902:393::-;9032:23;9072:10;9058:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9058:25:20;;9032:51;;9098:13;9126:130;9150:10;9142:5;:18;9126:130;;;9206:34;9226:6;9234:5;9206:19;:34::i;:::-;9190:6;9197:5;9190:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;9162:7;;;;:::i;:::-;;;;9126:130;;8902:393;8780:522;8700:602;;;:::o;7415:100::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;7491:16:20::1;::::0;;-1:-1:-1;;7471:36:20;::::1;7491:16;::::0;;::::1;7490:17;7471:36;::::0;;7415:100::o;7174:233::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;7249:21:20::1;::::0;::::1;::::0;::::1;;;7248:22;7240:51;;;::::0;-1:-1:-1;;;7240:51:20;;21213:2:22;7240:51:20::1;::::0;::::1;21195:21:22::0;21252:2;21232:18;;;21225:30;21291:18;21271;;;21264:46;21327:18;;7240:51:20::1;21011:340:22::0;7240:51:20::1;7302:16;:24:::0;;7337:15:::1;:23:::0;;-1:-1:-1;;7337:23:20::1;::::0;;-1:-1:-1;;7371:28:20;7302:24:::1;7371:28;::::0;;7174:233::o;2040:173::-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;2126:9:20::1;2122:84;2138:17:::0;;::::1;2122:84;;;2176:18;2182:8;;2191:1;2182:11;;;;;;;:::i;:::-;;;;;;;2176:5;:18::i;:::-;2156:3;::::0;::::1;:::i;:::-;;;2122:84;;2635:102:5::0;2691:13;2723:7;2716:14;;;;;:::i;4268:153::-;4362:52;719:10:12;4395:8:5;4405;4362:18;:52::i;3872:144:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;3945:15:20::1;:22:::0;;-1:-1:-1;;3945:22:20::1;::::0;::::1;::::0;;3978:6:::1;:30:::0;;-1:-1:-1;;;;;3978:30:20;;::::1;-1:-1:-1::0;;;;;;3978:30:20;;::::1;::::0;;;::::1;::::0;;3872:144::o;5741:290::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;5831:18:20;5823:50:::1;;;::::0;-1:-1:-1;;;5823:50:20;;21558:2:22;5823:50:20::1;::::0;::::1;21540:21:22::0;21597:2;21577:18;;;21570:30;21636:21;21616:18;;;21609:49;21675:18;;5823:50:20::1;21356:343:22::0;5823:50:20::1;5906:11;::::0;;5928:25;;;;5971:52:::1;::::0;;21878:25:22;;;21934:2;21919:18;;21912:34;;;5971:52:20::1;::::0;21851:18:22;5971:52:20::1;;;;;;;5812:219;5741:290:::0;:::o;5352:320:5:-;5521:41;719:10:12;5554:7:5;5521:18;:41::i;:::-;5513:103;;;;-1:-1:-1;;;5513:103:5;;14569:2:22;5513:103:5;;;14551:21:22;14608:2;14588:18;;;14581:30;14647:34;14627:18;;;14620:62;14718:19;14698:18;;;14691:47;14755:19;;5513:103:5;14367:413:22;5513:103:5;5626:39;5640:4;5646:2;5650:7;5659:5;5626:13;:39::i;7523:133:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;7602:11:20::1;:46:::0;;-1:-1:-1;;;;;;7602:46:20::1;-1:-1:-1::0;;;;;7602:46:20;;;::::1;::::0;;;::::1;::::0;;7523:133::o;2803:329:5:-;7209:4;7232:16;;;:7;:16;;;;;;2876:13;;-1:-1:-1;;;;;7232:16:5;2901:76;;;;-1:-1:-1;;;2901:76:5;;22159:2:22;2901:76:5;;;22141:21:22;22198:2;22178:18;;;22171:30;22237:34;22217:18;;;22210:62;22308:17;22288:18;;;22281:45;22343:19;;2901:76:5;21957:411:22;2901:76:5;2988:21;3012:10;:8;:10::i;:::-;2988:34;;3063:1;3045:7;3039:21;:25;:86;;;;;;;;;;;;;;;;;3091:7;3100:18;:7;:16;:18::i;:::-;3074:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3039:86;3032:93;2803:329;-1:-1:-1;;;2803:329:5:o;6782:164:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;6840:21:20::1;:29:::0;;-1:-1:-1;;6880:24:20;;;6915:15:::1;:23:::0;;-1:-1:-1;;6915:23:20::1;6840:21;6915:23;::::0;;6782:164::o;5568:165::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;5645:9:20::1;5641:85;5659:6;5657:8;;:1;:8;5641:85;;;5686:28;5696:2;5700:13;1702:10:8::0;:17;;1615:111;5686:28:20::1;5666:3;::::0;::::1;:::i;:::-;;;5641:85;;3721:143:::0;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;3792:15:20::1;:22:::0;;-1:-1:-1;;3792:22:20::1;::::0;::::1;::::0;;3825:6:::1;:31:::0;;-1:-1:-1;;;;;3825:31:20;;::::1;-1:-1:-1::0;;;;;;3825:31:20;;::::1;::::0;;;::::1;::::0;;3721:143::o;6954:212::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;7027:9:20::1;:22:::0;7060:15:::1;:24:::0;;-1:-1:-1;;7060:24:20::1;::::0;;7095:21:::1;:29:::0;;-1:-1:-1;;7135:23:20;7060:24;7135:23:::1;::::0;;6954:212::o;1918:198:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;23050:2:22;1998:73:0::1;::::0;::::1;23032:21:22::0;23089:2;23069:18;;;23062:30;23128:34;23108:18;;;23101:62;23199:8;23179:18;;;23172:36;23225:19;;1998:73:0::1;22848:402:22::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;4024:377:20:-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;4089:7:20::1;9530;9513:13;1702:10:8::0;:17;;1615:111;9513:13:20::1;:24;;9505:57;;;::::0;-1:-1:-1;;;9505:57:20;;12826:2:22;9505:57:20::1;::::0;::::1;12808:21:22::0;12865:2;12845:18;;;12838:30;12904:22;12884:18;;;12877:50;12944:18;;9505:57:20::1;12624:344:22::0;9505:57:20::1;9601:10;9581:16;9589:7:::0;9581::::1;:16::i;:::-;-1:-1:-1::0;;;;;9581:30:20::1;;9573:62;;;::::0;-1:-1:-1;;;9573:62:20;;13175:2:22;9573:62:20::1;::::0;::::1;13157:21:22::0;13214:2;13194:18;;;13187:30;13253:21;13233:18;;;13226:49;13292:18;;9573:62:20::1;12973:343:22::0;9573:62:20::1;4117:15:::2;::::0;;;::::2;;;4109:44;;;::::0;-1:-1:-1;;;4109:44:20;;23457:2:22;4109:44:20::2;::::0;::::2;23439:21:22::0;23496:2;23476:18;;;23469:30;23535:18;23515;;;23508:46;23571:18;;4109:44:20::2;23255:340:22::0;4109:44:20::2;4180:6;::::0;-1:-1:-1;;;;;4180:6:20::2;4164:63;;;::::0;-1:-1:-1;;;4164:63:20;;13871:2:22;4164:63:20::2;::::0;::::2;13853:21:22::0;13910:2;13890:18;;;13883:30;13949:21;13929:18;;;13922:49;13988:18;;4164:63:20::2;13669:343:22::0;4164:63:20::2;4247:18;::::0;;;:9:::2;:18;::::0;;;;:32;;;::::2;;;4246:33;4238:64;;;::::0;-1:-1:-1;;;4238:64:20;;23802:2:22;4238:64:20::2;::::0;::::2;23784:21:22::0;23841:2;23821:18;;;23814:30;23880:20;23860:18;;;23853:48;23918:18;;4238:64:20::2;23600:342:22::0;4238:64:20::2;4313:18;::::0;;;:9:::2;:18;::::0;;;;;;:39;;-1:-1:-1;;4313:39:20::2;::::0;::::2;::::0;;4363:6:::2;::::0;:30;;-1:-1:-1;;;4363:30:20;;4382:10:::2;4363:30;::::0;::::2;2335:74:22::0;-1:-1:-1;;;;;4363:6:20;;::::2;::::0;:18:::2;::::0;2308::22;;4363:30:20::2;2189:226:22::0;1555:300:5;1657:4;-1:-1:-1;;;;;;1692:40:5;;1707:25;1692:40;;:104;;-1:-1:-1;;;;;;;1748:48:5;;1763:33;1748:48;1692:104;:156;;;-1:-1:-1;952:25:15;-1:-1:-1;;;;;;937:40:15;;;1812:36:5;829:155:15;10995:171:5;11069:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11069:29:5;-1:-1:-1;;;;;11069:29:5;;;;;;;;:24;;11122:23;11069:24;11122:14;:23::i;:::-;-1:-1:-1;;;;;11113:46:5;;;;;;;;;;;10995:171;;:::o;7427:344::-;7520:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:5;7536:73;;;;-1:-1:-1;;;7536:73:5;;24149:2:22;7536:73:5;;;24131:21:22;24188:2;24168:18;;;24161:30;24227:34;24207:18;;;24200:62;-1:-1:-1;;;24278:18:22;;;24271:42;24330:19;;7536:73:5;23947:408:22;7536:73:5;7619:13;7635:23;7650:7;7635:14;:23::i;:::-;7619:39;;7687:5;-1:-1:-1;;;;;7676:16:5;:7;-1:-1:-1;;;;;7676:16:5;;:51;;;;7720:7;-1:-1:-1;;;;;7696:31:5;:20;7708:7;7696:11;:20::i;:::-;-1:-1:-1;;;;;7696:31:5;;7676:51;:87;;;-1:-1:-1;;;;;;4607:25:5;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7731:32;7668:96;7427:344;-1:-1:-1;;;;7427:344:5:o;10324:560::-;10478:4;-1:-1:-1;;;;;10451:31:5;:23;10466:7;10451:14;:23::i;:::-;-1:-1:-1;;;;;10451:31:5;;10443:85;;;;-1:-1:-1;;;10443:85:5;;24562:2:22;10443:85:5;;;24544:21:22;24601:2;24581:18;;;24574:30;24640:34;24620:18;;;24613:62;24711:11;24691:18;;;24684:39;24740:19;;10443:85:5;24360:405:22;10443:85:5;-1:-1:-1;;;;;10546:16:5;;10538:65;;;;-1:-1:-1;;;10538:65:5;;24972:2:22;10538:65:5;;;24954:21:22;25011:2;24991:18;;;24984:30;25050:34;25030:18;;;25023:62;25121:6;25101:18;;;25094:34;25145:19;;10538:65:5;24770:400:22;10538:65:5;10614:39;10635:4;10641:2;10645:7;10614:20;:39::i;:::-;10715:29;10732:1;10736:7;10715:8;:29::i;:::-;-1:-1:-1;;;;;10755:15:5;;;;;;:9;:15;;;;;:20;;10774:1;;10755:15;:20;;10774:1;;10755:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10785:13:5;;;;;;:9;:13;;;;;:18;;10802:1;;10785:13;:18;;10802:1;;10785:18;:::i;:::-;;;;-1:-1:-1;;10813:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10813:21:5;-1:-1:-1;;;;;10813:21:5;;;;;;;;;10850:27;;10813:16;;10850:27;;;;;;;10324:560;;;:::o;7777:239:20:-;7860:17;;7939:10;7914:22;7933:3;7914:16;:22;:::i;:::-;:35;;;;:::i;:::-;8134:88;;;8151:15;8134:88;;;;26017:19:22;;;;-1:-1:-1;;8168:14:20;26124:2:22;26120:15;;;26116:24;;26102:12;;;26095:46;8184:16:20;26157:12:22;;;26150:28;8202:10:20;26212:15:22;;26208:24;26194:12;;;26187:46;26249:13;;;;26242:29;;;8134:88:20;;;;;;;;;;26287:13:22;;;;8134:88:20;;;8124:99;;;;;7890:59;;;;;;-1:-1:-1;7890:59:20;;7968:39;;;;7777:239;-1:-1:-1;;;;7777:239:20:o;8240:118::-;8300:12;8341:9;;8332:6;:18;;;;:::i;6336:438::-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;6414:13:20::1;6430:12;:10;:12::i;:::-;6491:10;6453:15;6471:31:::0;;;:19:::1;:31;::::0;;;;;6414:28;;-1:-1:-1;6471:31:20::1;::::0;;::::1;::::0;6414:28;;6521:16:::1;::::0;;::::1;6471:31:::0;6521:16:::1;:::i;:::-;:25;;6513:59;;;::::0;-1:-1:-1;;;6513:59:20;;26686:2:22;6513:59:20::1;::::0;::::1;26668:21:22::0;26725:2;26705:18;;;26698:30;26764:23;26744:18;;;26737:51;26805:18;;6513:59:20::1;26484:345:22::0;6513:59:20::1;6583:15;6601:13;1702:10:8::0;:17;;1615:111;6601:13:20::1;6583:31;;6629:9;6625:142;6643:6;6641:8;;:1;:8;6625:142;;;6670:34;6680:10;6692:11;6702:1:::0;6692:7;:11:::1;:::i;6670:34::-;6739:10;6719:31;::::0;;;:19:::1;:31;::::0;;;;:36;;6754:1:::1;::::0;6719:31;:36:::1;::::0;6754:1;;6719:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6650:3;;;;:::i;:::-;;;6625:142;;;;6403:371;;;6336:438:::0;:::o;6039:289::-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;6136:11:20::1;;767:12:21;782:26;796:11;;782:13;:26::i;:::-;767:41;;827:7;819:35;;;::::0;-1:-1:-1;;;819:35:21;;27245:2:22;819:35:21::1;::::0;::::1;27227:21:22::0;27284:2;27264:18;;;27257:30;27323:17;27303:18;;;27296:45;27358:18;;819:35:21::1;27043:339:22::0;819:35:21::1;6191:10:20::2;6169:33;::::0;;;:21:::2;:33;::::0;;;;;::::2;;6168:34;6160:62;;;::::0;-1:-1:-1;;;6160:62:20;;27589:2:22;6160:62:20::2;::::0;::::2;27571:21:22::0;27628:2;27608:18;;;27601:30;27667:17;27647:18;;;27640:45;27702:18;;6160:62:20::2;27387:339:22::0;6160:62:20::2;6233:36;6243:10;6255:13;1702:10:8::0;:17;;1615:111;6233:36:20::2;-1:-1:-1::0;;6302:10:20::2;6280:33;::::0;;;:21:::2;:33;::::0;;;;:40;;-1:-1:-1;;6280:40:20::2;6316:4;6280:40;::::0;;-1:-1:-1;;;6039:289:20:o;8101:108:5:-;8176:26;8186:2;8190:7;8176:26;;;;;;;;;;;;:9;:26::i;2270:187:0:-;2343:16;2362:6;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;2410:40;;2362:6;;;;;;;2410:40;;2343:16;2410:40;2333:124;2270:187;:::o;11301:307:5:-;11451:8;-1:-1:-1;;;;;11442:17:5;:5;-1:-1:-1;;;;;11442:17:5;;;11434:55;;;;-1:-1:-1;;;11434:55:5;;27933:2:22;11434:55:5;;;27915:21:22;27972:2;27952:18;;;27945:30;28011:27;27991:18;;;27984:55;28056:18;;11434:55:5;27731:349:22;11434:55:5;-1:-1:-1;;;;;11499:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11499:46:5;;;;;;;;;;11560:41;;771::22;;;11560::5;;744:18:22;11560:41:5;;;;;;;11301:307;;;:::o;6534:::-;6685:28;6695:4;6701:2;6705:7;6685:9;:28::i;:::-;6731:48;6754:4;6760:2;6764:7;6773:5;6731:22;:48::i;:::-;6723:111;;;;-1:-1:-1;;;6723:111:5;;28287:2:22;6723:111:5;;;28269:21:22;28326:2;28306:18;;;28299:30;28365:34;28345:18;;;28338:62;-1:-1:-1;;;28416:18:22;;;28409:48;28474:19;;6723:111:5;28085:414:22;8592:100:20;8644:13;8677:7;8670:14;;;;;:::i;328:703:13:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:13;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:13;;-1:-1:-1;773:2:13;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:13;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:13;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:13;981:2;972:11;;:::i;:::-;;;844:150;;2624:572:8;-1:-1:-1;;;;;2823:18:8;;2819:183;;2857:40;2889:7;4005:10;:17;;3978:24;;;;:15;:24;;;;;:44;;;4032:24;;;;;;;;;;;;3902:161;2857:40;2819:183;;;2926:2;-1:-1:-1;;;;;2918:10:8;:4;-1:-1:-1;;;;;2918:10:8;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3015:16:8;;3011:179;;3047:45;3084:7;3047:36;:45::i;3011:179::-;3119:4;-1:-1:-1;;;;;3113:10:8;:2;-1:-1:-1;;;;;3113:10:8;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;8366:120:20:-;8449:7;;:29;;;;;8467:10;8449:29;;;2335:74:22;8411:15:20;;-1:-1:-1;;;;;8449:7:20;;:17;;2308:18:22;;8449:29:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8439:39;;8366:120;:::o;456:233:21:-;582:28;;-1:-1:-1;;599:10:21;28778:2:22;28774:15;28770:53;582:28:21;;;28758:66:22;534:10:21;;;;28840:12:22;;582:28:21;;;;;;;;;;;;572:39;;;;;;557:54;;630:51;649:12;;630:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;663:11:21;;;-1:-1:-1;676:4:21;;-1:-1:-1;630:18:21;:51::i;8430:311:5:-;8555:18;8561:2;8565:7;8555:5;:18::i;:::-;8604:54;8635:1;8639:2;8643:7;8652:5;8604:22;:54::i;:::-;8583:151;;;;-1:-1:-1;;;8583:151:5;;28287:2:22;8583:151:5;;;28269:21:22;28326:2;28306:18;;;28299:30;28365:34;28345:18;;;28338:62;-1:-1:-1;;;28416:18:22;;;28409:48;28474:19;;8583:151:5;28085:414:22;12161:778:5;12311:4;-1:-1:-1;;;;;12331:13:5;;1087:20:11;1133:8;12327:606:5;;12366:72;;-1:-1:-1;;;12366:72:5;;-1:-1:-1;;;;;12366:36:5;;;;;:72;;719:10:12;;12417:4:5;;12423:7;;12432:5;;12366:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12366:72:5;;;;;;;;-1:-1:-1;;12366:72:5;;;;;;;;;;;;:::i;:::-;;;12362:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12605:13:5;;12601:266;;12647:60;;-1:-1:-1;;;12647:60:5;;28287:2:22;12647:60:5;;;28269:21:22;28326:2;28306:18;;;28299:30;28365:34;28345:18;;;28338:62;-1:-1:-1;;;28416:18:22;;;28409:48;28474:19;;12647:60:5;28085:414:22;12601:266:5;12819:6;12813:13;12804:6;12800:2;12796:15;12789:38;12362:519;-1:-1:-1;;;;;;12488:51:5;-1:-1:-1;;;12488:51:5;;-1:-1:-1;12481:58:5;;12327:606;-1:-1:-1;12918:4:5;12161:778;;;;;;:::o;4680:970:8:-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;5003:18;5024:26;;;:17;:26;;;;;;4942:51;;-1:-1:-1;5154:28:8;;;5150:323;;-1:-1:-1;;;;;5220:18:8;;5198:19;5220:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5269:30;;;;;;:44;;;5385:30;;:17;:30;;;;;:43;;;5150:323;-1:-1:-1;5566:26:8;;;;:17;:26;;;;;;;;5559:33;;;-1:-1:-1;;;;;5609:18:8;;;;;:12;:18;;;;;:34;;;;;;;5602:41;4680:970::o;5938:1061::-;6212:10;:17;6187:22;;6212:21;;6232:1;;6212:21;:::i;:::-;6243:18;6264:24;;;:15;:24;;;;;;6632:10;:26;;6187:46;;-1:-1:-1;6264:24:8;;6187:46;;6632:26;;;;;;:::i;:::-;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6773:28;;;:15;:28;;;;;;;:41;;;6942:24;;;;;6935:31;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;-1:-1:-1;;;;;3621:16:8;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3665:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3490:217:8:o;847:184:14:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;;847:184;-1:-1:-1;;;;847:184:14:o;9063:372:5:-;-1:-1:-1;;;;;9142:16:5;;9134:61;;;;-1:-1:-1;;;9134:61:5;;30025:2:22;9134:61:5;;;30007:21:22;;;30044:18;;;30037:30;30103:34;30083:18;;;30076:62;30155:18;;9134:61:5;29823:356:22;9134:61:5;7209:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:5;:30;9205:58;;;;-1:-1:-1;;;9205:58:5;;30386:2:22;9205:58:5;;;30368:21:22;30425:2;30405:18;;;30398:30;30464;30444:18;;;30437:58;30512:18;;9205:58:5;30184:352:22;9205:58:5;9274:45;9303:1;9307:2;9311:7;9274:20;:45::i;:::-;-1:-1:-1;;;;;9330:13:5;;;;;;:9;:13;;;;;:18;;9347:1;;9330:13;:18;;9347:1;;9330:18;:::i;:::-;;;;-1:-1:-1;;9358:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9358:21:5;-1:-1:-1;;;;;9358:21:5;;;;;;;;9395:33;;9358:16;;;9395:33;;9358:16;;9395:33;9063:372;;:::o;1383:688:14:-;1466:7;1508:4;1466:7;1522:514;1546:5;:12;1542:1;:16;1522:514;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;:::i;:::-;;;;;;;1579:31;;1644:12;1628;:28;1624:402;;1779:44;;;;;;30698:19:22;;;30733:12;;;30726:28;;;30770:12;;1779:44:14;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1966:44;;;;;;30698:19:22;;;30733:12;;;30726:28;;;30770:12;;1966:44:14;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;-1:-1:-1;1560:3:14;;;;:::i;:::-;;;;1522:514;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:22;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:22;;14:180;-1:-1:-1;14:180:22:o;199:177::-;-1:-1:-1;;;;;;277:5:22;273:78;266:5;263:89;253:117;;366:1;363;356:12;381:245;439:6;492:2;480:9;471:7;467:23;463:32;460:52;;;508:1;505;498:12;460:52;547:9;534:23;566:30;590:5;566:30;:::i;823:196::-;891:20;;-1:-1:-1;;;;;940:54:22;;930:65;;920:93;;1009:1;1006;999:12;920:93;823:196;;;:::o;1024:409::-;1110:6;1118;1126;1134;1187:3;1175:9;1166:7;1162:23;1158:33;1155:53;;;1204:1;1201;1194:12;1155:53;1227:29;1246:9;1227:29;:::i;:::-;1217:39;;1275:38;1309:2;1298:9;1294:18;1275:38;:::i;:::-;1265:48;;1332:38;1366:2;1355:9;1351:18;1332:38;:::i;:::-;1322:48;;1389:38;1423:2;1412:9;1408:18;1389:38;:::i;:::-;1379:48;;1024:409;;;;;;;:::o;1438:258::-;1510:1;1520:113;1534:6;1531:1;1528:13;1520:113;;;1610:11;;;1604:18;1591:11;;;1584:39;1556:2;1549:10;1520:113;;;1651:6;1648:1;1645:13;1642:48;;;-1:-1:-1;;1686:1:22;1668:16;;1661:27;1438:258::o;1701:::-;1743:3;1781:5;1775:12;1808:6;1803:3;1796:19;1824:63;1880:6;1873:4;1868:3;1864:14;1857:4;1850:5;1846:16;1824:63;:::i;:::-;1941:2;1920:15;-1:-1:-1;;1916:29:22;1907:39;;;;1948:4;1903:50;;1701:258;-1:-1:-1;;1701:258:22:o;1964:220::-;2113:2;2102:9;2095:21;2076:4;2133:45;2174:2;2163:9;2159:18;2151:6;2133:45;:::i;2420:254::-;2488:6;2496;2549:2;2537:9;2528:7;2524:23;2520:32;2517:52;;;2565:1;2562;2555:12;2517:52;2588:29;2607:9;2588:29;:::i;:::-;2578:39;2664:2;2649:18;;;;2636:32;;-1:-1:-1;;;2420:254:22:o;2861:328::-;2938:6;2946;2954;3007:2;2995:9;2986:7;2982:23;2978:32;2975:52;;;3023:1;3020;3013:12;2975:52;3046:29;3065:9;3046:29;:::i;:::-;3036:39;;3094:38;3128:2;3117:9;3113:18;3094:38;:::i;:::-;3084:48;;3179:2;3168:9;3164:18;3151:32;3141:42;;2861:328;;;;;:::o;3194:367::-;3257:8;3267:6;3321:3;3314:4;3306:6;3302:17;3298:27;3288:55;;3339:1;3336;3329:12;3288:55;-1:-1:-1;3362:20:22;;3405:18;3394:30;;3391:50;;;3437:1;3434;3427:12;3391:50;3474:4;3466:6;3462:17;3450:29;;3534:3;3527:4;3517:6;3514:1;3510:14;3502:6;3498:27;3494:38;3491:47;3488:67;;;3551:1;3548;3541:12;3488:67;3194:367;;;;;:::o;3566:156::-;3632:20;;3692:4;3681:16;;3671:27;;3661:55;;3712:1;3709;3702:12;3727:507;3820:6;3828;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;3945:9;3932:23;3978:18;3970:6;3967:30;3964:50;;;4010:1;4007;4000:12;3964:50;4049:70;4111:7;4102:6;4091:9;4087:22;4049:70;:::i;:::-;4138:8;;-1:-1:-1;4023:96:22;-1:-1:-1;4192:36:22;;-1:-1:-1;4224:2:22;4209:18;;4192:36;:::i;:::-;4182:46;;3727:507;;;;;:::o;4492:184::-;-1:-1:-1;;;4541:1:22;4534:88;4641:4;4638:1;4631:15;4665:4;4662:1;4655:15;4681:632;4746:5;4776:18;4817:2;4809:6;4806:14;4803:40;;;4823:18;;:::i;:::-;4898:2;4892:9;4866:2;4952:15;;-1:-1:-1;;4948:24:22;;;4974:2;4944:33;4940:42;4928:55;;;4998:18;;;5018:22;;;4995:46;4992:72;;;5044:18;;:::i;:::-;5084:10;5080:2;5073:22;5113:6;5104:15;;5143:6;5135;5128:22;5183:3;5174:6;5169:3;5165:16;5162:25;5159:45;;;5200:1;5197;5190:12;5159:45;5250:6;5245:3;5238:4;5230:6;5226:17;5213:44;5305:1;5298:4;5289:6;5281;5277:19;5273:30;5266:41;;;;4681:632;;;;;:::o;5318:451::-;5387:6;5440:2;5428:9;5419:7;5415:23;5411:32;5408:52;;;5456:1;5453;5446:12;5408:52;5496:9;5483:23;5529:18;5521:6;5518:30;5515:50;;;5561:1;5558;5551:12;5515:50;5584:22;;5637:4;5629:13;;5625:27;-1:-1:-1;5615:55:22;;5666:1;5663;5656:12;5615:55;5689:74;5755:7;5750:2;5737:16;5732:2;5728;5724:11;5689:74;:::i;6266:186::-;6325:6;6378:2;6366:9;6357:7;6353:23;6349:32;6346:52;;;6394:1;6391;6384:12;6346:52;6417:29;6436:9;6417:29;:::i;6457:632::-;6628:2;6680:21;;;6750:13;;6653:18;;;6772:22;;;6599:4;;6628:2;6851:15;;;;6825:2;6810:18;;;6599:4;6894:169;6908:6;6905:1;6902:13;6894:169;;;6969:13;;6957:26;;7038:15;;;;7003:12;;;;6930:1;6923:9;6894:169;;;-1:-1:-1;7080:3:22;;6457:632;-1:-1:-1;;;;;;6457:632:22:o;7094:437::-;7180:6;7188;7241:2;7229:9;7220:7;7216:23;7212:32;7209:52;;;7257:1;7254;7247:12;7209:52;7297:9;7284:23;7330:18;7322:6;7319:30;7316:50;;;7362:1;7359;7352:12;7316:50;7401:70;7463:7;7454:6;7443:9;7439:22;7401:70;:::i;:::-;7490:8;;7375:96;;-1:-1:-1;7094:437:22;-1:-1:-1;;;;7094:437:22:o;7725:347::-;7790:6;7798;7851:2;7839:9;7830:7;7826:23;7822:32;7819:52;;;7867:1;7864;7857:12;7819:52;7890:29;7909:9;7890:29;:::i;:::-;7880:39;;7969:2;7958:9;7954:18;7941:32;8016:5;8009:13;8002:21;7995:5;7992:32;7982:60;;8038:1;8035;8028:12;7982:60;8061:5;8051:15;;;7725:347;;;;;:::o;8780:667::-;8875:6;8883;8891;8899;8952:3;8940:9;8931:7;8927:23;8923:33;8920:53;;;8969:1;8966;8959:12;8920:53;8992:29;9011:9;8992:29;:::i;:::-;8982:39;;9040:38;9074:2;9063:9;9059:18;9040:38;:::i;:::-;9030:48;;9125:2;9114:9;9110:18;9097:32;9087:42;;9180:2;9169:9;9165:18;9152:32;9207:18;9199:6;9196:30;9193:50;;;9239:1;9236;9229:12;9193:50;9262:22;;9315:4;9307:13;;9303:27;-1:-1:-1;9293:55:22;;9344:1;9341;9334:12;9293:55;9367:74;9433:7;9428:2;9415:16;9410:2;9406;9402:11;9367:74;:::i;:::-;9357:84;;;8780:667;;;;;;;:::o;9710:256::-;9776:6;9784;9837:2;9825:9;9816:7;9812:23;9808:32;9805:52;;;9853:1;9850;9843:12;9805:52;9876:29;9895:9;9876:29;:::i;:::-;9866:39;;9924:36;9956:2;9945:9;9941:18;9924:36;:::i;:::-;9914:46;;9710:256;;;;;:::o;9971:260::-;10039:6;10047;10100:2;10088:9;10079:7;10075:23;10071:32;10068:52;;;10116:1;10113;10106:12;10068:52;10139:29;10158:9;10139:29;:::i;:::-;10129:39;;10187:38;10221:2;10210:9;10206:18;10187:38;:::i;10597:437::-;10676:1;10672:12;;;;10719;;;10740:61;;10794:4;10786:6;10782:17;10772:27;;10740:61;10847:2;10839:6;10836:14;10816:18;10813:38;10810:218;;;-1:-1:-1;;;10881:1:22;10874:88;10985:4;10982:1;10975:15;11013:4;11010:1;11003:15;16610:184;-1:-1:-1;;;16659:1:22;16652:88;16759:4;16756:1;16749:15;16783:4;16780:1;16773:15;16799:112;16831:1;16857;16847:35;;16862:18;;:::i;:::-;-1:-1:-1;16896:9:22;;16799:112::o;16916:184::-;16986:6;17039:2;17027:9;17018:7;17014:23;17010:32;17007:52;;;17055:1;17052;17045:12;17007:52;-1:-1:-1;17078:16:22;;16916:184;-1:-1:-1;16916:184:22:o;17747:::-;-1:-1:-1;;;17796:1:22;17789:88;17896:4;17893:1;17886:15;17920:4;17917:1;17910:15;17936:128;17976:3;18007:1;18003:6;18000:1;17997:13;17994:39;;;18013:18;;:::i;:::-;-1:-1:-1;18049:9:22;;17936:128::o;19101:135::-;19140:3;-1:-1:-1;;19161:17:22;;19158:43;;;19181:18;;:::i;:::-;-1:-1:-1;19228:1:22;19217:13;;19101:135::o;19654:184::-;-1:-1:-1;;;19703:1:22;19696:88;19803:4;19800:1;19793:15;19827:4;19824:1;19817:15;22373:470;22552:3;22590:6;22584:13;22606:53;22652:6;22647:3;22640:4;22632:6;22628:17;22606:53;:::i;:::-;22722:13;;22681:16;;;;22744:57;22722:13;22681:16;22778:4;22766:17;;22744:57;:::i;:::-;22817:20;;22373:470;-1:-1:-1;;;;22373:470:22:o;25175:125::-;25215:4;25243:1;25240;25237:8;25234:34;;;25248:18;;:::i;:::-;-1:-1:-1;25285:9:22;;25175:125::o;25305:187::-;25344:1;25370:6;25403:2;25400:1;25396:10;25425:3;25415:37;;25432:18;;:::i;:::-;25470:10;;25466:20;;;;;25305:187;-1:-1:-1;;25305:187:22:o;25497:258::-;25536:7;25568:6;25601:2;25598:1;25594:10;25631:2;25628:1;25624:10;25687:3;25683:2;25679:12;25674:3;25671:21;25664:3;25657:11;25650:19;25646:47;25643:73;;;25696:18;;:::i;:::-;25736:13;;25497:258;-1:-1:-1;;;;25497:258:22:o;26311:168::-;26351:7;26417:1;26413;26409:6;26405:14;26402:1;26399:21;26394:1;26387:9;26380:17;26376:45;26373:71;;;26424:18;;:::i;:::-;-1:-1:-1;26464:9:22;;26311:168::o;26834:204::-;26872:3;26908:4;26905:1;26901:12;26940:4;26937:1;26933:12;26975:3;26969:4;26965:14;26960:3;26957:23;26954:49;;;26983:18;;:::i;:::-;27019:13;;26834:204;-1:-1:-1;;;26834:204:22:o;28504:120::-;28544:1;28570;28560:35;;28575:18;;:::i;:::-;-1:-1:-1;28609:9:22;;28504:120::o;28863:512::-;29057:4;-1:-1:-1;;;;;29167:2:22;29159:6;29155:15;29144:9;29137:34;29219:2;29211:6;29207:15;29202:2;29191:9;29187:18;29180:43;;29259:6;29254:2;29243:9;29239:18;29232:34;29302:3;29297:2;29286:9;29282:18;29275:31;29323:46;29364:3;29353:9;29349:19;29341:6;29323:46;:::i;:::-;29315:54;28863:512;-1:-1:-1;;;;;;28863:512:22:o;29380:249::-;29449:6;29502:2;29490:9;29481:7;29477:23;29473:32;29470:52;;;29518:1;29515;29508:12;29470:52;29550:9;29544:16;29569:30;29593:5;29569:30;:::i;29634:184::-;-1:-1:-1;;;29683:1:22;29676:88;29783:4;29780:1;29773:15;29807:4;29804:1;29797:15

Swarm Source

none
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.