BNB Price: $694.99 (-2.11%)
Gas: 1 GWei
 

Overview

Max Total Supply

37,293FCC

Holders

14,483

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
USD Coin: USDC Token
Balance
1 FCC
0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721Shared

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-06-30
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.3;

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

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

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

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

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

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

/**
 * @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}. 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}

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

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

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if(!hasRole(role, account)) {
            revert(string(abi.encodePacked(
                "AccessControl: account ",
                Strings.toHexString(uint160(account), 20),
                " is missing role ",
                Strings.toHexString(uint256(role), 32)
            )));
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721Upgradeable is IERC165Upgradeable {
    /**
     * @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;
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721Standard is IERC721Upgradeable {
    function mint(address _to, string memory _uri, address[] memory _feeAddresses, uint256[] memory _fees) external;
    function hasRole(bytes32 role, address account) view external returns(bool);
    function getFeeInfo(uint256 tokenId) external returns(address[] memory, uint256[] memory);
    function getFeeAddresses(uint256 tokenId) external returns(address[] memory);
    function getFees(uint256 tokenId) external returns(uint256[] memory);
}

contract ERC721Standard is Context, AccessControl, ERC721Enumerable, ERC721Burnable {
    uint256 public currentTokenId;

    bytes4 public constant ROYALTY_INTERFACE = bytes4(keccak256("ROYALTY_INTERFACE"));
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    uint256 constant MAX_FEE_ADDRESSES = 10;

    mapping (uint256 => string) public uri;
    mapping (uint256 => uint256[]) public fees;
    mapping (uint256 => address[]) public feeAddresses;

    uint256 public constant UNIT = 1e18;

    constructor(
        string memory _name,
        string memory _symbol
        ) ERC721(_name, _symbol) {
            _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
            _setupRole(MINTER_ROLE, _msgSender());
    }

    // ========== ADMIN FUNCTIONS ==========

    function mint(
        address _to,
        string memory _uri,
        address[] memory _feeAddresses,
        uint256[] memory _fees
        ) external virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "Only minter");
        _safeMint(_to, _uri, _feeAddresses, _fees);
    }

    function batchMint(
        address[] memory _to,
        string[] memory _uri,
        address[][] memory _feeAddresses,
        uint256[][] memory _fees
    ) external {
        require(hasRole(MINTER_ROLE, _msgSender()), "Only minter");
                require(_to.length == _uri.length && _to.length
         == _feeAddresses.length && _to.length == _fees.length, "Invalid params");
        for(uint256 i = 0; i < _to.length; i++) {
            _safeMint(_to[i], _uri[i], _feeAddresses[i], _fees[i]);
        }
    }

    function setFeeAddress(
        uint256 _tokenId,
        uint256 _addressPosition,
        address _feeAddress
        ) external virtual {
        require(_feeAddress != address(0));
        require(_msgSender() == feeAddresses[_tokenId][_addressPosition], "Invalid account");
        feeAddresses[_tokenId][_addressPosition] = _feeAddress;
    }

    // ========== VIEW FUNCTIONS ==========

    function tokenURI(
        uint256 _tokenId
        ) public view virtual override returns (string memory) {
        return uri[_tokenId];
    } 

    function getFeeAddresses(
        uint256 _tokenId
    ) external view returns(address[] memory) {
        return feeAddresses[_tokenId];
    }

    function getFees(
        uint256 _tokenId
    ) external view returns(uint256[] memory) {
        return fees[_tokenId];
    }

    function getFeeInfo(
        uint256 _tokenId
    ) external view returns (address[] memory, uint[] memory){
        return (feeAddresses[_tokenId], fees[_tokenId]);
    }

    function supportsInterface(
        bytes4 _interfaceId
        ) public view virtual override(ERC721, ERC721Enumerable, AccessControl) returns (bool) {
        return _interfaceId == ROYALTY_INTERFACE ||
         super.supportsInterface(_interfaceId);
    }

    // ========== INTERNAL FUNCTIONS ==========

    function _safeMint(
        address _to,
        string memory _uri,
        address[] memory _feeAddresses,
        uint256[] memory _fees
        ) internal {
        require(_feeAddresses.length == _fees.length, "Invalid fee lengths");
        require(_feeAddresses.length <= MAX_FEE_ADDRESSES, "Too many fees");
        require(bytes(_uri).length > 0, "Invalid URI");

        uint256 feeTotal;

        for (uint256 i = 0; i < _fees.length; i++) {
            require(_feeAddresses[i] != address(0), "Invalid fee address");
            feeTotal += _fees[i];
        }

        require(feeTotal <= UNIT, "Invalid fee");

        super._safeMint(_to, currentTokenId);

        uri[currentTokenId] = _uri;
        feeAddresses[currentTokenId] = _feeAddresses;
        fees[currentTokenId] = _fees;
        currentTokenId++;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
        ) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

contract ERC721Shared is ERC721Standard {
    mapping (uint256 => address) public creator;

    constructor(
        string memory _name,
        string memory _symbol
        ) ERC721Standard(_name, _symbol)
         {}
    
    function mint(
        address _to,
        string memory _uri,
        address[] memory _feeAddresses,
        uint256[] memory _fees
        ) external override {
        creator[currentTokenId] = _msgSender();
        _safeMint(_to, _uri, _feeAddresses, _fees);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_INTERFACE","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT","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":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"string[]","name":"_uri","type":"string[]"},{"internalType":"address[][]","name":"_feeAddresses","type":"address[][]"},{"internalType":"uint256[][]","name":"_fees","type":"uint256[][]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFeeAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFeeInfo","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFees","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"_to","type":"address"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address[]","name":"_feeAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_addressPosition","type":"uint256"},{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","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":[{"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":[],"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":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162005a4b38038062005a4b833981810160405281019062000037919062000379565b8181818181600190805190602001906200005392919062000257565b5080600290805190602001906200006c92919062000257565b505050620000936000801b62000087620000de60201b60201c565b620000e660201b60201c565b620000d47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000c8620000de60201b60201c565b620000e660201b60201c565b505050506200055c565b600033905090565b620000f88282620000fc60201b60201c565b5050565b6200010e8282620001ed60201b60201c565b620001e957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200018e620000de60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620002659062000481565b90600052602060002090601f016020900481019282620002895760008555620002d5565b82601f10620002a457805160ff1916838001178555620002d5565b82800160010185558215620002d5579182015b82811115620002d4578251825591602001919060010190620002b7565b5b509050620002e49190620002e8565b5090565b5b8082111562000303576000816000905550600101620002e9565b5090565b60006200031e620003188462000415565b620003ec565b9050828152602081018484840111156200033757600080fd5b620003448482856200044b565b509392505050565b600082601f8301126200035e57600080fd5b81516200037084826020860162000307565b91505092915050565b600080604083850312156200038d57600080fd5b600083015167ffffffffffffffff811115620003a857600080fd5b620003b6858286016200034c565b925050602083015167ffffffffffffffff811115620003d457600080fd5b620003e2858286016200034c565b9150509250929050565b6000620003f86200040b565b9050620004068282620004b7565b919050565b6000604051905090565b600067ffffffffffffffff8211156200043357620004326200051c565b5b6200043e826200054b565b9050602081019050919050565b60005b838110156200046b5780820151818401526020810190506200044e565b838111156200047b576000848401525b50505050565b600060028204905060018216806200049a57607f821691505b60208210811415620004b157620004b0620004ed565b5b50919050565b620004c2826200054b565b810181811067ffffffffffffffff82111715620004e457620004e36200051c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6154df806200056c6000396000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80634f6ccce711610130578063a217fddf116100b8578063d53913931161007c578063d5391393146106d2578063d547741f146106f0578063d5a06d4c1461070c578063e985e9c51461073c578063f1d99efa1461076c57610226565b8063a217fddf1461061b578063a22cb46514610639578063b88d4fde14610655578063c87b56dd14610671578063d45c267a146106a157610226565b806370a08231116100ff57806370a0823114610563578063766bd8d41461059357806391d14854146105af57806395d89b41146105df5780639d8e2177146105fd57610226565b80634f6ccce7146104a3578063510b5158146104d35780636308f1cd146105035780636352211e1461053357610226565b806323b872dd116101b35780632f745c59116101825780632f745c591461040357806336568abe1461043357806342842e0e1461044f57806342966c681461046b5780634a3410461461048757610226565b806323b872dd1461036b578063248a9ca3146103875780632d62f0f2146103b75780632f2ff15d146103e757610226565b8063095ea7b3116101fa578063095ea7b3146102c75780630e89341c146102e357806315807fc114610313578063158a4d5e1461033157806318160ddd1461034d57610226565b80629a9b7b1461022b57806301ffc9a71461024957806306fdde0314610279578063081812fc14610297575b600080fd5b61023361079c565b604051610240919061485b565b60405180910390f35b610263600480360381019061025e9190613cba565b6107a2565b60405161027091906144a8565b60405180910390f35b61028161081c565b60405161028e91906144f9565b60405180910390f35b6102b160048036038101906102ac9190613d0c565b6108ae565b6040516102be91906143c6565b60405180910390f35b6102e160048036038101906102dc9190613b56565b610933565b005b6102fd60048036038101906102f89190613d0c565b610a4b565b60405161030a91906144f9565b60405180910390f35b61031b610aeb565b60405161032891906144de565b60405180910390f35b61034b60048036038101906103469190613aab565b610b0f565b005b610355610b7c565b604051610362919061485b565b60405180910390f35b610385600480360381019061038091906139a5565b610b89565b005b6103a1600480360381019061039c9190613c55565b610be9565b6040516103ae91906144c3565b60405180910390f35b6103d160048036038101906103cc9190613d0c565b610c08565b6040516103de919061442d565b60405180910390f35b61040160048036038101906103fc9190613c7e565b610ca9565b005b61041d60048036038101906104189190613b56565b610cd2565b60405161042a919061485b565b60405180910390f35b61044d60048036038101906104489190613c7e565b610d77565b005b610469600480360381019061046491906139a5565b610dfa565b005b61048560048036038101906104809190613d0c565b610e1a565b005b6104a1600480360381019061049c9190613d71565b610e76565b005b6104bd60048036038101906104b89190613d0c565b611033565b6040516104ca919061485b565b60405180910390f35b6104ed60048036038101906104e89190613d0c565b6110ca565b6040516104fa91906143c6565b60405180910390f35b61051d60048036038101906105189190613d35565b6110fd565b60405161052a919061485b565b60405180910390f35b61054d60048036038101906105489190613d0c565b61112e565b60405161055a91906143c6565b60405180910390f35b61057d60048036038101906105789190613940565b6111e0565b60405161058a919061485b565b60405180910390f35b6105ad60048036038101906105a89190613b92565b611298565b005b6105c960048036038101906105c49190613c7e565b611498565b6040516105d691906144a8565b60405180910390f35b6105e7611502565b6040516105f491906144f9565b60405180910390f35b610605611594565b604051610612919061485b565b60405180910390f35b6106236115a0565b60405161063091906144c3565b60405180910390f35b610653600480360381019061064e9190613a6f565b6115a7565b005b61066f600480360381019061066a91906139f4565b611728565b005b61068b60048036038101906106869190613d0c565b61178a565b60405161069891906144f9565b60405180910390f35b6106bb60048036038101906106b69190613d0c565b61182f565b6040516106c992919061444f565b60405180910390f35b6106da61193b565b6040516106e791906144c3565b60405180910390f35b61070a60048036038101906107059190613c7e565b61195f565b005b61072660048036038101906107219190613d0c565b611988565b6040516107339190614486565b60405180910390f35b61075660048036038101906107519190613969565b6119f3565b60405161076391906144a8565b60405180910390f35b61078660048036038101906107819190613d35565b611a87565b60405161079391906143c6565b60405180910390f35b600b5481565b60007f6f72d0b7fc6f3865289c5a5d2fe8cf08a1f02584f7f082e02593de942b0fc3507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610815575061081482611ad5565b5b9050919050565b60606001805461082b90614c5c565b80601f016020809104026020016040519081016040528092919081815260200182805461085790614c5c565b80156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b60006108b982611b4f565b6108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef9061473b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093e8261112e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a69061479b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ce611bbb565b73ffffffffffffffffffffffffffffffffffffffff1614806109fd57506109fc816109f7611bbb565b6119f3565b5b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a339061463b565b60405180910390fd5b610a468383611bc3565b505050565b600c6020528060005260406000206000915090508054610a6a90614c5c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9690614c5c565b8015610ae35780601f10610ab857610100808354040283529160200191610ae3565b820191906000526020600020905b815481529060010190602001808311610ac657829003601f168201915b505050505081565b7f6f72d0b7fc6f3865289c5a5d2fe8cf08a1f02584f7f082e02593de942b0fc35081565b610b17611bbb565b600f6000600b54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b7684848484611c7c565b50505050565b6000600980549050905090565b610b9a610b94611bbb565b82611f60565b610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd0906147bb565b60405180910390fd5b610be483838361203e565b505050565b6000806000838152602001908152602001600020600101549050919050565b6060600e6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610c9d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c53575b50505050509050919050565b610cb282610be9565b610cc381610cbe611bbb565b61229a565b610ccd8383612337565b505050565b6000610cdd836111e0565b8210610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d159061453b565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d7f611bbb565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39061483b565b60405180910390fd5b610df68282612417565b5050565b610e1583838360405180602001604052806000815250611728565b505050565b610e2b610e25611bbb565b82611f60565b610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e619061481b565b60405180910390fd5b610e73816124f8565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eb057600080fd5b600e60008481526020019081526020016000208281548110610efb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f44611bbb565b73ffffffffffffffffffffffffffffffffffffffff1614610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f919061475b565b60405180910390fd5b80600e60008581526020019081526020016000208381548110610fe6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600061103d610b7c565b821061107e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611075906147fb565b60405180910390fd5b600982815481106110b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d602052816000526040600020818154811061111957600080fd5b90600052602060002001600091509150505481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce9061467b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112489061465b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112c97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66112c4611bbb565b611498565b611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff906145fb565b60405180910390fd5b8251845114801561131a575081518451145b8015611327575080518451145b611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d9061457b565b60405180910390fd5b60005b84518110156114915761147e8582815181106113ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106113ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858481518110611430577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858581518110611471577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611c7c565b808061148990614cbf565b915050611369565b5050505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606002805461151190614c5c565b80601f016020809104026020016040519081016040528092919081815260200182805461153d90614c5c565b801561158a5780601f1061155f5761010080835404028352916020019161158a565b820191906000526020600020905b81548152906001019060200180831161156d57829003601f168201915b5050505050905090565b670de0b6b3a764000081565b6000801b81565b6115af611bbb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611614906145db565b60405180910390fd5b806006600061162a611bbb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116d7611bbb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161171c91906144a8565b60405180910390a35050565b611739611733611bbb565b83611f60565b611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906147bb565b60405180910390fd5b61178484848484612609565b50505050565b6060600c600083815260200190815260200160002080546117aa90614c5c565b80601f01602080910402602001604051908101604052809291908181526020018280546117d690614c5c565b80156118235780601f106117f857610100808354040283529160200191611823565b820191906000526020600020905b81548152906001019060200180831161180657829003601f168201915b50505050509050919050565b606080600e6000848152602001908152602001600020600d6000858152602001908152602001600020818054806020026020016040519081016040528092919081815260200182805480156118d957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161188f575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561192b57602002820191906000526020600020905b815481526020019060010190808311611917575b5050505050905091509150915091565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61196882610be9565b61197981611974611bbb565b61229a565b6119838383612417565b505050565b6060600d60008381526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119e757602002820191906000526020600020905b8154815260200190600101908083116119d3575b50505050509050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e6020528160005260406000208181548110611aa357600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b485750611b4782612665565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c368361112e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8051825114611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb79061469b565b60405180910390fd5b600a82511115611d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfc906146db565b60405180910390fd5b6000835111611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d40906147db565b60405180910390fd5b600080600090505b8251811015611e6b57600073ffffffffffffffffffffffffffffffffffffffff16848281518110611dab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e01906146fb565b60405180910390fd5b828181518110611e43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015182611e569190614a8e565b91508080611e6390614cbf565b915050611d51565b50670de0b6b3a7640000811115611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae906146bb565b60405180910390fd5b611ec385600b54612747565b83600c6000600b5481526020019081526020016000209080519060200190611eec9291906133b7565b5082600e6000600b5481526020019081526020016000209080519060200190611f1692919061343d565b5081600d6000600b5481526020019081526020016000209080519060200190611f409291906134c7565b50600b6000815480929190611f5490614cbf565b91905055505050505050565b6000611f6b82611b4f565b611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa19061461b565b60405180910390fd5b6000611fb58361112e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061202457508373ffffffffffffffffffffffffffffffffffffffff1661200c846108ae565b73ffffffffffffffffffffffffffffffffffffffff16145b80612035575061203481856119f3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205e8261112e565b73ffffffffffffffffffffffffffffffffffffffff16146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061477b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b906145bb565b60405180910390fd5b61212f838383612765565b61213a600082611bc3565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218a9190614b3e565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e19190614a8e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122a48282611498565b612333576122c98173ffffffffffffffffffffffffffffffffffffffff166014612775565b6122d78360001c6020612775565b6040516020016122e892919061438c565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232a91906144f9565b60405180910390fd5b5050565b6123418282611498565b61241357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123b8611bbb565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6124218282611498565b156124f457600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612499611bbb565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006125038261112e565b905061251181600084612765565b61251c600083611bc3565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256c9190614b3e565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61261484848461203e565b61262084848484612a6f565b61265f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126569061455b565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061273057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612740575061273f82612c06565b5b9050919050565b612761828260405180602001604052806000815250612c80565b5050565b612770838383612cdb565b505050565b6060600060028360026127889190614ae4565b6127929190614a8e565b67ffffffffffffffff8111156127d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128035781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612861577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106128eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261292b9190614ae4565b6129359190614a8e565b90505b6001811115612a21577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061299d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106129da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612a1a90614c32565b9050612938565b5060008414612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c9061451b565b60405180910390fd5b8091505092915050565b6000612a908473ffffffffffffffffffffffffffffffffffffffff16612def565b15612bf9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ab9611bbb565b8786866040518563ffffffff1660e01b8152600401612adb94939291906143e1565b602060405180830381600087803b158015612af557600080fd5b505af1925050508015612b2657506040513d601f19601f82011682018060405250810190612b239190613ce3565b60015b612ba9573d8060008114612b56576040519150601f19603f3d011682016040523d82523d6000602084013e612b5b565b606091505b50600081511415612ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b989061455b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bfe565b600190505b949350505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c795750612c7882612e02565b5b9050919050565b612c8a8383612e6c565b612c976000848484612a6f565b612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd9061455b565b60405180910390fd5b505050565b612ce683838361303a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d2957612d248161303f565b612d68565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d6757612d668382613088565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dab57612da6816131f5565b612dea565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612de957612de88282613338565b5b5b505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed39061471b565b60405180910390fd5b612ee581611b4f565b15612f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1c9061459b565b60405180910390fd5b612f3160008383612765565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f819190614a8e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613095846111e0565b61309f9190614b3e565b9050600060086000848152602001908152602001600020549050818114613184576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506132099190614b3e565b90506000600a600084815260200190815260200160002054905060006009838154811061325f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600983815481106132a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061331c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613343836111e0565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546133c390614c5c565b90600052602060002090601f0160209004810192826133e5576000855561342c565b82601f106133fe57805160ff191683800117855561342c565b8280016001018555821561342c579182015b8281111561342b578251825591602001919060010190613410565b5b5090506134399190613514565b5090565b8280548282559060005260206000209081019282156134b6579160200282015b828111156134b55782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061345d565b5b5090506134c39190613514565b5090565b828054828255906000526020600020908101928215613503579160200282015b828111156135025782518255916020019190600101906134e7565b5b5090506135109190613514565b5090565b5b8082111561352d576000816000905550600101613515565b5090565b600061354461353f8461489b565b614876565b9050808382526020820190508285602086028201111561356357600080fd5b60005b858110156135935781613579888261379c565b845260208401935060208301925050600181019050613566565b5050509392505050565b60006135b06135ab846148c7565b614876565b9050808382526020820190508260005b858110156135f057813585016135d688826137b1565b8452602084019350602083019250506001810190506135c0565b5050509392505050565b600061360d613608846148f3565b614876565b9050808382526020820190508260005b8581101561364d57813585016136338882613859565b84526020840193506020830192505060018101905061361d565b5050509392505050565b600061366a6136658461491f565b614876565b9050808382526020820190508260005b858110156136aa57813585016136908882613901565b84526020840193506020830192505060018101905061367a565b5050509392505050565b60006136c76136c28461494b565b614876565b905080838252602082019050828560208602820111156136e657600080fd5b60005b8581101561371657816136fc888261392b565b8452602084019350602083019250506001810190506136e9565b5050509392505050565b600061373361372e84614977565b614876565b90508281526020810184848401111561374b57600080fd5b613756848285614bf0565b509392505050565b600061377161376c846149a8565b614876565b90508281526020810184848401111561378957600080fd5b613794848285614bf0565b509392505050565b6000813590506137ab81615436565b92915050565b600082601f8301126137c257600080fd5b81356137d2848260208601613531565b91505092915050565b600082601f8301126137ec57600080fd5b81356137fc84826020860161359d565b91505092915050565b600082601f83011261381657600080fd5b81356138268482602086016135fa565b91505092915050565b600082601f83011261384057600080fd5b8135613850848260208601613657565b91505092915050565b600082601f83011261386a57600080fd5b813561387a8482602086016136b4565b91505092915050565b6000813590506138928161544d565b92915050565b6000813590506138a781615464565b92915050565b6000813590506138bc8161547b565b92915050565b6000815190506138d18161547b565b92915050565b600082601f8301126138e857600080fd5b81356138f8848260208601613720565b91505092915050565b600082601f83011261391257600080fd5b813561392284826020860161375e565b91505092915050565b60008135905061393a81615492565b92915050565b60006020828403121561395257600080fd5b60006139608482850161379c565b91505092915050565b6000806040838503121561397c57600080fd5b600061398a8582860161379c565b925050602061399b8582860161379c565b9150509250929050565b6000806000606084860312156139ba57600080fd5b60006139c88682870161379c565b93505060206139d98682870161379c565b92505060406139ea8682870161392b565b9150509250925092565b60008060008060808587031215613a0a57600080fd5b6000613a188782880161379c565b9450506020613a298782880161379c565b9350506040613a3a8782880161392b565b925050606085013567ffffffffffffffff811115613a5757600080fd5b613a63878288016138d7565b91505092959194509250565b60008060408385031215613a8257600080fd5b6000613a908582860161379c565b9250506020613aa185828601613883565b9150509250929050565b60008060008060808587031215613ac157600080fd5b6000613acf8782880161379c565b945050602085013567ffffffffffffffff811115613aec57600080fd5b613af887828801613901565b935050604085013567ffffffffffffffff811115613b1557600080fd5b613b21878288016137b1565b925050606085013567ffffffffffffffff811115613b3e57600080fd5b613b4a87828801613859565b91505092959194509250565b60008060408385031215613b6957600080fd5b6000613b778582860161379c565b9250506020613b888582860161392b565b9150509250929050565b60008060008060808587031215613ba857600080fd5b600085013567ffffffffffffffff811115613bc257600080fd5b613bce878288016137b1565b945050602085013567ffffffffffffffff811115613beb57600080fd5b613bf78782880161382f565b935050604085013567ffffffffffffffff811115613c1457600080fd5b613c20878288016137db565b925050606085013567ffffffffffffffff811115613c3d57600080fd5b613c4987828801613805565b91505092959194509250565b600060208284031215613c6757600080fd5b6000613c7584828501613898565b91505092915050565b60008060408385031215613c9157600080fd5b6000613c9f85828601613898565b9250506020613cb08582860161379c565b9150509250929050565b600060208284031215613ccc57600080fd5b6000613cda848285016138ad565b91505092915050565b600060208284031215613cf557600080fd5b6000613d03848285016138c2565b91505092915050565b600060208284031215613d1e57600080fd5b6000613d2c8482850161392b565b91505092915050565b60008060408385031215613d4857600080fd5b6000613d568582860161392b565b9250506020613d678582860161392b565b9150509250929050565b600080600060608486031215613d8657600080fd5b6000613d948682870161392b565b9350506020613da58682870161392b565b9250506040613db68682870161379c565b9150509250925092565b6000613dcc8383613df0565b60208301905092915050565b6000613de4838361436e565b60208301905092915050565b613df981614b72565b82525050565b613e0881614b72565b82525050565b6000613e19826149f9565b613e238185614a3f565b9350613e2e836149d9565b8060005b83811015613e5f578151613e468882613dc0565b9750613e5183614a25565b925050600181019050613e32565b5085935050505092915050565b6000613e7782614a04565b613e818185614a50565b9350613e8c836149e9565b8060005b83811015613ebd578151613ea48882613dd8565b9750613eaf83614a32565b925050600181019050613e90565b5085935050505092915050565b613ed381614b84565b82525050565b613ee281614b90565b82525050565b613ef181614b9a565b82525050565b6000613f0282614a0f565b613f0c8185614a61565b9350613f1c818560208601614bff565b613f2581614d95565b840191505092915050565b6000613f3b82614a1a565b613f458185614a72565b9350613f55818560208601614bff565b613f5e81614d95565b840191505092915050565b6000613f7482614a1a565b613f7e8185614a83565b9350613f8e818560208601614bff565b80840191505092915050565b6000613fa7602083614a72565b9150613fb282614da6565b602082019050919050565b6000613fca602b83614a72565b9150613fd582614dcf565b604082019050919050565b6000613fed603283614a72565b9150613ff882614e1e565b604082019050919050565b6000614010600e83614a72565b915061401b82614e6d565b602082019050919050565b6000614033601c83614a72565b915061403e82614e96565b602082019050919050565b6000614056602483614a72565b915061406182614ebf565b604082019050919050565b6000614079601983614a72565b915061408482614f0e565b602082019050919050565b600061409c600b83614a72565b91506140a782614f37565b602082019050919050565b60006140bf602c83614a72565b91506140ca82614f60565b604082019050919050565b60006140e2603883614a72565b91506140ed82614faf565b604082019050919050565b6000614105602a83614a72565b915061411082614ffe565b604082019050919050565b6000614128602983614a72565b91506141338261504d565b604082019050919050565b600061414b601383614a72565b91506141568261509c565b602082019050919050565b600061416e600b83614a72565b9150614179826150c5565b602082019050919050565b6000614191600d83614a72565b915061419c826150ee565b602082019050919050565b60006141b4601383614a72565b91506141bf82615117565b602082019050919050565b60006141d7602083614a72565b91506141e282615140565b602082019050919050565b60006141fa602c83614a72565b915061420582615169565b604082019050919050565b600061421d600f83614a72565b9150614228826151b8565b602082019050919050565b6000614240602983614a72565b915061424b826151e1565b604082019050919050565b6000614263602183614a72565b915061426e82615230565b604082019050919050565b6000614286603183614a72565b91506142918261527f565b604082019050919050565b60006142a9600b83614a72565b91506142b4826152ce565b602082019050919050565b60006142cc602c83614a72565b91506142d7826152f7565b604082019050919050565b60006142ef601783614a83565b91506142fa82615346565b601782019050919050565b6000614312603083614a72565b915061431d8261536f565b604082019050919050565b6000614335601183614a83565b9150614340826153be565b601182019050919050565b6000614358602f83614a72565b9150614363826153e7565b604082019050919050565b61437781614be6565b82525050565b61438681614be6565b82525050565b6000614397826142e2565b91506143a38285613f69565b91506143ae82614328565b91506143ba8284613f69565b91508190509392505050565b60006020820190506143db6000830184613dff565b92915050565b60006080820190506143f66000830187613dff565b6144036020830186613dff565b614410604083018561437d565b81810360608301526144228184613ef7565b905095945050505050565b600060208201905081810360008301526144478184613e0e565b905092915050565b600060408201905081810360008301526144698185613e0e565b9050818103602083015261447d8184613e6c565b90509392505050565b600060208201905081810360008301526144a08184613e6c565b905092915050565b60006020820190506144bd6000830184613eca565b92915050565b60006020820190506144d86000830184613ed9565b92915050565b60006020820190506144f36000830184613ee8565b92915050565b600060208201905081810360008301526145138184613f30565b905092915050565b6000602082019050818103600083015261453481613f9a565b9050919050565b6000602082019050818103600083015261455481613fbd565b9050919050565b6000602082019050818103600083015261457481613fe0565b9050919050565b6000602082019050818103600083015261459481614003565b9050919050565b600060208201905081810360008301526145b481614026565b9050919050565b600060208201905081810360008301526145d481614049565b9050919050565b600060208201905081810360008301526145f48161406c565b9050919050565b600060208201905081810360008301526146148161408f565b9050919050565b60006020820190508181036000830152614634816140b2565b9050919050565b60006020820190508181036000830152614654816140d5565b9050919050565b60006020820190508181036000830152614674816140f8565b9050919050565b600060208201905081810360008301526146948161411b565b9050919050565b600060208201905081810360008301526146b48161413e565b9050919050565b600060208201905081810360008301526146d481614161565b9050919050565b600060208201905081810360008301526146f481614184565b9050919050565b60006020820190508181036000830152614714816141a7565b9050919050565b60006020820190508181036000830152614734816141ca565b9050919050565b60006020820190508181036000830152614754816141ed565b9050919050565b6000602082019050818103600083015261477481614210565b9050919050565b6000602082019050818103600083015261479481614233565b9050919050565b600060208201905081810360008301526147b481614256565b9050919050565b600060208201905081810360008301526147d481614279565b9050919050565b600060208201905081810360008301526147f48161429c565b9050919050565b60006020820190508181036000830152614814816142bf565b9050919050565b6000602082019050818103600083015261483481614305565b9050919050565b600060208201905081810360008301526148548161434b565b9050919050565b6000602082019050614870600083018461437d565b92915050565b6000614880614891565b905061488c8282614c8e565b919050565b6000604051905090565b600067ffffffffffffffff8211156148b6576148b5614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148e2576148e1614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561490e5761490d614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561493a57614939614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561496657614965614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561499257614991614d66565b5b61499b82614d95565b9050602081019050919050565b600067ffffffffffffffff8211156149c3576149c2614d66565b5b6149cc82614d95565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a9982614be6565b9150614aa483614be6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ad957614ad8614d08565b5b828201905092915050565b6000614aef82614be6565b9150614afa83614be6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3357614b32614d08565b5b828202905092915050565b6000614b4982614be6565b9150614b5483614be6565b925082821015614b6757614b66614d08565b5b828203905092915050565b6000614b7d82614bc6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c1d578082015181840152602081019050614c02565b83811115614c2c576000848401525b50505050565b6000614c3d82614be6565b91506000821415614c5157614c50614d08565b5b600182039050919050565b60006002820490506001821680614c7457607f821691505b60208210811415614c8857614c87614d37565b5b50919050565b614c9782614d95565b810181811067ffffffffffffffff82111715614cb657614cb5614d66565b5b80604052505050565b6000614cca82614be6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cfd57614cfc614d08565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f496e76616c696420706172616d73000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f6e6c79206d696e746572000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420666565206c656e6774687300000000000000000000000000600082015250565b7f496e76616c696420666565000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e79206665657300000000000000000000000000000000000000600082015250565b7f496e76616c696420666565206164647265737300000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e76616c6964206163636f756e740000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c696420555249000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61543f81614b72565b811461544a57600080fd5b50565b61545681614b84565b811461546157600080fd5b50565b61546d81614b90565b811461547857600080fd5b50565b61548481614b9a565b811461548f57600080fd5b50565b61549b81614be6565b81146154a657600080fd5b5056fea26469706673582212209f4bc20cdf51d17893a8d2978be4af4f75f68249209d203f30bee4ca991b3ad764736f6c6343000803003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001d466561747572656420436f6d6d756e69747920436f6c6c656374696f6e00000000000000000000000000000000000000000000000000000000000000000000034643430000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102265760003560e01c80634f6ccce711610130578063a217fddf116100b8578063d53913931161007c578063d5391393146106d2578063d547741f146106f0578063d5a06d4c1461070c578063e985e9c51461073c578063f1d99efa1461076c57610226565b8063a217fddf1461061b578063a22cb46514610639578063b88d4fde14610655578063c87b56dd14610671578063d45c267a146106a157610226565b806370a08231116100ff57806370a0823114610563578063766bd8d41461059357806391d14854146105af57806395d89b41146105df5780639d8e2177146105fd57610226565b80634f6ccce7146104a3578063510b5158146104d35780636308f1cd146105035780636352211e1461053357610226565b806323b872dd116101b35780632f745c59116101825780632f745c591461040357806336568abe1461043357806342842e0e1461044f57806342966c681461046b5780634a3410461461048757610226565b806323b872dd1461036b578063248a9ca3146103875780632d62f0f2146103b75780632f2ff15d146103e757610226565b8063095ea7b3116101fa578063095ea7b3146102c75780630e89341c146102e357806315807fc114610313578063158a4d5e1461033157806318160ddd1461034d57610226565b80629a9b7b1461022b57806301ffc9a71461024957806306fdde0314610279578063081812fc14610297575b600080fd5b61023361079c565b604051610240919061485b565b60405180910390f35b610263600480360381019061025e9190613cba565b6107a2565b60405161027091906144a8565b60405180910390f35b61028161081c565b60405161028e91906144f9565b60405180910390f35b6102b160048036038101906102ac9190613d0c565b6108ae565b6040516102be91906143c6565b60405180910390f35b6102e160048036038101906102dc9190613b56565b610933565b005b6102fd60048036038101906102f89190613d0c565b610a4b565b60405161030a91906144f9565b60405180910390f35b61031b610aeb565b60405161032891906144de565b60405180910390f35b61034b60048036038101906103469190613aab565b610b0f565b005b610355610b7c565b604051610362919061485b565b60405180910390f35b610385600480360381019061038091906139a5565b610b89565b005b6103a1600480360381019061039c9190613c55565b610be9565b6040516103ae91906144c3565b60405180910390f35b6103d160048036038101906103cc9190613d0c565b610c08565b6040516103de919061442d565b60405180910390f35b61040160048036038101906103fc9190613c7e565b610ca9565b005b61041d60048036038101906104189190613b56565b610cd2565b60405161042a919061485b565b60405180910390f35b61044d60048036038101906104489190613c7e565b610d77565b005b610469600480360381019061046491906139a5565b610dfa565b005b61048560048036038101906104809190613d0c565b610e1a565b005b6104a1600480360381019061049c9190613d71565b610e76565b005b6104bd60048036038101906104b89190613d0c565b611033565b6040516104ca919061485b565b60405180910390f35b6104ed60048036038101906104e89190613d0c565b6110ca565b6040516104fa91906143c6565b60405180910390f35b61051d60048036038101906105189190613d35565b6110fd565b60405161052a919061485b565b60405180910390f35b61054d60048036038101906105489190613d0c565b61112e565b60405161055a91906143c6565b60405180910390f35b61057d60048036038101906105789190613940565b6111e0565b60405161058a919061485b565b60405180910390f35b6105ad60048036038101906105a89190613b92565b611298565b005b6105c960048036038101906105c49190613c7e565b611498565b6040516105d691906144a8565b60405180910390f35b6105e7611502565b6040516105f491906144f9565b60405180910390f35b610605611594565b604051610612919061485b565b60405180910390f35b6106236115a0565b60405161063091906144c3565b60405180910390f35b610653600480360381019061064e9190613a6f565b6115a7565b005b61066f600480360381019061066a91906139f4565b611728565b005b61068b60048036038101906106869190613d0c565b61178a565b60405161069891906144f9565b60405180910390f35b6106bb60048036038101906106b69190613d0c565b61182f565b6040516106c992919061444f565b60405180910390f35b6106da61193b565b6040516106e791906144c3565b60405180910390f35b61070a60048036038101906107059190613c7e565b61195f565b005b61072660048036038101906107219190613d0c565b611988565b6040516107339190614486565b60405180910390f35b61075660048036038101906107519190613969565b6119f3565b60405161076391906144a8565b60405180910390f35b61078660048036038101906107819190613d35565b611a87565b60405161079391906143c6565b60405180910390f35b600b5481565b60007f6f72d0b7fc6f3865289c5a5d2fe8cf08a1f02584f7f082e02593de942b0fc3507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610815575061081482611ad5565b5b9050919050565b60606001805461082b90614c5c565b80601f016020809104026020016040519081016040528092919081815260200182805461085790614c5c565b80156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b60006108b982611b4f565b6108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef9061473b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093e8261112e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a69061479b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ce611bbb565b73ffffffffffffffffffffffffffffffffffffffff1614806109fd57506109fc816109f7611bbb565b6119f3565b5b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a339061463b565b60405180910390fd5b610a468383611bc3565b505050565b600c6020528060005260406000206000915090508054610a6a90614c5c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9690614c5c565b8015610ae35780601f10610ab857610100808354040283529160200191610ae3565b820191906000526020600020905b815481529060010190602001808311610ac657829003601f168201915b505050505081565b7f6f72d0b7fc6f3865289c5a5d2fe8cf08a1f02584f7f082e02593de942b0fc35081565b610b17611bbb565b600f6000600b54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b7684848484611c7c565b50505050565b6000600980549050905090565b610b9a610b94611bbb565b82611f60565b610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd0906147bb565b60405180910390fd5b610be483838361203e565b505050565b6000806000838152602001908152602001600020600101549050919050565b6060600e6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610c9d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c53575b50505050509050919050565b610cb282610be9565b610cc381610cbe611bbb565b61229a565b610ccd8383612337565b505050565b6000610cdd836111e0565b8210610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d159061453b565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d7f611bbb565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39061483b565b60405180910390fd5b610df68282612417565b5050565b610e1583838360405180602001604052806000815250611728565b505050565b610e2b610e25611bbb565b82611f60565b610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e619061481b565b60405180910390fd5b610e73816124f8565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eb057600080fd5b600e60008481526020019081526020016000208281548110610efb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f44611bbb565b73ffffffffffffffffffffffffffffffffffffffff1614610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f919061475b565b60405180910390fd5b80600e60008581526020019081526020016000208381548110610fe6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600061103d610b7c565b821061107e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611075906147fb565b60405180910390fd5b600982815481106110b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d602052816000526040600020818154811061111957600080fd5b90600052602060002001600091509150505481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce9061467b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112489061465b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112c97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66112c4611bbb565b611498565b611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff906145fb565b60405180910390fd5b8251845114801561131a575081518451145b8015611327575080518451145b611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d9061457b565b60405180910390fd5b60005b84518110156114915761147e8582815181106113ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106113ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858481518110611430577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858581518110611471577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611c7c565b808061148990614cbf565b915050611369565b5050505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606002805461151190614c5c565b80601f016020809104026020016040519081016040528092919081815260200182805461153d90614c5c565b801561158a5780601f1061155f5761010080835404028352916020019161158a565b820191906000526020600020905b81548152906001019060200180831161156d57829003601f168201915b5050505050905090565b670de0b6b3a764000081565b6000801b81565b6115af611bbb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611614906145db565b60405180910390fd5b806006600061162a611bbb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116d7611bbb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161171c91906144a8565b60405180910390a35050565b611739611733611bbb565b83611f60565b611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906147bb565b60405180910390fd5b61178484848484612609565b50505050565b6060600c600083815260200190815260200160002080546117aa90614c5c565b80601f01602080910402602001604051908101604052809291908181526020018280546117d690614c5c565b80156118235780601f106117f857610100808354040283529160200191611823565b820191906000526020600020905b81548152906001019060200180831161180657829003601f168201915b50505050509050919050565b606080600e6000848152602001908152602001600020600d6000858152602001908152602001600020818054806020026020016040519081016040528092919081815260200182805480156118d957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161188f575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561192b57602002820191906000526020600020905b815481526020019060010190808311611917575b5050505050905091509150915091565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61196882610be9565b61197981611974611bbb565b61229a565b6119838383612417565b505050565b6060600d60008381526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119e757602002820191906000526020600020905b8154815260200190600101908083116119d3575b50505050509050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e6020528160005260406000208181548110611aa357600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b485750611b4782612665565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c368361112e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8051825114611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb79061469b565b60405180910390fd5b600a82511115611d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfc906146db565b60405180910390fd5b6000835111611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d40906147db565b60405180910390fd5b600080600090505b8251811015611e6b57600073ffffffffffffffffffffffffffffffffffffffff16848281518110611dab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e01906146fb565b60405180910390fd5b828181518110611e43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015182611e569190614a8e565b91508080611e6390614cbf565b915050611d51565b50670de0b6b3a7640000811115611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae906146bb565b60405180910390fd5b611ec385600b54612747565b83600c6000600b5481526020019081526020016000209080519060200190611eec9291906133b7565b5082600e6000600b5481526020019081526020016000209080519060200190611f1692919061343d565b5081600d6000600b5481526020019081526020016000209080519060200190611f409291906134c7565b50600b6000815480929190611f5490614cbf565b91905055505050505050565b6000611f6b82611b4f565b611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa19061461b565b60405180910390fd5b6000611fb58361112e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061202457508373ffffffffffffffffffffffffffffffffffffffff1661200c846108ae565b73ffffffffffffffffffffffffffffffffffffffff16145b80612035575061203481856119f3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205e8261112e565b73ffffffffffffffffffffffffffffffffffffffff16146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061477b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b906145bb565b60405180910390fd5b61212f838383612765565b61213a600082611bc3565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218a9190614b3e565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e19190614a8e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122a48282611498565b612333576122c98173ffffffffffffffffffffffffffffffffffffffff166014612775565b6122d78360001c6020612775565b6040516020016122e892919061438c565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232a91906144f9565b60405180910390fd5b5050565b6123418282611498565b61241357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123b8611bbb565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6124218282611498565b156124f457600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612499611bbb565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006125038261112e565b905061251181600084612765565b61251c600083611bc3565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256c9190614b3e565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61261484848461203e565b61262084848484612a6f565b61265f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126569061455b565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061273057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612740575061273f82612c06565b5b9050919050565b612761828260405180602001604052806000815250612c80565b5050565b612770838383612cdb565b505050565b6060600060028360026127889190614ae4565b6127929190614a8e565b67ffffffffffffffff8111156127d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128035781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612861577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106128eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261292b9190614ae4565b6129359190614a8e565b90505b6001811115612a21577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061299d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106129da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612a1a90614c32565b9050612938565b5060008414612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c9061451b565b60405180910390fd5b8091505092915050565b6000612a908473ffffffffffffffffffffffffffffffffffffffff16612def565b15612bf9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ab9611bbb565b8786866040518563ffffffff1660e01b8152600401612adb94939291906143e1565b602060405180830381600087803b158015612af557600080fd5b505af1925050508015612b2657506040513d601f19601f82011682018060405250810190612b239190613ce3565b60015b612ba9573d8060008114612b56576040519150601f19603f3d011682016040523d82523d6000602084013e612b5b565b606091505b50600081511415612ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b989061455b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bfe565b600190505b949350505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c795750612c7882612e02565b5b9050919050565b612c8a8383612e6c565b612c976000848484612a6f565b612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd9061455b565b60405180910390fd5b505050565b612ce683838361303a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d2957612d248161303f565b612d68565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d6757612d668382613088565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dab57612da6816131f5565b612dea565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612de957612de88282613338565b5b5b505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed39061471b565b60405180910390fd5b612ee581611b4f565b15612f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1c9061459b565b60405180910390fd5b612f3160008383612765565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f819190614a8e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613095846111e0565b61309f9190614b3e565b9050600060086000848152602001908152602001600020549050818114613184576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506132099190614b3e565b90506000600a600084815260200190815260200160002054905060006009838154811061325f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600983815481106132a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061331c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613343836111e0565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546133c390614c5c565b90600052602060002090601f0160209004810192826133e5576000855561342c565b82601f106133fe57805160ff191683800117855561342c565b8280016001018555821561342c579182015b8281111561342b578251825591602001919060010190613410565b5b5090506134399190613514565b5090565b8280548282559060005260206000209081019282156134b6579160200282015b828111156134b55782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061345d565b5b5090506134c39190613514565b5090565b828054828255906000526020600020908101928215613503579160200282015b828111156135025782518255916020019190600101906134e7565b5b5090506135109190613514565b5090565b5b8082111561352d576000816000905550600101613515565b5090565b600061354461353f8461489b565b614876565b9050808382526020820190508285602086028201111561356357600080fd5b60005b858110156135935781613579888261379c565b845260208401935060208301925050600181019050613566565b5050509392505050565b60006135b06135ab846148c7565b614876565b9050808382526020820190508260005b858110156135f057813585016135d688826137b1565b8452602084019350602083019250506001810190506135c0565b5050509392505050565b600061360d613608846148f3565b614876565b9050808382526020820190508260005b8581101561364d57813585016136338882613859565b84526020840193506020830192505060018101905061361d565b5050509392505050565b600061366a6136658461491f565b614876565b9050808382526020820190508260005b858110156136aa57813585016136908882613901565b84526020840193506020830192505060018101905061367a565b5050509392505050565b60006136c76136c28461494b565b614876565b905080838252602082019050828560208602820111156136e657600080fd5b60005b8581101561371657816136fc888261392b565b8452602084019350602083019250506001810190506136e9565b5050509392505050565b600061373361372e84614977565b614876565b90508281526020810184848401111561374b57600080fd5b613756848285614bf0565b509392505050565b600061377161376c846149a8565b614876565b90508281526020810184848401111561378957600080fd5b613794848285614bf0565b509392505050565b6000813590506137ab81615436565b92915050565b600082601f8301126137c257600080fd5b81356137d2848260208601613531565b91505092915050565b600082601f8301126137ec57600080fd5b81356137fc84826020860161359d565b91505092915050565b600082601f83011261381657600080fd5b81356138268482602086016135fa565b91505092915050565b600082601f83011261384057600080fd5b8135613850848260208601613657565b91505092915050565b600082601f83011261386a57600080fd5b813561387a8482602086016136b4565b91505092915050565b6000813590506138928161544d565b92915050565b6000813590506138a781615464565b92915050565b6000813590506138bc8161547b565b92915050565b6000815190506138d18161547b565b92915050565b600082601f8301126138e857600080fd5b81356138f8848260208601613720565b91505092915050565b600082601f83011261391257600080fd5b813561392284826020860161375e565b91505092915050565b60008135905061393a81615492565b92915050565b60006020828403121561395257600080fd5b60006139608482850161379c565b91505092915050565b6000806040838503121561397c57600080fd5b600061398a8582860161379c565b925050602061399b8582860161379c565b9150509250929050565b6000806000606084860312156139ba57600080fd5b60006139c88682870161379c565b93505060206139d98682870161379c565b92505060406139ea8682870161392b565b9150509250925092565b60008060008060808587031215613a0a57600080fd5b6000613a188782880161379c565b9450506020613a298782880161379c565b9350506040613a3a8782880161392b565b925050606085013567ffffffffffffffff811115613a5757600080fd5b613a63878288016138d7565b91505092959194509250565b60008060408385031215613a8257600080fd5b6000613a908582860161379c565b9250506020613aa185828601613883565b9150509250929050565b60008060008060808587031215613ac157600080fd5b6000613acf8782880161379c565b945050602085013567ffffffffffffffff811115613aec57600080fd5b613af887828801613901565b935050604085013567ffffffffffffffff811115613b1557600080fd5b613b21878288016137b1565b925050606085013567ffffffffffffffff811115613b3e57600080fd5b613b4a87828801613859565b91505092959194509250565b60008060408385031215613b6957600080fd5b6000613b778582860161379c565b9250506020613b888582860161392b565b9150509250929050565b60008060008060808587031215613ba857600080fd5b600085013567ffffffffffffffff811115613bc257600080fd5b613bce878288016137b1565b945050602085013567ffffffffffffffff811115613beb57600080fd5b613bf78782880161382f565b935050604085013567ffffffffffffffff811115613c1457600080fd5b613c20878288016137db565b925050606085013567ffffffffffffffff811115613c3d57600080fd5b613c4987828801613805565b91505092959194509250565b600060208284031215613c6757600080fd5b6000613c7584828501613898565b91505092915050565b60008060408385031215613c9157600080fd5b6000613c9f85828601613898565b9250506020613cb08582860161379c565b9150509250929050565b600060208284031215613ccc57600080fd5b6000613cda848285016138ad565b91505092915050565b600060208284031215613cf557600080fd5b6000613d03848285016138c2565b91505092915050565b600060208284031215613d1e57600080fd5b6000613d2c8482850161392b565b91505092915050565b60008060408385031215613d4857600080fd5b6000613d568582860161392b565b9250506020613d678582860161392b565b9150509250929050565b600080600060608486031215613d8657600080fd5b6000613d948682870161392b565b9350506020613da58682870161392b565b9250506040613db68682870161379c565b9150509250925092565b6000613dcc8383613df0565b60208301905092915050565b6000613de4838361436e565b60208301905092915050565b613df981614b72565b82525050565b613e0881614b72565b82525050565b6000613e19826149f9565b613e238185614a3f565b9350613e2e836149d9565b8060005b83811015613e5f578151613e468882613dc0565b9750613e5183614a25565b925050600181019050613e32565b5085935050505092915050565b6000613e7782614a04565b613e818185614a50565b9350613e8c836149e9565b8060005b83811015613ebd578151613ea48882613dd8565b9750613eaf83614a32565b925050600181019050613e90565b5085935050505092915050565b613ed381614b84565b82525050565b613ee281614b90565b82525050565b613ef181614b9a565b82525050565b6000613f0282614a0f565b613f0c8185614a61565b9350613f1c818560208601614bff565b613f2581614d95565b840191505092915050565b6000613f3b82614a1a565b613f458185614a72565b9350613f55818560208601614bff565b613f5e81614d95565b840191505092915050565b6000613f7482614a1a565b613f7e8185614a83565b9350613f8e818560208601614bff565b80840191505092915050565b6000613fa7602083614a72565b9150613fb282614da6565b602082019050919050565b6000613fca602b83614a72565b9150613fd582614dcf565b604082019050919050565b6000613fed603283614a72565b9150613ff882614e1e565b604082019050919050565b6000614010600e83614a72565b915061401b82614e6d565b602082019050919050565b6000614033601c83614a72565b915061403e82614e96565b602082019050919050565b6000614056602483614a72565b915061406182614ebf565b604082019050919050565b6000614079601983614a72565b915061408482614f0e565b602082019050919050565b600061409c600b83614a72565b91506140a782614f37565b602082019050919050565b60006140bf602c83614a72565b91506140ca82614f60565b604082019050919050565b60006140e2603883614a72565b91506140ed82614faf565b604082019050919050565b6000614105602a83614a72565b915061411082614ffe565b604082019050919050565b6000614128602983614a72565b91506141338261504d565b604082019050919050565b600061414b601383614a72565b91506141568261509c565b602082019050919050565b600061416e600b83614a72565b9150614179826150c5565b602082019050919050565b6000614191600d83614a72565b915061419c826150ee565b602082019050919050565b60006141b4601383614a72565b91506141bf82615117565b602082019050919050565b60006141d7602083614a72565b91506141e282615140565b602082019050919050565b60006141fa602c83614a72565b915061420582615169565b604082019050919050565b600061421d600f83614a72565b9150614228826151b8565b602082019050919050565b6000614240602983614a72565b915061424b826151e1565b604082019050919050565b6000614263602183614a72565b915061426e82615230565b604082019050919050565b6000614286603183614a72565b91506142918261527f565b604082019050919050565b60006142a9600b83614a72565b91506142b4826152ce565b602082019050919050565b60006142cc602c83614a72565b91506142d7826152f7565b604082019050919050565b60006142ef601783614a83565b91506142fa82615346565b601782019050919050565b6000614312603083614a72565b915061431d8261536f565b604082019050919050565b6000614335601183614a83565b9150614340826153be565b601182019050919050565b6000614358602f83614a72565b9150614363826153e7565b604082019050919050565b61437781614be6565b82525050565b61438681614be6565b82525050565b6000614397826142e2565b91506143a38285613f69565b91506143ae82614328565b91506143ba8284613f69565b91508190509392505050565b60006020820190506143db6000830184613dff565b92915050565b60006080820190506143f66000830187613dff565b6144036020830186613dff565b614410604083018561437d565b81810360608301526144228184613ef7565b905095945050505050565b600060208201905081810360008301526144478184613e0e565b905092915050565b600060408201905081810360008301526144698185613e0e565b9050818103602083015261447d8184613e6c565b90509392505050565b600060208201905081810360008301526144a08184613e6c565b905092915050565b60006020820190506144bd6000830184613eca565b92915050565b60006020820190506144d86000830184613ed9565b92915050565b60006020820190506144f36000830184613ee8565b92915050565b600060208201905081810360008301526145138184613f30565b905092915050565b6000602082019050818103600083015261453481613f9a565b9050919050565b6000602082019050818103600083015261455481613fbd565b9050919050565b6000602082019050818103600083015261457481613fe0565b9050919050565b6000602082019050818103600083015261459481614003565b9050919050565b600060208201905081810360008301526145b481614026565b9050919050565b600060208201905081810360008301526145d481614049565b9050919050565b600060208201905081810360008301526145f48161406c565b9050919050565b600060208201905081810360008301526146148161408f565b9050919050565b60006020820190508181036000830152614634816140b2565b9050919050565b60006020820190508181036000830152614654816140d5565b9050919050565b60006020820190508181036000830152614674816140f8565b9050919050565b600060208201905081810360008301526146948161411b565b9050919050565b600060208201905081810360008301526146b48161413e565b9050919050565b600060208201905081810360008301526146d481614161565b9050919050565b600060208201905081810360008301526146f481614184565b9050919050565b60006020820190508181036000830152614714816141a7565b9050919050565b60006020820190508181036000830152614734816141ca565b9050919050565b60006020820190508181036000830152614754816141ed565b9050919050565b6000602082019050818103600083015261477481614210565b9050919050565b6000602082019050818103600083015261479481614233565b9050919050565b600060208201905081810360008301526147b481614256565b9050919050565b600060208201905081810360008301526147d481614279565b9050919050565b600060208201905081810360008301526147f48161429c565b9050919050565b60006020820190508181036000830152614814816142bf565b9050919050565b6000602082019050818103600083015261483481614305565b9050919050565b600060208201905081810360008301526148548161434b565b9050919050565b6000602082019050614870600083018461437d565b92915050565b6000614880614891565b905061488c8282614c8e565b919050565b6000604051905090565b600067ffffffffffffffff8211156148b6576148b5614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148e2576148e1614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561490e5761490d614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561493a57614939614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561496657614965614d66565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561499257614991614d66565b5b61499b82614d95565b9050602081019050919050565b600067ffffffffffffffff8211156149c3576149c2614d66565b5b6149cc82614d95565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a9982614be6565b9150614aa483614be6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ad957614ad8614d08565b5b828201905092915050565b6000614aef82614be6565b9150614afa83614be6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3357614b32614d08565b5b828202905092915050565b6000614b4982614be6565b9150614b5483614be6565b925082821015614b6757614b66614d08565b5b828203905092915050565b6000614b7d82614bc6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c1d578082015181840152602081019050614c02565b83811115614c2c576000848401525b50505050565b6000614c3d82614be6565b91506000821415614c5157614c50614d08565b5b600182039050919050565b60006002820490506001821680614c7457607f821691505b60208210811415614c8857614c87614d37565b5b50919050565b614c9782614d95565b810181811067ffffffffffffffff82111715614cb657614cb5614d66565b5b80604052505050565b6000614cca82614be6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cfd57614cfc614d08565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f496e76616c696420706172616d73000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f6e6c79206d696e746572000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420666565206c656e6774687300000000000000000000000000600082015250565b7f496e76616c696420666565000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e79206665657300000000000000000000000000000000000000600082015250565b7f496e76616c696420666565206164647265737300000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e76616c6964206163636f756e740000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c696420555249000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61543f81614b72565b811461544a57600080fd5b50565b61545681614b84565b811461546157600080fd5b50565b61546d81614b90565b811461547857600080fd5b50565b61548481614b9a565b811461548f57600080fd5b50565b61549b81614be6565b81146154a657600080fd5b5056fea26469706673582212209f4bc20cdf51d17893a8d2978be4af4f75f68249209d203f30bee4ca991b3ad764736f6c63430008030033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001d466561747572656420436f6d6d756e69747920436f6c6c656374696f6e00000000000000000000000000000000000000000000000000000000000000000000034643430000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Featured Community Collection
Arg [1] : _symbol (string): FCC

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001d
Arg [3] : 466561747572656420436f6d6d756e69747920436f6c6c656374696f6e000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4643430000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

58555:520:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54520:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57135:263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20693:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22153:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21690:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54765:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54558:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58794:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33910:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23043:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45302:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56658:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45687;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33578:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46735:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23419:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39727:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56090:356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34100:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58602:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54810:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20387:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20117:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55550:532;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44300:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20862:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54918:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42265:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22446:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23641:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56501:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56952:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;54646:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46079:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56813:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22812:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54859:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54520:29;;;;:::o;57135:263::-;57282:4;54608:30;57306:33;;;:12;:33;;;;:84;;;;57353:37;57377:12;57353:23;:37::i;:::-;57306:84;57299:91;;57135:263;;;:::o;20693:100::-;20747:13;20780:5;20773:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20693:100;:::o;22153:221::-;22229:7;22257:16;22265:7;22257;:16::i;:::-;22249:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22342:15;:24;22358:7;22342:24;;;;;;;;;;;;;;;;;;;;;22335:31;;22153:221;;;:::o;21690:397::-;21771:13;21787:23;21802:7;21787:14;:23::i;:::-;21771:39;;21835:5;21829:11;;:2;:11;;;;21821:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21915:5;21899:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21924:37;21941:5;21948:12;:10;:12::i;:::-;21924:16;:37::i;:::-;21899:62;21891:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22058:21;22067:2;22071:7;22058:8;:21::i;:::-;21690:397;;;:::o;54765:38::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54558:81::-;54608:30;54558:81;:::o;58794:278::-;58999:12;:10;:12::i;:::-;58973:7;:23;58981:14;;58973:23;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;59022:42;59032:3;59037:4;59043:13;59058:5;59022:9;:42::i;:::-;58794:278;;;;:::o;33910:113::-;33971:7;33998:10;:17;;;;33991:24;;33910:113;:::o;23043:305::-;23204:41;23223:12;:10;:12::i;:::-;23237:7;23204:18;:41::i;:::-;23196:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23312:28;23322:4;23328:2;23332:7;23312:9;:28::i;:::-;23043:305;;;:::o;45302:123::-;45368:7;45395:6;:12;45402:4;45395:12;;;;;;;;;;;:22;;;45388:29;;45302:123;;;:::o;56658:147::-;56739:16;56775:12;:22;56788:8;56775:22;;;;;;;;;;;56768:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56658:147;;;:::o;45687:::-;45770:18;45783:4;45770:12;:18::i;:::-;43869:30;43880:4;43886:12;:10;:12::i;:::-;43869:10;:30::i;:::-;45801:25:::1;45812:4;45818:7;45801:10;:25::i;:::-;45687:147:::0;;;:::o;33578:256::-;33675:7;33711:23;33728:5;33711:16;:23::i;:::-;33703:5;:31;33695:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33800:12;:19;33813:5;33800:19;;;;;;;;;;;;;;;:26;33820:5;33800:26;;;;;;;;;;;;33793:33;;33578:256;;;;:::o;46735:218::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:23;;;46823:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;46919:26;46931:4;46937:7;46919:11;:26::i;:::-;46735:218;;:::o;23419:151::-;23523:39;23540:4;23546:2;23550:7;23523:39;;;;;;;;;;;;:16;:39::i;:::-;23419:151;;;:::o;39727:245::-;39845:41;39864:12;:10;:12::i;:::-;39878:7;39845:18;:41::i;:::-;39837:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;39950:14;39956:7;39950:5;:14::i;:::-;39727:245;:::o;56090:356::-;56275:1;56252:25;;:11;:25;;;;56244:34;;;;;;56313:12;:22;56326:8;56313:22;;;;;;;;;;;56336:16;56313:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56297:56;;:12;:10;:12::i;:::-;:56;;;56289:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;56427:11;56384:12;:22;56397:8;56384:22;;;;;;;;;;;56407:16;56384:40;;;;;;;;;;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;56090:356;;;:::o;34100:233::-;34175:7;34211:30;:28;:30::i;:::-;34203:5;:38;34195:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34308:10;34319:5;34308:17;;;;;;;;;;;;;;;;;;;;;;;;34301:24;;34100:233;;;:::o;58602:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;54810:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20387:239::-;20459:7;20479:13;20495:7;:16;20503:7;20495:16;;;;;;;;;;;;;;;;;;;;;20479:32;;20547:1;20530:19;;:5;:19;;;;20522:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20613:5;20606:12;;;20387:239;;;:::o;20117:208::-;20189:7;20234:1;20217:19;;:5;:19;;;;20209:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20301:9;:16;20311:5;20301:16;;;;;;;;;;;;;;;;20294:23;;20117:208;;;:::o;55550:532::-;55744:34;54684:24;55765:12;:10;:12::i;:::-;55744:7;:34::i;:::-;55736:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55835:4;:11;55821:3;:10;:25;:73;;;;;55874:13;:20;55850:3;:10;:44;55821:73;:103;;;;;55912:5;:12;55898:3;:10;:26;55821:103;55813:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;55958:9;55954:121;55977:3;:10;55973:1;:14;55954:121;;;56009:54;56019:3;56023:1;56019:6;;;;;;;;;;;;;;;;;;;;;;56027:4;56032:1;56027:7;;;;;;;;;;;;;;;;;;;;;;56036:13;56050:1;56036:16;;;;;;;;;;;;;;;;;;;;;;56054:5;56060:1;56054:8;;;;;;;;;;;;;;;;;;;;;;56009:9;:54::i;:::-;55989:3;;;;;:::i;:::-;;;;55954:121;;;;55550:532;;;;:::o;44300:139::-;44378:4;44402:6;:12;44409:4;44402:12;;;;;;;;;;;:20;;:29;44423:7;44402:29;;;;;;;;;;;;;;;;;;;;;;;;;44395:36;;44300:139;;;;:::o;20862:104::-;20918:13;20951:7;20944:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20862:104;:::o;54918:35::-;54949:4;54918:35;:::o;42265:49::-;42310:4;42265:49;;;:::o;22446:295::-;22561:12;:10;:12::i;:::-;22549:24;;:8;:24;;;;22541:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22661:8;22616:18;:32;22635:12;:10;:12::i;:::-;22616:32;;;;;;;;;;;;;;;:42;22649:8;22616:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22714:8;22685:48;;22700:12;:10;:12::i;:::-;22685:48;;;22724:8;22685:48;;;;;;:::i;:::-;;;;;;;;22446:295;;:::o;23641:285::-;23773:41;23792:12;:10;:12::i;:::-;23806:7;23773:18;:41::i;:::-;23765:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23879:39;23893:4;23899:2;23903:7;23912:5;23879:13;:39::i;:::-;23641:285;;;;:::o;56501:148::-;56595:13;56628:3;:13;56632:8;56628:13;;;;;;;;;;;56621:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56501:148;;;:::o;56952:175::-;57029:16;57047:13;57080:12;:22;57093:8;57080:22;;;;;;;;;;;57104:4;:14;57109:8;57104:14;;;;;;;;;;;57072:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56952:175;;;:::o;54646:62::-;54684:24;54646:62;:::o;46079:149::-;46163:18;46176:4;46163:12;:18::i;:::-;43869:30;43880:4;43886:12;:10;:12::i;:::-;43869:10;:30::i;:::-;46194:26:::1;46206:4;46212:7;46194:11;:26::i;:::-;46079:149:::0;;;:::o;56813:131::-;56886:16;56922:4;:14;56927:8;56922:14;;;;;;;;;;;56915:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56813:131;;;:::o;22812:164::-;22909:4;22933:18;:25;22952:5;22933:25;;;;;;;;;;;;;;;:35;22959:8;22933:35;;;;;;;;;;;;;;;;;;;;;;;;;22926:42;;22812:164;;;;:::o;54859:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33257:237::-;33359:4;33398:35;33383:50;;;:11;:50;;;;:103;;;;33450:36;33474:11;33450:23;:36::i;:::-;33383:103;33376:110;;33257:237;;;:::o;25393:127::-;25458:4;25510:1;25482:30;;:7;:16;25490:7;25482:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25475:37;;25393:127;;;:::o;15339:98::-;15392:7;15419:10;15412:17;;15339:98;:::o;29270:174::-;29372:2;29345:15;:24;29361:7;29345:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29428:7;29424:2;29390:46;;29399:23;29414:7;29399:14;:23::i;:::-;29390:46;;;;;;;;;;;;29270:174;;:::o;57457:856::-;57664:5;:12;57640:13;:20;:36;57632:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54754:2;57719:13;:20;:41;;57711:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;57818:1;57803:4;57797:18;:22;57789:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;57848:16;57882:9;57894:1;57882:13;;57877:167;57901:5;:12;57897:1;:16;57877:167;;;57971:1;57943:30;;:13;57957:1;57943:16;;;;;;;;;;;;;;;;;;;;;;:30;;;;57935:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58024:5;58030:1;58024:8;;;;;;;;;;;;;;;;;;;;;;58012:20;;;;;:::i;:::-;;;57915:3;;;;;:::i;:::-;;;;57877:167;;;;54949:4;58064:8;:16;;58056:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;58109:36;58125:3;58130:14;;58109:15;:36::i;:::-;58180:4;58158:3;:19;58162:14;;58158:19;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;58226:13;58195:12;:28;58208:14;;58195:28;;;;;;;;;;;:44;;;;;;;;;;;;:::i;:::-;;58273:5;58250:4;:20;58255:14;;58250:20;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;58289:14;;:16;;;;;;;;;:::i;:::-;;;;;;57457:856;;;;;:::o;25687:348::-;25780:4;25805:16;25813:7;25805;:16::i;:::-;25797:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25881:13;25897:23;25912:7;25897:14;:23::i;:::-;25881:39;;25950:5;25939:16;;:7;:16;;;:51;;;;25983:7;25959:31;;:20;25971:7;25959:11;:20::i;:::-;:31;;;25939:51;:87;;;;25994:32;26011:5;26018:7;25994:16;:32::i;:::-;25939:87;25931:96;;;25687:348;;;;:::o;28608:544::-;28733:4;28706:31;;:23;28721:7;28706:14;:23::i;:::-;:31;;;28698:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28816:1;28802:16;;:2;:16;;;;28794:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28872:39;28893:4;28899:2;28903:7;28872:20;:39::i;:::-;28976:29;28993:1;28997:7;28976:8;:29::i;:::-;29037:1;29018:9;:15;29028:4;29018:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29066:1;29049:9;:13;29059:2;29049:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29097:2;29078:7;:16;29086:7;29078:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29136:7;29132:2;29117:27;;29126:4;29117:27;;;;;;;;;;;;28608:544;;;:::o;44729:384::-;44809:22;44817:4;44823:7;44809;:22::i;:::-;44805:301;;44941:41;44969:7;44941:41;;44979:2;44941:19;:41::i;:::-;45039:38;45067:4;45059:13;;45074:2;45039:19;:38::i;:::-;44862:230;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44848:246;;;;;;;;;;;:::i;:::-;;;;;;;;44805:301;44729:384;;:::o;47983:229::-;48058:22;48066:4;48072:7;48058;:22::i;:::-;48053:152;;48129:4;48097:6;:12;48104:4;48097:12;;;;;;;;;;;:20;;:29;48118:7;48097:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;48180:12;:10;:12::i;:::-;48153:40;;48171:7;48153:40;;48165:4;48153:40;;;;;;;;;;48053:152;47983:229;;:::o;48220:230::-;48295:22;48303:4;48309:7;48295;:22::i;:::-;48291:152;;;48366:5;48334:6;:12;48341:4;48334:12;;;;;;;;;;;:20;;:29;48355:7;48334:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;48418:12;:10;:12::i;:::-;48391:40;;48409:7;48391:40;;48403:4;48391:40;;;;;;;;;;48291:152;48220:230;;:::o;27911:360::-;27971:13;27987:23;28002:7;27987:14;:23::i;:::-;27971:39;;28023:48;28044:5;28059:1;28063:7;28023:20;:48::i;:::-;28112:29;28129:1;28133:7;28112:8;:29::i;:::-;28174:1;28154:9;:16;28164:5;28154:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28193:7;:16;28201:7;28193:16;;;;;;;;;;;;28186:23;;;;;;;;;;;28255:7;28251:1;28227:36;;28236:5;28227:36;;;;;;;;;;;;27911:360;;:::o;24808:272::-;24922:28;24932:4;24938:2;24942:7;24922:9;:28::i;:::-;24969:48;24992:4;24998:2;25002:7;25011:5;24969:22;:48::i;:::-;24961:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24808:272;;;;:::o;19761:292::-;19863:4;19902:25;19887:40;;;:11;:40;;;;:105;;;;19959:33;19944:48;;;:11;:48;;;;19887:105;:158;;;;20009:36;20033:11;20009:23;:36::i;:::-;19887:158;19880:165;;19761:292;;;:::o;26377:110::-;26453:26;26463:2;26467:7;26453:26;;;;;;;;;;;;:9;:26::i;:::-;26377:110;;:::o;58321:227::-;58495:45;58522:4;58528:2;58532:7;58495:26;:45::i;:::-;58321:227;;;:::o;17210:447::-;17285:13;17311:19;17356:1;17347:6;17343:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17333:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17311:47;;17369:15;:6;17376:1;17369:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;17395;:6;17402:1;17395:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;17426:9;17451:1;17442:6;17438:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17426:26;;17421:131;17458:1;17454;:5;17421:131;;;17493:8;17510:3;17502:5;:11;17493:21;;;;;;;;;;;;;;;;;;17481:6;17488:1;17481:9;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;17539:1;17529:11;;;;;17461:3;;;;:::i;:::-;;;17421:131;;;;17579:1;17570:5;:10;17562:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17642:6;17628:21;;;17210:447;;;;:::o;30009:843::-;30130:4;30156:15;:2;:13;;;:15::i;:::-;30152:693;;;30208:2;30192:36;;;30229:12;:10;:12::i;:::-;30243:4;30249:7;30258:5;30192:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30188:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30455:1;30438:6;:13;:18;30434:341;;;30481:60;;;;;;;;;;:::i;:::-;;;;;;;;30434:341;30725:6;30719:13;30710:6;30706:2;30702:15;30695:38;30188:602;30325:45;;;30315:55;;;:6;:55;;;;30308:62;;;;;30152:693;30829:4;30822:11;;30009:843;;;;;;;:::o;43991:217::-;44076:4;44115:32;44100:47;;;:11;:47;;;;:100;;;;44164:36;44188:11;44164:23;:36::i;:::-;44100:100;44093:107;;43991:217;;;:::o;26714:250::-;26810:18;26816:2;26820:7;26810:5;:18::i;:::-;26847:54;26878:1;26882:2;26886:7;26895:5;26847:22;:54::i;:::-;26839:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;26714:250;;;:::o;34946:555::-;35056:45;35083:4;35089:2;35093:7;35056:26;:45::i;:::-;35134:1;35118:18;;:4;:18;;;35114:187;;;35153:40;35185:7;35153:31;:40::i;:::-;35114:187;;;35223:2;35215:10;;:4;:10;;;35211:90;;35242:47;35275:4;35281:7;35242:32;:47::i;:::-;35211:90;35114:187;35329:1;35315:16;;:2;:16;;;35311:183;;;35348:45;35385:7;35348:36;:45::i;:::-;35311:183;;;35421:4;35415:10;;:2;:10;;;35411:83;;35442:40;35470:2;35474:7;35442:27;:40::i;:::-;35411:83;35311:183;34946:555;;;:::o;7541:422::-;7601:4;7809:12;7920:7;7908:20;7900:28;;7954:1;7947:4;:8;7940:15;;;7541:422;;;:::o;18364:157::-;18449:4;18488:25;18473:40;;;:11;:40;;;;18466:47;;18364:157;;;:::o;27300:382::-;27394:1;27380:16;;:2;:16;;;;27372:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27453:16;27461:7;27453;:16::i;:::-;27452:17;27444:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27515:45;27544:1;27548:2;27552:7;27515:20;:45::i;:::-;27590:1;27573:9;:13;27583:2;27573:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27621:2;27602:7;:16;27610:7;27602:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27666:7;27662:2;27641:33;;27658:1;27641:33;;;;;;;;;;;;27300:382;;:::o;31465:93::-;;;;:::o;36224:164::-;36328:10;:17;;;;36301:15;:24;36317:7;36301:24;;;;;;;;;;;:44;;;;36356:10;36372:7;36356:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36224:164;:::o;37015:988::-;37281:22;37331:1;37306:22;37323:4;37306:16;:22::i;:::-;:26;;;;:::i;:::-;37281:51;;37343:18;37364:17;:26;37382:7;37364:26;;;;;;;;;;;;37343:47;;37511:14;37497:10;:28;37493:328;;37542:19;37564:12;:18;37577:4;37564:18;;;;;;;;;;;;;;;:34;37583:14;37564:34;;;;;;;;;;;;37542:56;;37648:11;37615:12;:18;37628:4;37615:18;;;;;;;;;;;;;;;:30;37634:10;37615:30;;;;;;;;;;;:44;;;;37765:10;37732:17;:30;37750:11;37732:30;;;;;;;;;;;:43;;;;37493:328;;37917:17;:26;37935:7;37917:26;;;;;;;;;;;37910:33;;;37961:12;:18;37974:4;37961:18;;;;;;;;;;;;;;;:34;37980:14;37961:34;;;;;;;;;;;37954:41;;;37015:988;;;;:::o;38298:1079::-;38551:22;38596:1;38576:10;:17;;;;:21;;;;:::i;:::-;38551:46;;38608:18;38629:15;:24;38645:7;38629:24;;;;;;;;;;;;38608:45;;38980:19;39002:10;39013:14;39002:26;;;;;;;;;;;;;;;;;;;;;;;;38980:48;;39066:11;39041:10;39052;39041:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39177:10;39146:15;:28;39162:11;39146:28;;;;;;;;;;;:41;;;;39318:15;:24;39334:7;39318:24;;;;;;;;;;;39311:31;;;39353:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38298:1079;;;;:::o;35802:221::-;35887:14;35904:20;35921:2;35904:16;:20::i;:::-;35887:37;;35962:7;35935:12;:16;35948:2;35935:16;;;;;;;;;;;;;;;:24;35952:6;35935:24;;;;;;;;;;;:34;;;;36009:6;35980:17;:26;35998:7;35980:26;;;;;;;;;;;:35;;;;35802:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;672:661::-;;818:106;834:89;916:6;834:89;:::i;:::-;818:106;:::i;:::-;809:115;;944:5;972:6;965:5;958:21;998:4;991:5;987:16;980:23;;1023:6;1054:1;1039:288;1064:6;1061:1;1058:13;1039:288;;;1156:3;1143:17;1135:6;1131:30;1186:62;1244:3;1232:10;1186:62;:::i;:::-;1181:3;1174:75;1278:4;1273:3;1269:14;1262:21;;1312:4;1307:3;1303:14;1296:21;;1099:228;1086:1;1083;1079:9;1074:14;;1039:288;;;1043:14;799:534;;;;;;;:::o;1358:661::-;;1504:106;1520:89;1602:6;1520:89;:::i;:::-;1504:106;:::i;:::-;1495:115;;1630:5;1658:6;1651:5;1644:21;1684:4;1677:5;1673:16;1666:23;;1709:6;1740:1;1725:288;1750:6;1747:1;1744:13;1725:288;;;1842:3;1829:17;1821:6;1817:30;1872:62;1930:3;1918:10;1872:62;:::i;:::-;1867:3;1860:75;1964:4;1959:3;1955:14;1948:21;;1998:4;1993:3;1989:14;1982:21;;1785:228;1772:1;1769;1765:9;1760:14;;1725:288;;;1729:14;1485:534;;;;;;;:::o;2041:616::-;;2172:91;2188:74;2255:6;2188:74;:::i;:::-;2172:91;:::i;:::-;2163:100;;2283:5;2311:6;2304:5;2297:21;2337:4;2330:5;2326:16;2319:23;;2362:6;2393:1;2378:273;2403:6;2400:1;2397:13;2378:273;;;2495:3;2482:17;2474:6;2470:30;2525:47;2568:3;2556:10;2525:47;:::i;:::-;2520:3;2513:60;2602:4;2597:3;2593:14;2586:21;;2636:4;2631:3;2627:14;2620:21;;2438:213;2425:1;2422;2418:9;2413:14;;2378:273;;;2382:14;2153:504;;;;;;;:::o;2680:623::-;;2801:81;2817:64;2874:6;2817:64;:::i;:::-;2801:81;:::i;:::-;2792:90;;2902:5;2930:6;2923:5;2916:21;2956:4;2949:5;2945:16;2938:23;;2981:6;3031:3;3023:4;3015:6;3011:17;3006:3;3002:27;2999:36;2996:2;;;3048:1;3045;3038:12;2996:2;3076:1;3061:236;3086:6;3083:1;3080:13;3061:236;;;3153:3;3181:37;3214:3;3202:10;3181:37;:::i;:::-;3176:3;3169:50;3248:4;3243:3;3239:14;3232:21;;3282:4;3277:3;3273:14;3266:21;;3121:176;3108:1;3105;3101:9;3096:14;;3061:236;;;3065:14;2782:521;;;;;;;:::o;3309:343::-;;3411:65;3427:48;3468:6;3427:48;:::i;:::-;3411:65;:::i;:::-;3402:74;;3499:6;3492:5;3485:21;3537:4;3530:5;3526:16;3575:3;3566:6;3561:3;3557:16;3554:25;3551:2;;;3592:1;3589;3582:12;3551:2;3605:41;3639:6;3634:3;3629;3605:41;:::i;:::-;3392:260;;;;;;:::o;3658:345::-;;3761:66;3777:49;3819:6;3777:49;:::i;:::-;3761:66;:::i;:::-;3752:75;;3850:6;3843:5;3836:21;3888:4;3881:5;3877:16;3926:3;3917:6;3912:3;3908:16;3905:25;3902:2;;;3943:1;3940;3933:12;3902:2;3956:41;3990:6;3985:3;3980;3956:41;:::i;:::-;3742:261;;;;;;:::o;4009:139::-;;4093:6;4080:20;4071:29;;4109:33;4136:5;4109:33;:::i;:::-;4061:87;;;;:::o;4171:303::-;;4291:3;4284:4;4276:6;4272:17;4268:27;4258:2;;4309:1;4306;4299:12;4258:2;4349:6;4336:20;4374:94;4464:3;4456:6;4449:4;4441:6;4437:17;4374:94;:::i;:::-;4365:103;;4248:226;;;;;:::o;4499:353::-;;4644:3;4637:4;4629:6;4625:17;4621:27;4611:2;;4662:1;4659;4652:12;4611:2;4702:6;4689:20;4727:119;4842:3;4834:6;4827:4;4819:6;4815:17;4727:119;:::i;:::-;4718:128;;4601:251;;;;;:::o;4877:353::-;;5022:3;5015:4;5007:6;5003:17;4999:27;4989:2;;5040:1;5037;5030:12;4989:2;5080:6;5067:20;5105:119;5220:3;5212:6;5205:4;5197:6;5193:17;5105:119;:::i;:::-;5096:128;;4979:251;;;;;:::o;5252:323::-;;5382:3;5375:4;5367:6;5363:17;5359:27;5349:2;;5400:1;5397;5390:12;5349:2;5440:6;5427:20;5465:104;5565:3;5557:6;5550:4;5542:6;5538:17;5465:104;:::i;:::-;5456:113;;5339:236;;;;;:::o;5598:303::-;;5718:3;5711:4;5703:6;5699:17;5695:27;5685:2;;5736:1;5733;5726:12;5685:2;5776:6;5763:20;5801:94;5891:3;5883:6;5876:4;5868:6;5864:17;5801:94;:::i;:::-;5792:103;;5675:226;;;;;:::o;5907:133::-;;5988:6;5975:20;5966:29;;6004:30;6028:5;6004:30;:::i;:::-;5956:84;;;;:::o;6046:139::-;;6130:6;6117:20;6108:29;;6146:33;6173:5;6146:33;:::i;:::-;6098:87;;;;:::o;6191:137::-;;6274:6;6261:20;6252:29;;6290:32;6316:5;6290:32;:::i;:::-;6242:86;;;;:::o;6334:141::-;;6421:6;6415:13;6406:22;;6437:32;6463:5;6437:32;:::i;:::-;6396:79;;;;:::o;6494:271::-;;6598:3;6591:4;6583:6;6579:17;6575:27;6565:2;;6616:1;6613;6606:12;6565:2;6656:6;6643:20;6681:78;6755:3;6747:6;6740:4;6732:6;6728:17;6681:78;:::i;:::-;6672:87;;6555:210;;;;;:::o;6785:273::-;;6890:3;6883:4;6875:6;6871:17;6867:27;6857:2;;6908:1;6905;6898:12;6857:2;6948:6;6935:20;6973:79;7048:3;7040:6;7033:4;7025:6;7021:17;6973:79;:::i;:::-;6964:88;;6847:211;;;;;:::o;7064:139::-;;7148:6;7135:20;7126:29;;7164:33;7191:5;7164:33;:::i;:::-;7116:87;;;;:::o;7209:262::-;;7317:2;7305:9;7296:7;7292:23;7288:32;7285:2;;;7333:1;7330;7323:12;7285:2;7376:1;7401:53;7446:7;7437:6;7426:9;7422:22;7401:53;:::i;:::-;7391:63;;7347:117;7275:196;;;;:::o;7477:407::-;;;7602:2;7590:9;7581:7;7577:23;7573:32;7570:2;;;7618:1;7615;7608:12;7570:2;7661:1;7686:53;7731:7;7722:6;7711:9;7707:22;7686:53;:::i;:::-;7676:63;;7632:117;7788:2;7814:53;7859:7;7850:6;7839:9;7835:22;7814:53;:::i;:::-;7804:63;;7759:118;7560:324;;;;;:::o;7890:552::-;;;;8032:2;8020:9;8011:7;8007:23;8003:32;8000:2;;;8048:1;8045;8038:12;8000:2;8091:1;8116:53;8161:7;8152:6;8141:9;8137:22;8116:53;:::i;:::-;8106:63;;8062:117;8218:2;8244:53;8289:7;8280:6;8269:9;8265:22;8244:53;:::i;:::-;8234:63;;8189:118;8346:2;8372:53;8417:7;8408:6;8397:9;8393:22;8372:53;:::i;:::-;8362:63;;8317:118;7990:452;;;;;:::o;8448:809::-;;;;;8616:3;8604:9;8595:7;8591:23;8587:33;8584:2;;;8633:1;8630;8623:12;8584:2;8676:1;8701:53;8746:7;8737:6;8726:9;8722:22;8701:53;:::i;:::-;8691:63;;8647:117;8803:2;8829:53;8874:7;8865:6;8854:9;8850:22;8829:53;:::i;:::-;8819:63;;8774:118;8931:2;8957:53;9002:7;8993:6;8982:9;8978:22;8957:53;:::i;:::-;8947:63;;8902:118;9087:2;9076:9;9072:18;9059:32;9118:18;9110:6;9107:30;9104:2;;;9150:1;9147;9140:12;9104:2;9178:62;9232:7;9223:6;9212:9;9208:22;9178:62;:::i;:::-;9168:72;;9030:220;8574:683;;;;;;;:::o;9263:401::-;;;9385:2;9373:9;9364:7;9360:23;9356:32;9353:2;;;9401:1;9398;9391:12;9353:2;9444:1;9469:53;9514:7;9505:6;9494:9;9490:22;9469:53;:::i;:::-;9459:63;;9415:117;9571:2;9597:50;9639:7;9630:6;9619:9;9615:22;9597:50;:::i;:::-;9587:60;;9542:115;9343:321;;;;;:::o;9670:1097::-;;;;;9889:3;9877:9;9868:7;9864:23;9860:33;9857:2;;;9906:1;9903;9896:12;9857:2;9949:1;9974:53;10019:7;10010:6;9999:9;9995:22;9974:53;:::i;:::-;9964:63;;9920:117;10104:2;10093:9;10089:18;10076:32;10135:18;10127:6;10124:30;10121:2;;;10167:1;10164;10157:12;10121:2;10195:63;10250:7;10241:6;10230:9;10226:22;10195:63;:::i;:::-;10185:73;;10047:221;10335:2;10324:9;10320:18;10307:32;10366:18;10358:6;10355:30;10352:2;;;10398:1;10395;10388:12;10352:2;10426:78;10496:7;10487:6;10476:9;10472:22;10426:78;:::i;:::-;10416:88;;10278:236;10581:2;10570:9;10566:18;10553:32;10612:18;10604:6;10601:30;10598:2;;;10644:1;10641;10634:12;10598:2;10672:78;10742:7;10733:6;10722:9;10718:22;10672:78;:::i;:::-;10662:88;;10524:236;9847:920;;;;;;;:::o;10773:407::-;;;10898:2;10886:9;10877:7;10873:23;10869:32;10866:2;;;10914:1;10911;10904:12;10866:2;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;10856:324;;;;;:::o;11186:1390::-;;;;;11505:3;11493:9;11484:7;11480:23;11476:33;11473:2;;;11522:1;11519;11512:12;11473:2;11593:1;11582:9;11578:17;11565:31;11623:18;11615:6;11612:30;11609:2;;;11655:1;11652;11645:12;11609:2;11683:78;11753:7;11744:6;11733:9;11729:22;11683:78;:::i;:::-;11673:88;;11536:235;11838:2;11827:9;11823:18;11810:32;11869:18;11861:6;11858:30;11855:2;;;11901:1;11898;11891:12;11855:2;11929:88;12009:7;12000:6;11989:9;11985:22;11929:88;:::i;:::-;11919:98;;11781:246;12094:2;12083:9;12079:18;12066:32;12125:18;12117:6;12114:30;12111:2;;;12157:1;12154;12147:12;12111:2;12185:103;12280:7;12271:6;12260:9;12256:22;12185:103;:::i;:::-;12175:113;;12037:261;12365:2;12354:9;12350:18;12337:32;12396:18;12388:6;12385:30;12382:2;;;12428:1;12425;12418:12;12382:2;12456:103;12551:7;12542:6;12531:9;12527:22;12456:103;:::i;:::-;12446:113;;12308:261;11463:1113;;;;;;;:::o;12582:262::-;;12690:2;12678:9;12669:7;12665:23;12661:32;12658:2;;;12706:1;12703;12696:12;12658:2;12749:1;12774:53;12819:7;12810:6;12799:9;12795:22;12774:53;:::i;:::-;12764:63;;12720:117;12648:196;;;;:::o;12850:407::-;;;12975:2;12963:9;12954:7;12950:23;12946:32;12943:2;;;12991:1;12988;12981:12;12943:2;13034:1;13059:53;13104:7;13095:6;13084:9;13080:22;13059:53;:::i;:::-;13049:63;;13005:117;13161:2;13187:53;13232:7;13223:6;13212:9;13208:22;13187:53;:::i;:::-;13177:63;;13132:118;12933:324;;;;;:::o;13263:260::-;;13370:2;13358:9;13349:7;13345:23;13341:32;13338:2;;;13386:1;13383;13376:12;13338:2;13429:1;13454:52;13498:7;13489:6;13478:9;13474:22;13454:52;:::i;:::-;13444:62;;13400:116;13328:195;;;;:::o;13529:282::-;;13647:2;13635:9;13626:7;13622:23;13618:32;13615:2;;;13663:1;13660;13653:12;13615:2;13706:1;13731:63;13786:7;13777:6;13766:9;13762:22;13731:63;:::i;:::-;13721:73;;13677:127;13605:206;;;;:::o;13817:262::-;;13925:2;13913:9;13904:7;13900:23;13896:32;13893:2;;;13941:1;13938;13931:12;13893:2;13984:1;14009:53;14054:7;14045:6;14034:9;14030:22;14009:53;:::i;:::-;13999:63;;13955:117;13883:196;;;;:::o;14085:407::-;;;14210:2;14198:9;14189:7;14185:23;14181:32;14178:2;;;14226:1;14223;14216:12;14178:2;14269:1;14294:53;14339:7;14330:6;14319:9;14315:22;14294:53;:::i;:::-;14284:63;;14240:117;14396:2;14422:53;14467:7;14458:6;14447:9;14443:22;14422:53;:::i;:::-;14412:63;;14367:118;14168:324;;;;;:::o;14498:552::-;;;;14640:2;14628:9;14619:7;14615:23;14611:32;14608:2;;;14656:1;14653;14646:12;14608:2;14699:1;14724:53;14769:7;14760:6;14749:9;14745:22;14724:53;:::i;:::-;14714:63;;14670:117;14826:2;14852:53;14897:7;14888:6;14877:9;14873:22;14852:53;:::i;:::-;14842:63;;14797:118;14954:2;14980:53;15025:7;15016:6;15005:9;15001:22;14980:53;:::i;:::-;14970:63;;14925:118;14598:452;;;;;:::o;15056:179::-;;15146:46;15188:3;15180:6;15146:46;:::i;:::-;15224:4;15219:3;15215:14;15201:28;;15136:99;;;;:::o;15241:179::-;;15331:46;15373:3;15365:6;15331:46;:::i;:::-;15409:4;15404:3;15400:14;15386:28;;15321:99;;;;:::o;15426:108::-;15503:24;15521:5;15503:24;:::i;:::-;15498:3;15491:37;15481:53;;:::o;15540:118::-;15627:24;15645:5;15627:24;:::i;:::-;15622:3;15615:37;15605:53;;:::o;15694:732::-;;15842:54;15890:5;15842:54;:::i;:::-;15912:86;15991:6;15986:3;15912:86;:::i;:::-;15905:93;;16022:56;16072:5;16022:56;:::i;:::-;16101:7;16132:1;16117:284;16142:6;16139:1;16136:13;16117:284;;;16218:6;16212:13;16245:63;16304:3;16289:13;16245:63;:::i;:::-;16238:70;;16331:60;16384:6;16331:60;:::i;:::-;16321:70;;16177:224;16164:1;16161;16157:9;16152:14;;16117:284;;;16121:14;16417:3;16410:10;;15818:608;;;;;;;:::o;16462:732::-;;16610:54;16658:5;16610:54;:::i;:::-;16680:86;16759:6;16754:3;16680:86;:::i;:::-;16673:93;;16790:56;16840:5;16790:56;:::i;:::-;16869:7;16900:1;16885:284;16910:6;16907:1;16904:13;16885:284;;;16986:6;16980:13;17013:63;17072:3;17057:13;17013:63;:::i;:::-;17006:70;;17099:60;17152:6;17099:60;:::i;:::-;17089:70;;16945:224;16932:1;16929;16925:9;16920:14;;16885:284;;;16889:14;17185:3;17178:10;;16586:608;;;;;;;:::o;17200:109::-;17281:21;17296:5;17281:21;:::i;:::-;17276:3;17269:34;17259:50;;:::o;17315:118::-;17402:24;17420:5;17402:24;:::i;:::-;17397:3;17390:37;17380:53;;:::o;17439:115::-;17524:23;17541:5;17524:23;:::i;:::-;17519:3;17512:36;17502:52;;:::o;17560:360::-;;17674:38;17706:5;17674:38;:::i;:::-;17728:70;17791:6;17786:3;17728:70;:::i;:::-;17721:77;;17807:52;17852:6;17847:3;17840:4;17833:5;17829:16;17807:52;:::i;:::-;17884:29;17906:6;17884:29;:::i;:::-;17879:3;17875:39;17868:46;;17650:270;;;;;:::o;17926:364::-;;18042:39;18075:5;18042:39;:::i;:::-;18097:71;18161:6;18156:3;18097:71;:::i;:::-;18090:78;;18177:52;18222:6;18217:3;18210:4;18203:5;18199:16;18177:52;:::i;:::-;18254:29;18276:6;18254:29;:::i;:::-;18249:3;18245:39;18238:46;;18018:272;;;;;:::o;18296:377::-;;18430:39;18463:5;18430:39;:::i;:::-;18485:89;18567:6;18562:3;18485:89;:::i;:::-;18478:96;;18583:52;18628:6;18623:3;18616:4;18609:5;18605:16;18583:52;:::i;:::-;18660:6;18655:3;18651:16;18644:23;;18406:267;;;;;:::o;18679:366::-;;18842:67;18906:2;18901:3;18842:67;:::i;:::-;18835:74;;18918:93;19007:3;18918:93;:::i;:::-;19036:2;19031:3;19027:12;19020:19;;18825:220;;;:::o;19051:366::-;;19214:67;19278:2;19273:3;19214:67;:::i;:::-;19207:74;;19290:93;19379:3;19290:93;:::i;:::-;19408:2;19403:3;19399:12;19392:19;;19197:220;;;:::o;19423:366::-;;19586:67;19650:2;19645:3;19586:67;:::i;:::-;19579:74;;19662:93;19751:3;19662:93;:::i;:::-;19780:2;19775:3;19771:12;19764:19;;19569:220;;;:::o;19795:366::-;;19958:67;20022:2;20017:3;19958:67;:::i;:::-;19951:74;;20034:93;20123:3;20034:93;:::i;:::-;20152:2;20147:3;20143:12;20136:19;;19941:220;;;:::o;20167:366::-;;20330:67;20394:2;20389:3;20330:67;:::i;:::-;20323:74;;20406:93;20495:3;20406:93;:::i;:::-;20524:2;20519:3;20515:12;20508:19;;20313:220;;;:::o;20539:366::-;;20702:67;20766:2;20761:3;20702:67;:::i;:::-;20695:74;;20778:93;20867:3;20778:93;:::i;:::-;20896:2;20891:3;20887:12;20880:19;;20685:220;;;:::o;20911:366::-;;21074:67;21138:2;21133:3;21074:67;:::i;:::-;21067:74;;21150:93;21239:3;21150:93;:::i;:::-;21268:2;21263:3;21259:12;21252:19;;21057:220;;;:::o;21283:366::-;;21446:67;21510:2;21505:3;21446:67;:::i;:::-;21439:74;;21522:93;21611:3;21522:93;:::i;:::-;21640:2;21635:3;21631:12;21624:19;;21429:220;;;:::o;21655:366::-;;21818:67;21882:2;21877:3;21818:67;:::i;:::-;21811:74;;21894:93;21983:3;21894:93;:::i;:::-;22012:2;22007:3;22003:12;21996:19;;21801:220;;;:::o;22027:366::-;;22190:67;22254:2;22249:3;22190:67;:::i;:::-;22183:74;;22266:93;22355:3;22266:93;:::i;:::-;22384:2;22379:3;22375:12;22368:19;;22173:220;;;:::o;22399:366::-;;22562:67;22626:2;22621:3;22562:67;:::i;:::-;22555:74;;22638:93;22727:3;22638:93;:::i;:::-;22756:2;22751:3;22747:12;22740:19;;22545:220;;;:::o;22771:366::-;;22934:67;22998:2;22993:3;22934:67;:::i;:::-;22927:74;;23010:93;23099:3;23010:93;:::i;:::-;23128:2;23123:3;23119:12;23112:19;;22917:220;;;:::o;23143:366::-;;23306:67;23370:2;23365:3;23306:67;:::i;:::-;23299:74;;23382:93;23471:3;23382:93;:::i;:::-;23500:2;23495:3;23491:12;23484:19;;23289:220;;;:::o;23515:366::-;;23678:67;23742:2;23737:3;23678:67;:::i;:::-;23671:74;;23754:93;23843:3;23754:93;:::i;:::-;23872:2;23867:3;23863:12;23856:19;;23661:220;;;:::o;23887:366::-;;24050:67;24114:2;24109:3;24050:67;:::i;:::-;24043:74;;24126:93;24215:3;24126:93;:::i;:::-;24244:2;24239:3;24235:12;24228:19;;24033:220;;;:::o;24259:366::-;;24422:67;24486:2;24481:3;24422:67;:::i;:::-;24415:74;;24498:93;24587:3;24498:93;:::i;:::-;24616:2;24611:3;24607:12;24600:19;;24405:220;;;:::o;24631:366::-;;24794:67;24858:2;24853:3;24794:67;:::i;:::-;24787:74;;24870:93;24959:3;24870:93;:::i;:::-;24988:2;24983:3;24979:12;24972:19;;24777:220;;;:::o;25003:366::-;;25166:67;25230:2;25225:3;25166:67;:::i;:::-;25159:74;;25242:93;25331:3;25242:93;:::i;:::-;25360:2;25355:3;25351:12;25344:19;;25149:220;;;:::o;25375:366::-;;25538:67;25602:2;25597:3;25538:67;:::i;:::-;25531:74;;25614:93;25703:3;25614:93;:::i;:::-;25732:2;25727:3;25723:12;25716:19;;25521:220;;;:::o;25747:366::-;;25910:67;25974:2;25969:3;25910:67;:::i;:::-;25903:74;;25986:93;26075:3;25986:93;:::i;:::-;26104:2;26099:3;26095:12;26088:19;;25893:220;;;:::o;26119:366::-;;26282:67;26346:2;26341:3;26282:67;:::i;:::-;26275:74;;26358:93;26447:3;26358:93;:::i;:::-;26476:2;26471:3;26467:12;26460:19;;26265:220;;;:::o;26491:366::-;;26654:67;26718:2;26713:3;26654:67;:::i;:::-;26647:74;;26730:93;26819:3;26730:93;:::i;:::-;26848:2;26843:3;26839:12;26832:19;;26637:220;;;:::o;26863:366::-;;27026:67;27090:2;27085:3;27026:67;:::i;:::-;27019:74;;27102:93;27191:3;27102:93;:::i;:::-;27220:2;27215:3;27211:12;27204:19;;27009:220;;;:::o;27235:366::-;;27398:67;27462:2;27457:3;27398:67;:::i;:::-;27391:74;;27474:93;27563:3;27474:93;:::i;:::-;27592:2;27587:3;27583:12;27576:19;;27381:220;;;:::o;27607:402::-;;27788:85;27870:2;27865:3;27788:85;:::i;:::-;27781:92;;27882:93;27971:3;27882:93;:::i;:::-;28000:2;27995:3;27991:12;27984:19;;27771:238;;;:::o;28015:366::-;;28178:67;28242:2;28237:3;28178:67;:::i;:::-;28171:74;;28254:93;28343:3;28254:93;:::i;:::-;28372:2;28367:3;28363:12;28356:19;;28161:220;;;:::o;28387:402::-;;28568:85;28650:2;28645:3;28568:85;:::i;:::-;28561:92;;28662:93;28751:3;28662:93;:::i;:::-;28780:2;28775:3;28771:12;28764:19;;28551:238;;;:::o;28795:366::-;;28958:67;29022:2;29017:3;28958:67;:::i;:::-;28951:74;;29034:93;29123:3;29034:93;:::i;:::-;29152:2;29147:3;29143:12;29136:19;;28941:220;;;:::o;29167:108::-;29244:24;29262:5;29244:24;:::i;:::-;29239:3;29232:37;29222:53;;:::o;29281:118::-;29368:24;29386:5;29368:24;:::i;:::-;29363:3;29356:37;29346:53;;:::o;29405:967::-;;29809:148;29953:3;29809:148;:::i;:::-;29802:155;;29974:95;30065:3;30056:6;29974:95;:::i;:::-;29967:102;;30086:148;30230:3;30086:148;:::i;:::-;30079:155;;30251:95;30342:3;30333:6;30251:95;:::i;:::-;30244:102;;30363:3;30356:10;;29791:581;;;;;:::o;30378:222::-;;30509:2;30498:9;30494:18;30486:26;;30522:71;30590:1;30579:9;30575:17;30566:6;30522:71;:::i;:::-;30476:124;;;;:::o;30606:640::-;;30839:3;30828:9;30824:19;30816:27;;30853:71;30921:1;30910:9;30906:17;30897:6;30853:71;:::i;:::-;30934:72;31002:2;30991:9;30987:18;30978:6;30934:72;:::i;:::-;31016;31084:2;31073:9;31069:18;31060:6;31016:72;:::i;:::-;31135:9;31129:4;31125:20;31120:2;31109:9;31105:18;31098:48;31163:76;31234:4;31225:6;31163:76;:::i;:::-;31155:84;;30806:440;;;;;;;:::o;31252:373::-;;31433:2;31422:9;31418:18;31410:26;;31482:9;31476:4;31472:20;31468:1;31457:9;31453:17;31446:47;31510:108;31613:4;31604:6;31510:108;:::i;:::-;31502:116;;31400:225;;;;:::o;31631:634::-;;31890:2;31879:9;31875:18;31867:26;;31939:9;31933:4;31929:20;31925:1;31914:9;31910:17;31903:47;31967:108;32070:4;32061:6;31967:108;:::i;:::-;31959:116;;32122:9;32116:4;32112:20;32107:2;32096:9;32092:18;32085:48;32150:108;32253:4;32244:6;32150:108;:::i;:::-;32142:116;;31857:408;;;;;:::o;32271:373::-;;32452:2;32441:9;32437:18;32429:26;;32501:9;32495:4;32491:20;32487:1;32476:9;32472:17;32465:47;32529:108;32632:4;32623:6;32529:108;:::i;:::-;32521:116;;32419:225;;;;:::o;32650:210::-;;32775:2;32764:9;32760:18;32752:26;;32788:65;32850:1;32839:9;32835:17;32826:6;32788:65;:::i;:::-;32742:118;;;;:::o;32866:222::-;;32997:2;32986:9;32982:18;32974:26;;33010:71;33078:1;33067:9;33063:17;33054:6;33010:71;:::i;:::-;32964:124;;;;:::o;33094:218::-;;33223:2;33212:9;33208:18;33200:26;;33236:69;33302:1;33291:9;33287:17;33278:6;33236:69;:::i;:::-;33190:122;;;;:::o;33318:313::-;;33469:2;33458:9;33454:18;33446:26;;33518:9;33512:4;33508:20;33504:1;33493:9;33489:17;33482:47;33546:78;33619:4;33610:6;33546:78;:::i;:::-;33538:86;;33436:195;;;;:::o;33637:419::-;;33841:2;33830:9;33826:18;33818:26;;33890:9;33884:4;33880:20;33876:1;33865:9;33861:17;33854:47;33918:131;34044:4;33918:131;:::i;:::-;33910:139;;33808:248;;;:::o;34062:419::-;;34266:2;34255:9;34251:18;34243:26;;34315:9;34309:4;34305:20;34301:1;34290:9;34286:17;34279:47;34343:131;34469:4;34343:131;:::i;:::-;34335:139;;34233:248;;;:::o;34487:419::-;;34691:2;34680:9;34676:18;34668:26;;34740:9;34734:4;34730:20;34726:1;34715:9;34711:17;34704:47;34768:131;34894:4;34768:131;:::i;:::-;34760:139;;34658:248;;;:::o;34912:419::-;;35116:2;35105:9;35101:18;35093:26;;35165:9;35159:4;35155:20;35151:1;35140:9;35136:17;35129:47;35193:131;35319:4;35193:131;:::i;:::-;35185:139;;35083:248;;;:::o;35337:419::-;;35541:2;35530:9;35526:18;35518:26;;35590:9;35584:4;35580:20;35576:1;35565:9;35561:17;35554:47;35618:131;35744:4;35618:131;:::i;:::-;35610:139;;35508:248;;;:::o;35762:419::-;;35966:2;35955:9;35951:18;35943:26;;36015:9;36009:4;36005:20;36001:1;35990:9;35986:17;35979:47;36043:131;36169:4;36043:131;:::i;:::-;36035:139;;35933:248;;;:::o;36187:419::-;;36391:2;36380:9;36376:18;36368:26;;36440:9;36434:4;36430:20;36426:1;36415:9;36411:17;36404:47;36468:131;36594:4;36468:131;:::i;:::-;36460:139;;36358:248;;;:::o;36612:419::-;;36816:2;36805:9;36801:18;36793:26;;36865:9;36859:4;36855:20;36851:1;36840:9;36836:17;36829:47;36893:131;37019:4;36893:131;:::i;:::-;36885:139;;36783:248;;;:::o;37037:419::-;;37241:2;37230:9;37226:18;37218:26;;37290:9;37284:4;37280:20;37276:1;37265:9;37261:17;37254:47;37318:131;37444:4;37318:131;:::i;:::-;37310:139;;37208:248;;;:::o;37462:419::-;;37666:2;37655:9;37651:18;37643:26;;37715:9;37709:4;37705:20;37701:1;37690:9;37686:17;37679:47;37743:131;37869:4;37743:131;:::i;:::-;37735:139;;37633:248;;;:::o;37887:419::-;;38091:2;38080:9;38076:18;38068:26;;38140:9;38134:4;38130:20;38126:1;38115:9;38111:17;38104:47;38168:131;38294:4;38168:131;:::i;:::-;38160:139;;38058:248;;;:::o;38312:419::-;;38516:2;38505:9;38501:18;38493:26;;38565:9;38559:4;38555:20;38551:1;38540:9;38536:17;38529:47;38593:131;38719:4;38593:131;:::i;:::-;38585:139;;38483:248;;;:::o;38737:419::-;;38941:2;38930:9;38926:18;38918:26;;38990:9;38984:4;38980:20;38976:1;38965:9;38961:17;38954:47;39018:131;39144:4;39018:131;:::i;:::-;39010:139;;38908:248;;;:::o;39162:419::-;;39366:2;39355:9;39351:18;39343:26;;39415:9;39409:4;39405:20;39401:1;39390:9;39386:17;39379:47;39443:131;39569:4;39443:131;:::i;:::-;39435:139;;39333:248;;;:::o;39587:419::-;;39791:2;39780:9;39776:18;39768:26;;39840:9;39834:4;39830:20;39826:1;39815:9;39811:17;39804:47;39868:131;39994:4;39868:131;:::i;:::-;39860:139;;39758:248;;;:::o;40012:419::-;;40216:2;40205:9;40201:18;40193:26;;40265:9;40259:4;40255:20;40251:1;40240:9;40236:17;40229:47;40293:131;40419:4;40293:131;:::i;:::-;40285:139;;40183:248;;;:::o;40437:419::-;;40641:2;40630:9;40626:18;40618:26;;40690:9;40684:4;40680:20;40676:1;40665:9;40661:17;40654:47;40718:131;40844:4;40718:131;:::i;:::-;40710:139;;40608:248;;;:::o;40862:419::-;;41066:2;41055:9;41051:18;41043:26;;41115:9;41109:4;41105:20;41101:1;41090:9;41086:17;41079:47;41143:131;41269:4;41143:131;:::i;:::-;41135:139;;41033:248;;;:::o;41287:419::-;;41491:2;41480:9;41476:18;41468:26;;41540:9;41534:4;41530:20;41526:1;41515:9;41511:17;41504:47;41568:131;41694:4;41568:131;:::i;:::-;41560:139;;41458:248;;;:::o;41712:419::-;;41916:2;41905:9;41901:18;41893:26;;41965:9;41959:4;41955:20;41951:1;41940:9;41936:17;41929:47;41993:131;42119:4;41993:131;:::i;:::-;41985:139;;41883:248;;;:::o;42137:419::-;;42341:2;42330:9;42326:18;42318:26;;42390:9;42384:4;42380:20;42376:1;42365:9;42361:17;42354:47;42418:131;42544:4;42418:131;:::i;:::-;42410:139;;42308:248;;;:::o;42562:419::-;;42766:2;42755:9;42751:18;42743:26;;42815:9;42809:4;42805:20;42801:1;42790:9;42786:17;42779:47;42843:131;42969:4;42843:131;:::i;:::-;42835:139;;42733:248;;;:::o;42987:419::-;;43191:2;43180:9;43176:18;43168:26;;43240:9;43234:4;43230:20;43226:1;43215:9;43211:17;43204:47;43268:131;43394:4;43268:131;:::i;:::-;43260:139;;43158:248;;;:::o;43412:419::-;;43616:2;43605:9;43601:18;43593:26;;43665:9;43659:4;43655:20;43651:1;43640:9;43636:17;43629:47;43693:131;43819:4;43693:131;:::i;:::-;43685:139;;43583:248;;;:::o;43837:419::-;;44041:2;44030:9;44026:18;44018:26;;44090:9;44084:4;44080:20;44076:1;44065:9;44061:17;44054:47;44118:131;44244:4;44118:131;:::i;:::-;44110:139;;44008:248;;;:::o;44262:419::-;;44466:2;44455:9;44451:18;44443:26;;44515:9;44509:4;44505:20;44501:1;44490:9;44486:17;44479:47;44543:131;44669:4;44543:131;:::i;:::-;44535:139;;44433:248;;;:::o;44687:222::-;;44818:2;44807:9;44803:18;44795:26;;44831:71;44899:1;44888:9;44884:17;44875:6;44831:71;:::i;:::-;44785:124;;;;:::o;44915:129::-;;44976:20;;:::i;:::-;44966:30;;45005:33;45033:4;45025:6;45005:33;:::i;:::-;44956:88;;;:::o;45050:75::-;;45116:2;45110:9;45100:19;;45090:35;:::o;45131:311::-;;45298:18;45290:6;45287:30;45284:2;;;45320:18;;:::i;:::-;45284:2;45370:4;45362:6;45358:17;45350:25;;45430:4;45424;45420:15;45412:23;;45213:229;;;:::o;45448:336::-;;45640:18;45632:6;45629:30;45626:2;;;45662:18;;:::i;:::-;45626:2;45712:4;45704:6;45700:17;45692:25;;45772:4;45766;45762:15;45754:23;;45555:229;;;:::o;45790:336::-;;45982:18;45974:6;45971:30;45968:2;;;46004:18;;:::i;:::-;45968:2;46054:4;46046:6;46042:17;46034:25;;46114:4;46108;46104:15;46096:23;;45897:229;;;:::o;46132:321::-;;46309:18;46301:6;46298:30;46295:2;;;46331:18;;:::i;:::-;46295:2;46381:4;46373:6;46369:17;46361:25;;46441:4;46435;46431:15;46423:23;;46224:229;;;:::o;46459:311::-;;46626:18;46618:6;46615:30;46612:2;;;46648:18;;:::i;:::-;46612:2;46698:4;46690:6;46686:17;46678:25;;46758:4;46752;46748:15;46740:23;;46541:229;;;:::o;46776:307::-;;46927:18;46919:6;46916:30;46913:2;;;46949:18;;:::i;:::-;46913:2;46987:29;47009:6;46987:29;:::i;:::-;46979:37;;47071:4;47065;47061:15;47053:23;;46842:241;;;:::o;47089:308::-;;47241:18;47233:6;47230:30;47227:2;;;47263:18;;:::i;:::-;47227:2;47301:29;47323:6;47301:29;:::i;:::-;47293:37;;47385:4;47379;47375:15;47367:23;;47156:241;;;:::o;47403:132::-;;47493:3;47485:11;;47523:4;47518:3;47514:14;47506:22;;47475:60;;;:::o;47541:132::-;;47631:3;47623:11;;47661:4;47656:3;47652:14;47644:22;;47613:60;;;:::o;47679:114::-;;47780:5;47774:12;47764:22;;47753:40;;;:::o;47799:114::-;;47900:5;47894:12;47884:22;;47873:40;;;:::o;47919:98::-;;48004:5;47998:12;47988:22;;47977:40;;;:::o;48023:99::-;;48109:5;48103:12;48093:22;;48082:40;;;:::o;48128:113::-;;48230:4;48225:3;48221:14;48213:22;;48203:38;;;:::o;48247:113::-;;48349:4;48344:3;48340:14;48332:22;;48322:38;;;:::o;48366:184::-;;48499:6;48494:3;48487:19;48539:4;48534:3;48530:14;48515:29;;48477:73;;;;:::o;48556:184::-;;48689:6;48684:3;48677:19;48729:4;48724:3;48720:14;48705:29;;48667:73;;;;:::o;48746:168::-;;48863:6;48858:3;48851:19;48903:4;48898:3;48894:14;48879:29;;48841:73;;;;:::o;48920:169::-;;49038:6;49033:3;49026:19;49078:4;49073:3;49069:14;49054:29;;49016:73;;;;:::o;49095:148::-;;49234:3;49219:18;;49209:34;;;;:::o;49249:305::-;;49308:20;49326:1;49308:20;:::i;:::-;49303:25;;49342:20;49360:1;49342:20;:::i;:::-;49337:25;;49496:1;49428:66;49424:74;49421:1;49418:81;49415:2;;;49502:18;;:::i;:::-;49415:2;49546:1;49543;49539:9;49532:16;;49293:261;;;;:::o;49560:348::-;;49623:20;49641:1;49623:20;:::i;:::-;49618:25;;49657:20;49675:1;49657:20;:::i;:::-;49652:25;;49845:1;49777:66;49773:74;49770:1;49767:81;49762:1;49755:9;49748:17;49744:105;49741:2;;;49852:18;;:::i;:::-;49741:2;49900:1;49897;49893:9;49882:20;;49608:300;;;;:::o;49914:191::-;;49974:20;49992:1;49974:20;:::i;:::-;49969:25;;50008:20;50026:1;50008:20;:::i;:::-;50003:25;;50047:1;50044;50041:8;50038:2;;;50052:18;;:::i;:::-;50038:2;50097:1;50094;50090:9;50082:17;;49959:146;;;;:::o;50111:96::-;;50177:24;50195:5;50177:24;:::i;:::-;50166:35;;50156:51;;;:::o;50213:90::-;;50290:5;50283:13;50276:21;50265:32;;50255:48;;;:::o;50309:77::-;;50375:5;50364:16;;50354:32;;;:::o;50392:149::-;;50468:66;50461:5;50457:78;50446:89;;50436:105;;;:::o;50547:126::-;;50624:42;50617:5;50613:54;50602:65;;50592:81;;;:::o;50679:77::-;;50745:5;50734:16;;50724:32;;;:::o;50762:154::-;50846:6;50841:3;50836;50823:30;50908:1;50899:6;50894:3;50890:16;50883:27;50813:103;;;:::o;50922:307::-;50990:1;51000:113;51014:6;51011:1;51008:13;51000:113;;;51099:1;51094:3;51090:11;51084:18;51080:1;51075:3;51071:11;51064:39;51036:2;51033:1;51029:10;51024:15;;51000:113;;;51131:6;51128:1;51125:13;51122:2;;;51211:1;51202:6;51197:3;51193:16;51186:27;51122:2;50971:258;;;;:::o;51235:171::-;;51297:24;51315:5;51297:24;:::i;:::-;51288:33;;51343:4;51336:5;51333:15;51330:2;;;51351:18;;:::i;:::-;51330:2;51398:1;51391:5;51387:13;51380:20;;51278:128;;;:::o;51412:320::-;;51493:1;51487:4;51483:12;51473:22;;51540:1;51534:4;51530:12;51561:18;51551:2;;51617:4;51609:6;51605:17;51595:27;;51551:2;51679;51671:6;51668:14;51648:18;51645:38;51642:2;;;51698:18;;:::i;:::-;51642:2;51463:269;;;;:::o;51738:281::-;51821:27;51843:4;51821:27;:::i;:::-;51813:6;51809:40;51951:6;51939:10;51936:22;51915:18;51903:10;51900:34;51897:62;51894:2;;;51962:18;;:::i;:::-;51894:2;52002:10;51998:2;51991:22;51781:238;;;:::o;52025:233::-;;52087:24;52105:5;52087:24;:::i;:::-;52078:33;;52133:66;52126:5;52123:77;52120:2;;;52203:18;;:::i;:::-;52120:2;52250:1;52243:5;52239:13;52232:20;;52068:190;;;:::o;52264:180::-;52312:77;52309:1;52302:88;52409:4;52406:1;52399:15;52433:4;52430:1;52423:15;52450:180;52498:77;52495:1;52488:88;52595:4;52592:1;52585:15;52619:4;52616:1;52609:15;52636:180;52684:77;52681:1;52674:88;52781:4;52778:1;52771:15;52805:4;52802:1;52795:15;52822:102;;52914:2;52910:7;52905:2;52898:5;52894:14;52890:28;52880:38;;52870:54;;;:::o;52930:182::-;53070:34;53066:1;53058:6;53054:14;53047:58;53036:76;:::o;53118:230::-;53258:34;53254:1;53246:6;53242:14;53235:58;53327:13;53322:2;53314:6;53310:15;53303:38;53224:124;:::o;53354:237::-;53494:34;53490:1;53482:6;53478:14;53471:58;53563:20;53558:2;53550:6;53546:15;53539:45;53460:131;:::o;53597:164::-;53737:16;53733:1;53725:6;53721:14;53714:40;53703:58;:::o;53767:178::-;53907:30;53903:1;53895:6;53891:14;53884:54;53873:72;:::o;53951:223::-;54091:34;54087:1;54079:6;54075:14;54068:58;54160:6;54155:2;54147:6;54143:15;54136:31;54057:117;:::o;54180:175::-;54320:27;54316:1;54308:6;54304:14;54297:51;54286:69;:::o;54361:161::-;54501:13;54497:1;54489:6;54485:14;54478:37;54467:55;:::o;54528:231::-;54668:34;54664:1;54656:6;54652:14;54645:58;54737:14;54732:2;54724:6;54720:15;54713:39;54634:125;:::o;54765:243::-;54905:34;54901:1;54893:6;54889:14;54882:58;54974:26;54969:2;54961:6;54957:15;54950:51;54871:137;:::o;55014:229::-;55154:34;55150:1;55142:6;55138:14;55131:58;55223:12;55218:2;55210:6;55206:15;55199:37;55120:123;:::o;55249:228::-;55389:34;55385:1;55377:6;55373:14;55366:58;55458:11;55453:2;55445:6;55441:15;55434:36;55355:122;:::o;55483:169::-;55623:21;55619:1;55611:6;55607:14;55600:45;55589:63;:::o;55658:161::-;55798:13;55794:1;55786:6;55782:14;55775:37;55764:55;:::o;55825:163::-;55965:15;55961:1;55953:6;55949:14;55942:39;55931:57;:::o;55994:169::-;56134:21;56130:1;56122:6;56118:14;56111:45;56100:63;:::o;56169:182::-;56309:34;56305:1;56297:6;56293:14;56286:58;56275:76;:::o;56357:231::-;56497:34;56493:1;56485:6;56481:14;56474:58;56566:14;56561:2;56553:6;56549:15;56542:39;56463:125;:::o;56594:165::-;56734:17;56730:1;56722:6;56718:14;56711:41;56700:59;:::o;56765:228::-;56905:34;56901:1;56893:6;56889:14;56882:58;56974:11;56969:2;56961:6;56957:15;56950:36;56871:122;:::o;56999:220::-;57139:34;57135:1;57127:6;57123:14;57116:58;57208:3;57203:2;57195:6;57191:15;57184:28;57105:114;:::o;57225:236::-;57365:34;57361:1;57353:6;57349:14;57342:58;57434:19;57429:2;57421:6;57417:15;57410:44;57331:130;:::o;57467:161::-;57607:13;57603:1;57595:6;57591:14;57584:37;57573:55;:::o;57634:231::-;57774:34;57770:1;57762:6;57758:14;57751:58;57843:14;57838:2;57830:6;57826:15;57819:39;57740:125;:::o;57871:173::-;58011:25;58007:1;57999:6;57995:14;57988:49;57977:67;:::o;58050:235::-;58190:34;58186:1;58178:6;58174:14;58167:58;58259:18;58254:2;58246:6;58242:15;58235:43;58156:129;:::o;58291:167::-;58431:19;58427:1;58419:6;58415:14;58408:43;58397:61;:::o;58464:234::-;58604:34;58600:1;58592:6;58588:14;58581:58;58673:17;58668:2;58660:6;58656:15;58649:42;58570:128;:::o;58704:122::-;58777:24;58795:5;58777:24;:::i;:::-;58770:5;58767:35;58757:2;;58816:1;58813;58806:12;58757:2;58747:79;:::o;58832:116::-;58902:21;58917:5;58902:21;:::i;:::-;58895:5;58892:32;58882:2;;58938:1;58935;58928:12;58882:2;58872:76;:::o;58954:122::-;59027:24;59045:5;59027:24;:::i;:::-;59020:5;59017:35;59007:2;;59066:1;59063;59056:12;59007:2;58997:79;:::o;59082:120::-;59154:23;59171:5;59154:23;:::i;:::-;59147:5;59144:34;59134:2;;59192:1;59189;59182:12;59134:2;59124:78;:::o;59208:122::-;59281:24;59299:5;59281:24;:::i;:::-;59274:5;59271:35;59261:2;;59320:1;59317;59310:12;59261:2;59251:79;:::o

Swarm Source

ipfs://9f4bc20cdf51d17893a8d2978be4af4f75f68249209d203f30bee4ca991b3ad7
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.