Mumbai Testnet

Token

LFISoftwareNFT (LFIS)
ERC-1155

Overview

Max Total Supply

0 LFIS

Holders

100

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
softmint

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at mumbai.polygonscan.com on 2023-03-21
*/

/**
 *Submitted for verification at polygonscan.com on 2023-03-16
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

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: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

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.
     *
     * NOTE: 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.
     *
     * NOTE: 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/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

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 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/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

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/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/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 , Ownable{
    using Address for address;
    string private _name;

    // Token symbol
    string private _symbol;
    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _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 name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @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: address zero is not a valid owner");
        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 {
        _setApprovalForAll(_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 token owner or 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: caller is not token owner or 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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

        _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");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

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

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

        _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 `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

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

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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 _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();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

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

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

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

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

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

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        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: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` 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 addStackingContract(address _stackingContractAddress)
        public
        virtual
        onlyOwner
    {
        stakingContract = _stackingContractAddress;
    }

    address public stakingContract;
    modifier onlyOperator() {
        require(stakingContract == msg.sender, "Only Operator can access");
        _;
    }

    function _afterTokenTransfer(
        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.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.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: erc1155.sol


pragma solidity ^0.8.18;




contract softmint is ERC1155 {

    event safeMinted(uint256  tokenId,uint256  emissionDate);
    uint256 public totalSupply;
    uint256 public mintCount;
    uint256 public burnCount;
    uint256 public marketPrice;
    uint256 tokenid;
    mapping(uint256 => softwareNftInfo) public NftInfo;
    mapping(address => uint256) public nftCount;
    mapping(address => mapping(uint256 => ownerCheck))  nftOwner;
    struct softwareNftInfo {
        uint256  tokenid;
       uint256  emissionDate;
        string fileUri;
        address nftHolder;

    }

      struct ownerCheck{
        bool _flag;
    }
    constructor() ERC1155("LFISoftwareNFT", "LFIS") {
        // owner = msg.sender;
    }


function safeMint(

        //string [] calldata _fileUri,
        address [] calldata _nftHolder
    ) public  onlyOwner ( ) {
       // require(_nftHolder.length == _fileUri.length ,"address and fileUri length not match"); 
        for (uint256 i = 0; i < _nftHolder.length; i++) {        
        uint256 emissionDate = block.timestamp;       
        _mint(_nftHolder[i], mintCount, 1 , '');       
        emit safeMinted(mintCount, emissionDate);
        mintCount++;
        totalSupply++;       
        }  
    }

    //     function burnNft(address [] calldata _nftHolder,uint256 [] calldata id) public onlyOwner {
    //     require(_nftHolder.length == id.length ,"address and id length not match"); 
    //     for (uint256 i = 0; i < _nftHolder.length; i++) {
    //      _burn(_nftHolder[i], id[i], 1);
    //     burnCount++;
    //     nftCount[NftInfo[id[i]].nftHolder]--;
    //     NftInfo[id[i]].nftHolder = 0x0000000000000000000000000000000000000000;
    //     NftInfo[id[i]].licenseNo = "";
    //     NftInfo[id[i]].cLFIValue = 0;
    //     NftInfo[id[i]].emissionDate = 0;
    //     NftInfo[id[i]].baseValue = 0;
    //     NftInfo[id[i]].baseTokenEmmission = 0;
    //     NftInfo[id[i]].licensePurchaseDate = 0;
    //     NftInfo[id[i]].licenseExpiryDate = 0;
    //     NftInfo[id[i]].licensePurchaseDate = 0;
    //     NftInfo[id[i]].licenseExpiryDate = 0;
    //     NftInfo[id[i]].fileUri = "";
    //     NftInfo[id[i]].isAvailable = false;
    //     totalSupply--;
    // }
    //  }
    

      
    // function checkNftOwner( address _add , uint256 _tokenid) public view returns( bool , uint256) {
    // return (nftOwner[_add][_tokenid]._flag ,_tokenid) ;
    // }

    // function tokenURI(uint256 tokenId)
    //     public
    //     view
    //     returns (string memory)
    // {
    //     return NftInfo[tokenId].fileUri;
    // }

    // function updateMarketPrice(uint256 _marketPrice)public onlyOwner{
    //     marketPrice = _marketPrice;
    // }

    // function addStackingContract(address _stackingContractAddress)
    //     public
    //     override
    // onlyOwner
    // {
    //     stakingContract = _stackingContractAddress;
    // }

    // function getNftContractInfo()public view returns(uint256 _carryingCapacity, uint256 _mintCount , uint256 _burnCount, uint256 _totalSupply , uint256 _marketPrice){
    //        _carryingCapacity = carryingCapacity();
    //        _mintCount = mintCount;
    //        _burnCount =burnCount;
    //        _totalSupply = totalSupply;
    //        _marketPrice = marketPrice ;
    //   return ( _carryingCapacity, _mintCount,_burnCount,_totalSupply, _marketPrice ) ;

    // }

    // // function updateBaseValue(uint256 _tokenId, uint256 _updatedBaseValue)
    // //     public
    // // {
    // //     NftInfo[_tokenId].baseValue = _updatedBaseValue;
    // // }

    // function updateBaseTokenEmmission(
    //     uint256 _tokenId,
    //     uint256 _updatedBaseTokenEmmission
    // ) public {
    //     NftInfo[_tokenId].baseTokenEmmission = _updatedBaseTokenEmmission;
    // }

    // function getSoftwareNftInfo(uint256 _tokenId)
    //     public
    //     view
    //     returns (softwareNftInfo memory)
    // {
    //     softwareNftInfo memory info = NftInfo[_tokenId];
    //     return info;
    // }

    // function getBaseTokenEmmission(uint256 _tokenId)
    //     public
    //     view
    //     returns (uint256)
    // {
    //     return NftInfo[_tokenId].baseTokenEmmission;
    // }

    // function getlicensePurchaseDate(uint256 _tokenId)
    //     public
    //     view
    //     returns (uint256)
    // {
    //     return NftInfo[_tokenId].licensePurchaseDate;
    // }

    // function getlicenseExpiryDate(uint256 _tokenId)
    //     public
    //     view
    //     returns (uint256)
    // {
    //     return NftInfo[_tokenId].licenseExpiryDate;
    // }

    // function getEmmissionDate(uint256 _tokenId) public view returns (uint256) {
    //     return NftInfo[_tokenId].emissionDate;
    // }

    // function getBaseValue(uint256 _tokenId) public view returns (uint256) {
    //     return NftInfo[_tokenId].baseValue;
    // }

    // function getcLFIValue(uint256 _tokenId) public view returns (uint256) {
    //     return NftInfo[_tokenId].cLFIValue;
    // }

// function getMintCount() public view returns (uint256) {
//         return mintCount;
//     }

//     function getlicenseNum(uint256 _tokenId)
//         public
//         view
//         returns (string memory)
//     {
//         return NftInfo[_tokenId].licenseNo;
//     }


   function carryingCapacity() public view returns(uint256){
    return 15*(totalSupply/250000); 

}

    // maybe removable
    function getTotalSupply() public view returns (uint256) {
        require(mintCount >= burnCount, "invalid");
        return mintCount - burnCount;
    }

   
}

Contract ABI

[{"inputs":[],"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":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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"emissionDate","type":"uint256"}],"name":"safeMinted","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"NftInfo","outputs":[{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"emissionDate","type":"uint256"},{"internalType":"string","name":"fileUri","type":"string"},{"internalType":"address","name":"nftHolder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stackingContractAddress","type":"address"}],"name":"addStackingContract","outputs":[],"stateMutability":"nonpayable","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":[],"name":"burnCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"carryingCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"marketPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_nftHolder","type":"address[]"}],"name":"safeMint","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"totalSupply","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"}]

60806040523480156200001157600080fd5b506040518060400160405280600e81526020017f4c4649536f6674776172654e46540000000000000000000000000000000000008152506040518060400160405280600481526020017f4c464953000000000000000000000000000000000000000000000000000000008152506200009e62000092620000ca60201b60201c565b620000d260201b60201c565b8160019081620000af919062000410565b508060029081620000c1919062000410565b505050620004f7565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200021857607f821691505b6020821081036200022e576200022d620001d0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002987fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000259565b620002a4868362000259565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002f1620002eb620002e584620002bc565b620002c6565b620002bc565b9050919050565b6000819050919050565b6200030d83620002d0565b620003256200031c82620002f8565b84845462000266565b825550505050565b600090565b6200033c6200032d565b6200034981848462000302565b505050565b5b8181101562000371576200036560008262000332565b6001810190506200034f565b5050565b601f821115620003c0576200038a8162000234565b620003958462000249565b81016020851015620003a5578190505b620003bd620003b48562000249565b8301826200034e565b50505b505050565b600082821c905092915050565b6000620003e560001984600802620003c5565b1980831691505092915050565b6000620004008383620003d2565b9150826002028217905092915050565b6200041b8262000196565b67ffffffffffffffff811115620004375762000436620001a1565b5b620004438254620001ff565b6200045082828562000375565b600060209050601f83116001811462000488576000841562000473578287015190505b6200047f8582620003f2565b865550620004ef565b601f198416620004988662000234565b60005b82811015620004c2578489015182556001820191506020850194506020810190506200049b565b86831015620004e25784890151620004de601f891682620003d2565b8355505b6001600288020188555050505b505050505050565b61338080620005076000396000f3fe608060405234801561001057600080fd5b50600436106101575760003560e01c8063715018a6116100c3578063c971ebb31161007c578063c971ebb3146103a4578063e985e9c5146103d4578063eb25362f14610404578063ee99205c14610437578063f242432a14610455578063f2fde38b1461047157610157565b8063715018a6146103065780638da5cb5b1461031057806395d89b411461032e5780639659867e1461034c578063a22cb4651461036a578063c4e41b221461038657610157565b80632eb2c2d6116101155780632eb2c2d61461024457806336b8ea5c1461026057806345a153881461027e5780634e1273f41461029c578063524773ce146102cc5780636864dcb2146102ea57610157565b8062fdd58e1461015c57806301ffc9a71461018c57806306fdde03146101bc5780630e89341c146101da57806318160ddd1461020a57806321d37b4d14610228575b600080fd5b61017660048036038101906101719190611e2b565b61048d565b6040516101839190611e7a565b60405180910390f35b6101a660048036038101906101a19190611eed565b610556565b6040516101b39190611f35565b60405180910390f35b6101c4610638565b6040516101d19190611fe0565b60405180910390f35b6101f460048036038101906101ef9190612002565b6106ca565b6040516102019190611fe0565b60405180910390f35b61021261075e565b60405161021f9190611e7a565b60405180910390f35b610242600480360381019061023d9190612094565b610764565b005b61025e600480360381019061025991906122d4565b610848565b005b6102686108e9565b6040516102759190611e7a565b60405180910390f35b61028661090d565b6040516102939190611e7a565b60405180910390f35b6102b660048036038101906102b19190612466565b610913565b6040516102c3919061259c565b60405180910390f35b6102d4610a2c565b6040516102e19190611e7a565b60405180910390f35b61030460048036038101906102ff91906125be565b610a32565b005b61030e610a7e565b005b610318610a92565b60405161032591906125fa565b60405180910390f35b610336610abb565b6040516103439190611fe0565b60405180910390f35b610354610b4d565b6040516103619190611e7a565b60405180910390f35b610384600480360381019061037f9190612641565b610b53565b005b61038e610b69565b60405161039b9190611e7a565b60405180910390f35b6103be60048036038101906103b991906125be565b610bc7565b6040516103cb9190611e7a565b60405180910390f35b6103ee60048036038101906103e99190612681565b610bdf565b6040516103fb9190611f35565b60405180910390f35b61041e60048036038101906104199190612002565b610c73565b60405161042e94939291906126c1565b60405180910390f35b61043f610d4b565b60405161044c91906125fa565b60405180910390f35b61046f600480360381019061046a919061270d565b610d71565b005b61048b600480360381019061048691906125be565b610e12565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036104fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f490612816565b60405180910390fd5b6003600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610631575061063082610e95565b5b9050919050565b60606001805461064790612865565b80601f016020809104026020016040519081016040528092919081815260200182805461067390612865565b80156106c05780601f10610695576101008083540402835291602001916106c0565b820191906000526020600020905b8154815290600101906020018083116106a357829003601f168201915b5050505050905090565b6060600580546106d990612865565b80601f016020809104026020016040519081016040528092919081815260200182805461070590612865565b80156107525780601f1061072757610100808354040283529160200191610752565b820191906000526020600020905b81548152906001019060200180831161073557829003601f168201915b50505050509050919050565b60075481565b61076c610eff565b60005b828290508110156108435760004290506107c484848481811061079557610794612896565b5b90506020020160208101906107aa91906125be565b600854600160405180602001604052806000815250610f7d565b7fe8ccfea63961bc9d60eae29718c7ae715d5417db5cb188759d404cd06a1d758d600854826040516107f79291906128c5565b60405180910390a1600860008154809291906108129061291d565b91905055506007600081548092919061082a9061291d565b919050555050808061083b9061291d565b91505061076f565b505050565b61085061112e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061089657506108958561089061112e565b610bdf565b5b6108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc906129d7565b60405180910390fd5b6108e28585858585611136565b5050505050565b60006203d0906007546108fc9190612a26565b600f6109089190612a57565b905090565b600a5481565b60608151835114610959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095090612b0b565b60405180910390fd5b6000835167ffffffffffffffff811115610976576109756120e1565b5b6040519080825280602002602001820160405280156109a45781602001602082028036833780820191505090505b50905060005b8451811015610a21576109f18582815181106109c9576109c8612896565b5b60200260200101518583815181106109e4576109e3612896565b5b602002602001015161048d565b828281518110610a0457610a03612896565b5b60200260200101818152505080610a1a9061291d565b90506109aa565b508091505092915050565b60095481565b610a3a610eff565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610a86610eff565b610a90600061145a565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610aca90612865565b80601f0160208091040260200160405190810160405280929190818152602001828054610af690612865565b8015610b435780601f10610b1857610100808354040283529160200191610b43565b820191906000526020600020905b815481529060010190602001808311610b2657829003601f168201915b5050505050905090565b60085481565b610b65610b5e61112e565b838361151e565b5050565b60006009546008541015610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba990612b77565b60405180910390fd5b600954600854610bc29190612b97565b905090565b600d6020528060005260406000206000915090505481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c602052806000526040600020600091509050806000015490806001015490806002018054610ca290612865565b80601f0160208091040260200160405190810160405280929190818152602001828054610cce90612865565b8015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d7961112e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610dbf5750610dbe85610db961112e565b610bdf565b5b610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df5906129d7565b60405180910390fd5b610e0b858585858561168a565b5050505050565b610e1a610eff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090612c3d565b60405180910390fd5b610e928161145a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610f0761112e565b73ffffffffffffffffffffffffffffffffffffffff16610f25610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290612ca9565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390612d3b565b60405180910390fd5b6000610ff661112e565b9050600061100385611928565b9050600061101085611928565b9050611021836000898585896119a2565b846003600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110819190612d5b565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516110ff9291906128c5565b60405180910390a4611116836000898585896119aa565b611125836000898989896119b2565b50505050505050565b600033905090565b815183511461117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117190612e01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e090612e93565b60405180910390fd5b60006111f361112e565b90506112038187878787876119a2565b60005b84518110156113b757600085828151811061122457611223612896565b5b60200260200101519050600085838151811061124357611242612896565b5b6020026020010151905060006003600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc90612f25565b60405180910390fd5b8181036003600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816003600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139c9190612d5b565b92505081905550505050806113b09061291d565b9050611206565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161142e929190612f45565b60405180910390a46114448187878787876119aa565b611452818787878787611b89565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390612fee565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161167d9190611f35565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036116f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f090612e93565b60405180910390fd5b600061170361112e565b9050600061171085611928565b9050600061171d85611928565b905061172d8389898585896119a2565b60006003600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90612f25565b60405180910390fd5b8581036003600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856003600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461187c9190612d5b565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516118f99291906128c5565b60405180910390a461190f848a8a86868a6119aa565b61191d848a8a8a8a8a6119b2565b505050505050505050565b60606000600167ffffffffffffffff811115611947576119466120e1565b5b6040519080825280602002602001820160405280156119755781602001602082028036833780820191505090505b509050828160008151811061198d5761198c612896565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6119d18473ffffffffffffffffffffffffffffffffffffffff16611d60565b15611b81578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611a17959493929190613063565b6020604051808303816000875af1925050508015611a5357506040513d601f19601f82011682018060405250810190611a5091906130d2565b60015b611af857611a5f61310c565b806308c379a003611abb5750611a7361312e565b80611a7e5750611abd565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab29190611fe0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aef90613230565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906132c2565b60405180910390fd5b505b505050505050565b611ba88473ffffffffffffffffffffffffffffffffffffffff16611d60565b15611d58578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611bee9594939291906132e2565b6020604051808303816000875af1925050508015611c2a57506040513d601f19601f82011682018060405250810190611c2791906130d2565b60015b611ccf57611c3661310c565b806308c379a003611c925750611c4a61312e565b80611c555750611c94565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c899190611fe0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690613230565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4d906132c2565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611dc282611d97565b9050919050565b611dd281611db7565b8114611ddd57600080fd5b50565b600081359050611def81611dc9565b92915050565b6000819050919050565b611e0881611df5565b8114611e1357600080fd5b50565b600081359050611e2581611dff565b92915050565b60008060408385031215611e4257611e41611d8d565b5b6000611e5085828601611de0565b9250506020611e6185828601611e16565b9150509250929050565b611e7481611df5565b82525050565b6000602082019050611e8f6000830184611e6b565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eca81611e95565b8114611ed557600080fd5b50565b600081359050611ee781611ec1565b92915050565b600060208284031215611f0357611f02611d8d565b5b6000611f1184828501611ed8565b91505092915050565b60008115159050919050565b611f2f81611f1a565b82525050565b6000602082019050611f4a6000830184611f26565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f8a578082015181840152602081019050611f6f565b60008484015250505050565b6000601f19601f8301169050919050565b6000611fb282611f50565b611fbc8185611f5b565b9350611fcc818560208601611f6c565b611fd581611f96565b840191505092915050565b60006020820190508181036000830152611ffa8184611fa7565b905092915050565b60006020828403121561201857612017611d8d565b5b600061202684828501611e16565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126120545761205361202f565b5b8235905067ffffffffffffffff81111561207157612070612034565b5b60208301915083602082028301111561208d5761208c612039565b5b9250929050565b600080602083850312156120ab576120aa611d8d565b5b600083013567ffffffffffffffff8111156120c9576120c8611d92565b5b6120d58582860161203e565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61211982611f96565b810181811067ffffffffffffffff82111715612138576121376120e1565b5b80604052505050565b600061214b611d83565b90506121578282612110565b919050565b600067ffffffffffffffff821115612177576121766120e1565b5b602082029050602081019050919050565b600061219b6121968461215c565b612141565b905080838252602082019050602084028301858111156121be576121bd612039565b5b835b818110156121e757806121d38882611e16565b8452602084019350506020810190506121c0565b5050509392505050565b600082601f8301126122065761220561202f565b5b8135612216848260208601612188565b91505092915050565b600080fd5b600067ffffffffffffffff82111561223f5761223e6120e1565b5b61224882611f96565b9050602081019050919050565b82818337600083830152505050565b600061227761227284612224565b612141565b9050828152602081018484840111156122935761229261221f565b5b61229e848285612255565b509392505050565b600082601f8301126122bb576122ba61202f565b5b81356122cb848260208601612264565b91505092915050565b600080600080600060a086880312156122f0576122ef611d8d565b5b60006122fe88828901611de0565b955050602061230f88828901611de0565b945050604086013567ffffffffffffffff8111156123305761232f611d92565b5b61233c888289016121f1565b935050606086013567ffffffffffffffff81111561235d5761235c611d92565b5b612369888289016121f1565b925050608086013567ffffffffffffffff81111561238a57612389611d92565b5b612396888289016122a6565b9150509295509295909350565b600067ffffffffffffffff8211156123be576123bd6120e1565b5b602082029050602081019050919050565b60006123e26123dd846123a3565b612141565b9050808382526020820190506020840283018581111561240557612404612039565b5b835b8181101561242e578061241a8882611de0565b845260208401935050602081019050612407565b5050509392505050565b600082601f83011261244d5761244c61202f565b5b813561245d8482602086016123cf565b91505092915050565b6000806040838503121561247d5761247c611d8d565b5b600083013567ffffffffffffffff81111561249b5761249a611d92565b5b6124a785828601612438565b925050602083013567ffffffffffffffff8111156124c8576124c7611d92565b5b6124d4858286016121f1565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61251381611df5565b82525050565b6000612525838361250a565b60208301905092915050565b6000602082019050919050565b6000612549826124de565b61255381856124e9565b935061255e836124fa565b8060005b8381101561258f5781516125768882612519565b975061258183612531565b925050600181019050612562565b5085935050505092915050565b600060208201905081810360008301526125b6818461253e565b905092915050565b6000602082840312156125d4576125d3611d8d565b5b60006125e284828501611de0565b91505092915050565b6125f481611db7565b82525050565b600060208201905061260f60008301846125eb565b92915050565b61261e81611f1a565b811461262957600080fd5b50565b60008135905061263b81612615565b92915050565b6000806040838503121561265857612657611d8d565b5b600061266685828601611de0565b92505060206126778582860161262c565b9150509250929050565b6000806040838503121561269857612697611d8d565b5b60006126a685828601611de0565b92505060206126b785828601611de0565b9150509250929050565b60006080820190506126d66000830187611e6b565b6126e36020830186611e6b565b81810360408301526126f58185611fa7565b905061270460608301846125eb565b95945050505050565b600080600080600060a0868803121561272957612728611d8d565b5b600061273788828901611de0565b955050602061274888828901611de0565b945050604061275988828901611e16565b935050606061276a88828901611e16565b925050608086013567ffffffffffffffff81111561278b5761278a611d92565b5b612797888289016122a6565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000612800602a83611f5b565b915061280b826127a4565b604082019050919050565b6000602082019050818103600083015261282f816127f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061287d57607f821691505b6020821081036128905761288f612836565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006040820190506128da6000830185611e6b565b6128e76020830184611e6b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061292882611df5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361295a576129596128ee565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006129c1602e83611f5b565b91506129cc82612965565b604082019050919050565b600060208201905081810360008301526129f0816129b4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612a3182611df5565b9150612a3c83611df5565b925082612a4c57612a4b6129f7565b5b828204905092915050565b6000612a6282611df5565b9150612a6d83611df5565b9250828202612a7b81611df5565b91508282048414831517612a9257612a916128ee565b5b5092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000612af5602983611f5b565b9150612b0082612a99565b604082019050919050565b60006020820190508181036000830152612b2481612ae8565b9050919050565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b6000612b61600783611f5b565b9150612b6c82612b2b565b602082019050919050565b60006020820190508181036000830152612b9081612b54565b9050919050565b6000612ba282611df5565b9150612bad83611df5565b9250828203905081811115612bc557612bc46128ee565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c27602683611f5b565b9150612c3282612bcb565b604082019050919050565b60006020820190508181036000830152612c5681612c1a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c93602083611f5b565b9150612c9e82612c5d565b602082019050919050565b60006020820190508181036000830152612cc281612c86565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d25602183611f5b565b9150612d3082612cc9565b604082019050919050565b60006020820190508181036000830152612d5481612d18565b9050919050565b6000612d6682611df5565b9150612d7183611df5565b9250828201905080821115612d8957612d886128ee565b5b92915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000612deb602883611f5b565b9150612df682612d8f565b604082019050919050565b60006020820190508181036000830152612e1a81612dde565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612e7d602583611f5b565b9150612e8882612e21565b604082019050919050565b60006020820190508181036000830152612eac81612e70565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000612f0f602a83611f5b565b9150612f1a82612eb3565b604082019050919050565b60006020820190508181036000830152612f3e81612f02565b9050919050565b60006040820190508181036000830152612f5f818561253e565b90508181036020830152612f73818461253e565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000612fd8602983611f5b565b9150612fe382612f7c565b604082019050919050565b6000602082019050818103600083015261300781612fcb565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130358261300e565b61303f8185613019565b935061304f818560208601611f6c565b61305881611f96565b840191505092915050565b600060a08201905061307860008301886125eb565b61308560208301876125eb565b6130926040830186611e6b565b61309f6060830185611e6b565b81810360808301526130b1818461302a565b90509695505050505050565b6000815190506130cc81611ec1565b92915050565b6000602082840312156130e8576130e7611d8d565b5b60006130f6848285016130bd565b91505092915050565b60008160e01c9050919050565b600060033d111561312b5760046000803e6131286000516130ff565b90505b90565b600060443d106131bb57613140611d83565b60043d036004823e80513d602482011167ffffffffffffffff821117156131685750506131bb565b808201805167ffffffffffffffff81111561318657505050506131bb565b80602083010160043d0385018111156131a35750505050506131bb565b6131b282602001850186612110565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061321a603483611f5b565b9150613225826131be565b604082019050919050565b600060208201905081810360008301526132498161320d565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006132ac602883611f5b565b91506132b782613250565b604082019050919050565b600060208201905081810360008301526132db8161329f565b9050919050565b600060a0820190506132f760008301886125eb565b61330460208301876125eb565b8181036040830152613316818661253e565b9050818103606083015261332a818561253e565b9050818103608083015261333e818461302a565b9050969550505050505056fea2646970667358221220aa8658a33b8faab15555f1eca0a4fc0cc7a94cc8f1a51c320404e1679a55df1f64736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101575760003560e01c8063715018a6116100c3578063c971ebb31161007c578063c971ebb3146103a4578063e985e9c5146103d4578063eb25362f14610404578063ee99205c14610437578063f242432a14610455578063f2fde38b1461047157610157565b8063715018a6146103065780638da5cb5b1461031057806395d89b411461032e5780639659867e1461034c578063a22cb4651461036a578063c4e41b221461038657610157565b80632eb2c2d6116101155780632eb2c2d61461024457806336b8ea5c1461026057806345a153881461027e5780634e1273f41461029c578063524773ce146102cc5780636864dcb2146102ea57610157565b8062fdd58e1461015c57806301ffc9a71461018c57806306fdde03146101bc5780630e89341c146101da57806318160ddd1461020a57806321d37b4d14610228575b600080fd5b61017660048036038101906101719190611e2b565b61048d565b6040516101839190611e7a565b60405180910390f35b6101a660048036038101906101a19190611eed565b610556565b6040516101b39190611f35565b60405180910390f35b6101c4610638565b6040516101d19190611fe0565b60405180910390f35b6101f460048036038101906101ef9190612002565b6106ca565b6040516102019190611fe0565b60405180910390f35b61021261075e565b60405161021f9190611e7a565b60405180910390f35b610242600480360381019061023d9190612094565b610764565b005b61025e600480360381019061025991906122d4565b610848565b005b6102686108e9565b6040516102759190611e7a565b60405180910390f35b61028661090d565b6040516102939190611e7a565b60405180910390f35b6102b660048036038101906102b19190612466565b610913565b6040516102c3919061259c565b60405180910390f35b6102d4610a2c565b6040516102e19190611e7a565b60405180910390f35b61030460048036038101906102ff91906125be565b610a32565b005b61030e610a7e565b005b610318610a92565b60405161032591906125fa565b60405180910390f35b610336610abb565b6040516103439190611fe0565b60405180910390f35b610354610b4d565b6040516103619190611e7a565b60405180910390f35b610384600480360381019061037f9190612641565b610b53565b005b61038e610b69565b60405161039b9190611e7a565b60405180910390f35b6103be60048036038101906103b991906125be565b610bc7565b6040516103cb9190611e7a565b60405180910390f35b6103ee60048036038101906103e99190612681565b610bdf565b6040516103fb9190611f35565b60405180910390f35b61041e60048036038101906104199190612002565b610c73565b60405161042e94939291906126c1565b60405180910390f35b61043f610d4b565b60405161044c91906125fa565b60405180910390f35b61046f600480360381019061046a919061270d565b610d71565b005b61048b600480360381019061048691906125be565b610e12565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036104fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f490612816565b60405180910390fd5b6003600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610631575061063082610e95565b5b9050919050565b60606001805461064790612865565b80601f016020809104026020016040519081016040528092919081815260200182805461067390612865565b80156106c05780601f10610695576101008083540402835291602001916106c0565b820191906000526020600020905b8154815290600101906020018083116106a357829003601f168201915b5050505050905090565b6060600580546106d990612865565b80601f016020809104026020016040519081016040528092919081815260200182805461070590612865565b80156107525780601f1061072757610100808354040283529160200191610752565b820191906000526020600020905b81548152906001019060200180831161073557829003601f168201915b50505050509050919050565b60075481565b61076c610eff565b60005b828290508110156108435760004290506107c484848481811061079557610794612896565b5b90506020020160208101906107aa91906125be565b600854600160405180602001604052806000815250610f7d565b7fe8ccfea63961bc9d60eae29718c7ae715d5417db5cb188759d404cd06a1d758d600854826040516107f79291906128c5565b60405180910390a1600860008154809291906108129061291d565b91905055506007600081548092919061082a9061291d565b919050555050808061083b9061291d565b91505061076f565b505050565b61085061112e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061089657506108958561089061112e565b610bdf565b5b6108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc906129d7565b60405180910390fd5b6108e28585858585611136565b5050505050565b60006203d0906007546108fc9190612a26565b600f6109089190612a57565b905090565b600a5481565b60608151835114610959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095090612b0b565b60405180910390fd5b6000835167ffffffffffffffff811115610976576109756120e1565b5b6040519080825280602002602001820160405280156109a45781602001602082028036833780820191505090505b50905060005b8451811015610a21576109f18582815181106109c9576109c8612896565b5b60200260200101518583815181106109e4576109e3612896565b5b602002602001015161048d565b828281518110610a0457610a03612896565b5b60200260200101818152505080610a1a9061291d565b90506109aa565b508091505092915050565b60095481565b610a3a610eff565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610a86610eff565b610a90600061145a565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610aca90612865565b80601f0160208091040260200160405190810160405280929190818152602001828054610af690612865565b8015610b435780601f10610b1857610100808354040283529160200191610b43565b820191906000526020600020905b815481529060010190602001808311610b2657829003601f168201915b5050505050905090565b60085481565b610b65610b5e61112e565b838361151e565b5050565b60006009546008541015610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba990612b77565b60405180910390fd5b600954600854610bc29190612b97565b905090565b600d6020528060005260406000206000915090505481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c602052806000526040600020600091509050806000015490806001015490806002018054610ca290612865565b80601f0160208091040260200160405190810160405280929190818152602001828054610cce90612865565b8015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d7961112e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610dbf5750610dbe85610db961112e565b610bdf565b5b610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df5906129d7565b60405180910390fd5b610e0b858585858561168a565b5050505050565b610e1a610eff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090612c3d565b60405180910390fd5b610e928161145a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610f0761112e565b73ffffffffffffffffffffffffffffffffffffffff16610f25610a92565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290612ca9565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390612d3b565b60405180910390fd5b6000610ff661112e565b9050600061100385611928565b9050600061101085611928565b9050611021836000898585896119a2565b846003600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110819190612d5b565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516110ff9291906128c5565b60405180910390a4611116836000898585896119aa565b611125836000898989896119b2565b50505050505050565b600033905090565b815183511461117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117190612e01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e090612e93565b60405180910390fd5b60006111f361112e565b90506112038187878787876119a2565b60005b84518110156113b757600085828151811061122457611223612896565b5b60200260200101519050600085838151811061124357611242612896565b5b6020026020010151905060006003600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc90612f25565b60405180910390fd5b8181036003600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816003600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461139c9190612d5b565b92505081905550505050806113b09061291d565b9050611206565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161142e929190612f45565b60405180910390a46114448187878787876119aa565b611452818787878787611b89565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390612fee565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161167d9190611f35565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036116f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f090612e93565b60405180910390fd5b600061170361112e565b9050600061171085611928565b9050600061171d85611928565b905061172d8389898585896119a2565b60006003600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90612f25565b60405180910390fd5b8581036003600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856003600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461187c9190612d5b565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516118f99291906128c5565b60405180910390a461190f848a8a86868a6119aa565b61191d848a8a8a8a8a6119b2565b505050505050505050565b60606000600167ffffffffffffffff811115611947576119466120e1565b5b6040519080825280602002602001820160405280156119755781602001602082028036833780820191505090505b509050828160008151811061198d5761198c612896565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6119d18473ffffffffffffffffffffffffffffffffffffffff16611d60565b15611b81578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611a17959493929190613063565b6020604051808303816000875af1925050508015611a5357506040513d601f19601f82011682018060405250810190611a5091906130d2565b60015b611af857611a5f61310c565b806308c379a003611abb5750611a7361312e565b80611a7e5750611abd565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab29190611fe0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aef90613230565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906132c2565b60405180910390fd5b505b505050505050565b611ba88473ffffffffffffffffffffffffffffffffffffffff16611d60565b15611d58578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611bee9594939291906132e2565b6020604051808303816000875af1925050508015611c2a57506040513d601f19601f82011682018060405250810190611c2791906130d2565b60015b611ccf57611c3661310c565b806308c379a003611c925750611c4a61312e565b80611c555750611c94565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c899190611fe0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690613230565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4d906132c2565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611dc282611d97565b9050919050565b611dd281611db7565b8114611ddd57600080fd5b50565b600081359050611def81611dc9565b92915050565b6000819050919050565b611e0881611df5565b8114611e1357600080fd5b50565b600081359050611e2581611dff565b92915050565b60008060408385031215611e4257611e41611d8d565b5b6000611e5085828601611de0565b9250506020611e6185828601611e16565b9150509250929050565b611e7481611df5565b82525050565b6000602082019050611e8f6000830184611e6b565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eca81611e95565b8114611ed557600080fd5b50565b600081359050611ee781611ec1565b92915050565b600060208284031215611f0357611f02611d8d565b5b6000611f1184828501611ed8565b91505092915050565b60008115159050919050565b611f2f81611f1a565b82525050565b6000602082019050611f4a6000830184611f26565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f8a578082015181840152602081019050611f6f565b60008484015250505050565b6000601f19601f8301169050919050565b6000611fb282611f50565b611fbc8185611f5b565b9350611fcc818560208601611f6c565b611fd581611f96565b840191505092915050565b60006020820190508181036000830152611ffa8184611fa7565b905092915050565b60006020828403121561201857612017611d8d565b5b600061202684828501611e16565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126120545761205361202f565b5b8235905067ffffffffffffffff81111561207157612070612034565b5b60208301915083602082028301111561208d5761208c612039565b5b9250929050565b600080602083850312156120ab576120aa611d8d565b5b600083013567ffffffffffffffff8111156120c9576120c8611d92565b5b6120d58582860161203e565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61211982611f96565b810181811067ffffffffffffffff82111715612138576121376120e1565b5b80604052505050565b600061214b611d83565b90506121578282612110565b919050565b600067ffffffffffffffff821115612177576121766120e1565b5b602082029050602081019050919050565b600061219b6121968461215c565b612141565b905080838252602082019050602084028301858111156121be576121bd612039565b5b835b818110156121e757806121d38882611e16565b8452602084019350506020810190506121c0565b5050509392505050565b600082601f8301126122065761220561202f565b5b8135612216848260208601612188565b91505092915050565b600080fd5b600067ffffffffffffffff82111561223f5761223e6120e1565b5b61224882611f96565b9050602081019050919050565b82818337600083830152505050565b600061227761227284612224565b612141565b9050828152602081018484840111156122935761229261221f565b5b61229e848285612255565b509392505050565b600082601f8301126122bb576122ba61202f565b5b81356122cb848260208601612264565b91505092915050565b600080600080600060a086880312156122f0576122ef611d8d565b5b60006122fe88828901611de0565b955050602061230f88828901611de0565b945050604086013567ffffffffffffffff8111156123305761232f611d92565b5b61233c888289016121f1565b935050606086013567ffffffffffffffff81111561235d5761235c611d92565b5b612369888289016121f1565b925050608086013567ffffffffffffffff81111561238a57612389611d92565b5b612396888289016122a6565b9150509295509295909350565b600067ffffffffffffffff8211156123be576123bd6120e1565b5b602082029050602081019050919050565b60006123e26123dd846123a3565b612141565b9050808382526020820190506020840283018581111561240557612404612039565b5b835b8181101561242e578061241a8882611de0565b845260208401935050602081019050612407565b5050509392505050565b600082601f83011261244d5761244c61202f565b5b813561245d8482602086016123cf565b91505092915050565b6000806040838503121561247d5761247c611d8d565b5b600083013567ffffffffffffffff81111561249b5761249a611d92565b5b6124a785828601612438565b925050602083013567ffffffffffffffff8111156124c8576124c7611d92565b5b6124d4858286016121f1565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61251381611df5565b82525050565b6000612525838361250a565b60208301905092915050565b6000602082019050919050565b6000612549826124de565b61255381856124e9565b935061255e836124fa565b8060005b8381101561258f5781516125768882612519565b975061258183612531565b925050600181019050612562565b5085935050505092915050565b600060208201905081810360008301526125b6818461253e565b905092915050565b6000602082840312156125d4576125d3611d8d565b5b60006125e284828501611de0565b91505092915050565b6125f481611db7565b82525050565b600060208201905061260f60008301846125eb565b92915050565b61261e81611f1a565b811461262957600080fd5b50565b60008135905061263b81612615565b92915050565b6000806040838503121561265857612657611d8d565b5b600061266685828601611de0565b92505060206126778582860161262c565b9150509250929050565b6000806040838503121561269857612697611d8d565b5b60006126a685828601611de0565b92505060206126b785828601611de0565b9150509250929050565b60006080820190506126d66000830187611e6b565b6126e36020830186611e6b565b81810360408301526126f58185611fa7565b905061270460608301846125eb565b95945050505050565b600080600080600060a0868803121561272957612728611d8d565b5b600061273788828901611de0565b955050602061274888828901611de0565b945050604061275988828901611e16565b935050606061276a88828901611e16565b925050608086013567ffffffffffffffff81111561278b5761278a611d92565b5b612797888289016122a6565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000612800602a83611f5b565b915061280b826127a4565b604082019050919050565b6000602082019050818103600083015261282f816127f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061287d57607f821691505b6020821081036128905761288f612836565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006040820190506128da6000830185611e6b565b6128e76020830184611e6b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061292882611df5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361295a576129596128ee565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006129c1602e83611f5b565b91506129cc82612965565b604082019050919050565b600060208201905081810360008301526129f0816129b4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612a3182611df5565b9150612a3c83611df5565b925082612a4c57612a4b6129f7565b5b828204905092915050565b6000612a6282611df5565b9150612a6d83611df5565b9250828202612a7b81611df5565b91508282048414831517612a9257612a916128ee565b5b5092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000612af5602983611f5b565b9150612b0082612a99565b604082019050919050565b60006020820190508181036000830152612b2481612ae8565b9050919050565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b6000612b61600783611f5b565b9150612b6c82612b2b565b602082019050919050565b60006020820190508181036000830152612b9081612b54565b9050919050565b6000612ba282611df5565b9150612bad83611df5565b9250828203905081811115612bc557612bc46128ee565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c27602683611f5b565b9150612c3282612bcb565b604082019050919050565b60006020820190508181036000830152612c5681612c1a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c93602083611f5b565b9150612c9e82612c5d565b602082019050919050565b60006020820190508181036000830152612cc281612c86565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d25602183611f5b565b9150612d3082612cc9565b604082019050919050565b60006020820190508181036000830152612d5481612d18565b9050919050565b6000612d6682611df5565b9150612d7183611df5565b9250828201905080821115612d8957612d886128ee565b5b92915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000612deb602883611f5b565b9150612df682612d8f565b604082019050919050565b60006020820190508181036000830152612e1a81612dde565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612e7d602583611f5b565b9150612e8882612e21565b604082019050919050565b60006020820190508181036000830152612eac81612e70565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000612f0f602a83611f5b565b9150612f1a82612eb3565b604082019050919050565b60006020820190508181036000830152612f3e81612f02565b9050919050565b60006040820190508181036000830152612f5f818561253e565b90508181036020830152612f73818461253e565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000612fd8602983611f5b565b9150612fe382612f7c565b604082019050919050565b6000602082019050818103600083015261300781612fcb565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130358261300e565b61303f8185613019565b935061304f818560208601611f6c565b61305881611f96565b840191505092915050565b600060a08201905061307860008301886125eb565b61308560208301876125eb565b6130926040830186611e6b565b61309f6060830185611e6b565b81810360808301526130b1818461302a565b90509695505050505050565b6000815190506130cc81611ec1565b92915050565b6000602082840312156130e8576130e7611d8d565b5b60006130f6848285016130bd565b91505092915050565b60008160e01c9050919050565b600060033d111561312b5760046000803e6131286000516130ff565b90505b90565b600060443d106131bb57613140611d83565b60043d036004823e80513d602482011167ffffffffffffffff821117156131685750506131bb565b808201805167ffffffffffffffff81111561318657505050506131bb565b80602083010160043d0385018111156131a35750505050506131bb565b6131b282602001850186612110565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061321a603483611f5b565b9150613225826131be565b604082019050919050565b600060208201905081810360008301526132498161320d565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006132ac602883611f5b565b91506132b782613250565b604082019050919050565b600060208201905081810360008301526132db8161329f565b9050919050565b600060a0820190506132f760008301886125eb565b61330460208301876125eb565b8181036040830152613316818661253e565b9050818103606083015261332a818561253e565b9050818103608083015261333e818461302a565b9050969550505050505056fea2646970667358221220aa8658a33b8faab15555f1eca0a4fc0cc7a94cc8f1a51c320404e1679a55df1f64736f6c63430008120033

Deployed Bytecode Sourcemap

39946:5783:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24947:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23970:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23703:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24691:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40047:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40671:534;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26890:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45431:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40142:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25343:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40111:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37525:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2883:103;;;:::i;:::-;;2235:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23803:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40080:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25940:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45563:156;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40254:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26167:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40197:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;37714:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26407:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3141:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24947:230;25033:7;25080:1;25061:21;;:7;:21;;;25053:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25147:9;:13;25157:2;25147:13;;;;;;;;;;;:22;25161:7;25147:22;;;;;;;;;;;;;;;;25140:29;;24947:230;;;;:::o;23970:310::-;24072:4;24124:26;24109:41;;;:11;:41;;;;:110;;;;24182:37;24167:52;;;:11;:52;;;;24109:110;:163;;;;24236:36;24260:11;24236:23;:36::i;:::-;24109:163;24089:183;;23970:310;;;:::o;23703:92::-;23749:13;23782:5;23775:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23703:92;:::o;24691:105::-;24751:13;24784:4;24777:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24691:105;;;:::o;40047:26::-;;;;:::o;40671:534::-;2121:13;:11;:13::i;:::-;40916:9:::1;40911:285;40935:10;;:17;;40931:1;:21;40911:285;;;40978:20;41001:15;40978:38;;41034:39;41040:10;;41051:1;41040:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;41055:9;;41066:1;41034:39;;;;;;;;;;;::::0;:5:::1;:39::i;:::-;41096:35;41107:9;;41118:12;41096:35;;;;;;;:::i;:::-;;;;;;;;41142:9;;:11;;;;;;;;;:::i;:::-;;;;;;41164;;:13;;;;;;;;;:::i;:::-;;;;;;40959:237;40954:3;;;;;:::i;:::-;;;;40911:285;;;;40671:534:::0;;:::o;26890:438::-;27131:12;:10;:12::i;:::-;27123:20;;:4;:20;;;:60;;;;27147:36;27164:4;27170:12;:10;:12::i;:::-;27147:16;:36::i;:::-;27123:60;27101:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;27268:52;27291:4;27297:2;27301:3;27306:7;27315:4;27268:22;:52::i;:::-;26890:438;;;;;:::o;45431:100::-;45479:7;45517:6;45505:11;;:18;;;;:::i;:::-;45501:2;:23;;;;:::i;:::-;45494:30;;45431:100;:::o;40142:26::-;;;;:::o;25343:524::-;25499:16;25560:3;:10;25541:8;:15;:29;25533:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;25629:30;25676:8;:15;25662:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25629:63;;25710:9;25705:122;25729:8;:15;25725:1;:19;25705:122;;;25785:30;25795:8;25804:1;25795:11;;;;;;;;:::i;:::-;;;;;;;;25808:3;25812:1;25808:6;;;;;;;;:::i;:::-;;;;;;;;25785:9;:30::i;:::-;25766:13;25780:1;25766:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;25746:3;;;;:::i;:::-;;;25705:122;;;;25846:13;25839:20;;;25343:524;;;;:::o;40111:24::-;;;;:::o;37525:181::-;2121:13;:11;:13::i;:::-;37674:24:::1;37656:15;;:42;;;;;;;;;;;;;;;;;;37525:181:::0;:::o;2883:103::-;2121:13;:11;:13::i;:::-;2948:30:::1;2975:1;2948:18;:30::i;:::-;2883:103::o:0;2235:87::-;2281:7;2308:6;;;;;;;;;;;2301:13;;2235:87;:::o;23803:95::-;23850:13;23883:7;23876:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23803:95;:::o;40080:24::-;;;;:::o;25940:155::-;26035:52;26054:12;:10;:12::i;:::-;26068:8;26078;26035:18;:52::i;:::-;25940:155;;:::o;45563:156::-;45610:7;45651:9;;45638;;:22;;45630:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;45702:9;;45690;;:21;;;;:::i;:::-;45683:28;;45563:156;:::o;40254:43::-;;;;;;;;;;;;;;;;;:::o;26167:168::-;26266:4;26290:18;:27;26309:7;26290:27;;;;;;;;;;;;;;;:37;26318:8;26290:37;;;;;;;;;;;;;;;;;;;;;;;;;26283:44;;26167:168;;;;:::o;40197:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37714:30::-;;;;;;;;;;;;;:::o;26407:406::-;26623:12;:10;:12::i;:::-;26615:20;;:4;:20;;;:60;;;;26639:36;26656:4;26662:12;:10;:12::i;:::-;26639:16;:36::i;:::-;26615:60;26593:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;26760:45;26778:4;26784:2;26788;26792:6;26800:4;26760:17;:45::i;:::-;26407:406;;;;;:::o;3141:201::-;2121:13;:11;:13::i;:::-;3250:1:::1;3230:22;;:8;:22;;::::0;3222:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3306:28;3325:8;3306:18;:28::i;:::-;3141:201:::0;:::o;14910:157::-;14995:4;15034:25;15019:40;;;:11;:40;;;;15012:47;;14910:157;;;:::o;2400:132::-;2475:12;:10;:12::i;:::-;2464:23;;:7;:5;:7::i;:::-;:23;;;2456:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2400:132::o;31588:729::-;31755:1;31741:16;;:2;:16;;;31733:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31808:16;31827:12;:10;:12::i;:::-;31808:31;;31850:20;31873:21;31891:2;31873:17;:21::i;:::-;31850:44;;31905:24;31932:25;31950:6;31932:17;:25::i;:::-;31905:52;;31970:66;31991:8;32009:1;32013:2;32017:3;32022:7;32031:4;31970:20;:66::i;:::-;32070:6;32049:9;:13;32059:2;32049:13;;;;;;;;;;;:17;32063:2;32049:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;32129:2;32092:52;;32125:1;32092:52;;32107:8;32092:52;;;32133:2;32137:6;32092:52;;;;;;;:::i;:::-;;;;;;;;32157:65;32177:8;32195:1;32199:2;32203:3;32208:7;32217:4;32157:19;:65::i;:::-;32235:74;32266:8;32284:1;32288:2;32292;32296:6;32304:4;32235:30;:74::i;:::-;31722:595;;;31588:729;;;;:::o;786:98::-;839:7;866:10;859:17;;786:98;:::o;29124:1146::-;29351:7;:14;29337:3;:10;:28;29329:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29443:1;29429:16;;:2;:16;;;29421:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;29500:16;29519:12;:10;:12::i;:::-;29500:31;;29544:60;29565:8;29575:4;29581:2;29585:3;29590:7;29599:4;29544:20;:60::i;:::-;29622:9;29617:421;29641:3;:10;29637:1;:14;29617:421;;;29673:10;29686:3;29690:1;29686:6;;;;;;;;:::i;:::-;;;;;;;;29673:19;;29707:14;29724:7;29732:1;29724:10;;;;;;;;:::i;:::-;;;;;;;;29707:27;;29751:19;29773:9;:13;29783:2;29773:13;;;;;;;;;;;:19;29787:4;29773:19;;;;;;;;;;;;;;;;29751:41;;29830:6;29815:11;:21;;29807:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29963:6;29949:11;:20;29927:9;:13;29937:2;29927:13;;;;;;;;;;;:19;29941:4;29927:19;;;;;;;;;;;;;;;:42;;;;30020:6;29999:9;:13;30009:2;29999:13;;;;;;;;;;;:17;30013:2;29999:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29658:380;;;29653:3;;;;:::i;:::-;;;29617:421;;;;30085:2;30055:47;;30079:4;30055:47;;30069:8;30055:47;;;30089:3;30094:7;30055:47;;;;;;;:::i;:::-;;;;;;;;30115:59;30135:8;30145:4;30151:2;30155:3;30160:7;30169:4;30115:19;:59::i;:::-;30187:75;30223:8;30233:4;30239:2;30243:3;30248:7;30257:4;30187:35;:75::i;:::-;29318:952;29124:1146;;;;;:::o;3502:191::-;3576:16;3595:6;;;;;;;;;;;3576:25;;3621:8;3612:6;;:17;;;;;;;;;;;;;;;;;;3676:8;3645:40;;3666:8;3645:40;;;;;;;;;;;;3565:128;3502:191;:::o;36001:331::-;36156:8;36147:17;;:5;:17;;;36139:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36259:8;36221:18;:25;36240:5;36221:25;;;;;;;;;;;;;;;:35;36247:8;36221:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36305:8;36283:41;;36298:5;36283:41;;;36315:8;36283:41;;;;;;:::i;:::-;;;;;;;;36001:331;;;:::o;27792:974::-;27994:1;27980:16;;:2;:16;;;27972:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;28051:16;28070:12;:10;:12::i;:::-;28051:31;;28093:20;28116:21;28134:2;28116:17;:21::i;:::-;28093:44;;28148:24;28175:25;28193:6;28175:17;:25::i;:::-;28148:52;;28213:60;28234:8;28244:4;28250:2;28254:3;28259:7;28268:4;28213:20;:60::i;:::-;28286:19;28308:9;:13;28318:2;28308:13;;;;;;;;;;;:19;28322:4;28308:19;;;;;;;;;;;;;;;;28286:41;;28361:6;28346:11;:21;;28338:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28486:6;28472:11;:20;28450:9;:13;28460:2;28450:13;;;;;;;;;;;:19;28464:4;28450:19;;;;;;;;;;;;;;;:42;;;;28535:6;28514:9;:13;28524:2;28514:13;;;;;;;;;;;:17;28528:2;28514:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;28590:2;28559:46;;28584:4;28559:46;;28574:8;28559:46;;;28594:2;28598:6;28559:46;;;;;;;:::i;:::-;;;;;;;;28618:59;28638:8;28648:4;28654:2;28658:3;28663:7;28672:4;28618:19;:59::i;:::-;28690:68;28721:8;28731:4;28737:2;28741;28745:6;28753:4;28690:30;:68::i;:::-;27961:805;;;;27792:974;;;;;:::o;39681:198::-;39747:16;39776:22;39815:1;39801:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39776:41;;39839:7;39828:5;39834:1;39828:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;39866:5;39859:12;;;39681:198;;;:::o;37290:221::-;;;;;;;:::o;37880:220::-;;;;;;;:::o;38108:744::-;38323:15;:2;:13;;;:15::i;:::-;38319:526;;;38376:2;38359:38;;;38398:8;38408:4;38414:2;38418:6;38426:4;38359:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38355:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;38707:6;38700:14;;;;;;;;;;;:::i;:::-;;;;;;;;38355:479;;;38756:62;;;;;;;;;;:::i;:::-;;;;;;;;38355:479;38493:43;;;38481:55;;;:8;:55;;;;38477:154;;38561:50;;;;;;;;;;:::i;:::-;;;;;;;;38477:154;38432:214;38319:526;38108:744;;;;;;:::o;38860:813::-;39100:15;:2;:13;;;:15::i;:::-;39096:570;;;39153:2;39136:43;;;39180:8;39190:4;39196:3;39201:7;39210:4;39136:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39132:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;39528:6;39521:14;;;;;;;;;;;:::i;:::-;;;;;;;;39132:523;;;39577:62;;;;;;;;;;:::i;:::-;;;;;;;;39132:523;39309:48;;;39297:60;;;:8;:60;;;;39293:159;;39382:50;;;;;;;;;;:::i;:::-;;;;;;;;39293:159;39216:251;39096:570;38860:813;;;;;;:::o;4933:326::-;4993:4;5250:1;5228:7;:19;;;:23;5221:30;;4933:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:246::-;3574:1;3584:113;3598:6;3595:1;3592:13;3584:113;;;3683:1;3678:3;3674:11;3668:18;3664:1;3659:3;3655:11;3648:39;3620:2;3617:1;3613:10;3608:15;;3584:113;;;3731:1;3722:6;3717:3;3713:16;3706:27;3555:184;3493:246;;;:::o;3745:102::-;3786:6;3837:2;3833:7;3828:2;3821:5;3817:14;3813:28;3803:38;;3745:102;;;:::o;3853:377::-;3941:3;3969:39;4002:5;3969:39;:::i;:::-;4024:71;4088:6;4083:3;4024:71;:::i;:::-;4017:78;;4104:65;4162:6;4157:3;4150:4;4143:5;4139:16;4104:65;:::i;:::-;4194:29;4216:6;4194:29;:::i;:::-;4189:3;4185:39;4178:46;;3945:285;3853:377;;;;:::o;4236:313::-;4349:4;4387:2;4376:9;4372:18;4364:26;;4436:9;4430:4;4426:20;4422:1;4411:9;4407:17;4400:47;4464:78;4537:4;4528:6;4464:78;:::i;:::-;4456:86;;4236:313;;;;:::o;4555:329::-;4614:6;4663:2;4651:9;4642:7;4638:23;4634:32;4631:119;;;4669:79;;:::i;:::-;4631:119;4789:1;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4760:117;4555:329;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:117;5245:1;5242;5235:12;5276:568;5349:8;5359:6;5409:3;5402:4;5394:6;5390:17;5386:27;5376:122;;5417:79;;:::i;:::-;5376:122;5530:6;5517:20;5507:30;;5560:18;5552:6;5549:30;5546:117;;;5582:79;;:::i;:::-;5546:117;5696:4;5688:6;5684:17;5672:29;;5750:3;5742:4;5734:6;5730:17;5720:8;5716:32;5713:41;5710:128;;;5757:79;;:::i;:::-;5710:128;5276:568;;;;;:::o;5850:559::-;5936:6;5944;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6147:1;6136:9;6132:17;6119:31;6177:18;6169:6;6166:30;6163:117;;;6199:79;;:::i;:::-;6163:117;6312:80;6384:7;6375:6;6364:9;6360:22;6312:80;:::i;:::-;6294:98;;;;6090:312;5850:559;;;;;:::o;6415:180::-;6463:77;6460:1;6453:88;6560:4;6557:1;6550:15;6584:4;6581:1;6574:15;6601:281;6684:27;6706:4;6684:27;:::i;:::-;6676:6;6672:40;6814:6;6802:10;6799:22;6778:18;6766:10;6763:34;6760:62;6757:88;;;6825:18;;:::i;:::-;6757:88;6865:10;6861:2;6854:22;6644:238;6601:281;;:::o;6888:129::-;6922:6;6949:20;;:::i;:::-;6939:30;;6978:33;7006:4;6998:6;6978:33;:::i;:::-;6888:129;;;:::o;7023:311::-;7100:4;7190:18;7182:6;7179:30;7176:56;;;7212:18;;:::i;:::-;7176:56;7262:4;7254:6;7250:17;7242:25;;7322:4;7316;7312:15;7304:23;;7023:311;;;:::o;7357:710::-;7453:5;7478:81;7494:64;7551:6;7494:64;:::i;:::-;7478:81;:::i;:::-;7469:90;;7579:5;7608:6;7601:5;7594:21;7642:4;7635:5;7631:16;7624:23;;7695:4;7687:6;7683:17;7675:6;7671:30;7724:3;7716:6;7713:15;7710:122;;;7743:79;;:::i;:::-;7710:122;7858:6;7841:220;7875:6;7870:3;7867:15;7841:220;;;7950:3;7979:37;8012:3;8000:10;7979:37;:::i;:::-;7974:3;7967:50;8046:4;8041:3;8037:14;8030:21;;7917:144;7901:4;7896:3;7892:14;7885:21;;7841:220;;;7845:21;7459:608;;7357:710;;;;;:::o;8090:370::-;8161:5;8210:3;8203:4;8195:6;8191:17;8187:27;8177:122;;8218:79;;:::i;:::-;8177:122;8335:6;8322:20;8360:94;8450:3;8442:6;8435:4;8427:6;8423:17;8360:94;:::i;:::-;8351:103;;8167:293;8090:370;;;;:::o;8466:117::-;8575:1;8572;8565:12;8589:307;8650:4;8740:18;8732:6;8729:30;8726:56;;;8762:18;;:::i;:::-;8726:56;8800:29;8822:6;8800:29;:::i;:::-;8792:37;;8884:4;8878;8874:15;8866:23;;8589:307;;;:::o;8902:146::-;8999:6;8994:3;8989;8976:30;9040:1;9031:6;9026:3;9022:16;9015:27;8902:146;;;:::o;9054:423::-;9131:5;9156:65;9172:48;9213:6;9172:48;:::i;:::-;9156:65;:::i;:::-;9147:74;;9244:6;9237:5;9230:21;9282:4;9275:5;9271:16;9320:3;9311:6;9306:3;9302:16;9299:25;9296:112;;;9327:79;;:::i;:::-;9296:112;9417:54;9464:6;9459:3;9454;9417:54;:::i;:::-;9137:340;9054:423;;;;;:::o;9496:338::-;9551:5;9600:3;9593:4;9585:6;9581:17;9577:27;9567:122;;9608:79;;:::i;:::-;9567:122;9725:6;9712:20;9750:78;9824:3;9816:6;9809:4;9801:6;9797:17;9750:78;:::i;:::-;9741:87;;9557:277;9496:338;;;;:::o;9840:1509::-;9994:6;10002;10010;10018;10026;10075:3;10063:9;10054:7;10050:23;10046:33;10043:120;;;10082:79;;:::i;:::-;10043:120;10202:1;10227:53;10272:7;10263:6;10252:9;10248:22;10227:53;:::i;:::-;10217:63;;10173:117;10329:2;10355:53;10400:7;10391:6;10380:9;10376:22;10355:53;:::i;:::-;10345:63;;10300:118;10485:2;10474:9;10470:18;10457:32;10516:18;10508:6;10505:30;10502:117;;;10538:79;;:::i;:::-;10502:117;10643:78;10713:7;10704:6;10693:9;10689:22;10643:78;:::i;:::-;10633:88;;10428:303;10798:2;10787:9;10783:18;10770:32;10829:18;10821:6;10818:30;10815:117;;;10851:79;;:::i;:::-;10815:117;10956:78;11026:7;11017:6;11006:9;11002:22;10956:78;:::i;:::-;10946:88;;10741:303;11111:3;11100:9;11096:19;11083:33;11143:18;11135:6;11132:30;11129:117;;;11165:79;;:::i;:::-;11129:117;11270:62;11324:7;11315:6;11304:9;11300:22;11270:62;:::i;:::-;11260:72;;11054:288;9840:1509;;;;;;;;:::o;11355:311::-;11432:4;11522:18;11514:6;11511:30;11508:56;;;11544:18;;:::i;:::-;11508:56;11594:4;11586:6;11582:17;11574:25;;11654:4;11648;11644:15;11636:23;;11355:311;;;:::o;11689:710::-;11785:5;11810:81;11826:64;11883:6;11826:64;:::i;:::-;11810:81;:::i;:::-;11801:90;;11911:5;11940:6;11933:5;11926:21;11974:4;11967:5;11963:16;11956:23;;12027:4;12019:6;12015:17;12007:6;12003:30;12056:3;12048:6;12045:15;12042:122;;;12075:79;;:::i;:::-;12042:122;12190:6;12173:220;12207:6;12202:3;12199:15;12173:220;;;12282:3;12311:37;12344:3;12332:10;12311:37;:::i;:::-;12306:3;12299:50;12378:4;12373:3;12369:14;12362:21;;12249:144;12233:4;12228:3;12224:14;12217:21;;12173:220;;;12177:21;11791:608;;11689:710;;;;;:::o;12422:370::-;12493:5;12542:3;12535:4;12527:6;12523:17;12519:27;12509:122;;12550:79;;:::i;:::-;12509:122;12667:6;12654:20;12692:94;12782:3;12774:6;12767:4;12759:6;12755:17;12692:94;:::i;:::-;12683:103;;12499:293;12422:370;;;;:::o;12798:894::-;12916:6;12924;12973:2;12961:9;12952:7;12948:23;12944:32;12941:119;;;12979:79;;:::i;:::-;12941:119;13127:1;13116:9;13112:17;13099:31;13157:18;13149:6;13146:30;13143:117;;;13179:79;;:::i;:::-;13143:117;13284:78;13354:7;13345:6;13334:9;13330:22;13284:78;:::i;:::-;13274:88;;13070:302;13439:2;13428:9;13424:18;13411:32;13470:18;13462:6;13459:30;13456:117;;;13492:79;;:::i;:::-;13456:117;13597:78;13667:7;13658:6;13647:9;13643:22;13597:78;:::i;:::-;13587:88;;13382:303;12798:894;;;;;:::o;13698:114::-;13765:6;13799:5;13793:12;13783:22;;13698:114;;;:::o;13818:184::-;13917:11;13951:6;13946:3;13939:19;13991:4;13986:3;13982:14;13967:29;;13818:184;;;;:::o;14008:132::-;14075:4;14098:3;14090:11;;14128:4;14123:3;14119:14;14111:22;;14008:132;;;:::o;14146:108::-;14223:24;14241:5;14223:24;:::i;:::-;14218:3;14211:37;14146:108;;:::o;14260:179::-;14329:10;14350:46;14392:3;14384:6;14350:46;:::i;:::-;14428:4;14423:3;14419:14;14405:28;;14260:179;;;;:::o;14445:113::-;14515:4;14547;14542:3;14538:14;14530:22;;14445:113;;;:::o;14594:732::-;14713:3;14742:54;14790:5;14742:54;:::i;:::-;14812:86;14891:6;14886:3;14812:86;:::i;:::-;14805:93;;14922:56;14972:5;14922:56;:::i;:::-;15001:7;15032:1;15017:284;15042:6;15039:1;15036:13;15017:284;;;15118:6;15112:13;15145:63;15204:3;15189:13;15145:63;:::i;:::-;15138:70;;15231:60;15284:6;15231:60;:::i;:::-;15221:70;;15077:224;15064:1;15061;15057:9;15052:14;;15017:284;;;15021:14;15317:3;15310:10;;14718:608;;;14594:732;;;;:::o;15332:373::-;15475:4;15513:2;15502:9;15498:18;15490:26;;15562:9;15556:4;15552:20;15548:1;15537:9;15533:17;15526:47;15590:108;15693:4;15684:6;15590:108;:::i;:::-;15582:116;;15332:373;;;;:::o;15711:329::-;15770:6;15819:2;15807:9;15798:7;15794:23;15790:32;15787:119;;;15825:79;;:::i;:::-;15787:119;15945:1;15970:53;16015:7;16006:6;15995:9;15991:22;15970:53;:::i;:::-;15960:63;;15916:117;15711:329;;;;:::o;16046:118::-;16133:24;16151:5;16133:24;:::i;:::-;16128:3;16121:37;16046:118;;:::o;16170:222::-;16263:4;16301:2;16290:9;16286:18;16278:26;;16314:71;16382:1;16371:9;16367:17;16358:6;16314:71;:::i;:::-;16170:222;;;;:::o;16398:116::-;16468:21;16483:5;16468:21;:::i;:::-;16461:5;16458:32;16448:60;;16504:1;16501;16494:12;16448:60;16398:116;:::o;16520:133::-;16563:5;16601:6;16588:20;16579:29;;16617:30;16641:5;16617:30;:::i;:::-;16520:133;;;;:::o;16659:468::-;16724:6;16732;16781:2;16769:9;16760:7;16756:23;16752:32;16749:119;;;16787:79;;:::i;:::-;16749:119;16907:1;16932:53;16977:7;16968:6;16957:9;16953:22;16932:53;:::i;:::-;16922:63;;16878:117;17034:2;17060:50;17102:7;17093:6;17082:9;17078:22;17060:50;:::i;:::-;17050:60;;17005:115;16659:468;;;;;:::o;17133:474::-;17201:6;17209;17258:2;17246:9;17237:7;17233:23;17229:32;17226:119;;;17264:79;;:::i;:::-;17226:119;17384:1;17409:53;17454:7;17445:6;17434:9;17430:22;17409:53;:::i;:::-;17399:63;;17355:117;17511:2;17537:53;17582:7;17573:6;17562:9;17558:22;17537:53;:::i;:::-;17527:63;;17482:118;17133:474;;;;;:::o;17613:644::-;17810:4;17848:3;17837:9;17833:19;17825:27;;17862:71;17930:1;17919:9;17915:17;17906:6;17862:71;:::i;:::-;17943:72;18011:2;18000:9;17996:18;17987:6;17943:72;:::i;:::-;18062:9;18056:4;18052:20;18047:2;18036:9;18032:18;18025:48;18090:78;18163:4;18154:6;18090:78;:::i;:::-;18082:86;;18178:72;18246:2;18235:9;18231:18;18222:6;18178:72;:::i;:::-;17613:644;;;;;;;:::o;18263:1089::-;18367:6;18375;18383;18391;18399;18448:3;18436:9;18427:7;18423:23;18419:33;18416:120;;;18455:79;;:::i;:::-;18416:120;18575:1;18600:53;18645:7;18636:6;18625:9;18621:22;18600:53;:::i;:::-;18590:63;;18546:117;18702:2;18728:53;18773:7;18764:6;18753:9;18749:22;18728:53;:::i;:::-;18718:63;;18673:118;18830:2;18856:53;18901:7;18892:6;18881:9;18877:22;18856:53;:::i;:::-;18846:63;;18801:118;18958:2;18984:53;19029:7;19020:6;19009:9;19005:22;18984:53;:::i;:::-;18974:63;;18929:118;19114:3;19103:9;19099:19;19086:33;19146:18;19138:6;19135:30;19132:117;;;19168:79;;:::i;:::-;19132:117;19273:62;19327:7;19318:6;19307:9;19303:22;19273:62;:::i;:::-;19263:72;;19057:288;18263:1089;;;;;;;;:::o;19358:229::-;19498:34;19494:1;19486:6;19482:14;19475:58;19567:12;19562:2;19554:6;19550:15;19543:37;19358:229;:::o;19593:366::-;19735:3;19756:67;19820:2;19815:3;19756:67;:::i;:::-;19749:74;;19832:93;19921:3;19832:93;:::i;:::-;19950:2;19945:3;19941:12;19934:19;;19593:366;;;:::o;19965:419::-;20131:4;20169:2;20158:9;20154:18;20146:26;;20218:9;20212:4;20208:20;20204:1;20193:9;20189:17;20182:47;20246:131;20372:4;20246:131;:::i;:::-;20238:139;;19965:419;;;:::o;20390:180::-;20438:77;20435:1;20428:88;20535:4;20532:1;20525:15;20559:4;20556:1;20549:15;20576:320;20620:6;20657:1;20651:4;20647:12;20637:22;;20704:1;20698:4;20694:12;20725:18;20715:81;;20781:4;20773:6;20769:17;20759:27;;20715:81;20843:2;20835:6;20832:14;20812:18;20809:38;20806:84;;20862:18;;:::i;:::-;20806:84;20627:269;20576:320;;;:::o;20902:180::-;20950:77;20947:1;20940:88;21047:4;21044:1;21037:15;21071:4;21068:1;21061:15;21088:332;21209:4;21247:2;21236:9;21232:18;21224:26;;21260:71;21328:1;21317:9;21313:17;21304:6;21260:71;:::i;:::-;21341:72;21409:2;21398:9;21394:18;21385:6;21341:72;:::i;:::-;21088:332;;;;;:::o;21426:180::-;21474:77;21471:1;21464:88;21571:4;21568:1;21561:15;21595:4;21592:1;21585:15;21612:233;21651:3;21674:24;21692:5;21674:24;:::i;:::-;21665:33;;21720:66;21713:5;21710:77;21707:103;;21790:18;;:::i;:::-;21707:103;21837:1;21830:5;21826:13;21819:20;;21612:233;;;:::o;21851:::-;21991:34;21987:1;21979:6;21975:14;21968:58;22060:16;22055:2;22047:6;22043:15;22036:41;21851:233;:::o;22090:366::-;22232:3;22253:67;22317:2;22312:3;22253:67;:::i;:::-;22246:74;;22329:93;22418:3;22329:93;:::i;:::-;22447:2;22442:3;22438:12;22431:19;;22090:366;;;:::o;22462:419::-;22628:4;22666:2;22655:9;22651:18;22643:26;;22715:9;22709:4;22705:20;22701:1;22690:9;22686:17;22679:47;22743:131;22869:4;22743:131;:::i;:::-;22735:139;;22462:419;;;:::o;22887:180::-;22935:77;22932:1;22925:88;23032:4;23029:1;23022:15;23056:4;23053:1;23046:15;23073:185;23113:1;23130:20;23148:1;23130:20;:::i;:::-;23125:25;;23164:20;23182:1;23164:20;:::i;:::-;23159:25;;23203:1;23193:35;;23208:18;;:::i;:::-;23193:35;23250:1;23247;23243:9;23238:14;;23073:185;;;;:::o;23264:410::-;23304:7;23327:20;23345:1;23327:20;:::i;:::-;23322:25;;23361:20;23379:1;23361:20;:::i;:::-;23356:25;;23416:1;23413;23409:9;23438:30;23456:11;23438:30;:::i;:::-;23427:41;;23617:1;23608:7;23604:15;23601:1;23598:22;23578:1;23571:9;23551:83;23528:139;;23647:18;;:::i;:::-;23528:139;23312:362;23264:410;;;;:::o;23680:228::-;23820:34;23816:1;23808:6;23804:14;23797:58;23889:11;23884:2;23876:6;23872:15;23865:36;23680:228;:::o;23914:366::-;24056:3;24077:67;24141:2;24136:3;24077:67;:::i;:::-;24070:74;;24153:93;24242:3;24153:93;:::i;:::-;24271:2;24266:3;24262:12;24255:19;;23914:366;;;:::o;24286:419::-;24452:4;24490:2;24479:9;24475:18;24467:26;;24539:9;24533:4;24529:20;24525:1;24514:9;24510:17;24503:47;24567:131;24693:4;24567:131;:::i;:::-;24559:139;;24286:419;;;:::o;24711:157::-;24851:9;24847:1;24839:6;24835:14;24828:33;24711:157;:::o;24874:365::-;25016:3;25037:66;25101:1;25096:3;25037:66;:::i;:::-;25030:73;;25112:93;25201:3;25112:93;:::i;:::-;25230:2;25225:3;25221:12;25214:19;;24874:365;;;:::o;25245:419::-;25411:4;25449:2;25438:9;25434:18;25426:26;;25498:9;25492:4;25488:20;25484:1;25473:9;25469:17;25462:47;25526:131;25652:4;25526:131;:::i;:::-;25518:139;;25245:419;;;:::o;25670:194::-;25710:4;25730:20;25748:1;25730:20;:::i;:::-;25725:25;;25764:20;25782:1;25764:20;:::i;:::-;25759:25;;25808:1;25805;25801:9;25793:17;;25832:1;25826:4;25823:11;25820:37;;;25837:18;;:::i;:::-;25820:37;25670:194;;;;:::o;25870:225::-;26010:34;26006:1;25998:6;25994:14;25987:58;26079:8;26074:2;26066:6;26062:15;26055:33;25870:225;:::o;26101:366::-;26243:3;26264:67;26328:2;26323:3;26264:67;:::i;:::-;26257:74;;26340:93;26429:3;26340:93;:::i;:::-;26458:2;26453:3;26449:12;26442:19;;26101:366;;;:::o;26473:419::-;26639:4;26677:2;26666:9;26662:18;26654:26;;26726:9;26720:4;26716:20;26712:1;26701:9;26697:17;26690:47;26754:131;26880:4;26754:131;:::i;:::-;26746:139;;26473:419;;;:::o;26898:182::-;27038:34;27034:1;27026:6;27022:14;27015:58;26898:182;:::o;27086:366::-;27228:3;27249:67;27313:2;27308:3;27249:67;:::i;:::-;27242:74;;27325:93;27414:3;27325:93;:::i;:::-;27443:2;27438:3;27434:12;27427:19;;27086:366;;;:::o;27458:419::-;27624:4;27662:2;27651:9;27647:18;27639:26;;27711:9;27705:4;27701:20;27697:1;27686:9;27682:17;27675:47;27739:131;27865:4;27739:131;:::i;:::-;27731:139;;27458:419;;;:::o;27883:220::-;28023:34;28019:1;28011:6;28007:14;28000:58;28092:3;28087:2;28079:6;28075:15;28068:28;27883:220;:::o;28109:366::-;28251:3;28272:67;28336:2;28331:3;28272:67;:::i;:::-;28265:74;;28348:93;28437:3;28348:93;:::i;:::-;28466:2;28461:3;28457:12;28450:19;;28109:366;;;:::o;28481:419::-;28647:4;28685:2;28674:9;28670:18;28662:26;;28734:9;28728:4;28724:20;28720:1;28709:9;28705:17;28698:47;28762:131;28888:4;28762:131;:::i;:::-;28754:139;;28481:419;;;:::o;28906:191::-;28946:3;28965:20;28983:1;28965:20;:::i;:::-;28960:25;;28999:20;29017:1;28999:20;:::i;:::-;28994:25;;29042:1;29039;29035:9;29028:16;;29063:3;29060:1;29057:10;29054:36;;;29070:18;;:::i;:::-;29054:36;28906:191;;;;:::o;29103:227::-;29243:34;29239:1;29231:6;29227:14;29220:58;29312:10;29307:2;29299:6;29295:15;29288:35;29103:227;:::o;29336:366::-;29478:3;29499:67;29563:2;29558:3;29499:67;:::i;:::-;29492:74;;29575:93;29664:3;29575:93;:::i;:::-;29693:2;29688:3;29684:12;29677:19;;29336:366;;;:::o;29708:419::-;29874:4;29912:2;29901:9;29897:18;29889:26;;29961:9;29955:4;29951:20;29947:1;29936:9;29932:17;29925:47;29989:131;30115:4;29989:131;:::i;:::-;29981:139;;29708:419;;;:::o;30133:224::-;30273:34;30269:1;30261:6;30257:14;30250:58;30342:7;30337:2;30329:6;30325:15;30318:32;30133:224;:::o;30363:366::-;30505:3;30526:67;30590:2;30585:3;30526:67;:::i;:::-;30519:74;;30602:93;30691:3;30602:93;:::i;:::-;30720:2;30715:3;30711:12;30704:19;;30363:366;;;:::o;30735:419::-;30901:4;30939:2;30928:9;30924:18;30916:26;;30988:9;30982:4;30978:20;30974:1;30963:9;30959:17;30952:47;31016:131;31142:4;31016:131;:::i;:::-;31008:139;;30735:419;;;:::o;31160:229::-;31300:34;31296:1;31288:6;31284:14;31277:58;31369:12;31364:2;31356:6;31352:15;31345:37;31160:229;:::o;31395:366::-;31537:3;31558:67;31622:2;31617:3;31558:67;:::i;:::-;31551:74;;31634:93;31723:3;31634:93;:::i;:::-;31752:2;31747:3;31743:12;31736:19;;31395:366;;;:::o;31767:419::-;31933:4;31971:2;31960:9;31956:18;31948:26;;32020:9;32014:4;32010:20;32006:1;31995:9;31991:17;31984:47;32048:131;32174:4;32048:131;:::i;:::-;32040:139;;31767:419;;;:::o;32192:634::-;32413:4;32451:2;32440:9;32436:18;32428:26;;32500:9;32494:4;32490:20;32486:1;32475:9;32471:17;32464:47;32528:108;32631:4;32622:6;32528:108;:::i;:::-;32520:116;;32683:9;32677:4;32673:20;32668:2;32657:9;32653:18;32646:48;32711:108;32814:4;32805:6;32711:108;:::i;:::-;32703:116;;32192:634;;;;;:::o;32832:228::-;32972:34;32968:1;32960:6;32956:14;32949:58;33041:11;33036:2;33028:6;33024:15;33017:36;32832:228;:::o;33066:366::-;33208:3;33229:67;33293:2;33288:3;33229:67;:::i;:::-;33222:74;;33305:93;33394:3;33305:93;:::i;:::-;33423:2;33418:3;33414:12;33407:19;;33066:366;;;:::o;33438:419::-;33604:4;33642:2;33631:9;33627:18;33619:26;;33691:9;33685:4;33681:20;33677:1;33666:9;33662:17;33655:47;33719:131;33845:4;33719:131;:::i;:::-;33711:139;;33438:419;;;:::o;33863:98::-;33914:6;33948:5;33942:12;33932:22;;33863:98;;;:::o;33967:168::-;34050:11;34084:6;34079:3;34072:19;34124:4;34119:3;34115:14;34100:29;;33967:168;;;;:::o;34141:373::-;34227:3;34255:38;34287:5;34255:38;:::i;:::-;34309:70;34372:6;34367:3;34309:70;:::i;:::-;34302:77;;34388:65;34446:6;34441:3;34434:4;34427:5;34423:16;34388:65;:::i;:::-;34478:29;34500:6;34478:29;:::i;:::-;34473:3;34469:39;34462:46;;34231:283;34141:373;;;;:::o;34520:751::-;34743:4;34781:3;34770:9;34766:19;34758:27;;34795:71;34863:1;34852:9;34848:17;34839:6;34795:71;:::i;:::-;34876:72;34944:2;34933:9;34929:18;34920:6;34876:72;:::i;:::-;34958;35026:2;35015:9;35011:18;35002:6;34958:72;:::i;:::-;35040;35108:2;35097:9;35093:18;35084:6;35040:72;:::i;:::-;35160:9;35154:4;35150:20;35144:3;35133:9;35129:19;35122:49;35188:76;35259:4;35250:6;35188:76;:::i;:::-;35180:84;;34520:751;;;;;;;;:::o;35277:141::-;35333:5;35364:6;35358:13;35349:22;;35380:32;35406:5;35380:32;:::i;:::-;35277:141;;;;:::o;35424:349::-;35493:6;35542:2;35530:9;35521:7;35517:23;35513:32;35510:119;;;35548:79;;:::i;:::-;35510:119;35668:1;35693:63;35748:7;35739:6;35728:9;35724:22;35693:63;:::i;:::-;35683:73;;35639:127;35424:349;;;;:::o;35779:106::-;35823:8;35872:5;35867:3;35863:15;35842:36;;35779:106;;;:::o;35891:183::-;35926:3;35964:1;35946:16;35943:23;35940:128;;;36002:1;35999;35996;35981:23;36024:34;36055:1;36049:8;36024:34;:::i;:::-;36017:41;;35940:128;35891:183;:::o;36080:711::-;36119:3;36157:4;36139:16;36136:26;36165:5;36133:39;36194:20;;:::i;:::-;36269:1;36251:16;36247:24;36244:1;36238:4;36223:49;36302:4;36296:11;36401:16;36394:4;36386:6;36382:17;36379:39;36346:18;36338:6;36335:30;36319:113;36316:146;;;36447:5;;;;36316:146;36493:6;36487:4;36483:17;36529:3;36523:10;36556:18;36548:6;36545:30;36542:43;;;36578:5;;;;;;36542:43;36626:6;36619:4;36614:3;36610:14;36606:27;36685:1;36667:16;36663:24;36657:4;36653:35;36648:3;36645:44;36642:57;;;36692:5;;;;;;;36642:57;36709;36757:6;36751:4;36747:17;36739:6;36735:30;36729:4;36709:57;:::i;:::-;36782:3;36775:10;;36123:668;;;;;36080:711;;:::o;36797:239::-;36937:34;36933:1;36925:6;36921:14;36914:58;37006:22;37001:2;36993:6;36989:15;36982:47;36797:239;:::o;37042:366::-;37184:3;37205:67;37269:2;37264:3;37205:67;:::i;:::-;37198:74;;37281:93;37370:3;37281:93;:::i;:::-;37399:2;37394:3;37390:12;37383:19;;37042:366;;;:::o;37414:419::-;37580:4;37618:2;37607:9;37603:18;37595:26;;37667:9;37661:4;37657:20;37653:1;37642:9;37638:17;37631:47;37695:131;37821:4;37695:131;:::i;:::-;37687:139;;37414:419;;;:::o;37839:227::-;37979:34;37975:1;37967:6;37963:14;37956:58;38048:10;38043:2;38035:6;38031:15;38024:35;37839:227;:::o;38072:366::-;38214:3;38235:67;38299:2;38294:3;38235:67;:::i;:::-;38228:74;;38311:93;38400:3;38311:93;:::i;:::-;38429:2;38424:3;38420:12;38413:19;;38072:366;;;:::o;38444:419::-;38610:4;38648:2;38637:9;38633:18;38625:26;;38697:9;38691:4;38687:20;38683:1;38672:9;38668:17;38661:47;38725:131;38851:4;38725:131;:::i;:::-;38717:139;;38444:419;;;:::o;38869:1053::-;39192:4;39230:3;39219:9;39215:19;39207:27;;39244:71;39312:1;39301:9;39297:17;39288:6;39244:71;:::i;:::-;39325:72;39393:2;39382:9;39378:18;39369:6;39325:72;:::i;:::-;39444:9;39438:4;39434:20;39429:2;39418:9;39414:18;39407:48;39472:108;39575:4;39566:6;39472:108;:::i;:::-;39464:116;;39627:9;39621:4;39617:20;39612:2;39601:9;39597:18;39590:48;39655:108;39758:4;39749:6;39655:108;:::i;:::-;39647:116;;39811:9;39805:4;39801:20;39795:3;39784:9;39780:19;39773:49;39839:76;39910:4;39901:6;39839:76;:::i;:::-;39831:84;;38869:1053;;;;;;;;:::o

Swarm Source

ipfs://aa8658a33b8faab15555f1eca0a4fc0cc7a94cc8f1a51c320404e1679a55df1f
[ 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.