ETH Price: $3,430.55 (+7.47%)
Gas: 14 Gwei

Token

TCL (TCL)
 

Overview

Max Total Supply

1,258 TCL

Holders

346

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x5efb5d9a218dab7041db39a9cd0e47382bc12768
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TCLNFTToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-16
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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


// File openzeppelin-solidity/contracts/access/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/AbstractTCLEntity.sol


 
pragma solidity ^0.8.0;
abstract contract AbstractTCLEntity is Ownable {

    address internal _admin;

    /* modifiers */
    modifier onlyOwnerOrAdmin {
        if(_admin != address(0)){
            require(_msgSender() == owner() || _msgSender() == admin(), "TCL Entity: Sender is neither owner nor admin.");
        }
        else {
            require(_msgSender() == owner(),  "TCL Entity: Sender is not owner.");
        }
        _;
    }

    /* getter & setter for admin address */
    function admin() public view returns (address) {
        return _admin;
    }
    function setAdmin(address newAdmin) external onlyOwnerOrAdmin {
        require(newAdmin != address(0), "TCL Entity: Admin cannot be AddressZero");
        require(newAdmin != owner(), "TCL Entity: Owner and admin cannot be the same address.");
        _admin = newAdmin;
    }
}


// File openzeppelin-solidity/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File openzeppelin-solidity/contracts/token/ERC1155/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


// File openzeppelin-solidity/contracts/token/ERC1155/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File openzeppelin-solidity/contracts/token/ERC1155/extensions/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


// File openzeppelin-solidity/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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

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


// File openzeppelin-solidity/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File contracts/ERC1155.sol



pragma solidity ^0.8.0;
/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping (uint256 => mapping(address => uint256)) internal _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor (string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory ids
    )
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        internal
        virtual
    {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        _balances[id][from] = fromBalance - amount;
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        internal
        virtual
    {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            _balances[id][from] = fromBalance - amount;
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        if (account != address(this)){
            _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
        }
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(address account, uint256 id, uint256 amount) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        _balances[id][account] = accountBalance - amount;

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        for (uint i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This does not include minting
     * and burning.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        internal
        virtual
    { }

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}


// File contracts/TCLNFTToken.sol



pragma solidity ^0.8.0;


contract TCLNFTToken is ERC1155, AbstractTCLEntity {
  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  /* the central instance of content */
  uint256 private _maxTierId;

  /****** NFT SECTION *******/
  /* nft data type enum */
  enum NftDataType {TEXT, IMAGE, AUDIO, VIDEO}

  /* nft content struct */
  struct NftContent {
    NftDataType dataType;
    uint256 timestamp;
    uint256 value;
    string ipfsAddress;
  }

  mapping(uint256 => NftContent) private _tierToNftContent;
  mapping(string => bool) private _ipfsAddressUsed;

  event NewNft(address creator, uint256 contentId, uint256 timestamp, NftDataType dataType, string ipfsAddress);

  modifier validTierId(uint256 tier) {
    require(tier != 0 && tier <= _maxTierId, "TCL : Provided tier is not available.");
    _;
  }

  constructor(string memory name_, string memory symbol_, address adminAddr) 
    ERC1155("")
  {
    _name = name_;
    _symbol = symbol_;
    _admin = adminAddr;
    _maxTierId = 3;
  }

  function name() public view returns (string memory) {
    return _name;
  }

  function symbol() public view returns (string memory) {
      return _symbol;
  }

  /***************************************************
    * NFTS (public/ external section)
    ***************************************************/

  /**
    * Mint new content as NFT.
    */
  function createContent(uint tier, string memory ipfsAddress, NftDataType dataType, uint amount) external onlyOwnerOrAdmin {
    require(!_ipfsAddressUsed[ipfsAddress], "TCL: IPFS Address has already been used by this collection.");
    /* mint the NFT */
    NftContent memory content = NftContent({
                                    dataType: dataType,
                                    timestamp: block.timestamp,
                                    value: 0,
                                    ipfsAddress: ipfsAddress
                                });

    _mint(address(this), tier, amount, "");
    _tierToNftContent[tier] = content;
    _ipfsAddressUsed[ipfsAddress] = true;

    emit NewNft(address(this), tier, block.timestamp, dataType, ipfsAddress);
  }

  /* get tier ount and is just amount of content NFTs. */
  function tierCount() external view returns (uint256){
    return _maxTierId;
  }

  /* Get content data of the provided tier */
  function getContent(uint256 tier) external view validTierId(tier) returns (NftDataType, uint256, uint256, string memory) {
    NftContent memory content = _tierToNftContent[tier];
    return (content.dataType, content.timestamp, content.value, content.ipfsAddress);
  }

  /* claim NFT by tier */
  function claim(uint tier) public payable validTierId(tier) {
    require(balanceOf(_msgSender(), tier) < 1, "You already had claimed!");
    require(balanceOf(address(this), tier) > 0, "Out of NFT stock!");
    _safeTransferFrom(address(this), _msgSender(), tier, 1, "");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"adminAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"contentId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"enum TCLNFTToken.NftDataType","name":"dataType","type":"uint8"},{"indexed":false,"internalType":"string","name":"ipfsAddress","type":"string"}],"name":"NewNft","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"string","name":"ipfsAddress","type":"string"},{"internalType":"enum TCLNFTToken.NftDataType","name":"dataType","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createContent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"getContent","outputs":[{"internalType":"enum TCLNFTToken.NftDataType","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620028123803806200281283398101604081905262000034916200027c565b6040805160208101909152600081526200004e81620000bc565b50620000636200005d620000d5565b620000d9565b8251620000789060059060208601906200012b565b5081516200008e9060069060208501906200012b565b50600480546001600160a01b0319166001600160a01b03929092169190911790555050600360075562000358565b8051620000d19060029060208401906200012b565b5050565b3390565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001399062000305565b90600052602060002090601f0160209004810192826200015d5760008555620001a8565b82601f106200017857805160ff1916838001178555620001a8565b82800160010185558215620001a8579182015b82811115620001a85782518255916020019190600101906200018b565b50620001b6929150620001ba565b5090565b5b80821115620001b65760008155600101620001bb565b600082601f830112620001e2578081fd5b81516001600160401b0380821115620001ff57620001ff62000342565b6040516020601f8401601f191682018101838111838210171562000227576200022762000342565b60405283825285840181018710156200023e578485fd5b8492505b8383101562000261578583018101518284018201529182019162000242565b838311156200027257848185840101525b5095945050505050565b60008060006060848603121562000291578283fd5b83516001600160401b0380821115620002a8578485fd5b620002b687838801620001d1565b94506020860151915080821115620002cc578384fd5b50620002db86828701620001d1565b604086015190935090506001600160a01b0381168114620002fa578182fd5b809150509250925092565b6002810460018216806200031a57607f821691505b602082108114156200033c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6124aa80620003686000396000f3fe6080604052600436106101135760003560e01c8063715018a6116100a0578063a22cb46511610064578063a22cb465146102f0578063e985e9c514610310578063f242432a14610330578063f2fde38b14610350578063f851a4401461037057610113565b8063715018a61461026f5780638da5cb5b14610284578063913bb2be146102a657806395d89b41146102c657806396b55f7d146102db57610113565b80630e89341c116100e75780630e89341c146101cd5780632eb2c2d6146101ed578063379607f51461020f5780634e1273f414610222578063704b6c021461024f57610113565b8062fdd58e1461011857806301ffc9a71461014e57806306fdde031461017b5780630b7ad54c1461019d575b600080fd5b34801561012457600080fd5b506101386101333660046118c2565b610385565b604051610145919061226d565b60405180910390f35b34801561015a57600080fd5b5061016e6101693660046119a9565b6103dc565b6040516101459190611c47565b34801561018757600080fd5b50610190610424565b6040516101459190611c88565b3480156101a957600080fd5b506101bd6101b83660046119e1565b6104b7565b6040516101459493929190611c52565b3480156101d957600080fd5b506101906101e83660046119e1565b610617565b3480156101f957600080fd5b5061020d61020836600461177f565b6106ab565b005b61020d61021d3660046119e1565b610709565b34801561022e57600080fd5b5061024261023d3660046118eb565b6107b8565b6040516101459190611c06565b34801561025b57600080fd5b5061020d61026a366004611733565b6108d8565b34801561027b57600080fd5b5061020d610a17565b34801561029057600080fd5b50610299610a62565b6040516101459190611b12565b3480156102b257600080fd5b5061020d6102c13660046119f9565b610a71565b3480156102d257600080fd5b50610190610cb9565b3480156102e757600080fd5b50610138610cc8565b3480156102fc57600080fd5b5061020d61030b366004611888565b610cce565b34801561031c57600080fd5b5061016e61032b36600461174d565b610d9c565b34801561033c57600080fd5b5061020d61034b366004611825565b610dca565b34801561035c57600080fd5b5061020d61036b366004611733565b610e21565b34801561037c57600080fd5b50610299610e92565b60006001600160a01b0383166103b65760405162461bcd60e51b81526004016103ad90611dc3565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061040d57506001600160e01b031982166303a24d0760e21b145b8061041c575061041c82610ea1565b90505b919050565b60606005805461043390612331565b80601f016020809104026020016040519081016040528092919081815260200182805461045f90612331565b80156104ac5780601f10610481576101008083540402835291602001916104ac565b820191906000526020600020905b81548152906001019060200180831161048f57829003601f168201915b505050505090505b90565b6000808060608480158015906104cf57506007548111155b6104eb5760405162461bcd60e51b81526004016103ad90611d7e565b6000868152600860205260408082208151608081019092528054829060ff16600381111561052957634e487b7160e01b600052602160045260246000fd5b600381111561054857634e487b7160e01b600052602160045260246000fd5b8152602001600182015481526020016002820154815260200160038201805461057090612331565b80601f016020809104026020016040519081016040528092919081815260200182805461059c90612331565b80156105e95780601f106105be576101008083540402835291602001916105e9565b820191906000526020600020905b8154815290600101906020018083116105cc57829003601f168201915b505050919092525050815160208301516040840151606090940151919b909a50929850965090945050505050565b60606002805461062690612331565b80601f016020809104026020016040519081016040528092919081815260200182805461065290612331565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b50505050509050919050565b6106b3610eba565b6001600160a01b0316856001600160a01b031614806106d957506106d98561032b610eba565b6106f55760405162461bcd60e51b81526004016103ad90611f3f565b6107028585858585610ebe565b5050505050565b80801580159061071b57506007548111155b6107375760405162461bcd60e51b81526004016103ad90611d7e565b600161074a610744610eba565b84610385565b106107675760405162461bcd60e51b81526004016103ad90611f91565b60006107733084610385565b116107905760405162461bcd60e51b81526004016103ad906121b9565b6107b43061079c610eba565b846001604051806020016040528060008152506110da565b5050565b606081518351146107db5760405162461bcd60e51b81526004016103ad90612170565b6000835167ffffffffffffffff81111561080557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561082e578160200160208202803683370190505b50905060005b84518110156108d05761089585828151811061086057634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061088857634e487b7160e01b600052603260045260246000fd5b6020026020010151610385565b8282815181106108b557634e487b7160e01b600052603260045260246000fd5b60209081029190910101526108c98161236c565b9050610834565b509392505050565b6004546001600160a01b031615610957576108f1610a62565b6001600160a01b0316610902610eba565b6001600160a01b03161480610936575061091a610e92565b6001600160a01b031661092b610eba565b6001600160a01b0316145b6109525760405162461bcd60e51b81526004016103ad9061206f565b610996565b61095f610a62565b6001600160a01b0316610970610eba565b6001600160a01b0316146109965760405162461bcd60e51b81526004016103ad906120bd565b6001600160a01b0381166109bc5760405162461bcd60e51b81526004016103ad90611cef565b6109c4610a62565b6001600160a01b0316816001600160a01b031614156109f55760405162461bcd60e51b81526004016103ad90611e9d565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610a1f610eba565b6001600160a01b0316610a30610a62565b6001600160a01b031614610a565760405162461bcd60e51b81526004016103ad906120f2565b610a606000611226565b565b6003546001600160a01b031690565b6004546001600160a01b031615610af057610a8a610a62565b6001600160a01b0316610a9b610eba565b6001600160a01b03161480610acf5750610ab3610e92565b6001600160a01b0316610ac4610eba565b6001600160a01b0316145b610aeb5760405162461bcd60e51b81526004016103ad9061206f565b610b2f565b610af8610a62565b6001600160a01b0316610b09610eba565b6001600160a01b031614610b2f5760405162461bcd60e51b81526004016103ad906120bd565b600983604051610b3f9190611af6565b9081526040519081900360200190205460ff1615610b6f5760405162461bcd60e51b81526004016103ad90612012565b60006040518060800160405280846003811115610b9c57634e487b7160e01b600052602160045260246000fd5b815260200142815260200160008152602001858152509050610bcf30868460405180602001604052806000815250611278565b60008581526008602052604090208151815483929190829060ff19166001836003811115610c0d57634e487b7160e01b600052602160045260246000fd5b021790555060208281015160018301556040830151600283015560608301518051610c3e9260038501920190611599565b509050506001600985604051610c549190611af6565b908152604051908190036020018120805492151560ff19909316929092179091557fb2cc3e33d75a42f4f55410fe59ade1c92d7eb680b13d48d5811ea32a39d1cca590610caa9030908890429088908a90611bc9565b60405180910390a15050505050565b60606006805461043390612331565b60075490565b816001600160a01b0316610ce0610eba565b6001600160a01b03161415610d075760405162461bcd60e51b81526004016103ad90612127565b8060016000610d14610eba565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610d58610eba565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d909190611c47565b60405180910390a35050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b610dd2610eba565b6001600160a01b0316856001600160a01b03161480610df85750610df88561032b610eba565b610e145760405162461bcd60e51b81526004016103ad90611e54565b61070285858585856110da565b610e29610eba565b6001600160a01b0316610e3a610a62565b6001600160a01b031614610e605760405162461bcd60e51b81526004016103ad906120f2565b6001600160a01b038116610e865760405162461bcd60e51b81526004016103ad90611e0e565b610e8f81611226565b50565b6004546001600160a01b031690565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b8151835114610edf5760405162461bcd60e51b81526004016103ad906121e4565b6001600160a01b038416610f055760405162461bcd60e51b81526004016103ad90611efa565b6000610f0f610eba565b9050610f1f8187878787876110d2565b60005b845181101561106c576000858281518110610f4d57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610f7957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fc95760405162461bcd60e51b81526004016103ad90611fc8565b610fd382826122ea565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461105191906122d2565b92505081905550505050806110659061236c565b9050610f22565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516110bc929190611c19565b60405180910390a46110d281878787878761135b565b505050505050565b6001600160a01b0384166111005760405162461bcd60e51b81526004016103ad90611efa565b600061110a610eba565b905061112a81878761111b88611469565b61112488611469565b876110d2565b6000848152602081815260408083206001600160a01b038a1684529091529020548381101561116b5760405162461bcd60e51b81526004016103ad90611fc8565b61117584826122ea565b6000868152602081815260408083206001600160a01b038c811685529252808320939093558816815290812080548692906111b19084906122d2565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611207929190612276565b60405180910390a461121d8288888888886114c2565b50505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03841661129e5760405162461bcd60e51b81526004016103ad9061222c565b60006112a8610eba565b6000858152602081815260408083206001600160a01b038a1684529091528120805492935085929091906112dd9084906122d2565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611334929190612276565b60405180910390a46001600160a01b038516301461070257610702816000878787876114c2565b61136d846001600160a01b0316611593565b156110d25760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906113a69089908990889088908890600401611b26565b602060405180830381600087803b1580156113c057600080fd5b505af19250505080156113f0575060408051601f3d908101601f191682019092526113ed918101906119c5565b60015b611439576113fc6123b9565b806114075750611421565b8060405162461bcd60e51b81526004016103ad9190611c88565b60405162461bcd60e51b81526004016103ad90611c9b565b6001600160e01b0319811663bc197c8160e01b1461121d5760405162461bcd60e51b81526004016103ad90611d36565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106114b157634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6114d4846001600160a01b0316611593565b156110d25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061150d9089908990889088908890600401611b84565b602060405180830381600087803b15801561152757600080fd5b505af1925050508015611557575060408051601f3d908101601f19168201909252611554918101906119c5565b60015b611563576113fc6123b9565b6001600160e01b0319811663f23a6e6160e01b1461121d5760405162461bcd60e51b81526004016103ad90611d36565b3b151590565b8280546115a590612331565b90600052602060002090601f0160209004810192826115c7576000855561160d565b82601f106115e057805160ff191683800117855561160d565b8280016001018555821561160d579182015b8281111561160d5782518255916020019190600101906115f2565b5061161992915061161d565b5090565b5b80821115611619576000815560010161161e565b600067ffffffffffffffff83111561164c5761164c61239d565b61165f601f8401601f1916602001612284565b905082815283838301111561167357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461041f57600080fd5b600082601f8301126116b1578081fd5b813560206116c66116c1836122ae565b612284565b82815281810190858301838502870184018810156116e2578586fd5b855b85811015611700578135845292840192908401906001016116e4565b5090979650505050505050565b600082601f83011261171d578081fd5b61172c83833560208501611632565b9392505050565b600060208284031215611744578081fd5b61172c8261168a565b6000806040838503121561175f578081fd5b6117688361168a565b91506117766020840161168a565b90509250929050565b600080600080600060a08688031215611796578081fd5b61179f8661168a565b94506117ad6020870161168a565b9350604086013567ffffffffffffffff808211156117c9578283fd5b6117d589838a016116a1565b945060608801359150808211156117ea578283fd5b6117f689838a016116a1565b9350608088013591508082111561180b578283fd5b506118188882890161170d565b9150509295509295909350565b600080600080600060a0868803121561183c578081fd5b6118458661168a565b94506118536020870161168a565b93506040860135925060608601359150608086013567ffffffffffffffff81111561187c578182fd5b6118188882890161170d565b6000806040838503121561189a578182fd5b6118a38361168a565b9150602083013580151581146118b7578182fd5b809150509250929050565b600080604083850312156118d4578182fd5b6118dd8361168a565b946020939093013593505050565b600080604083850312156118fd578182fd5b823567ffffffffffffffff80821115611914578384fd5b818501915085601f830112611927578384fd5b813560206119376116c1836122ae565b82815281810190858301838502870184018b1015611953578889fd5b8896505b8487101561197c576119688161168a565b835260019690960195918301918301611957565b5096505086013592505080821115611992578283fd5b5061199f858286016116a1565b9150509250929050565b6000602082840312156119ba578081fd5b813561172c8161245e565b6000602082840312156119d6578081fd5b815161172c8161245e565b6000602082840312156119f2578081fd5b5035919050565b60008060008060808587031215611a0e578182fd5b84359350602085013567ffffffffffffffff811115611a2b578283fd5b8501601f81018713611a3b578283fd5b611a4a87823560208401611632565b935050604085013560048110611a5e578283fd5b9396929550929360600135925050565b6000815180845260208085019450808401835b83811015611a9d57815187529582019590820190600101611a81565b509495945050505050565b60008151808452611ac0816020860160208601612301565b601f01601f19169290920160200192915050565b60048110611af257634e487b7160e01b600052602160045260246000fd5b9052565b60008251611b08818460208701612301565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a060408201819052600090611b5290830186611a6e565b8281036060840152611b648186611a6e565b90508281036080840152611b788185611aa8565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611bbe90830184611aa8565b979650505050505050565b6001600160a01b038616815260208101859052604081018490526000611bf26060830185611ad4565b60a06080830152611bbe60a0830184611aa8565b60006020825261172c6020830184611a6e565b600060408252611c2c6040830185611a6e565b8281036020840152611c3e8185611a6e565b95945050505050565b901515815260200190565b6000611c5e8287611ad4565b84602083015283604083015260806060830152611c7e6080830184611aa8565b9695505050505050565b60006020825261172c6020830184611aa8565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526027908201527f54434c20456e746974793a2041646d696e2063616e6e6f7420626520416464726040820152666573735a65726f60c81b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f54434c203a2050726f76696465642074696572206973206e6f7420617661696c60408201526430b136329760d91b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526037908201527f54434c20456e746974793a204f776e657220616e642061646d696e2063616e6e60408201527f6f74206265207468652073616d6520616464726573732e000000000000000000606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526018908201527f596f7520616c72656164792068616420636c61696d6564210000000000000000604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252603b908201527f54434c3a204950465320416464726573732068617320616c726561647920626560408201527f656e2075736564206279207468697320636f6c6c656374696f6e2e0000000000606082015260800190565b6020808252602e908201527f54434c20456e746974793a2053656e646572206973206e656974686572206f7760408201526d3732b9103737b91030b236b4b71760911b606082015260800190565b6020808252818101527f54434c20456e746974793a2053656e646572206973206e6f74206f776e65722e604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601190820152704f7574206f66204e46542073746f636b2160781b604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156122a6576122a661239d565b604052919050565b600067ffffffffffffffff8211156122c8576122c861239d565b5060209081020190565b600082198211156122e5576122e5612387565b500190565b6000828210156122fc576122fc612387565b500390565b60005b8381101561231c578181015183820152602001612304565b8381111561232b576000848401525b50505050565b60028104600182168061234557607f821691505b6020821081141561236657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561238057612380612387565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d10156123c9576104b4565b600481823e6308c379a06123dd82516123b3565b146123e7576104b4565b6040513d600319016004823e80513d67ffffffffffffffff816024840111818411171561241757505050506104b4565b8284019250825191508082111561243157505050506104b4565b503d83016020828401011115612449575050506104b4565b601f01601f1916810160200160405291505090565b6001600160e01b031981168114610e8f57600080fdfea264697066735822122008d664806dcaf3aa631def2ae419b6cd14c6856011f44bb6d3f70d16b328c0e964736f6c63430008000033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000004a40004b1098f92b1a32ba552a679021d597cb0a000000000000000000000000000000000000000000000000000000000000000354434c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354434c0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101135760003560e01c8063715018a6116100a0578063a22cb46511610064578063a22cb465146102f0578063e985e9c514610310578063f242432a14610330578063f2fde38b14610350578063f851a4401461037057610113565b8063715018a61461026f5780638da5cb5b14610284578063913bb2be146102a657806395d89b41146102c657806396b55f7d146102db57610113565b80630e89341c116100e75780630e89341c146101cd5780632eb2c2d6146101ed578063379607f51461020f5780634e1273f414610222578063704b6c021461024f57610113565b8062fdd58e1461011857806301ffc9a71461014e57806306fdde031461017b5780630b7ad54c1461019d575b600080fd5b34801561012457600080fd5b506101386101333660046118c2565b610385565b604051610145919061226d565b60405180910390f35b34801561015a57600080fd5b5061016e6101693660046119a9565b6103dc565b6040516101459190611c47565b34801561018757600080fd5b50610190610424565b6040516101459190611c88565b3480156101a957600080fd5b506101bd6101b83660046119e1565b6104b7565b6040516101459493929190611c52565b3480156101d957600080fd5b506101906101e83660046119e1565b610617565b3480156101f957600080fd5b5061020d61020836600461177f565b6106ab565b005b61020d61021d3660046119e1565b610709565b34801561022e57600080fd5b5061024261023d3660046118eb565b6107b8565b6040516101459190611c06565b34801561025b57600080fd5b5061020d61026a366004611733565b6108d8565b34801561027b57600080fd5b5061020d610a17565b34801561029057600080fd5b50610299610a62565b6040516101459190611b12565b3480156102b257600080fd5b5061020d6102c13660046119f9565b610a71565b3480156102d257600080fd5b50610190610cb9565b3480156102e757600080fd5b50610138610cc8565b3480156102fc57600080fd5b5061020d61030b366004611888565b610cce565b34801561031c57600080fd5b5061016e61032b36600461174d565b610d9c565b34801561033c57600080fd5b5061020d61034b366004611825565b610dca565b34801561035c57600080fd5b5061020d61036b366004611733565b610e21565b34801561037c57600080fd5b50610299610e92565b60006001600160a01b0383166103b65760405162461bcd60e51b81526004016103ad90611dc3565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061040d57506001600160e01b031982166303a24d0760e21b145b8061041c575061041c82610ea1565b90505b919050565b60606005805461043390612331565b80601f016020809104026020016040519081016040528092919081815260200182805461045f90612331565b80156104ac5780601f10610481576101008083540402835291602001916104ac565b820191906000526020600020905b81548152906001019060200180831161048f57829003601f168201915b505050505090505b90565b6000808060608480158015906104cf57506007548111155b6104eb5760405162461bcd60e51b81526004016103ad90611d7e565b6000868152600860205260408082208151608081019092528054829060ff16600381111561052957634e487b7160e01b600052602160045260246000fd5b600381111561054857634e487b7160e01b600052602160045260246000fd5b8152602001600182015481526020016002820154815260200160038201805461057090612331565b80601f016020809104026020016040519081016040528092919081815260200182805461059c90612331565b80156105e95780601f106105be576101008083540402835291602001916105e9565b820191906000526020600020905b8154815290600101906020018083116105cc57829003601f168201915b505050919092525050815160208301516040840151606090940151919b909a50929850965090945050505050565b60606002805461062690612331565b80601f016020809104026020016040519081016040528092919081815260200182805461065290612331565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b50505050509050919050565b6106b3610eba565b6001600160a01b0316856001600160a01b031614806106d957506106d98561032b610eba565b6106f55760405162461bcd60e51b81526004016103ad90611f3f565b6107028585858585610ebe565b5050505050565b80801580159061071b57506007548111155b6107375760405162461bcd60e51b81526004016103ad90611d7e565b600161074a610744610eba565b84610385565b106107675760405162461bcd60e51b81526004016103ad90611f91565b60006107733084610385565b116107905760405162461bcd60e51b81526004016103ad906121b9565b6107b43061079c610eba565b846001604051806020016040528060008152506110da565b5050565b606081518351146107db5760405162461bcd60e51b81526004016103ad90612170565b6000835167ffffffffffffffff81111561080557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561082e578160200160208202803683370190505b50905060005b84518110156108d05761089585828151811061086057634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061088857634e487b7160e01b600052603260045260246000fd5b6020026020010151610385565b8282815181106108b557634e487b7160e01b600052603260045260246000fd5b60209081029190910101526108c98161236c565b9050610834565b509392505050565b6004546001600160a01b031615610957576108f1610a62565b6001600160a01b0316610902610eba565b6001600160a01b03161480610936575061091a610e92565b6001600160a01b031661092b610eba565b6001600160a01b0316145b6109525760405162461bcd60e51b81526004016103ad9061206f565b610996565b61095f610a62565b6001600160a01b0316610970610eba565b6001600160a01b0316146109965760405162461bcd60e51b81526004016103ad906120bd565b6001600160a01b0381166109bc5760405162461bcd60e51b81526004016103ad90611cef565b6109c4610a62565b6001600160a01b0316816001600160a01b031614156109f55760405162461bcd60e51b81526004016103ad90611e9d565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610a1f610eba565b6001600160a01b0316610a30610a62565b6001600160a01b031614610a565760405162461bcd60e51b81526004016103ad906120f2565b610a606000611226565b565b6003546001600160a01b031690565b6004546001600160a01b031615610af057610a8a610a62565b6001600160a01b0316610a9b610eba565b6001600160a01b03161480610acf5750610ab3610e92565b6001600160a01b0316610ac4610eba565b6001600160a01b0316145b610aeb5760405162461bcd60e51b81526004016103ad9061206f565b610b2f565b610af8610a62565b6001600160a01b0316610b09610eba565b6001600160a01b031614610b2f5760405162461bcd60e51b81526004016103ad906120bd565b600983604051610b3f9190611af6565b9081526040519081900360200190205460ff1615610b6f5760405162461bcd60e51b81526004016103ad90612012565b60006040518060800160405280846003811115610b9c57634e487b7160e01b600052602160045260246000fd5b815260200142815260200160008152602001858152509050610bcf30868460405180602001604052806000815250611278565b60008581526008602052604090208151815483929190829060ff19166001836003811115610c0d57634e487b7160e01b600052602160045260246000fd5b021790555060208281015160018301556040830151600283015560608301518051610c3e9260038501920190611599565b509050506001600985604051610c549190611af6565b908152604051908190036020018120805492151560ff19909316929092179091557fb2cc3e33d75a42f4f55410fe59ade1c92d7eb680b13d48d5811ea32a39d1cca590610caa9030908890429088908a90611bc9565b60405180910390a15050505050565b60606006805461043390612331565b60075490565b816001600160a01b0316610ce0610eba565b6001600160a01b03161415610d075760405162461bcd60e51b81526004016103ad90612127565b8060016000610d14610eba565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610d58610eba565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d909190611c47565b60405180910390a35050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b610dd2610eba565b6001600160a01b0316856001600160a01b03161480610df85750610df88561032b610eba565b610e145760405162461bcd60e51b81526004016103ad90611e54565b61070285858585856110da565b610e29610eba565b6001600160a01b0316610e3a610a62565b6001600160a01b031614610e605760405162461bcd60e51b81526004016103ad906120f2565b6001600160a01b038116610e865760405162461bcd60e51b81526004016103ad90611e0e565b610e8f81611226565b50565b6004546001600160a01b031690565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b8151835114610edf5760405162461bcd60e51b81526004016103ad906121e4565b6001600160a01b038416610f055760405162461bcd60e51b81526004016103ad90611efa565b6000610f0f610eba565b9050610f1f8187878787876110d2565b60005b845181101561106c576000858281518110610f4d57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610f7957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fc95760405162461bcd60e51b81526004016103ad90611fc8565b610fd382826122ea565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461105191906122d2565b92505081905550505050806110659061236c565b9050610f22565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516110bc929190611c19565b60405180910390a46110d281878787878761135b565b505050505050565b6001600160a01b0384166111005760405162461bcd60e51b81526004016103ad90611efa565b600061110a610eba565b905061112a81878761111b88611469565b61112488611469565b876110d2565b6000848152602081815260408083206001600160a01b038a1684529091529020548381101561116b5760405162461bcd60e51b81526004016103ad90611fc8565b61117584826122ea565b6000868152602081815260408083206001600160a01b038c811685529252808320939093558816815290812080548692906111b19084906122d2565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611207929190612276565b60405180910390a461121d8288888888886114c2565b50505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03841661129e5760405162461bcd60e51b81526004016103ad9061222c565b60006112a8610eba565b6000858152602081815260408083206001600160a01b038a1684529091528120805492935085929091906112dd9084906122d2565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611334929190612276565b60405180910390a46001600160a01b038516301461070257610702816000878787876114c2565b61136d846001600160a01b0316611593565b156110d25760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906113a69089908990889088908890600401611b26565b602060405180830381600087803b1580156113c057600080fd5b505af19250505080156113f0575060408051601f3d908101601f191682019092526113ed918101906119c5565b60015b611439576113fc6123b9565b806114075750611421565b8060405162461bcd60e51b81526004016103ad9190611c88565b60405162461bcd60e51b81526004016103ad90611c9b565b6001600160e01b0319811663bc197c8160e01b1461121d5760405162461bcd60e51b81526004016103ad90611d36565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106114b157634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6114d4846001600160a01b0316611593565b156110d25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061150d9089908990889088908890600401611b84565b602060405180830381600087803b15801561152757600080fd5b505af1925050508015611557575060408051601f3d908101601f19168201909252611554918101906119c5565b60015b611563576113fc6123b9565b6001600160e01b0319811663f23a6e6160e01b1461121d5760405162461bcd60e51b81526004016103ad90611d36565b3b151590565b8280546115a590612331565b90600052602060002090601f0160209004810192826115c7576000855561160d565b82601f106115e057805160ff191683800117855561160d565b8280016001018555821561160d579182015b8281111561160d5782518255916020019190600101906115f2565b5061161992915061161d565b5090565b5b80821115611619576000815560010161161e565b600067ffffffffffffffff83111561164c5761164c61239d565b61165f601f8401601f1916602001612284565b905082815283838301111561167357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461041f57600080fd5b600082601f8301126116b1578081fd5b813560206116c66116c1836122ae565b612284565b82815281810190858301838502870184018810156116e2578586fd5b855b85811015611700578135845292840192908401906001016116e4565b5090979650505050505050565b600082601f83011261171d578081fd5b61172c83833560208501611632565b9392505050565b600060208284031215611744578081fd5b61172c8261168a565b6000806040838503121561175f578081fd5b6117688361168a565b91506117766020840161168a565b90509250929050565b600080600080600060a08688031215611796578081fd5b61179f8661168a565b94506117ad6020870161168a565b9350604086013567ffffffffffffffff808211156117c9578283fd5b6117d589838a016116a1565b945060608801359150808211156117ea578283fd5b6117f689838a016116a1565b9350608088013591508082111561180b578283fd5b506118188882890161170d565b9150509295509295909350565b600080600080600060a0868803121561183c578081fd5b6118458661168a565b94506118536020870161168a565b93506040860135925060608601359150608086013567ffffffffffffffff81111561187c578182fd5b6118188882890161170d565b6000806040838503121561189a578182fd5b6118a38361168a565b9150602083013580151581146118b7578182fd5b809150509250929050565b600080604083850312156118d4578182fd5b6118dd8361168a565b946020939093013593505050565b600080604083850312156118fd578182fd5b823567ffffffffffffffff80821115611914578384fd5b818501915085601f830112611927578384fd5b813560206119376116c1836122ae565b82815281810190858301838502870184018b1015611953578889fd5b8896505b8487101561197c576119688161168a565b835260019690960195918301918301611957565b5096505086013592505080821115611992578283fd5b5061199f858286016116a1565b9150509250929050565b6000602082840312156119ba578081fd5b813561172c8161245e565b6000602082840312156119d6578081fd5b815161172c8161245e565b6000602082840312156119f2578081fd5b5035919050565b60008060008060808587031215611a0e578182fd5b84359350602085013567ffffffffffffffff811115611a2b578283fd5b8501601f81018713611a3b578283fd5b611a4a87823560208401611632565b935050604085013560048110611a5e578283fd5b9396929550929360600135925050565b6000815180845260208085019450808401835b83811015611a9d57815187529582019590820190600101611a81565b509495945050505050565b60008151808452611ac0816020860160208601612301565b601f01601f19169290920160200192915050565b60048110611af257634e487b7160e01b600052602160045260246000fd5b9052565b60008251611b08818460208701612301565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a060408201819052600090611b5290830186611a6e565b8281036060840152611b648186611a6e565b90508281036080840152611b788185611aa8565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611bbe90830184611aa8565b979650505050505050565b6001600160a01b038616815260208101859052604081018490526000611bf26060830185611ad4565b60a06080830152611bbe60a0830184611aa8565b60006020825261172c6020830184611a6e565b600060408252611c2c6040830185611a6e565b8281036020840152611c3e8185611a6e565b95945050505050565b901515815260200190565b6000611c5e8287611ad4565b84602083015283604083015260806060830152611c7e6080830184611aa8565b9695505050505050565b60006020825261172c6020830184611aa8565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526027908201527f54434c20456e746974793a2041646d696e2063616e6e6f7420626520416464726040820152666573735a65726f60c81b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f54434c203a2050726f76696465642074696572206973206e6f7420617661696c60408201526430b136329760d91b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526037908201527f54434c20456e746974793a204f776e657220616e642061646d696e2063616e6e60408201527f6f74206265207468652073616d6520616464726573732e000000000000000000606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526018908201527f596f7520616c72656164792068616420636c61696d6564210000000000000000604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252603b908201527f54434c3a204950465320416464726573732068617320616c726561647920626560408201527f656e2075736564206279207468697320636f6c6c656374696f6e2e0000000000606082015260800190565b6020808252602e908201527f54434c20456e746974793a2053656e646572206973206e656974686572206f7760408201526d3732b9103737b91030b236b4b71760911b606082015260800190565b6020808252818101527f54434c20456e746974793a2053656e646572206973206e6f74206f776e65722e604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252601190820152704f7574206f66204e46542073746f636b2160781b604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156122a6576122a661239d565b604052919050565b600067ffffffffffffffff8211156122c8576122c861239d565b5060209081020190565b600082198211156122e5576122e5612387565b500190565b6000828210156122fc576122fc612387565b500390565b60005b8381101561231c578181015183820152602001612304565b8381111561232b576000848401525b50505050565b60028104600182168061234557607f821691505b6020821081141561236657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561238057612380612387565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d10156123c9576104b4565b600481823e6308c379a06123dd82516123b3565b146123e7576104b4565b6040513d600319016004823e80513d67ffffffffffffffff816024840111818411171561241757505050506104b4565b8284019250825191508082111561243157505050506104b4565b503d83016020828401011115612449575050506104b4565b601f01601f1916810160200160405291505090565b6001600160e01b031981168114610e8f57600080fdfea264697066735822122008d664806dcaf3aa631def2ae419b6cd14c6856011f44bb6d3f70d16b328c0e964736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000004a40004b1098f92b1a32ba552a679021d597cb0a000000000000000000000000000000000000000000000000000000000000000354434c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354434c0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): TCL
Arg [1] : symbol_ (string): TCL
Arg [2] : adminAddr (address): 0x4a40004b1098F92B1a32bA552A679021D597Cb0a

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000004a40004b1098f92b1a32ba552a679021d597cb0a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 54434c0000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 54434c0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

35794:3006:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22950:231;;;;;;;;;;-1:-1:-1;22950:231:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21986:297;;;;;;;;;;-1:-1:-1;21986:297:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36853:77::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38213:272::-;;;;;;;;;;-1:-1:-1;38213:272:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;22694:105::-;;;;;;;;;;-1:-1:-1;22694:105:0;;;;;:::i;:::-;;:::i;25102:474::-;;;;;;;;;;-1:-1:-1;25102:474:0;;;;;:::i;:::-;;:::i;:::-;;38518:279;;;;;;:::i;:::-;;:::i;23347:549::-;;;;;;;;;;-1:-1:-1;23347:549:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3756:281::-;;;;;;;;;;-1:-1:-1;3756:281:0;;;;;:::i;:::-;;:::i;2478:94::-;;;;;;;;;;;;;:::i;1827:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37227:786::-;;;;;;;;;;-1:-1:-1;37227:786:0;;;;;:::i;:::-;;:::i;36936:83::-;;;;;;;;;;;;;:::i;38078:82::-;;;;;;;;;;;;;:::i;23969:311::-;;;;;;;;;;-1:-1:-1;23969:311:0;;;;;:::i;:::-;;:::i;24352:168::-;;;;;;;;;;-1:-1:-1;24352:168:0;;;;;:::i;:::-;;:::i;24592:433::-;;;;;;;;;;-1:-1:-1;24592:433:0;;;;;:::i;:::-;;:::i;2727:192::-;;;;;;;;;;-1:-1:-1;2727:192:0;;;;;:::i;:::-;;:::i;3671:79::-;;;;;;;;;;;;;:::i;22950:231::-;23036:7;-1:-1:-1;;;;;23064:21:0;;23056:77;;;;-1:-1:-1;;;23056:77:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23151:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;23151:22:0;;;;;;;;;;;;22950:231::o;21986:297::-;22088:4;-1:-1:-1;;;;;;22112:41:0;;-1:-1:-1;;;22112:41:0;;:110;;-1:-1:-1;;;;;;;22170:52:0;;-1:-1:-1;;;22170:52:0;22112:110;:163;;;;22239:36;22263:11;22239:23;:36::i;:::-;22105:170;;21986:297;;;;:::o;36853:77::-;36890:13;36919:5;36912:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36853:77;;:::o;38213:272::-;38288:11;;;38319:13;38273:4;36562:9;;;;;:31;;;36583:10;;36575:4;:18;;36562:31;36554:81;;;;-1:-1:-1;;;36554:81:0;;;;;;;:::i;:::-;38341:25:::1;38369:23:::0;;;:17:::1;:23;::::0;;;;;38341:51;;::::1;::::0;::::1;::::0;;;;;;;::::1;;;::::0;::::1;;;;-1:-1:-1::0;;;38341:51:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;38341:51:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;38341:51:0;;;;-1:-1:-1;;38407:16:0;;38425:17:::1;::::0;::::1;::::0;38444:13:::1;::::0;::::1;::::0;38459:19:::1;::::0;;::::1;::::0;38407:16;;38425:17;;-1:-1:-1;38444:13:0;;-1:-1:-1;38459:19:0;-1:-1:-1;38213:272:0;;-1:-1:-1;;;;;38213:272:0:o;22694:105::-;22754:13;22787:4;22780:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22694:105;;;:::o;25102:474::-;25375:12;:10;:12::i;:::-;-1:-1:-1;;;;;25367:20:0;:4;-1:-1:-1;;;;;25367:20:0;;:60;;;;25391:36;25408:4;25414:12;:10;:12::i;25391:36::-;25345:160;;;;-1:-1:-1;;;25345:160:0;;;;;;;:::i;:::-;25516:52;25539:4;25545:2;25549:3;25554:7;25563:4;25516:22;:52::i;:::-;25102:474;;;;;:::o;38518:279::-;38571:4;36562:9;;;;;:31;;;36583:10;;36575:4;:18;;36562:31;36554:81;;;;-1:-1:-1;;;36554:81:0;;;;;;;:::i;:::-;38624:1:::1;38592:29;38602:12;:10;:12::i;:::-;38616:4;38592:9;:29::i;:::-;:33;38584:70;;;;-1:-1:-1::0;;;38584:70:0::1;;;;;;;:::i;:::-;38702:1;38669:30;38687:4;38694;38669:9;:30::i;:::-;:34;38661:64;;;;-1:-1:-1::0;;;38661:64:0::1;;;;;;;:::i;:::-;38732:59;38758:4;38765:12;:10;:12::i;:::-;38779:4;38785:1;38732:59;;;;;;;;;;;::::0;:17:::1;:59::i;:::-;38518:279:::0;;:::o;23347:549::-;23528:16;23589:3;:10;23570:8;:15;:29;23562:83;;;;-1:-1:-1;;;23562:83:0;;;;;;;:::i;:::-;23658:30;23705:8;:15;23691:30;;;;;;-1:-1:-1;;;23691:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23691:30:0;;23658:63;;23739:9;23734:122;23758:8;:15;23754:1;:19;23734:122;;;23814:30;23824:8;23833:1;23824:11;;;;;;-1:-1:-1;;;23824:11:0;;;;;;;;;;;;;;;23837:3;23841:1;23837:6;;;;;;-1:-1:-1;;;23837:6:0;;;;;;;;;;;;;;;23814:9;:30::i;:::-;23795:13;23809:1;23795:16;;;;;;-1:-1:-1;;;23795:16:0;;;;;;;;;;;;;;;;;;:49;23775:3;;;:::i;:::-;;;23734:122;;;-1:-1:-1;23875:13:0;23347:549;-1:-1:-1;;;23347:549:0:o;3756:281::-;3331:6;;-1:-1:-1;;;;;3331:6:0;:20;3328:271;;3391:7;:5;:7::i;:::-;-1:-1:-1;;;;;3375:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3375:23:0;;:50;;;;3418:7;:5;:7::i;:::-;-1:-1:-1;;;;;3402:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3402:23:0;;3375:50;3367:109;;;;-1:-1:-1;;;3367:109:0;;;;;;;:::i;:::-;3328:271;;;3542:7;:5;:7::i;:::-;-1:-1:-1;;;;;3526:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3526:23:0;;3518:69;;;;-1:-1:-1;;;3518:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3837:22:0;::::1;3829:74;;;;-1:-1:-1::0;;;3829:74:0::1;;;;;;;:::i;:::-;3934:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;3922:19:0::1;:8;-1:-1:-1::0;;;;;3922:19:0::1;;;3914:87;;;;-1:-1:-1::0;;;3914:87:0::1;;;;;;;:::i;:::-;4012:6;:17:::0;;-1:-1:-1;;;;;;4012:17:0::1;-1:-1:-1::0;;;;;4012:17:0;;;::::1;::::0;;;::::1;::::0;;3756:281::o;2478:94::-;2058:12;:10;:12::i;:::-;-1:-1:-1;;;;;2047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2047:23:0;;2039:68;;;;-1:-1:-1;;;2039:68:0;;;;;;;:::i;:::-;2543:21:::1;2561:1;2543:9;:21::i;:::-;2478:94::o:0;1827:87::-;1900:6;;-1:-1:-1;;;;;1900:6:0;1827:87;:::o;37227:786::-;3331:6;;-1:-1:-1;;;;;3331:6:0;:20;3328:271;;3391:7;:5;:7::i;:::-;-1:-1:-1;;;;;3375:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3375:23:0;;:50;;;;3418:7;:5;:7::i;:::-;-1:-1:-1;;;;;3402:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3402:23:0;;3375:50;3367:109;;;;-1:-1:-1;;;3367:109:0;;;;;;;:::i;:::-;3328:271;;;3542:7;:5;:7::i;:::-;-1:-1:-1;;;;;3526:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3526:23:0;;3518:69;;;;-1:-1:-1;;;3518:69:0;;;;;;;:::i;:::-;37365:16:::1;37382:11;37365:29;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;37364:30;37356:102;;;;-1:-1:-1::0;;;37356:102:0::1;;;;;;;:::i;:::-;37489:25;37517:279;;;;;;;;37577:8;37517:279;;;;;;-1:-1:-1::0;;;37517:279:0::1;;;;;;;;;;;;;37635:15;37517:279;;;;37696:1;37517:279;;;;37749:11;37517:279;;::::0;37489:307:::1;;37805:38;37819:4;37826;37832:6;37805:38;;;;;;;;;;;::::0;:5:::1;:38::i;:::-;37850:23;::::0;;;:17:::1;:23;::::0;;;;:33;;;;37876:7;;37850:23;:33;:23;;-1:-1:-1;;37850:33:0::1;::::0;;::::1;::::0;::::1;;;;-1:-1:-1::0;;;37850:33:0::1;;;;;;;;;;;::::0;;-1:-1:-1;37850:33:0::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;37922:4;37890:16;37907:11;37890:29;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:36;;;::::1;;-1:-1:-1::0;;37890:36:0;;::::1;::::0;;;::::1;::::0;;;37940:67:::1;::::0;::::1;::::0;37955:4:::1;::::0;37962;;37968:15:::1;::::0;37985:8;;37995:11;;37940:67:::1;:::i;:::-;;;;;;;;3609:1;37227:786:::0;;;;:::o;36936:83::-;36975:13;37006:7;36999:14;;;;;:::i;38078:82::-;38144:10;;38078:82;:::o;23969:311::-;24088:8;-1:-1:-1;;;;;24072:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;24072:24:0;;;24064:78;;;;-1:-1:-1;;;24064:78:0;;;;;;;:::i;:::-;24200:8;24155:18;:32;24174:12;:10;:12::i;:::-;-1:-1:-1;;;;;24155:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24155:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;24155:53:0;;;;;;;;;;;24239:12;:10;:12::i;:::-;-1:-1:-1;;;;;24224:48:0;;24263:8;24224:48;;;;;;:::i;:::-;;;;;;;;23969:311;;:::o;24352:168::-;-1:-1:-1;;;;;24475:27:0;;;24451:4;24475:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;24352:168::o;24592:433::-;24840:12;:10;:12::i;:::-;-1:-1:-1;;;;;24832:20:0;:4;-1:-1:-1;;;;;24832:20:0;;:60;;;;24856:36;24873:4;24879:12;:10;:12::i;24856:36::-;24810:151;;;;-1:-1:-1;;;24810:151:0;;;;;;;:::i;:::-;24972:45;24990:4;24996:2;25000;25004:6;25012:4;24972:17;:45::i;2727:192::-;2058:12;:10;:12::i;:::-;-1:-1:-1;;;;;2047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2047:23:0;;2039:68;;;;-1:-1:-1;;;2039:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2816:22:0;::::1;2808:73;;;;-1:-1:-1::0;;;2808:73:0::1;;;;;;;:::i;:::-;2892:19;2902:8;2892:9;:19::i;:::-;2727:192:::0;:::o;3671:79::-;3736:6;;-1:-1:-1;;;;;3736:6:0;3671:79;:::o;20844:157::-;-1:-1:-1;;;;;;20953:40:0;;-1:-1:-1;;;20953:40:0;20844:157;;;:::o;601:98::-;681:10;601:98;:::o;27205:1053::-;27455:7;:14;27441:3;:10;:28;27433:81;;;;-1:-1:-1;;;27433:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27533:16:0;;27525:66;;;;-1:-1:-1;;;27525:66:0;;;;;;;:::i;:::-;27604:16;27623:12;:10;:12::i;:::-;27604:31;;27648:60;27669:8;27679:4;27685:2;27689:3;27694:7;27703:4;27648:20;:60::i;:::-;27726:9;27721:377;27745:3;:10;27741:1;:14;27721:377;;;27777:10;27790:3;27794:1;27790:6;;;;;;-1:-1:-1;;;27790:6:0;;;;;;;;;;;;;;;27777:19;;27811:14;27828:7;27836:1;27828:10;;;;;;-1:-1:-1;;;27828:10:0;;;;;;;;;;;;;;;;;;;;27855:19;27877:13;;;;;;;;;;-1:-1:-1;;;;;27877:19:0;;;;;;;;;;;;27828:10;;-1:-1:-1;27919:21:0;;;;27911:76;;;;-1:-1:-1;;;27911:76:0;;;;;;;:::i;:::-;28024:20;28038:6;28024:11;:20;:::i;:::-;28002:9;:13;28012:2;28002:13;;;;;;;;;;;:19;28016:4;-1:-1:-1;;;;;28002:19:0;-1:-1:-1;;;;;28002:19:0;;;;;;;;;;;;:42;;;;28080:6;28059:9;:13;28069:2;28059:13;;;;;;;;;;;:17;28073:2;-1:-1:-1;;;;;28059:17:0;-1:-1:-1;;;;;28059:17:0;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27721:377;;;27757:3;;;;:::i;:::-;;;27721:377;;;;28145:2;-1:-1:-1;;;;;28115:47:0;28139:4;-1:-1:-1;;;;;28115:47:0;28129:8;-1:-1:-1;;;;;28115:47:0;;28149:3;28154:7;28115:47;;;;;;;:::i;:::-;;;;;;;;28175:75;28211:8;28221:4;28227:2;28231:3;28236:7;28245:4;28175:35;:75::i;:::-;27205:1053;;;;;;:::o;26040:807::-;-1:-1:-1;;;;;26251:16:0;;26243:66;;;;-1:-1:-1;;;26243:66:0;;;;;;;:::i;:::-;26322:16;26341:12;:10;:12::i;:::-;26322:31;;26366:96;26387:8;26397:4;26403:2;26407:21;26425:2;26407:17;:21::i;:::-;26430:25;26448:6;26430:17;:25::i;:::-;26457:4;26366:20;:96::i;:::-;26475:19;26497:13;;;;;;;;;;;-1:-1:-1;;;;;26497:19:0;;;;;;;;;;26535:21;;;;26527:76;;;;-1:-1:-1;;;26527:76:0;;;;;;;:::i;:::-;26636:20;26650:6;26636:11;:20;:::i;:::-;26614:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26614:19:0;;;;;;;;;;:42;;;;26667:17;;;;;;;:27;;26688:6;;26614:9;26667:27;;26688:6;;26667:27;:::i;:::-;;;;;;;;26743:2;-1:-1:-1;;;;;26712:46:0;26737:4;-1:-1:-1;;;;;26712:46:0;26727:8;-1:-1:-1;;;;;26712:46:0;;26747:2;26751:6;26712:46;;;;;;;:::i;:::-;;;;;;;;26771:68;26802:8;26812:4;26818:2;26822;26826:6;26834:4;26771:30;:68::i;:::-;26040:807;;;;;;;:::o;2927:173::-;3002:6;;;-1:-1:-1;;;;;3019:17:0;;;-1:-1:-1;;;;;;3019:17:0;;;;;;;3052:40;;3002:6;;;3019:17;3002:6;;3052:40;;2983:16;;3052:40;2927:173;;:::o;29591:491::-;-1:-1:-1;;;;;29706:21:0;;29698:67;;;;-1:-1:-1;;;29698:67:0;;;;;;;:::i;:::-;29778:16;29797:12;:10;:12::i;:::-;29822:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29822:22:0;;;;;;;;;:32;;29778:31;;-1:-1:-1;29848:6:0;;29822:22;;:9;:32;;29848:6;;29822:32;:::i;:::-;;;;;;;;29907:7;-1:-1:-1;;;;;29870:57:0;29903:1;-1:-1:-1;;;;;29870:57:0;29885:8;-1:-1:-1;;;;;29870:57:0;;29916:2;29920:6;29870:57;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;29944:24:0;;29963:4;29944:24;29940:135;;29984:79;30015:8;30033:1;30037:7;30046:2;30050:6;30058:4;29984:30;:79::i;34710:799::-;34964:15;:2;-1:-1:-1;;;;;34964:13:0;;:15::i;:::-;34960:542;;;35000:79;;-1:-1:-1;;;35000:79:0;;-1:-1:-1;;;;;35000:43:0;;;;;:79;;35044:8;;35054:4;;35060:3;;35065:7;;35074:4;;35000:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35000:79:0;;;;;;;;-1:-1:-1;;35000:79:0;;;;;;;;;;;;:::i;:::-;;;34996:495;;;;:::i;:::-;;;;;;;;35364:6;35357:14;;-1:-1:-1;;;35357:14:0;;;;;;;;:::i;34996:495::-;35413:62;;-1:-1:-1;;;35413:62:0;;;;;;;:::i;34996:495::-;-1:-1:-1;;;;;;35129:64:0;;-1:-1:-1;;;35129:64:0;35125:163;;35218:50;;-1:-1:-1;;;35218:50:0;;;;;;;:::i;35517:198::-;35637:16;;;35651:1;35637:16;;;;;;;;;35583;;35612:22;;35637:16;;;;;;;;;;;;-1:-1:-1;35637:16:0;35612:41;;35675:7;35664:5;35670:1;35664:8;;;;;;-1:-1:-1;;;35664:8:0;;;;;;;;;;;;;;;;;;:18;35702:5;35517:198;-1:-1:-1;;35517:198:0:o;33940:762::-;34169:15;:2;-1:-1:-1;;;;;34169:13:0;;:15::i;:::-;34165:530;;;34205:72;;-1:-1:-1;;;34205:72:0;;-1:-1:-1;;;;;34205:38:0;;;;;:72;;34244:8;;34254:4;;34260:2;;34264:6;;34272:4;;34205:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34205:72:0;;;;;;;;-1:-1:-1;;34205:72:0;;;;;;;;;;;;:::i;:::-;;;34201:483;;;;:::i;:::-;-1:-1:-1;;;;;;34327:59:0;;-1:-1:-1;;;34327:59:0;34323:158;;34411:50;;-1:-1:-1;;;34411:50:0;;;;;;;:::i;12918:387::-;13241:20;13289:8;;;12918:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:1;;537:42;;527:2;;593:1;590;583:12;608:705;;721:3;714:4;706:6;702:17;698:27;688:2;;743:5;736;729:20;688:2;783:6;770:20;809:4;833:65;848:49;894:2;848:49;:::i;:::-;833:65;:::i;:::-;932:15;;;963:12;;;;995:15;;;1041:11;;;1029:24;;1025:33;;1022:42;-1:-1:-1;1019:2:1;;;1081:5;1074;1067:20;1019:2;1107:5;1121:163;1135:2;1132:1;1129:9;1121:163;;;1192:17;;1180:30;;1230:12;;;;1262;;;;1153:1;1146:9;1121:163;;;-1:-1:-1;1302:5:1;;678:635;-1:-1:-1;;;;;;;678:635:1:o;1318:232::-;;1415:3;1408:4;1400:6;1396:17;1392:27;1382:2;;1437:5;1430;1423:20;1382:2;1463:81;1540:3;1531:6;1518:20;1511:4;1503:6;1499:17;1463:81;:::i;:::-;1454:90;1372:178;-1:-1:-1;;;1372:178:1:o;1555:198::-;;1667:2;1655:9;1646:7;1642:23;1638:32;1635:2;;;1688:6;1680;1673:22;1635:2;1716:31;1737:9;1716:31;:::i;1758:274::-;;;1887:2;1875:9;1866:7;1862:23;1858:32;1855:2;;;1908:6;1900;1893:22;1855:2;1936:31;1957:9;1936:31;:::i;:::-;1926:41;;1986:40;2022:2;2011:9;2007:18;1986:40;:::i;:::-;1976:50;;1845:187;;;;;:::o;2037:1001::-;;;;;;2276:3;2264:9;2255:7;2251:23;2247:33;2244:2;;;2298:6;2290;2283:22;2244:2;2326:31;2347:9;2326:31;:::i;:::-;2316:41;;2376:40;2412:2;2401:9;2397:18;2376:40;:::i;:::-;2366:50;;2467:2;2456:9;2452:18;2439:32;2490:18;2531:2;2523:6;2520:14;2517:2;;;2552:6;2544;2537:22;2517:2;2580:67;2639:7;2630:6;2619:9;2615:22;2580:67;:::i;:::-;2570:77;;2700:2;2689:9;2685:18;2672:32;2656:48;;2729:2;2719:8;2716:16;2713:2;;;2750:6;2742;2735:22;2713:2;2778:69;2839:7;2828:8;2817:9;2813:24;2778:69;:::i;:::-;2768:79;;2900:3;2889:9;2885:19;2872:33;2856:49;;2930:2;2920:8;2917:16;2914:2;;;2951:6;2943;2936:22;2914:2;;2979:53;3024:7;3013:8;3002:9;2998:24;2979:53;:::i;:::-;2969:63;;;2234:804;;;;;;;;:::o;3043:632::-;;;;;;3232:3;3220:9;3211:7;3207:23;3203:33;3200:2;;;3254:6;3246;3239:22;3200:2;3282:31;3303:9;3282:31;:::i;:::-;3272:41;;3332:40;3368:2;3357:9;3353:18;3332:40;:::i;:::-;3322:50;;3419:2;3408:9;3404:18;3391:32;3381:42;;3470:2;3459:9;3455:18;3442:32;3432:42;;3525:3;3514:9;3510:19;3497:33;3553:18;3545:6;3542:30;3539:2;;;3590:6;3582;3575:22;3539:2;3618:51;3661:7;3652:6;3641:9;3637:22;3618:51;:::i;3680:369::-;;;3806:2;3794:9;3785:7;3781:23;3777:32;3774:2;;;3827:6;3819;3812:22;3774:2;3855:31;3876:9;3855:31;:::i;:::-;3845:41;;3936:2;3925:9;3921:18;3908:32;3983:5;3976:13;3969:21;3962:5;3959:32;3949:2;;4010:6;4002;3995:22;3949:2;4038:5;4028:15;;;3764:285;;;;;:::o;4054:266::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4204:6;4196;4189:22;4151:2;4232:31;4253:9;4232:31;:::i;:::-;4222:41;4310:2;4295:18;;;;4282:32;;-1:-1:-1;;;4141:179:1:o;4325:1226::-;;;4504:2;4492:9;4483:7;4479:23;4475:32;4472:2;;;4525:6;4517;4510:22;4472:2;4570:9;4557:23;4599:18;4640:2;4632:6;4629:14;4626:2;;;4661:6;4653;4646:22;4626:2;4704:6;4693:9;4689:22;4679:32;;4749:7;4742:4;4738:2;4734:13;4730:27;4720:2;;4776:6;4768;4761:22;4720:2;4817;4804:16;4839:4;4863:65;4878:49;4924:2;4878:49;:::i;4863:65::-;4962:15;;;4993:12;;;;5025:11;;;5063;;;5055:20;;5051:29;;5048:42;-1:-1:-1;5045:2:1;;;5108:6;5100;5093:22;5045:2;5135:6;5126:15;;5150:171;5164:2;5161:1;5158:9;5150:171;;;5221:25;5242:3;5221:25;:::i;:::-;5209:38;;5182:1;5175:9;;;;;5267:12;;;;5299;;5150:171;;;-1:-1:-1;5340:5:1;-1:-1:-1;;5383:18:1;;5370:32;;-1:-1:-1;;5414:16:1;;;5411:2;;;5448:6;5440;5433:22;5411:2;;5476:69;5537:7;5526:8;5515:9;5511:24;5476:69;:::i;:::-;5466:79;;;4462:1089;;;;;:::o;5556:257::-;;5667:2;5655:9;5646:7;5642:23;5638:32;5635:2;;;5688:6;5680;5673:22;5635:2;5732:9;5719:23;5751:32;5777:5;5751:32;:::i;5818:261::-;;5940:2;5928:9;5919:7;5915:23;5911:32;5908:2;;;5961:6;5953;5946:22;5908:2;5998:9;5992:16;6017:32;6043:5;6017:32;:::i;6084:190::-;;6196:2;6184:9;6175:7;6171:23;6167:32;6164:2;;;6217:6;6209;6202:22;6164:2;-1:-1:-1;6245:23:1;;6154:120;-1:-1:-1;6154:120:1:o;6279:789::-;;;;;6468:3;6456:9;6447:7;6443:23;6439:33;6436:2;;;6490:6;6482;6475:22;6436:2;6531:9;6518:23;6508:33;;6592:2;6581:9;6577:18;6564:32;6619:18;6611:6;6608:30;6605:2;;;6656:6;6648;6641:22;6605:2;6684:22;;6737:4;6729:13;;6725:27;-1:-1:-1;6715:2:1;;6771:6;6763;6756:22;6715:2;6799:75;6866:7;6861:2;6848:16;6843:2;6839;6835:11;6799:75;:::i;:::-;6789:85;;;6924:2;6913:9;6909:18;6896:32;6957:1;6950:5;6947:12;6937:2;;6978:6;6970;6963:22;6937:2;6426:642;;;;-1:-1:-1;7006:5:1;;7058:2;7043:18;7030:32;;-1:-1:-1;;6426:642:1:o;7073:443::-;;7170:5;7164:12;7197:6;7192:3;7185:19;7223:4;7252:2;7247:3;7243:12;7236:19;;7289:2;7282:5;7278:14;7310:3;7322:169;7336:6;7333:1;7330:13;7322:169;;;7397:13;;7385:26;;7431:12;;;;7466:15;;;;7358:1;7351:9;7322:169;;;-1:-1:-1;7507:3:1;;7140:376;-1:-1:-1;;;;;7140:376:1:o;7521:259::-;;7602:5;7596:12;7629:6;7624:3;7617:19;7645:63;7701:6;7694:4;7689:3;7685:14;7678:4;7671:5;7667:16;7645:63;:::i;:::-;7762:2;7741:15;-1:-1:-1;;7737:29:1;7728:39;;;;7769:4;7724:50;;7572:208;-1:-1:-1;;7572:208:1:o;7785:242::-;7871:1;7864:5;7861:12;7851:2;;7916:10;7911:3;7907:20;7904:1;7897:31;7951:4;7948:1;7941:15;7979:4;7976:1;7969:15;7851:2;8003:18;;7841:186::o;8032:276::-;;8201:6;8195:13;8217:53;8263:6;8258:3;8251:4;8243:6;8239:17;8217:53;:::i;:::-;8286:16;;;;;8171:137;-1:-1:-1;;8171:137:1:o;8313:203::-;-1:-1:-1;;;;;8477:32:1;;;;8459:51;;8447:2;8432:18;;8414:102::o;8521:840::-;-1:-1:-1;;;;;8918:15:1;;;8900:34;;8970:15;;8965:2;8950:18;;8943:43;8880:3;9017:2;9002:18;;8995:31;;;8521:840;;9049:63;;9092:19;;9084:6;9049:63;:::i;:::-;9160:9;9152:6;9148:22;9143:2;9132:9;9128:18;9121:50;9194;9237:6;9229;9194:50;:::i;:::-;9180:64;;9293:9;9285:6;9281:22;9275:3;9264:9;9260:19;9253:51;9321:34;9348:6;9340;9321:34;:::i;:::-;9313:42;8852:509;-1:-1:-1;;;;;;;;8852:509:1:o;9366:562::-;-1:-1:-1;;;;;9663:15:1;;;9645:34;;9715:15;;9710:2;9695:18;;9688:43;9762:2;9747:18;;9740:34;;;9805:2;9790:18;;9783:34;;;9625:3;9848;9833:19;;9826:32;;;9366:562;;9875:47;;9902:19;;9894:6;9875:47;:::i;:::-;9867:55;9597:331;-1:-1:-1;;;;;;;9597:331:1:o;9933:572::-;-1:-1:-1;;;;;10208:32:1;;10190:51;;10272:2;10257:18;;10250:34;;;10315:2;10300:18;;10293:34;;;9933:572;10336:58;10390:2;10375:18;;10367:6;10336:58;:::i;:::-;10431:3;10425;10414:9;10410:19;10403:32;10452:47;10494:3;10483:9;10479:19;10471:6;10452:47;:::i;10510:267::-;;10689:2;10678:9;10671:21;10709:62;10767:2;10756:9;10752:18;10744:6;10709:62;:::i;10782:477::-;;11039:2;11028:9;11021:21;11065:62;11123:2;11112:9;11108:18;11100:6;11065:62;:::i;:::-;11175:9;11167:6;11163:22;11158:2;11147:9;11143:18;11136:50;11203;11246:6;11238;11203:50;:::i;:::-;11195:58;11011:248;-1:-1:-1;;;;;11011:248:1:o;11264:187::-;11429:14;;11422:22;11404:41;;11392:2;11377:18;;11359:92::o;11456:474::-;;11685:49;11724:9;11716:6;11685:49;:::i;:::-;11770:6;11765:2;11754:9;11750:18;11743:34;11813:6;11808:2;11797:9;11793:18;11786:34;11856:3;11851:2;11840:9;11836:18;11829:31;11877:47;11919:3;11908:9;11904:19;11896:6;11877:47;:::i;:::-;11869:55;11675:255;-1:-1:-1;;;;;;11675:255:1:o;11935:221::-;;12084:2;12073:9;12066:21;12104:46;12146:2;12135:9;12131:18;12123:6;12104:46;:::i;12161:416::-;12363:2;12345:21;;;12402:2;12382:18;;;12375:30;12441:34;12436:2;12421:18;;12414:62;-1:-1:-1;;;12507:2:1;12492:18;;12485:50;12567:3;12552:19;;12335:242::o;12582:403::-;12784:2;12766:21;;;12823:2;12803:18;;;12796:30;12862:34;12857:2;12842:18;;12835:62;-1:-1:-1;;;12928:2:1;12913:18;;12906:37;12975:3;12960:19;;12756:229::o;12990:404::-;13192:2;13174:21;;;13231:2;13211:18;;;13204:30;13270:34;13265:2;13250:18;;13243:62;-1:-1:-1;;;13336:2:1;13321:18;;13314:38;13384:3;13369:19;;13164:230::o;13399:401::-;13601:2;13583:21;;;13640:2;13620:18;;;13613:30;13679:34;13674:2;13659:18;;13652:62;-1:-1:-1;;;13745:2:1;13730:18;;13723:35;13790:3;13775:19;;13573:227::o;13805:407::-;14007:2;13989:21;;;14046:2;14026:18;;;14019:30;14085:34;14080:2;14065:18;;14058:62;-1:-1:-1;;;14151:2:1;14136:18;;14129:41;14202:3;14187:19;;13979:233::o;14217:402::-;14419:2;14401:21;;;14458:2;14438:18;;;14431:30;14497:34;14492:2;14477:18;;14470:62;-1:-1:-1;;;14563:2:1;14548:18;;14541:36;14609:3;14594:19;;14391:228::o;14624:405::-;14826:2;14808:21;;;14865:2;14845:18;;;14838:30;14904:34;14899:2;14884:18;;14877:62;-1:-1:-1;;;14970:2:1;14955:18;;14948:39;15019:3;15004:19;;14798:231::o;15034:419::-;15236:2;15218:21;;;15275:2;15255:18;;;15248:30;15314:34;15309:2;15294:18;;15287:62;15385:25;15380:2;15365:18;;15358:53;15443:3;15428:19;;15208:245::o;15458:401::-;15660:2;15642:21;;;15699:2;15679:18;;;15672:30;15738:34;15733:2;15718:18;;15711:62;-1:-1:-1;;;15804:2:1;15789:18;;15782:35;15849:3;15834:19;;15632:227::o;15864:414::-;16066:2;16048:21;;;16105:2;16085:18;;;16078:30;16144:34;16139:2;16124:18;;16117:62;-1:-1:-1;;;16210:2:1;16195:18;;16188:48;16268:3;16253:19;;16038:240::o;16283:348::-;16485:2;16467:21;;;16524:2;16504:18;;;16497:30;16563:26;16558:2;16543:18;;16536:54;16622:2;16607:18;;16457:174::o;16636:406::-;16838:2;16820:21;;;16877:2;16857:18;;;16850:30;16916:34;16911:2;16896:18;;16889:62;-1:-1:-1;;;16982:2:1;16967:18;;16960:40;17032:3;17017:19;;16810:232::o;17047:423::-;17249:2;17231:21;;;17288:2;17268:18;;;17261:30;17327:34;17322:2;17307:18;;17300:62;17398:29;17393:2;17378:18;;17371:57;17460:3;17445:19;;17221:249::o;17475:410::-;17677:2;17659:21;;;17716:2;17696:18;;;17689:30;17755:34;17750:2;17735:18;;17728:62;-1:-1:-1;;;17821:2:1;17806:18;;17799:44;17875:3;17860:19;;17649:236::o;17890:356::-;18092:2;18074:21;;;18111:18;;;18104:30;18170:34;18165:2;18150:18;;18143:62;18237:2;18222:18;;18064:182::o;18251:356::-;18453:2;18435:21;;;18472:18;;;18465:30;18531:34;18526:2;18511:18;;18504:62;18598:2;18583:18;;18425:182::o;18612:405::-;18814:2;18796:21;;;18853:2;18833:18;;;18826:30;18892:34;18887:2;18872:18;;18865:62;-1:-1:-1;;;18958:2:1;18943:18;;18936:39;19007:3;18992:19;;18786:231::o;19022:405::-;19224:2;19206:21;;;19263:2;19243:18;;;19236:30;19302:34;19297:2;19282:18;;19275:62;-1:-1:-1;;;19368:2:1;19353:18;;19346:39;19417:3;19402:19;;19196:231::o;19432:341::-;19634:2;19616:21;;;19673:2;19653:18;;;19646:30;-1:-1:-1;;;19707:2:1;19692:18;;19685:47;19764:2;19749:18;;19606:167::o;19778:404::-;19980:2;19962:21;;;20019:2;19999:18;;;19992:30;20058:34;20053:2;20038:18;;20031:62;-1:-1:-1;;;20124:2:1;20109:18;;20102:38;20172:3;20157:19;;19952:230::o;20187:397::-;20389:2;20371:21;;;20428:2;20408:18;;;20401:30;20467:34;20462:2;20447:18;;20440:62;-1:-1:-1;;;20533:2:1;20518:18;;20511:31;20574:3;20559:19;;20361:223::o;20589:177::-;20735:25;;;20723:2;20708:18;;20690:76::o;20771:248::-;20945:25;;;21001:2;20986:18;;20979:34;20933:2;20918:18;;20900:119::o;21024:251::-;21094:2;21088:9;21124:17;;;21171:18;21156:34;;21192:22;;;21153:62;21150:2;;;21218:18;;:::i;:::-;21254:2;21247:22;21068:207;;-1:-1:-1;21068:207:1:o;21280:192::-;;21379:18;21371:6;21368:30;21365:2;;;21401:18;;:::i;:::-;-1:-1:-1;21461:4:1;21442:17;;;21438:28;;21355:117::o;21477:128::-;;21548:1;21544:6;21541:1;21538:13;21535:2;;;21554:18;;:::i;:::-;-1:-1:-1;21590:9:1;;21525:80::o;21610:125::-;;21678:1;21675;21672:8;21669:2;;;21683:18;;:::i;:::-;-1:-1:-1;21720:9:1;;21659:76::o;21740:258::-;21812:1;21822:113;21836:6;21833:1;21830:13;21822:113;;;21912:11;;;21906:18;21893:11;;;21886:39;21858:2;21851:10;21822:113;;;21953:6;21950:1;21947:13;21944:2;;;21988:1;21979:6;21974:3;21970:16;21963:27;21944:2;;21793:205;;;:::o;22003:380::-;22088:1;22078:12;;22135:1;22125:12;;;22146:2;;22200:4;22192:6;22188:17;22178:27;;22146:2;22253;22245:6;22242:14;22222:18;22219:38;22216:2;;;22299:10;22294:3;22290:20;22287:1;22280:31;22334:4;22331:1;22324:15;22362:4;22359:1;22352:15;22216:2;;22058:325;;;:::o;22388:135::-;;-1:-1:-1;;22448:17:1;;22445:2;;;22468:18;;:::i;:::-;-1:-1:-1;22515:1:1;22504:13;;22435:88::o;22528:127::-;22589:10;22584:3;22580:20;22577:1;22570:31;22620:4;22617:1;22610:15;22644:4;22641:1;22634:15;22660:127;22721:10;22716:3;22712:20;22709:1;22702:31;22752:4;22749:1;22742:15;22776:4;22773:1;22766:15;22792:88;22867:3;22863:15;;22849:31::o;22885:764::-;;22966:4;22948:16;22945:26;22942:2;;;22974:5;;22942:2;23015:1;23010:3;23005;22990:27;23077:10;23039:36;23070:3;23064:10;23039:36;:::i;:::-;23036:52;23026:2;;23092:5;;23026:2;23126;23120:9;23166:16;-1:-1:-1;;23162:29:1;23159:1;23120:9;23138:54;23221:4;23215:11;23245:16;23280:18;23351:2;23344:4;23336:6;23332:17;23329:25;23324:2;23316:6;23313:14;23310:45;23307:2;;;23358:5;;;;;;23307:2;23395:6;23389:4;23385:17;23374:28;;23431:3;23425:10;23411:24;;23458:2;23450:6;23447:14;23444:2;;;23464:5;;;;;;23444:2;;23525:16;23519:4;23515:27;23508:4;23499:6;23494:3;23490:16;23486:27;23483:60;23480:2;;;23546:5;;;;;23480:2;23611;23590:15;-1:-1:-1;;23586:29:1;23577:39;;23618:4;23573:50;23569:2;23562:62;23581:3;-1:-1:-1;;22932:717:1;:::o;23654:133::-;-1:-1:-1;;;;;;23730:32:1;;23720:43;;23710:2;;23777:1;23774;23767:12

Swarm Source

ipfs://08d664806dcaf3aa631def2ae419b6cd14c6856011f44bb6d3f70d16b328c0e9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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