ETH Price: $3,453.73 (-1.11%)
Gas: 11 Gwei

Token

Swipa The Fox Stories (FOXSTORIES)
 

Overview

Max Total Supply

385 FOXSTORIES

Holders

119

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x386188730ff238942a6a90ced98777a0712cf750
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SwipaFoxStory

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 18 of 18: SwipaFoxStory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./ERC1155.sol";
import "./MerkleProof.sol";
import "./SafeMath.sol";
import "./Counters.sol";
import "./AbstractSwipaFoxStory.sol";

contract SwipaFoxStory is AbstractSwipaFoxStory  {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    address public devAddress1 = 0x2Dd146bcf2Dae32851fCeE09e5F3a4E886eFe076;
    address public devAddress2 = 0x3e81D9B5E4fD4C7C3f69bb4396A857d41D1A3471;
    address public NFTA_Address = 0x855A67D331a52C8701306B7bfa62EaBa68F25F44;
    address public CommunityAddress = 0x266Db4743755109a5926D6fDeD5ED6F6a284aB98;
    address public oAddress = 0x6662DF22aE83a8cCfc9c99C641aA54dE8E120407;

    bool public isSaleActive = false; 

    Counters.Counter private swipaCounter; 
  
    mapping(uint256 => SwipaStory) public swipaStories;
    
    struct SwipaStory {
        uint256 mintPrice;
        string ipfsMetadataHash;
        uint maxSupply;
        uint supply;
    }

    constructor() ERC1155("https://swipathefox.mypinata.cloud/ipfs/") {
        name_ = "Swipa The Fox Stories";
        symbol_ = "FOXSTORIES";
    }

    function addSwipaStory (
        uint256  _mintPrice, 
        string memory _ipfsMetadataHash,
        uint _maxSupply,
        uint _supply
    ) external onlyOwner {

        SwipaStory storage _swipa_story = swipaStories[swipaCounter.current()];
        _swipa_story.mintPrice = _mintPrice;
        _swipa_story.ipfsMetadataHash = _ipfsMetadataHash;
        _swipa_story.maxSupply = _maxSupply;
        _swipa_story.supply = _supply;
        swipaCounter.increment();

    }

    function editSwipaStory (
        uint256 _mintPrice, 
        string memory _ipfsMetadataHash,        
        uint256 _swipaStory
    ) external onlyOwner {
        swipaStories[_swipaStory].mintPrice = _mintPrice;    
        swipaStories[_swipaStory].ipfsMetadataHash = _ipfsMetadataHash;    
    }       

    function mintSwipaStory (
        uint256 amount,
        uint256 _story
    ) external payable {
        require(isSaleActive, "Swipa sale is not active" );
        require(msg.value >= amount.mul(swipaStories[_story].mintPrice), "Swipa amount is not valid");

        uint currentSupply = swipaStories[_story].supply;
        require(currentSupply + amount <= swipaStories[_story].maxSupply, "Order exceeds supply" );
        swipaStories[_story].supply = swipaStories[_story].supply + amount; 

        _mint(msg.sender, _story, amount, "");
    }

    function ownerMint (
        uint256 amount,
        uint256 _story
    ) external onlyOwner {
        uint currentSupply = swipaStories[_story].supply;
        require(currentSupply + amount <= swipaStories[_story].maxSupply, "Order exceeds supply" );
        swipaStories[_story].supply = swipaStories[_story].supply + amount; 

        _mint(msg.sender, _story, amount, "");
    }

    function setSaleActive(bool isSaleActive_ ) external onlyOwner {
        require( isSaleActive != isSaleActive_ , "Values are not valid" );
        isSaleActive = isSaleActive_;
    }
    
    function emergencyWithdraw() external onlyOwner {
        (bool emergencyWithdrawStatus,) = devAddress1.call{value: address(this).balance}("");
        require(emergencyWithdrawStatus, "Failed Emergency Withdraw");
    }

    function emergencyWithdraw2() external onlyOwner {
        (bool emergencyWithdrawStatus2,) = devAddress2.call{value: address(this).balance}("");
        require(emergencyWithdrawStatus2, "Failed Emergency Withdraw");
    }

    function withdraw() external {
        require(address(this).balance > 0, "Not enough ether to withdraw");
        uint256 walletBalance = address(this).balance;
            
        (bool withdraw_1,) = devAddress1.call{value: walletBalance * 425 / 10000}("");
        (bool withdraw_2,) = devAddress2.call{value: walletBalance * 425 / 10000}("");
        (bool withdraw_3,) = NFTA_Address.call{value: walletBalance * 415 / 1000}("");
        (bool withdraw_4,) = CommunityAddress.call{value: walletBalance * 10 / 100}("");
        (bool withdraw_5,) = oAddress.call{value: walletBalance * 40 / 100}("");

        require(withdraw_1 && withdraw_2 && withdraw_3 && withdraw_4 && withdraw_5, "Failed withdraw");
    }

    function uri(uint256 _id) public view override returns (string memory) {
            require(totalSupply(_id) > 0, "URI: nonexistent token");
            
            return string(abi.encodePacked(super.uri(_id), swipaStories[_id].ipfsMetadataHash));
    }    
}

File 1 of 18: AbstractSwipaFoxStory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import './Ownable.sol';
import './ERC1155Burnable.sol';
import './ERC1155Pausable.sol';
import './ERC1155Supply.sol';

abstract contract AbstractSwipaFoxStory is ERC1155Pausable, ERC1155Supply, ERC1155Burnable, Ownable {
    
    string public name_;
    string public symbol_;   
    
    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }    

    function setURI(string memory baseURI) external onlyOwner {
        _setURI(baseURI);
    }    

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

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

    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._mint(account, id, amount, data);
    }

    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._mintBatch(to, ids, amounts, data);
    }

    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._burn(account, id, amount);
    }

    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._burnBatch(account, ids, amounts);
    }  

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155Pausable, ERC1155) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }  
}

File 2 of 18: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 3 of 18: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 4 of 18: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 18: ERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

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

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) 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 uri_) {
        _setURI(uri_);
    }

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

        address operator = _msgSender();

        _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);

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

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

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

        address operator = _msgSender();

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

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

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

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

    /**
     * @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 `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

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

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

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

        return array;
    }
}

File 6 of 18: ERC1155Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

File 7 of 18: ERC1155Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC1155.sol";
import "./Pausable.sol";

/**
 * @dev ERC1155 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Pausable is ERC1155, Pausable {
    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        require(!paused(), "ERC1155Pausable: token transfer while paused");
    }
}

File 8 of 18: ERC1155Supply.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates weither any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_mint}.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override {
        super._mint(account, id, amount, data);
        _totalSupply[id] += amount;
    }

    /**
     * @dev See {ERC1155-_mintBatch}.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._mintBatch(to, ids, amounts, data);
        for (uint256 i = 0; i < ids.length; ++i) {
            _totalSupply[ids[i]] += amounts[i];
        }
    }

    /**
     * @dev See {ERC1155-_burn}.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual override {
        super._burn(account, id, amount);
        _totalSupply[id] -= amount;
    }

    /**
     * @dev See {ERC1155-_burnBatch}.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual override {
        super._burnBatch(account, ids, amounts);
        for (uint256 i = 0; i < ids.length; ++i) {
            _totalSupply[ids[i]] -= amounts[i];
        }
    }
}

File 9 of 18: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 10 of 18: IERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

File 11 of 18: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @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 12 of 18: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

File 13 of 18: IERC165.sol
// SPDX-License-Identifier: MIT

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 14 of 18: MerkleProof.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

File 15 of 18: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 16 of 18: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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

File 17 of 18: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

Contract Security Audit

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CommunityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTA_Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"string","name":"_ipfsMetadataHash","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"addSwipaStory","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"string","name":"_ipfsMetadataHash","type":"string"},{"internalType":"uint256","name":"_swipaStory","type":"uint256"}],"name":"editSwipaStory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_story","type":"uint256"}],"name":"mintSwipaStory","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_story","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isSaleActive_","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"swipaStories","outputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"string","name":"ipfsMetadataHash","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600880546001600160a01b0319908116732dd146bcf2dae32851fcee09e5f3a4e886efe07617909155600980548216733e81d9b5e4fd4c7c3f69bb4396a857d41d1a3471179055600a8054821673855a67d331a52c8701306b7bfa62eaba68f25f44179055600b805490911673266db4743755109a5926d6fded5ed6f6a284ab98179055600c80546001600160a81b031916736662df22ae83a8ccfc9c99c641aa54de8e120407179055348015620000bb57600080fd5b50604051806060016040528060288152602001620032dc60289139620000e18162000178565b506003805460ff19169055620000f73362000191565b6040805180820190915260158082527f53776970612054686520466f782053746f72696573000000000000000000000060209092019182526200013d91600691620001e3565b5060408051808201909152600a80825269464f5853544f5249455360b01b60209092019182526200017191600791620001e3565b50620002c6565b80516200018d906002906020840190620001e3565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f19062000289565b90600052602060002090601f01602090048101928262000215576000855562000260565b82601f106200023057805160ff191683800117855562000260565b8280016001018555821562000260579182015b828111156200026057825182559160200191906001019062000243565b506200026e92915062000272565b5090565b5b808211156200026e576000815560010162000273565b600181811c908216806200029e57607f821691505b60208210811415620002c057634e487b7160e01b600052602260045260246000fd5b50919050565b61300680620002d66000396000f3fe6080604052600436106102245760003560e01c8063738f88a511610123578063b8a7c78a116100ab578063e2b9e1861161006f578063e2b9e18614610653578063e985e9c514610668578063f242432a146106b1578063f2fde38b146106d1578063f5298aca146106f157600080fd5b8063b8a7c78a146105b1578063bd85b039146105d1578063d1de084b146105fe578063d47573d41461061e578063db2e21bc1461063e57600080fd5b80638bdeefcf116100f25780638bdeefcf146105295780638da5cb5b1461054957806395d89b4114610567578063a22cb4651461057c578063af17dea61461059c57600080fd5b8063738f88a5146104b4578063841718a6146104d45780638456cb59146104f45780638787679b1461050957600080fd5b80633fe8f0a7116101b157806363511db61161017557806363511db6146103f75780636b20c4541461042f5780636bf24dcd1461044f578063715018a61461046f5780637374f0101461048457600080fd5b80633fe8f0a71461034d5780634e1273f4146103625780634f558e791461038f578063564566a8146103be5780635c975abb146103df57600080fd5b80630e89341c116101f85780630e89341c146102d05780632d0da529146102f05780632eb2c2d6146103035780633ccfd60b146103235780633f4ba83a1461033857600080fd5b8062fdd58e1461022957806301ffc9a71461025c57806302fe53051461028c57806306fdde03146102ae575b600080fd5b34801561023557600080fd5b5061024961024436600461268e565b610711565b6040519081526020015b60405180910390f35b34801561026857600080fd5b5061027c6102773660046127d7565b6107a8565b6040519015158152602001610253565b34801561029857600080fd5b506102ac6102a7366004612811565b6107fa565b005b3480156102ba57600080fd5b506102c3610830565b6040516102539190612b2c565b3480156102dc57600080fd5b506102c36102eb36600461284e565b6108c2565b6102ac6102fe36600461290e565b61095c565b34801561030f57600080fd5b506102ac61031e3660046124e1565b610add565b34801561032f57600080fd5b506102ac610b74565b34801561034457600080fd5b506102ac610e52565b34801561035957600080fd5b506102ac610e86565b34801561036e57600080fd5b5061038261037d3660046126eb565b610f59565b6040516102539190612aeb565b34801561039b57600080fd5b5061027c6103aa36600461284e565b600090815260046020526040902054151590565b3480156103ca57600080fd5b50600c5461027c90600160a01b900460ff1681565b3480156103eb57600080fd5b5060035460ff1661027c565b34801561040357600080fd5b50600854610417906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b34801561043b57600080fd5b506102ac61044a3660046125f0565b611083565b34801561045b57600080fd5b50600c54610417906001600160a01b031681565b34801561047b57600080fd5b506102ac6110c6565b34801561049057600080fd5b506104a461049f36600461284e565b6110fa565b6040516102539493929190612d63565b3480156104c057600080fd5b50600954610417906001600160a01b031681565b3480156104e057600080fd5b506102ac6104ef3660046127bc565b6111ab565b34801561050057600080fd5b506102ac61124b565b34801561051557600080fd5b506102ac6105243660046128b7565b61127d565b34801561053557600080fd5b506102ac610544366004612867565b6112fe565b34801561055557600080fd5b506005546001600160a01b0316610417565b34801561057357600080fd5b506102c3611356565b34801561058857600080fd5b506102ac610597366004612664565b611365565b3480156105a857600080fd5b506102c361143c565b3480156105bd57600080fd5b50600b54610417906001600160a01b031681565b3480156105dd57600080fd5b506102496105ec36600461284e565b60009081526004602052604090205490565b34801561060a57600080fd5b50600a54610417906001600160a01b031681565b34801561062a57600080fd5b506102ac61063936600461290e565b6114ca565b34801561064a57600080fd5b506102ac6114f4565b34801561065f57600080fd5b506102c3611538565b34801561067457600080fd5b5061027c6106833660046124ae565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156106bd57600080fd5b506102ac6106cc36600461258b565b611545565b3480156106dd57600080fd5b506102ac6106ec366004612493565b61158a565b3480156106fd57600080fd5b506102ac61070c3660046126b8565b611622565b60006001600160a01b0383166107825760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806107d957506001600160e01b031982166303a24d0760e21b145b806107f457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6005546001600160a01b031633146108245760405162461bcd60e51b815260040161077990612ce6565b61082d81611665565b50565b60606006805461083f90612e4f565b80601f016020809104026020016040519081016040528092919081815260200182805461086b90612e4f565b80156108b85780601f1061088d576101008083540402835291602001916108b8565b820191906000526020600020905b81548152906001019060200180831161089b57829003601f168201915b5050505050905090565b6000818152600460205260408120546060911061091a5760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610779565b6109238261167c565b6000838152600e6020908152604091829020915161094693926001019101612997565b6040516020818303038152906040529050919050565b600c54600160a01b900460ff166109b55760405162461bcd60e51b815260206004820152601860248201527f53776970612073616c65206973206e6f742061637469766500000000000000006044820152606401610779565b6000818152600e60205260409020546109cf908390611710565b341015610a1e5760405162461bcd60e51b815260206004820152601960248201527f537769706120616d6f756e74206973206e6f742076616c6964000000000000006044820152606401610779565b6000818152600e602052604090206003810154600290910154610a418483612db3565b1115610a865760405162461bcd60e51b81526020600482015260146024820152734f72646572206578636565647320737570706c7960601b6044820152606401610779565b6000828152600e6020526040902060030154610aa3908490612db3565b600e600084815260200190815260200160002060030181905550610ad833838560405180602001604052806000815250611723565b505050565b6001600160a01b038516331480610af95750610af98533610683565b610b605760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610779565b610b6d858585858561172f565b5050505050565b60004711610bc45760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820657468657220746f207769746864726177000000006044820152606401610779565b60085447906000906001600160a01b0316612710610be4846101a9612ded565b610bee9190612dcb565b604051600081818185875af1925050503d8060008114610c2a576040519150601f19603f3d011682016040523d82523d6000602084013e610c2f565b606091505b50506009549091506000906001600160a01b0316612710610c52856101a9612ded565b610c5c9190612dcb565b604051600081818185875af1925050503d8060008114610c98576040519150601f19603f3d011682016040523d82523d6000602084013e610c9d565b606091505b5050600a549091506000906001600160a01b03166103e8610cc08661019f612ded565b610cca9190612dcb565b604051600081818185875af1925050503d8060008114610d06576040519150601f19603f3d011682016040523d82523d6000602084013e610d0b565b606091505b5050600b549091506000906001600160a01b03166064610d2c87600a612ded565b610d369190612dcb565b604051600081818185875af1925050503d8060008114610d72576040519150601f19603f3d011682016040523d82523d6000602084013e610d77565b606091505b5050600c549091506000906001600160a01b03166064610d98886028612ded565b610da29190612dcb565b604051600081818185875af1925050503d8060008114610dde576040519150601f19603f3d011682016040523d82523d6000602084013e610de3565b606091505b50509050848015610df15750835b8015610dfa5750825b8015610e035750815b8015610e0c5750805b610e4a5760405162461bcd60e51b815260206004820152600f60248201526e4661696c656420776974686472617760881b6044820152606401610779565b505050505050565b6005546001600160a01b03163314610e7c5760405162461bcd60e51b815260040161077990612ce6565b610e846118d1565b565b6005546001600160a01b03163314610eb05760405162461bcd60e51b815260040161077990612ce6565b6009546040516000916001600160a01b03169047905b60006040518083038185875af1925050503d8060008114610f03576040519150601f19603f3d011682016040523d82523d6000602084013e610f08565b606091505b505090508061082d5760405162461bcd60e51b815260206004820152601960248201527f4661696c656420456d657267656e6379205769746864726177000000000000006044820152606401610779565b60608151835114610fbe5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610779565b6000835167ffffffffffffffff811115610fda57610fda612efe565b604051908082528060200260200182016040528015611003578160200160208202803683370190505b50905060005b845181101561107b5761104e85828151811061102757611027612ee8565b602002602001015185838151811061104157611041612ee8565b6020026020010151610711565b82828151811061106057611060612ee8565b602090810291909101015261107481612eb7565b9050611009565b509392505050565b6001600160a01b03831633148061109f575061109f8333610683565b6110bb5760405162461bcd60e51b815260040161077990612bcb565b610ad8838383611964565b6005546001600160a01b031633146110f05760405162461bcd60e51b815260040161077990612ce6565b610e84600061196f565b600e602052600090815260409020805460018201805491929161111c90612e4f565b80601f016020809104026020016040519081016040528092919081815260200182805461114890612e4f565b80156111955780601f1061116a57610100808354040283529160200191611195565b820191906000526020600020905b81548152906001019060200180831161117857829003601f168201915b5050505050908060020154908060030154905084565b6005546001600160a01b031633146111d55760405162461bcd60e51b815260040161077990612ce6565b600c5460ff600160a01b909104161515811515141561122d5760405162461bcd60e51b815260206004820152601460248201527315985b1d595cc8185c99481b9bdd081d985b1a5960621b6044820152606401610779565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b6005546001600160a01b031633146112755760405162461bcd60e51b815260040161077990612ce6565b610e846119c1565b6005546001600160a01b031633146112a75760405162461bcd60e51b815260040161077990612ce6565b6000600e60006112b6600d5490565b815260208082019290925260400160002086815585519092506112e1916001840191908701906122e3565b506002810183905560038101829055610b6d600d80546001019055565b6005546001600160a01b031633146113285760405162461bcd60e51b815260040161077990612ce6565b6000818152600e602090815260409091208481558351611350926001909201918501906122e3565b50505050565b60606007805461083f90612e4f565b336001600160a01b03831614156113d05760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610779565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007805461144990612e4f565b80601f016020809104026020016040519081016040528092919081815260200182805461147590612e4f565b80156114c25780601f10611497576101008083540402835291602001916114c2565b820191906000526020600020905b8154815290600101906020018083116114a557829003601f168201915b505050505081565b6005546001600160a01b03163314610a1e5760405162461bcd60e51b815260040161077990612ce6565b6005546001600160a01b0316331461151e5760405162461bcd60e51b815260040161077990612ce6565b6008546040516000916001600160a01b0316904790610ec6565b6006805461144990612e4f565b6001600160a01b03851633148061156157506115618533610683565b61157d5760405162461bcd60e51b815260040161077990612bcb565b610b6d8585858585611a3c565b6005546001600160a01b031633146115b45760405162461bcd60e51b815260040161077990612ce6565b6001600160a01b0381166116195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610779565b61082d8161196f565b6001600160a01b03831633148061163e575061163e8333610683565b61165a5760405162461bcd60e51b815260040161077990612bcb565b610ad8838383611b68565b80516116789060029060208401906122e3565b5050565b60606002805461168b90612e4f565b80601f01602080910402602001604051908101604052809291908181526020018280546116b790612e4f565b80156117045780601f106116d957610100808354040283529160200191611704565b820191906000526020600020905b8154815290600101906020018083116116e757829003601f168201915b50505050509050919050565b600061171c8284612ded565b9392505050565b61135084848484611b73565b81518351146117505760405162461bcd60e51b815260040161077990612d1b565b6001600160a01b0384166117765760405162461bcd60e51b815260040161077990612c14565b33611785818787878787611ba8565b60005b845181101561186b5760008582815181106117a5576117a5612ee8565b6020026020010151905060008583815181106117c3576117c3612ee8565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156118135760405162461bcd60e51b815260040161077990612c9c565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611850908490612db3565b925050819055505050508061186490612eb7565b9050611788565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118bb929190612afe565b60405180910390a4610e4a818787878787611bb6565b60035460ff1661191a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610779565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610ad8838383611d21565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60035460ff1615611a075760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610779565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119473390565b6001600160a01b038416611a625760405162461bcd60e51b815260040161077990612c14565b33611a81818787611a7288611da3565b611a7b88611da3565b87611ba8565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611ac25760405162461bcd60e51b815260040161077990612c9c565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611aff908490612db3565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b5f828888888888611dee565b50505050505050565b610ad8838383611eb8565b611b7f84848484611eeb565b60008381526004602052604081208054849290611b9d908490612db3565b909155505050505050565b610e4a868686868686611fec565b6001600160a01b0384163b15610e4a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611bfa9089908990889088908890600401612a48565b602060405180830381600087803b158015611c1457600080fd5b505af1925050508015611c44575060408051601f3d908101601f19168201909252611c41918101906127f4565b60015b611cf157611c50612f14565b806308c379a01415611c8a5750611c65612f30565b80611c705750611c8c565b8060405162461bcd60e51b81526004016107799190612b2c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610779565b6001600160e01b0319811663bc197c8160e01b14611b5f5760405162461bcd60e51b815260040161077990612b3f565b611d2c838383612054565b60005b825181101561135057818181518110611d4a57611d4a612ee8565b602002602001015160046000858481518110611d6857611d68612ee8565b602002602001015181526020019081526020016000206000828254611d8d9190612e0c565b90915550611d9c905081612eb7565b9050611d2f565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611ddd57611ddd612ee8565b602090810291909101015292915050565b6001600160a01b0384163b15610e4a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e329089908990889088908890600401612aa6565b602060405180830381600087803b158015611e4c57600080fd5b505af1925050508015611e7c575060408051601f3d908101601f19168201909252611e79918101906127f4565b60015b611e8857611c50612f14565b6001600160e01b0319811663f23a6e6160e01b14611b5f5760405162461bcd60e51b815260040161077990612b3f565b611ec38383836121e2565b60008281526004602052604081208054839290611ee1908490612e0c565b9091555050505050565b6001600160a01b038416611f4b5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610779565b33611f5c81600087611a7288611da3565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611f8c908490612db3565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610b6d81600087878787611dee565b60035460ff1615610e4a5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610779565b6001600160a01b03831661207a5760405162461bcd60e51b815260040161077990612c59565b805182511461209b5760405162461bcd60e51b815260040161077990612d1b565b60003390506120be81856000868660405180602001604052806000815250611ba8565b60005b83518110156121835760008482815181106120de576120de612ee8565b6020026020010151905060008483815181106120fc576120fc612ee8565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561214c5760405162461bcd60e51b815260040161077990612b87565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061217b81612eb7565b9150506120c1565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516121d4929190612afe565b60405180910390a450505050565b6001600160a01b0383166122085760405162461bcd60e51b815260040161077990612c59565b336122378185600061221987611da3565b61222287611da3565b60405180602001604052806000815250611ba8565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156122785760405162461bcd60e51b815260040161077990612b87565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b8280546122ef90612e4f565b90600052602060002090601f0160209004810192826123115760008555612357565b82601f1061232a57805160ff1916838001178555612357565b82800160010185558215612357579182015b8281111561235757825182559160200191906001019061233c565b50612363929150612367565b5090565b5b808211156123635760008155600101612368565b80356001600160a01b038116811461239357600080fd5b919050565b600082601f8301126123a957600080fd5b813560206123b682612d8f565b6040516123c38282612e8a565b8381528281019150858301600585901b870184018810156123e357600080fd5b60005b85811015612402578135845292840192908401906001016123e6565b5090979650505050505050565b8035801515811461239357600080fd5b600082601f83011261243057600080fd5b813567ffffffffffffffff81111561244a5761244a612efe565b604051612461601f8301601f191660200182612e8a565b81815284602083860101111561247657600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156124a557600080fd5b61171c8261237c565b600080604083850312156124c157600080fd5b6124ca8361237c565b91506124d86020840161237c565b90509250929050565b600080600080600060a086880312156124f957600080fd5b6125028661237c565b94506125106020870161237c565b9350604086013567ffffffffffffffff8082111561252d57600080fd5b61253989838a01612398565b9450606088013591508082111561254f57600080fd5b61255b89838a01612398565b9350608088013591508082111561257157600080fd5b5061257e8882890161241f565b9150509295509295909350565b600080600080600060a086880312156125a357600080fd5b6125ac8661237c565b94506125ba6020870161237c565b93506040860135925060608601359150608086013567ffffffffffffffff8111156125e457600080fd5b61257e8882890161241f565b60008060006060848603121561260557600080fd5b61260e8461237c565b9250602084013567ffffffffffffffff8082111561262b57600080fd5b61263787838801612398565b9350604086013591508082111561264d57600080fd5b5061265a86828701612398565b9150509250925092565b6000806040838503121561267757600080fd5b6126808361237c565b91506124d86020840161240f565b600080604083850312156126a157600080fd5b6126aa8361237c565b946020939093013593505050565b6000806000606084860312156126cd57600080fd5b6126d68461237c565b95602085013595506040909401359392505050565b600080604083850312156126fe57600080fd5b823567ffffffffffffffff8082111561271657600080fd5b818501915085601f83011261272a57600080fd5b8135602061273782612d8f565b6040516127448282612e8a565b8381528281019150858301600585901b870184018b101561276457600080fd5b600096505b8487101561278e5761277a8161237c565b835260019690960195918301918301612769565b50965050860135925050808211156127a557600080fd5b506127b285828601612398565b9150509250929050565b6000602082840312156127ce57600080fd5b61171c8261240f565b6000602082840312156127e957600080fd5b813561171c81612fba565b60006020828403121561280657600080fd5b815161171c81612fba565b60006020828403121561282357600080fd5b813567ffffffffffffffff81111561283a57600080fd5b6128468482850161241f565b949350505050565b60006020828403121561286057600080fd5b5035919050565b60008060006060848603121561287c57600080fd5b83359250602084013567ffffffffffffffff81111561289a57600080fd5b6128a68682870161241f565b925050604084013590509250925092565b600080600080608085870312156128cd57600080fd5b84359350602085013567ffffffffffffffff8111156128eb57600080fd5b6128f78782880161241f565b949794965050505060408301359260600135919050565b6000806040838503121561292157600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101561296057815187529582019590820190600101612944565b509495945050505050565b60008151808452612983816020860160208601612e23565b601f01601f19169290920160200192915050565b6000835160206129aa8285838901612e23565b845491840191600090600181811c90808316806129c857607f831692505b8583108114156129e657634e487b7160e01b85526022600452602485fd5b8080156129fa5760018114612a0b57612a38565b60ff19851688528388019550612a38565b60008b81526020902060005b85811015612a305781548a820152908401908801612a17565b505083880195505b50939a9950505050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612a7490830186612930565b8281036060840152612a868186612930565b90508281036080840152612a9a818561296b565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612ae09083018461296b565b979650505050505050565b60208152600061171c6020830184612930565b604081526000612b116040830185612930565b8281036020840152612b238185612930565b95945050505050565b60208152600061171c602083018461296b565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b848152608060208201526000612d7c608083018661296b565b6040830194909452506060015292915050565b600067ffffffffffffffff821115612da957612da9612efe565b5060051b60200190565b60008219821115612dc657612dc6612ed2565b500190565b600082612de857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612e0757612e07612ed2565b500290565b600082821015612e1e57612e1e612ed2565b500390565b60005b83811015612e3e578181015183820152602001612e26565b838111156113505750506000910152565b600181811c90821680612e6357607f821691505b60208210811415612e8457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612eb057612eb0612efe565b6040525050565b6000600019821415612ecb57612ecb612ed2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612f2d5760046000803e5060005160e01c5b90565b600060443d1015612f3e5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612f6e57505050505090565b8285019150815181811115612f865750505050505090565b843d8701016020828501011115612fa05750505050505090565b612faf60208286010187612e8a565b509095945050505050565b6001600160e01b03198116811461082d57600080fdfea2646970667358221220dbfd911f8ab72348e90b19b257faa5eae3746876e1214e1308eec219ddd953e664736f6c6343000807003368747470733a2f2f7377697061746865666f782e6d7970696e6174612e636c6f75642f697066732f

Deployed Bytecode

0x6080604052600436106102245760003560e01c8063738f88a511610123578063b8a7c78a116100ab578063e2b9e1861161006f578063e2b9e18614610653578063e985e9c514610668578063f242432a146106b1578063f2fde38b146106d1578063f5298aca146106f157600080fd5b8063b8a7c78a146105b1578063bd85b039146105d1578063d1de084b146105fe578063d47573d41461061e578063db2e21bc1461063e57600080fd5b80638bdeefcf116100f25780638bdeefcf146105295780638da5cb5b1461054957806395d89b4114610567578063a22cb4651461057c578063af17dea61461059c57600080fd5b8063738f88a5146104b4578063841718a6146104d45780638456cb59146104f45780638787679b1461050957600080fd5b80633fe8f0a7116101b157806363511db61161017557806363511db6146103f75780636b20c4541461042f5780636bf24dcd1461044f578063715018a61461046f5780637374f0101461048457600080fd5b80633fe8f0a71461034d5780634e1273f4146103625780634f558e791461038f578063564566a8146103be5780635c975abb146103df57600080fd5b80630e89341c116101f85780630e89341c146102d05780632d0da529146102f05780632eb2c2d6146103035780633ccfd60b146103235780633f4ba83a1461033857600080fd5b8062fdd58e1461022957806301ffc9a71461025c57806302fe53051461028c57806306fdde03146102ae575b600080fd5b34801561023557600080fd5b5061024961024436600461268e565b610711565b6040519081526020015b60405180910390f35b34801561026857600080fd5b5061027c6102773660046127d7565b6107a8565b6040519015158152602001610253565b34801561029857600080fd5b506102ac6102a7366004612811565b6107fa565b005b3480156102ba57600080fd5b506102c3610830565b6040516102539190612b2c565b3480156102dc57600080fd5b506102c36102eb36600461284e565b6108c2565b6102ac6102fe36600461290e565b61095c565b34801561030f57600080fd5b506102ac61031e3660046124e1565b610add565b34801561032f57600080fd5b506102ac610b74565b34801561034457600080fd5b506102ac610e52565b34801561035957600080fd5b506102ac610e86565b34801561036e57600080fd5b5061038261037d3660046126eb565b610f59565b6040516102539190612aeb565b34801561039b57600080fd5b5061027c6103aa36600461284e565b600090815260046020526040902054151590565b3480156103ca57600080fd5b50600c5461027c90600160a01b900460ff1681565b3480156103eb57600080fd5b5060035460ff1661027c565b34801561040357600080fd5b50600854610417906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b34801561043b57600080fd5b506102ac61044a3660046125f0565b611083565b34801561045b57600080fd5b50600c54610417906001600160a01b031681565b34801561047b57600080fd5b506102ac6110c6565b34801561049057600080fd5b506104a461049f36600461284e565b6110fa565b6040516102539493929190612d63565b3480156104c057600080fd5b50600954610417906001600160a01b031681565b3480156104e057600080fd5b506102ac6104ef3660046127bc565b6111ab565b34801561050057600080fd5b506102ac61124b565b34801561051557600080fd5b506102ac6105243660046128b7565b61127d565b34801561053557600080fd5b506102ac610544366004612867565b6112fe565b34801561055557600080fd5b506005546001600160a01b0316610417565b34801561057357600080fd5b506102c3611356565b34801561058857600080fd5b506102ac610597366004612664565b611365565b3480156105a857600080fd5b506102c361143c565b3480156105bd57600080fd5b50600b54610417906001600160a01b031681565b3480156105dd57600080fd5b506102496105ec36600461284e565b60009081526004602052604090205490565b34801561060a57600080fd5b50600a54610417906001600160a01b031681565b34801561062a57600080fd5b506102ac61063936600461290e565b6114ca565b34801561064a57600080fd5b506102ac6114f4565b34801561065f57600080fd5b506102c3611538565b34801561067457600080fd5b5061027c6106833660046124ae565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156106bd57600080fd5b506102ac6106cc36600461258b565b611545565b3480156106dd57600080fd5b506102ac6106ec366004612493565b61158a565b3480156106fd57600080fd5b506102ac61070c3660046126b8565b611622565b60006001600160a01b0383166107825760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806107d957506001600160e01b031982166303a24d0760e21b145b806107f457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6005546001600160a01b031633146108245760405162461bcd60e51b815260040161077990612ce6565b61082d81611665565b50565b60606006805461083f90612e4f565b80601f016020809104026020016040519081016040528092919081815260200182805461086b90612e4f565b80156108b85780601f1061088d576101008083540402835291602001916108b8565b820191906000526020600020905b81548152906001019060200180831161089b57829003601f168201915b5050505050905090565b6000818152600460205260408120546060911061091a5760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610779565b6109238261167c565b6000838152600e6020908152604091829020915161094693926001019101612997565b6040516020818303038152906040529050919050565b600c54600160a01b900460ff166109b55760405162461bcd60e51b815260206004820152601860248201527f53776970612073616c65206973206e6f742061637469766500000000000000006044820152606401610779565b6000818152600e60205260409020546109cf908390611710565b341015610a1e5760405162461bcd60e51b815260206004820152601960248201527f537769706120616d6f756e74206973206e6f742076616c6964000000000000006044820152606401610779565b6000818152600e602052604090206003810154600290910154610a418483612db3565b1115610a865760405162461bcd60e51b81526020600482015260146024820152734f72646572206578636565647320737570706c7960601b6044820152606401610779565b6000828152600e6020526040902060030154610aa3908490612db3565b600e600084815260200190815260200160002060030181905550610ad833838560405180602001604052806000815250611723565b505050565b6001600160a01b038516331480610af95750610af98533610683565b610b605760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610779565b610b6d858585858561172f565b5050505050565b60004711610bc45760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820657468657220746f207769746864726177000000006044820152606401610779565b60085447906000906001600160a01b0316612710610be4846101a9612ded565b610bee9190612dcb565b604051600081818185875af1925050503d8060008114610c2a576040519150601f19603f3d011682016040523d82523d6000602084013e610c2f565b606091505b50506009549091506000906001600160a01b0316612710610c52856101a9612ded565b610c5c9190612dcb565b604051600081818185875af1925050503d8060008114610c98576040519150601f19603f3d011682016040523d82523d6000602084013e610c9d565b606091505b5050600a549091506000906001600160a01b03166103e8610cc08661019f612ded565b610cca9190612dcb565b604051600081818185875af1925050503d8060008114610d06576040519150601f19603f3d011682016040523d82523d6000602084013e610d0b565b606091505b5050600b549091506000906001600160a01b03166064610d2c87600a612ded565b610d369190612dcb565b604051600081818185875af1925050503d8060008114610d72576040519150601f19603f3d011682016040523d82523d6000602084013e610d77565b606091505b5050600c549091506000906001600160a01b03166064610d98886028612ded565b610da29190612dcb565b604051600081818185875af1925050503d8060008114610dde576040519150601f19603f3d011682016040523d82523d6000602084013e610de3565b606091505b50509050848015610df15750835b8015610dfa5750825b8015610e035750815b8015610e0c5750805b610e4a5760405162461bcd60e51b815260206004820152600f60248201526e4661696c656420776974686472617760881b6044820152606401610779565b505050505050565b6005546001600160a01b03163314610e7c5760405162461bcd60e51b815260040161077990612ce6565b610e846118d1565b565b6005546001600160a01b03163314610eb05760405162461bcd60e51b815260040161077990612ce6565b6009546040516000916001600160a01b03169047905b60006040518083038185875af1925050503d8060008114610f03576040519150601f19603f3d011682016040523d82523d6000602084013e610f08565b606091505b505090508061082d5760405162461bcd60e51b815260206004820152601960248201527f4661696c656420456d657267656e6379205769746864726177000000000000006044820152606401610779565b60608151835114610fbe5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610779565b6000835167ffffffffffffffff811115610fda57610fda612efe565b604051908082528060200260200182016040528015611003578160200160208202803683370190505b50905060005b845181101561107b5761104e85828151811061102757611027612ee8565b602002602001015185838151811061104157611041612ee8565b6020026020010151610711565b82828151811061106057611060612ee8565b602090810291909101015261107481612eb7565b9050611009565b509392505050565b6001600160a01b03831633148061109f575061109f8333610683565b6110bb5760405162461bcd60e51b815260040161077990612bcb565b610ad8838383611964565b6005546001600160a01b031633146110f05760405162461bcd60e51b815260040161077990612ce6565b610e84600061196f565b600e602052600090815260409020805460018201805491929161111c90612e4f565b80601f016020809104026020016040519081016040528092919081815260200182805461114890612e4f565b80156111955780601f1061116a57610100808354040283529160200191611195565b820191906000526020600020905b81548152906001019060200180831161117857829003601f168201915b5050505050908060020154908060030154905084565b6005546001600160a01b031633146111d55760405162461bcd60e51b815260040161077990612ce6565b600c5460ff600160a01b909104161515811515141561122d5760405162461bcd60e51b815260206004820152601460248201527315985b1d595cc8185c99481b9bdd081d985b1a5960621b6044820152606401610779565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b6005546001600160a01b031633146112755760405162461bcd60e51b815260040161077990612ce6565b610e846119c1565b6005546001600160a01b031633146112a75760405162461bcd60e51b815260040161077990612ce6565b6000600e60006112b6600d5490565b815260208082019290925260400160002086815585519092506112e1916001840191908701906122e3565b506002810183905560038101829055610b6d600d80546001019055565b6005546001600160a01b031633146113285760405162461bcd60e51b815260040161077990612ce6565b6000818152600e602090815260409091208481558351611350926001909201918501906122e3565b50505050565b60606007805461083f90612e4f565b336001600160a01b03831614156113d05760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610779565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007805461144990612e4f565b80601f016020809104026020016040519081016040528092919081815260200182805461147590612e4f565b80156114c25780601f10611497576101008083540402835291602001916114c2565b820191906000526020600020905b8154815290600101906020018083116114a557829003601f168201915b505050505081565b6005546001600160a01b03163314610a1e5760405162461bcd60e51b815260040161077990612ce6565b6005546001600160a01b0316331461151e5760405162461bcd60e51b815260040161077990612ce6565b6008546040516000916001600160a01b0316904790610ec6565b6006805461144990612e4f565b6001600160a01b03851633148061156157506115618533610683565b61157d5760405162461bcd60e51b815260040161077990612bcb565b610b6d8585858585611a3c565b6005546001600160a01b031633146115b45760405162461bcd60e51b815260040161077990612ce6565b6001600160a01b0381166116195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610779565b61082d8161196f565b6001600160a01b03831633148061163e575061163e8333610683565b61165a5760405162461bcd60e51b815260040161077990612bcb565b610ad8838383611b68565b80516116789060029060208401906122e3565b5050565b60606002805461168b90612e4f565b80601f01602080910402602001604051908101604052809291908181526020018280546116b790612e4f565b80156117045780601f106116d957610100808354040283529160200191611704565b820191906000526020600020905b8154815290600101906020018083116116e757829003601f168201915b50505050509050919050565b600061171c8284612ded565b9392505050565b61135084848484611b73565b81518351146117505760405162461bcd60e51b815260040161077990612d1b565b6001600160a01b0384166117765760405162461bcd60e51b815260040161077990612c14565b33611785818787878787611ba8565b60005b845181101561186b5760008582815181106117a5576117a5612ee8565b6020026020010151905060008583815181106117c3576117c3612ee8565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156118135760405162461bcd60e51b815260040161077990612c9c565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611850908490612db3565b925050819055505050508061186490612eb7565b9050611788565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118bb929190612afe565b60405180910390a4610e4a818787878787611bb6565b60035460ff1661191a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610779565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610ad8838383611d21565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60035460ff1615611a075760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610779565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119473390565b6001600160a01b038416611a625760405162461bcd60e51b815260040161077990612c14565b33611a81818787611a7288611da3565b611a7b88611da3565b87611ba8565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611ac25760405162461bcd60e51b815260040161077990612c9c565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611aff908490612db3565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b5f828888888888611dee565b50505050505050565b610ad8838383611eb8565b611b7f84848484611eeb565b60008381526004602052604081208054849290611b9d908490612db3565b909155505050505050565b610e4a868686868686611fec565b6001600160a01b0384163b15610e4a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611bfa9089908990889088908890600401612a48565b602060405180830381600087803b158015611c1457600080fd5b505af1925050508015611c44575060408051601f3d908101601f19168201909252611c41918101906127f4565b60015b611cf157611c50612f14565b806308c379a01415611c8a5750611c65612f30565b80611c705750611c8c565b8060405162461bcd60e51b81526004016107799190612b2c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610779565b6001600160e01b0319811663bc197c8160e01b14611b5f5760405162461bcd60e51b815260040161077990612b3f565b611d2c838383612054565b60005b825181101561135057818181518110611d4a57611d4a612ee8565b602002602001015160046000858481518110611d6857611d68612ee8565b602002602001015181526020019081526020016000206000828254611d8d9190612e0c565b90915550611d9c905081612eb7565b9050611d2f565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611ddd57611ddd612ee8565b602090810291909101015292915050565b6001600160a01b0384163b15610e4a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e329089908990889088908890600401612aa6565b602060405180830381600087803b158015611e4c57600080fd5b505af1925050508015611e7c575060408051601f3d908101601f19168201909252611e79918101906127f4565b60015b611e8857611c50612f14565b6001600160e01b0319811663f23a6e6160e01b14611b5f5760405162461bcd60e51b815260040161077990612b3f565b611ec38383836121e2565b60008281526004602052604081208054839290611ee1908490612e0c565b9091555050505050565b6001600160a01b038416611f4b5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610779565b33611f5c81600087611a7288611da3565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611f8c908490612db3565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610b6d81600087878787611dee565b60035460ff1615610e4a5760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610779565b6001600160a01b03831661207a5760405162461bcd60e51b815260040161077990612c59565b805182511461209b5760405162461bcd60e51b815260040161077990612d1b565b60003390506120be81856000868660405180602001604052806000815250611ba8565b60005b83518110156121835760008482815181106120de576120de612ee8565b6020026020010151905060008483815181106120fc576120fc612ee8565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561214c5760405162461bcd60e51b815260040161077990612b87565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061217b81612eb7565b9150506120c1565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516121d4929190612afe565b60405180910390a450505050565b6001600160a01b0383166122085760405162461bcd60e51b815260040161077990612c59565b336122378185600061221987611da3565b61222287611da3565b60405180602001604052806000815250611ba8565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156122785760405162461bcd60e51b815260040161077990612b87565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b8280546122ef90612e4f565b90600052602060002090601f0160209004810192826123115760008555612357565b82601f1061232a57805160ff1916838001178555612357565b82800160010185558215612357579182015b8281111561235757825182559160200191906001019061233c565b50612363929150612367565b5090565b5b808211156123635760008155600101612368565b80356001600160a01b038116811461239357600080fd5b919050565b600082601f8301126123a957600080fd5b813560206123b682612d8f565b6040516123c38282612e8a565b8381528281019150858301600585901b870184018810156123e357600080fd5b60005b85811015612402578135845292840192908401906001016123e6565b5090979650505050505050565b8035801515811461239357600080fd5b600082601f83011261243057600080fd5b813567ffffffffffffffff81111561244a5761244a612efe565b604051612461601f8301601f191660200182612e8a565b81815284602083860101111561247657600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156124a557600080fd5b61171c8261237c565b600080604083850312156124c157600080fd5b6124ca8361237c565b91506124d86020840161237c565b90509250929050565b600080600080600060a086880312156124f957600080fd5b6125028661237c565b94506125106020870161237c565b9350604086013567ffffffffffffffff8082111561252d57600080fd5b61253989838a01612398565b9450606088013591508082111561254f57600080fd5b61255b89838a01612398565b9350608088013591508082111561257157600080fd5b5061257e8882890161241f565b9150509295509295909350565b600080600080600060a086880312156125a357600080fd5b6125ac8661237c565b94506125ba6020870161237c565b93506040860135925060608601359150608086013567ffffffffffffffff8111156125e457600080fd5b61257e8882890161241f565b60008060006060848603121561260557600080fd5b61260e8461237c565b9250602084013567ffffffffffffffff8082111561262b57600080fd5b61263787838801612398565b9350604086013591508082111561264d57600080fd5b5061265a86828701612398565b9150509250925092565b6000806040838503121561267757600080fd5b6126808361237c565b91506124d86020840161240f565b600080604083850312156126a157600080fd5b6126aa8361237c565b946020939093013593505050565b6000806000606084860312156126cd57600080fd5b6126d68461237c565b95602085013595506040909401359392505050565b600080604083850312156126fe57600080fd5b823567ffffffffffffffff8082111561271657600080fd5b818501915085601f83011261272a57600080fd5b8135602061273782612d8f565b6040516127448282612e8a565b8381528281019150858301600585901b870184018b101561276457600080fd5b600096505b8487101561278e5761277a8161237c565b835260019690960195918301918301612769565b50965050860135925050808211156127a557600080fd5b506127b285828601612398565b9150509250929050565b6000602082840312156127ce57600080fd5b61171c8261240f565b6000602082840312156127e957600080fd5b813561171c81612fba565b60006020828403121561280657600080fd5b815161171c81612fba565b60006020828403121561282357600080fd5b813567ffffffffffffffff81111561283a57600080fd5b6128468482850161241f565b949350505050565b60006020828403121561286057600080fd5b5035919050565b60008060006060848603121561287c57600080fd5b83359250602084013567ffffffffffffffff81111561289a57600080fd5b6128a68682870161241f565b925050604084013590509250925092565b600080600080608085870312156128cd57600080fd5b84359350602085013567ffffffffffffffff8111156128eb57600080fd5b6128f78782880161241f565b949794965050505060408301359260600135919050565b6000806040838503121561292157600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101561296057815187529582019590820190600101612944565b509495945050505050565b60008151808452612983816020860160208601612e23565b601f01601f19169290920160200192915050565b6000835160206129aa8285838901612e23565b845491840191600090600181811c90808316806129c857607f831692505b8583108114156129e657634e487b7160e01b85526022600452602485fd5b8080156129fa5760018114612a0b57612a38565b60ff19851688528388019550612a38565b60008b81526020902060005b85811015612a305781548a820152908401908801612a17565b505083880195505b50939a9950505050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612a7490830186612930565b8281036060840152612a868186612930565b90508281036080840152612a9a818561296b565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612ae09083018461296b565b979650505050505050565b60208152600061171c6020830184612930565b604081526000612b116040830185612930565b8281036020840152612b238185612930565b95945050505050565b60208152600061171c602083018461296b565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b848152608060208201526000612d7c608083018661296b565b6040830194909452506060015292915050565b600067ffffffffffffffff821115612da957612da9612efe565b5060051b60200190565b60008219821115612dc657612dc6612ed2565b500190565b600082612de857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612e0757612e07612ed2565b500290565b600082821015612e1e57612e1e612ed2565b500390565b60005b83811015612e3e578181015183820152602001612e26565b838111156113505750506000910152565b600181811c90821680612e6357607f821691505b60208210811415612e8457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612eb057612eb0612efe565b6040525050565b6000600019821415612ecb57612ecb612ed2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612f2d5760046000803e5060005160e01c5b90565b600060443d1015612f3e5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612f6e57505050505090565b8285019150815181811115612f865750505050505090565b843d8701016020828501011115612fa05750505050505090565b612faf60208286010187612e8a565b509095945050505050565b6001600160e01b03198116811461082d57600080fdfea2646970667358221220dbfd911f8ab72348e90b19b257faa5eae3746876e1214e1308eec219ddd953e664736f6c63430008070033

Deployed Bytecode Sourcemap

198:4331:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2054:228:4;;;;;;;;;;-1:-1:-1;2054:228:4;;;;;:::i;:::-;;:::i;:::-;;;24029:25:18;;;24017:2;24002:18;2054:228:4;;;;;;;;1105:305;;;;;;;;;;-1:-1:-1;1105:305:4;;;;;:::i;:::-;;:::i;:::-;;;13618:14:18;;13611:22;13593:41;;13581:2;13566:18;1105:305:4;13453:187:18;490:91:0;;;;;;;;;;-1:-1:-1;490:91:0;;;;;:::i;:::-;;:::i;:::-;;591:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4266:257:17:-;;;;;;;;;;-1:-1:-1;4266:257:17;;;;;:::i;:::-;;:::i;1951:550::-;;;;;;:::i;:::-;;:::i;4082:430:4:-;;;;;;;;;;-1:-1:-1;4082:430:4;;;;;:::i;:::-;;:::i;3544:716:17:-;;;;;;;;;;;;;:::i;415:65:0:-;;;;;;;;;;;;;:::i;3315:223:17:-;;;;;;;;;;;;;:::i;2439:508:4:-;;;;;;;;;;-1:-1:-1;2439:508:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;807:120:7:-;;;;;;;;;;-1:-1:-1;807:120:7;;;;;:::i;:::-;864:4;691:16;;;:12;:16;;;;;;-1:-1:-1;;;807:120:7;716:32:17;;;;;;;;;;-1:-1:-1;716:32:17;;;;-1:-1:-1;;;716:32:17;;;;;;1034:84:15;;;;;;;;;;-1:-1:-1;1104:7:15;;;;1034:84;;327:71:17;;;;;;;;;;-1:-1:-1;327:71:17;;;;-1:-1:-1;;;;;327:71:17;;;;;;-1:-1:-1;;;;;11277:32:18;;;11259:51;;11247:2;11232:18;327:71:17;11113:203:18;628:342:5;;;;;;;;;;-1:-1:-1;628:342:5;;;;;:::i;:::-;;:::i;641:68:17:-;;;;;;;;;;-1:-1:-1;641:68:17;;;;-1:-1:-1;;;;;641:68:17;;;1598:92:14;;;;;;;;;;;;;:::i;803:50:17:-;;;;;;;;;;-1:-1:-1;803:50:17;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;404:71::-;;;;;;;;;;-1:-1:-1;404:71:17;;;;-1:-1:-1;;;;;404:71:17;;;2896:183;;;;;;;;;;-1:-1:-1;2896:183:17;;;;;:::i;:::-;;:::i;348:61:0:-;;;;;;;;;;;;;:::i;1152:478:17:-;;;;;;;;;;-1:-1:-1;1152:478:17;;;;;:::i;:::-;;:::i;1636:302::-;;;;;;;;;;-1:-1:-1;1636:302:17;;;;;:::i;:::-;;:::i;966:85:14:-;;;;;;;;;;-1:-1:-1;1038:6:14;;-1:-1:-1;;;;;1038:6:14;966:85;;678::0;;;;;;;;;;;;;:::i;3015:306:4:-;;;;;;;;;;-1:-1:-1;3015:306:4;;;;;:::i;:::-;;:::i;313:21:0:-;;;;;;;;;;;;;:::i;559:76:17:-;;;;;;;;;;-1:-1:-1;559:76:17;;;;-1:-1:-1;;;;;559:76:17;;;603:111:7;;;;;;;;;;-1:-1:-1;603:111:7;;;;;:::i;:::-;665:7;691:16;;;:12;:16;;;;;;;603:111;481:72:17;;;;;;;;;;-1:-1:-1;481:72:17;;;;-1:-1:-1;;;;;481:72:17;;;2507:383;;;;;;;;;;-1:-1:-1;2507:383:17;;;;;:::i;:::-;;:::i;3089:220::-;;;;;;;;;;;;;:::i;288:19:0:-;;;;;;;;;;;;;:::i;3388:166:4:-;;;;;;;;;;-1:-1:-1;3388:166:4;;;;;:::i;:::-;-1:-1:-1;;;;;3510:27:4;;;3487:4;3510:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3388:166;3621:389;;;;;;;;;;-1:-1:-1;3621:389:4;;;;;:::i;:::-;;:::i;1839:189:14:-;;;;;;;;;;-1:-1:-1;1839:189:14;;;;;:::i;:::-;;:::i;312:310:5:-;;;;;;;;;;-1:-1:-1;312:310:5;;;;;:::i;:::-;;:::i;2054:228:4:-;2140:7;-1:-1:-1;;;;;2167:21:4;;2159:77;;;;-1:-1:-1;;;2159:77:4;;15250:2:18;2159:77:4;;;15232:21:18;15289:2;15269:18;;;15262:30;15328:34;15308:18;;;15301:62;-1:-1:-1;;;15379:18:18;;;15372:41;15430:19;;2159:77:4;;;;;;;;;-1:-1:-1;2253:9:4;:13;;;;;;;;;;;-1:-1:-1;;;;;2253:22:4;;;;;;;;;;;;2054:228::o;1105:305::-;1207:4;-1:-1:-1;;;;;;1242:41:4;;-1:-1:-1;;;1242:41:4;;:109;;-1:-1:-1;;;;;;;1299:52:4;;-1:-1:-1;;;1299:52:4;1242:109;:161;;;-1:-1:-1;;;;;;;;;;871:40:8;;;1367:36:4;1223:180;1105:305;-1:-1:-1;;1105:305:4:o;490:91:0:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;558:16:0::1;566:7;558;:16::i;:::-;490:91:::0;:::o;591:81::-;628:13;660:5;653:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;591:81;:::o;4266:257:17:-;4378:1;691:16:7;;;:12;:16;;;;;;4322:13:17;;-1:-1:-1;4351:55:17;;;;-1:-1:-1;;;4351:55:17;;21749:2:18;4351:55:17;;;21731:21:18;21788:2;21768:18;;;21761:30;-1:-1:-1;;;21807:18:18;;;21800:52;21869:18;;4351:55:17;21547:346:18;4351:55:17;4464:14;4474:3;4464:9;:14::i;:::-;4480:17;;;;:12;:17;;;;;;;;;4447:68;;;;;4480:34;;;4447:68;;:::i;:::-;;;;;;;;;;;;;4433:83;;4266:257;;;:::o;1951:550::-;2065:12;;-1:-1:-1;;;2065:12:17;;;;2057:50;;;;-1:-1:-1;;;2057:50:17;;17177:2:18;2057:50:17;;;17159:21:18;17216:2;17196:18;;;17189:30;17255:26;17235:18;;;17228:54;17299:18;;2057:50:17;16975:348:18;2057:50:17;2149:20;;;;:12;:20;;;;;:30;2138:42;;:6;;:10;:42::i;:::-;2125:9;:55;;2117:93;;;;-1:-1:-1;;;2117:93:17;;23731:2:18;2117:93:17;;;23713:21:18;23770:2;23750:18;;;23743:30;23809:27;23789:18;;;23782:55;23854:18;;2117:93:17;23529:349:18;2117:93:17;2221:18;2242:20;;;:12;:20;;;;;:27;;;;2313:30;;;;;2287:22;2303:6;2242:27;2287:22;:::i;:::-;:56;;2279:90;;;;-1:-1:-1;;;2279:90:17;;19523:2:18;2279:90:17;;;19505:21:18;19562:2;19542:18;;;19535:30;-1:-1:-1;;;19581:18:18;;;19574:50;19641:18;;2279:90:17;19321:344:18;2279:90:17;2409:20;;;;:12;:20;;;;;:27;;;:36;;2439:6;;2409:36;:::i;:::-;2379:12;:20;2392:6;2379:20;;;;;;;;;;;:27;;:66;;;;2457:37;2463:10;2475:6;2483;2457:37;;;;;;;;;;;;:5;:37::i;:::-;2047:454;1951:550;;:::o;4082:430:4:-;-1:-1:-1;;;;;4307:20:4;;665:10:2;4307:20:4;;:60;;-1:-1:-1;4331:36:4;4348:4;665:10:2;3388:166:4;:::i;4331:36::-;4286:157;;;;-1:-1:-1;;;4286:157:4;;19104:2:18;4286:157:4;;;19086:21:18;19143:2;19123:18;;;19116:30;19182:34;19162:18;;;19155:62;-1:-1:-1;;;19233:18:18;;;19226:48;19291:19;;4286:157:4;18902:414:18;4286:157:4;4453:52;4476:4;4482:2;4486:3;4491:7;4500:4;4453:22;:52::i;:::-;4082:430;;;;;:::o;3544:716:17:-;3615:1;3591:21;:25;3583:66;;;;-1:-1:-1;;;3583:66:17;;21392:2:18;3583:66:17;;;21374:21:18;21431:2;21411:18;;;21404:30;21470;21450:18;;;21443:58;21518:18;;3583:66:17;21190:352:18;3583:66:17;3748:11;;3683:21;;3659;;-1:-1:-1;;;;;3748:11:17;3794:5;3772:19;3683:21;3788:3;3772:19;:::i;:::-;:27;;;;:::i;:::-;3748:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3835:11:17;;3727:77;;-1:-1:-1;3815:15:17;;-1:-1:-1;;;;;3835:11:17;3881:5;3859:19;:13;3875:3;3859:19;:::i;:::-;:27;;;;:::i;:::-;3835:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3922:12:17;;3814:77;;-1:-1:-1;3902:15:17;;-1:-1:-1;;;;;3922:12:17;3969:4;3947:19;:13;3963:3;3947:19;:::i;:::-;:26;;;;:::i;:::-;3922:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4009:16:17;;3901:77;;-1:-1:-1;3989:15:17;;-1:-1:-1;;;;;4009:16:17;4059:3;4038:18;:13;4054:2;4038:18;:::i;:::-;:24;;;;:::i;:::-;4009:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4098:8:17;;3988:79;;-1:-1:-1;4078:15:17;;-1:-1:-1;;;;;4098:8:17;4140:3;4119:18;:13;4135:2;4119:18;:::i;:::-;:24;;;;:::i;:::-;4098:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4077:71;;;4167:10;:24;;;;;4181:10;4167:24;:38;;;;;4195:10;4167:38;:52;;;;;4209:10;4167:52;:66;;;;;4223:10;4167:66;4159:94;;;;-1:-1:-1;;;4159:94:17;;21048:2:18;4159:94:17;;;21030:21:18;21087:2;21067:18;;;21060:30;-1:-1:-1;;;21106:18:18;;;21099:45;21161:18;;4159:94:17;20846:339:18;4159:94:17;3573:687;;;;;;3544:716::o;415:65:0:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;463:10:0::1;:8;:10::i;:::-;415:65::o:0;3315:223:17:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;3409:11:17::1;::::0;:50:::1;::::0;3375:29:::1;::::0;-1:-1:-1;;;;;3409:11:17::1;::::0;3433:21:::1;::::0;3409:50:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3374:85;;;3477:24;3469:62;;;::::0;-1:-1:-1;;;3469:62:17;;15662:2:18;3469:62:17::1;::::0;::::1;15644:21:18::0;15701:2;15681:18;;;15674:30;15740:27;15720:18;;;15713:55;15785:18;;3469:62:17::1;15460:349:18::0;2439:508:4;2590:16;2649:3;:10;2630:8;:15;:29;2622:83;;;;-1:-1:-1;;;2622:83:4;;22510:2:18;2622:83:4;;;22492:21:18;22549:2;22529:18;;;22522:30;22588:34;22568:18;;;22561:62;-1:-1:-1;;;22639:18:18;;;22632:39;22688:19;;2622:83:4;22308:405:18;2622:83:4;2716:30;2763:8;:15;2749:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2749:30:4;;2716:63;;2795:9;2790:120;2814:8;:15;2810:1;:19;2790:120;;;2869:30;2879:8;2888:1;2879:11;;;;;;;;:::i;:::-;;;;;;;2892:3;2896:1;2892:6;;;;;;;;:::i;:::-;;;;;;;2869:9;:30::i;:::-;2850:13;2864:1;2850:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2831:3;;;:::i;:::-;;;2790:120;;;-1:-1:-1;2927:13:4;2439:508;-1:-1:-1;;;2439:508:4:o;628:342:5:-;-1:-1:-1;;;;;787:23:5;;665:10:2;787:23:5;;:66;;-1:-1:-1;814:39:5;831:7;665:10:2;3388:166:4;:::i;814:39:5:-;766:154;;;;-1:-1:-1;;;766:154:5;;;;;;;:::i;:::-;931:32;942:7;951:3;956:6;931:10;:32::i;1598:92:14:-;1038:6;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;803:50:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2896:183::-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;2978:12:17::1;::::0;::::1;-1:-1:-1::0;;;2978:12:17;;::::1;;:29;;::::0;::::1;;;;2969:65;;;::::0;-1:-1:-1;;;2969:65:17;;16828:2:18;2969:65:17::1;::::0;::::1;16810:21:18::0;16867:2;16847:18;;;16840:30;-1:-1:-1;;;16886:18:18;;;16879:50;16946:18;;2969:65:17::1;16626:344:18::0;2969:65:17::1;3044:12;:28:::0;;;::::1;;-1:-1:-1::0;;;3044:28:17::1;-1:-1:-1::0;;;;3044:28:17;;::::1;::::0;;;::::1;::::0;;2896:183::o;348:61:0:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;394:8:0::1;:6;:8::i;1152:478:17:-:0;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;1330:31:17::1;1364:12;:36;1377:22;:12;864:14:3::0;;773:112;1377:22:17::1;1364:36:::0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;1364:36:17;1410:35;;;1455:49;;1364:36;;-1:-1:-1;1455:49:17::1;::::0;:29:::1;::::0;::::1;::::0;:49;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;1514:22:17::1;::::0;::::1;:35:::0;;;1559:19:::1;::::0;::::1;:29:::0;;;1598:24:::1;:12;978:19:3::0;;996:1;978:19;;;891:123;1636:302:17;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;1803:25:17::1;::::0;;;:12:::1;:25;::::0;;;;;;;:48;;;1865:62;;::::1;::::0;:42:::1;::::0;;::::1;::::0;:62;::::1;::::0;::::1;:::i;:::-;;1636:302:::0;;;:::o;678:85:0:-;717:13;749:7;742:14;;;;;:::i;3015:306:4:-;665:10:2;-1:-1:-1;;;;;3117:24:4;;;;3109:78;;;;-1:-1:-1;;;3109:78:4;;22100:2:18;3109:78:4;;;22082:21:18;22139:2;22119:18;;;22112:30;22178:34;22158:18;;;22151:62;-1:-1:-1;;;22229:18:18;;;22222:39;22278:19;;3109:78:4;21898:405:18;3109:78:4;665:10:2;3198:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;3198:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;3198:53:4;;;;;;;;;;3266:48;;13593:41:18;;;3198:42:4;;665:10:2;3266:48:4;;13566:18:18;3266:48:4;;;;;;;3015:306;;:::o;313:21:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2507:383:17:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;3089:220:17:-;1038:6:14;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;3181:11:17::1;::::0;:50:::1;::::0;3148:28:::1;::::0;-1:-1:-1;;;;;3181:11:17::1;::::0;3205:21:::1;::::0;3181:50:::1;10903:205:18::0;288:19:0;;;;;;;:::i;3621:389:4:-;-1:-1:-1;;;;;3821:20:4;;665:10:2;3821:20:4;;:60;;-1:-1:-1;3845:36:4;3862:4;665:10:2;3388:166:4;:::i;3845:36::-;3800:148;;;;-1:-1:-1;;;3800:148:4;;;;;;;:::i;:::-;3958:45;3976:4;3982:2;3986;3990:6;3998:4;3958:17;:45::i;1839:189:14:-;1038:6;;-1:-1:-1;;;;;1038:6:14;665:10:2;1178:23:14;1170:68;;;;-1:-1:-1;;;1170:68:14;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:14;::::1;1919:73;;;::::0;-1:-1:-1;;;1919:73:14;;16016:2:18;1919:73:14::1;::::0;::::1;15998:21:18::0;16055:2;16035:18;;;16028:30;16094:34;16074:18;;;16067:62;-1:-1:-1;;;16145:18:18;;;16138:36;16191:19;;1919:73:14::1;15814:402:18::0;1919:73:14::1;2002:19;2012:8;2002:9;:19::i;312:310:5:-:0;-1:-1:-1;;;;;446:23:5;;665:10:2;446:23:5;;:66;;-1:-1:-1;473:39:5;490:7;665:10:2;3388:166:4;:::i;473:39:5:-;425:154;;;;-1:-1:-1;;;425:154:5;;;;;;;:::i;:::-;590:25;596:7;605:2;609:5;590;:25::i;7973:86:4:-;8039:13;;;;:4;;:13;;;;;:::i;:::-;;7973:86;:::o;1809:103::-;1869:13;1901:4;1894:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1809:103;;;:::o;3382:96:16:-;3440:7;3466:5;3470:1;3466;:5;:::i;:::-;3459:12;3382:96;-1:-1:-1;;;3382:96:16:o;779:222:0:-;956:38;968:7;977:2;981:6;989:4;956:11;:38::i;6105:1045:4:-;6325:7;:14;6311:3;:10;:28;6303:81;;;;-1:-1:-1;;;6303:81:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;6402:16:4;;6394:66;;;;-1:-1:-1;;;6394:66:4;;;;;;;:::i;:::-;665:10:2;6513:60:4;665:10:2;6544:4:4;6550:2;6554:3;6559:7;6568:4;6513:20;:60::i;:::-;6589:9;6584:411;6608:3;:10;6604:1;:14;6584:411;;;6639:10;6652:3;6656:1;6652:6;;;;;;;;:::i;:::-;;;;;;;6639:19;;6672:14;6689:7;6697:1;6689:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6714:19;6736:13;;;;;;;;;;-1:-1:-1;;;;;6736:19:4;;;;;;;;;;;;6689:10;;-1:-1:-1;6777:21:4;;;;6769:76;;;;-1:-1:-1;;;6769:76:4;;;;;;;:::i;:::-;6887:9;:13;;;;;;;;;;;-1:-1:-1;;;;;6887:19:4;;;;;;;;;;6909:20;;;6887:42;;6957:17;;;;;;;:27;;6909:20;;6887:9;6957:27;;6909:20;;6957:27;:::i;:::-;;;;;;;;6625:370;;;6620:3;;;;:::i;:::-;;;6584:411;;;;7040:2;-1:-1:-1;;;;;7010:47:4;7034:4;-1:-1:-1;;;;;7010:47:4;7024:8;-1:-1:-1;;;;;7010:47:4;;7044:3;7049:7;7010:47;;;;;;;:::i;:::-;;;;;;;;7068:75;7104:8;7114:4;7120:2;7124:3;7129:7;7138:4;7068:35;:75::i;2046:117:15:-;1104:7;;;;1605:41;;;;-1:-1:-1;;;1605:41:15;;14901:2:18;1605:41:15;;;14883:21:18;14940:2;14920:18;;;14913:30;-1:-1:-1;;;14959:18:18;;;14952:50;15019:18;;1605:41:15;14699:344:18;1605:41:15;2104:7:::1;:15:::0;;-1:-1:-1;;2104:15:15::1;::::0;;2134:22:::1;665:10:2::0;2143:12:15::1;2134:22;::::0;-1:-1:-1;;;;;11277:32:18;;;11259:51;;11247:2;11232:18;2134:22:15::1;;;;;;;2046:117::o:0;1452:221:0:-;1627:39;1644:7;1653:3;1658:7;1627:16;:39::i;2034:169:14:-;2108:6;;;-1:-1:-1;;;;;2124:17:14;;;-1:-1:-1;;;;;;2124:17:14;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2079:124;2034:169;:::o;1799:115:15:-;1104:7;;;;1347:9;1339:38;;;;-1:-1:-1;;;1339:38:15;;18353:2:18;1339:38:15;;;18335:21:18;18392:2;18372:18;;;18365:30;-1:-1:-1;;;18411:18:18;;;18404:46;18467:18;;1339:38:15;18151:340:18;1339:38:15;1858:7:::1;:14:::0;;-1:-1:-1;;1858:14:15::1;1868:4;1858:14;::::0;;1887:20:::1;1894:12;665:10:2::0;;586:96;4962:797:4;-1:-1:-1;;;;;5143:16:4;;5135:66;;;;-1:-1:-1;;;5135:66:4;;;;;;;:::i;:::-;665:10:2;5254:96:4;665:10:2;5285:4:4;5291:2;5295:21;5313:2;5295:17;:21::i;:::-;5318:25;5336:6;5318:17;:25::i;:::-;5345:4;5254:20;:96::i;:::-;5361:19;5383:13;;;;;;;;;;;-1:-1:-1;;;;;5383:19:4;;;;;;;;;;5420:21;;;;5412:76;;;;-1:-1:-1;;;5412:76:4;;;;;;;:::i;:::-;5522:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5522:19:4;;;;;;;;;;5544:20;;;5522:42;;5584:17;;;;;;;:27;;5544:20;;5522:9;5584:27;;5544:20;;5584:27;:::i;:::-;;;;-1:-1:-1;;5627:46:4;;;24678:25:18;;;24734:2;24719:18;;24712:34;;;-1:-1:-1;;;;;5627:46:4;;;;;;;;;;;;;;24651:18:18;5627:46:4;;;;;;;5684:68;5715:8;5725:4;5731:2;5735;5739:6;5747:4;5684:30;:68::i;:::-;5125:634;;4962:797;;;;;:::o;1257:189:0:-;1407:32;1419:7;1428:2;1432:6;1407:11;:32::i;982:234:7:-;1135:38;1147:7;1156:2;1160:6;1168:4;1135:11;:38::i;:::-;1183:16;;;;:12;:16;;;;;:26;;1203:6;;1183:16;:26;;1203:6;;1183:26;:::i;:::-;;;;-1:-1:-1;;;;;;982:234:7:o;1681:330:0:-;1938:66;1965:8;1975:4;1981:2;1985:3;1990:7;1999:4;1938:26;:66::i;13973:796:4:-;-1:-1:-1;;;;;14205:13:4;;1034:20:1;1080:8;14201:562:4;;14240:79;;-1:-1:-1;;;14240:79:4;;-1:-1:-1;;;;;14240:43:4;;;;;:79;;14284:8;;14294:4;;14300:3;;14305:7;;14314:4;;14240:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14240:79:4;;;;;;;;-1:-1:-1;;14240:79:4;;;;;;;;;;;;:::i;:::-;;;14236:517;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14629:6;14622:14;;-1:-1:-1;;;14622:14:4;;;;;;;;:::i;14236:517::-;;;14676:62;;-1:-1:-1;;;14676:62:4;;14071:2:18;14676:62:4;;;14053:21:18;14110:2;14090:18;;;14083:30;14149:34;14129:18;;;14122:62;-1:-1:-1;;;14200:18:18;;;14193:50;14260:19;;14676:62:4;13869:416:18;14236:517:4;-1:-1:-1;;;;;;14398:64:4;;-1:-1:-1;;;14398:64:4;14394:161;;14486:50;;-1:-1:-1;;;14486:50:4;;;;;;;:::i;1921:306:7:-;2072:39;2089:7;2098:3;2103:7;2072:16;:39::i;:::-;2126:9;2121:100;2145:3;:10;2141:1;:14;2121:100;;;2200:7;2208:1;2200:10;;;;;;;;:::i;:::-;;;;;;;2176:12;:20;2189:3;2193:1;2189:6;;;;;;;;:::i;:::-;;;;;;;2176:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;2157:3:7;;-1:-1:-1;2157:3:7;;:::i;:::-;;;2121:100;;14775:193:4;14894:16;;;14908:1;14894:16;;;;;;;;;14841;;14869:22;;14894:16;;;;;;;;;;;;-1:-1:-1;14894:16:4;14869:41;;14931:7;14920:5;14926:1;14920:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;14956:5;14775:193;-1:-1:-1;;14775:193:4:o;13238:729::-;-1:-1:-1;;;;;13445:13:4;;1034:20:1;1080:8;13441:520:4;;13480:72;;-1:-1:-1;;;13480:72:4;;-1:-1:-1;;;;;13480:38:4;;;;;:72;;13519:8;;13529:4;;13535:2;;13539:6;;13547:4;;13480:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13480:72:4;;;;;;;;-1:-1:-1;;13480:72:4;;;;;;;;;;;;:::i;:::-;;;13476:475;;;;:::i;:::-;-1:-1:-1;;;;;;13601:59:4;;-1:-1:-1;;;13601:59:4;13597:156;;13684:50;;-1:-1:-1;;;13684:50:4;;;;;;;:::i;1660:201:7:-;1786:32;1798:7;1807:2;1811:6;1786:11;:32::i;:::-;1828:16;;;;:12;:16;;;;;:26;;1848:6;;1828:16;:26;;1848:6;;1828:26;:::i;:::-;;;;-1:-1:-1;;;;;1660:201:7:o;8447:583:4:-;-1:-1:-1;;;;;8599:21:4;;8591:67;;;;-1:-1:-1;;;8591:67:4;;23329:2:18;8591:67:4;;;23311:21:18;23368:2;23348:18;;;23341:30;23407:34;23387:18;;;23380:62;-1:-1:-1;;;23458:18:18;;;23451:31;23499:19;;8591:67:4;23127:397:18;8591:67:4;665:10:2;8711:107:4;665:10:2;8669:16:4;8754:7;8763:21;8781:2;8763:17;:21::i;8711:107::-;8829:9;:13;;;;;;;;;;;-1:-1:-1;;;;;8829:22:4;;;;;;;;;:32;;8855:6;;8829:9;:32;;8855:6;;8829:32;:::i;:::-;;;;-1:-1:-1;;8876:57:4;;;24678:25:18;;;24734:2;24719:18;;24712:34;;;-1:-1:-1;;;;;8876:57:4;;;;8909:1;;8876:57;;;;;;24651:18:18;8876:57:4;;;;;;;8944:79;8975:8;8993:1;8997:7;9006:2;9010:6;9018:4;8944:30;:79::i;612:381:6:-;1104:7:15;;;;928:9:6;920:66;;;;-1:-1:-1;;;920:66:6;;17530:2:18;920:66:6;;;17512:21:18;17569:2;17549:18;;;17542:30;17608:34;17588:18;;;17581:62;-1:-1:-1;;;17659:18:18;;;17652:42;17711:19;;920:66:6;17328:408:18;11190:894:4;-1:-1:-1;;;;;11340:21:4;;11332:69;;;;-1:-1:-1;;;11332:69:4;;;;;;;:::i;:::-;11433:7;:14;11419:3;:10;:28;11411:81;;;;-1:-1:-1;;;11411:81:4;;;;;;;:::i;:::-;11503:16;665:10:2;11503:31:4;;11545:69;11566:8;11576:7;11593:1;11597:3;11602:7;11545:69;;;;;;;;;;;;:20;:69::i;:::-;11630:9;11625:379;11649:3;:10;11645:1;:14;11625:379;;;11680:10;11693:3;11697:1;11693:6;;;;;;;;:::i;:::-;;;;;;;11680:19;;11713:14;11730:7;11738:1;11730:10;;;;;;;;:::i;:::-;;;;;;;;;;;;11755:22;11780:13;;;;;;;;;;-1:-1:-1;;;;;11780:22:4;;;;;;;;;;;;11730:10;;-1:-1:-1;11824:24:4;;;;11816:73;;;;-1:-1:-1;;;11816:73:4;;;;;;;:::i;:::-;11931:9;:13;;;;;;;;;;;-1:-1:-1;;;;;11931:22:4;;;;;;;;;;11956:23;;11931:48;;11661:3;;;;:::i;:::-;;;;11625:379;;;;12060:1;-1:-1:-1;;;;;12019:58:4;12043:7;-1:-1:-1;;;;;12019:58:4;12033:8;-1:-1:-1;;;;;12019:58:4;;12064:3;12069:7;12019:58;;;;;;;:::i;:::-;;;;;;;;11322:762;11190:894;;;:::o;10339:657::-;-1:-1:-1;;;;;10464:21:4;;10456:69;;;;-1:-1:-1;;;10456:69:4;;;;;;;:::i;:::-;665:10:2;10578:105:4;665:10:2;10609:7:4;10536:16;10630:21;10648:2;10630:17;:21::i;:::-;10653:25;10671:6;10653:17;:25::i;:::-;10578:105;;;;;;;;;;;;:20;:105::i;:::-;10694:22;10719:13;;;;;;;;;;;-1:-1:-1;;;;;10719:22:4;;;;;;;;;;10759:24;;;;10751:73;;;;-1:-1:-1;;;10751:73:4;;;;;;;:::i;:::-;10858:9;:13;;;;;;;;;;;-1:-1:-1;;;;;10858:22:4;;;;;;;;;;;;10883:23;;;10858:48;;10932:57;;24678:25:18;;;24719:18;;;24712:34;;;10858:22:4;;10932:57;;;;;;24651:18:18;10932:57:4;;;;;;;10446:550;;10339:657;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:18;82:20;;-1:-1:-1;;;;;131:31:18;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:735::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:18;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:18;;;702:1;699;692:12;645:61;724:1;734:163;748:2;745:1;742:9;734:163;;;805:17;;793:30;;843:12;;;;875;;;;766:1;759:9;734:163;;;-1:-1:-1;915:6:18;;192:735;-1:-1:-1;;;;;;;192:735:18:o;932:160::-;997:20;;1053:13;;1046:21;1036:32;;1026:60;;1082:1;1079;1072:12;1097:555;1139:5;1192:3;1185:4;1177:6;1173:17;1169:27;1159:55;;1210:1;1207;1200:12;1159:55;1246:6;1233:20;1272:18;1268:2;1265:26;1262:52;;;1294:18;;:::i;:::-;1343:2;1337:9;1355:67;1410:2;1391:13;;-1:-1:-1;;1387:27:18;1416:4;1383:38;1337:9;1355:67;:::i;:::-;1446:2;1438:6;1431:18;1492:3;1485:4;1480:2;1472:6;1468:15;1464:26;1461:35;1458:55;;;1509:1;1506;1499:12;1458:55;1573:2;1566:4;1558:6;1554:17;1547:4;1539:6;1535:17;1522:54;1620:1;1596:15;;;1613:4;1592:26;1585:37;;;;1600:6;1097:555;-1:-1:-1;;;1097:555:18:o;1657:186::-;1716:6;1769:2;1757:9;1748:7;1744:23;1740:32;1737:52;;;1785:1;1782;1775:12;1737:52;1808:29;1827:9;1808:29;:::i;1848:260::-;1916:6;1924;1977:2;1965:9;1956:7;1952:23;1948:32;1945:52;;;1993:1;1990;1983:12;1945:52;2016:29;2035:9;2016:29;:::i;:::-;2006:39;;2064:38;2098:2;2087:9;2083:18;2064:38;:::i;:::-;2054:48;;1848:260;;;;;:::o;2113:943::-;2267:6;2275;2283;2291;2299;2352:3;2340:9;2331:7;2327:23;2323:33;2320:53;;;2369:1;2366;2359:12;2320:53;2392:29;2411:9;2392:29;:::i;:::-;2382:39;;2440:38;2474:2;2463:9;2459:18;2440:38;:::i;:::-;2430:48;;2529:2;2518:9;2514:18;2501:32;2552:18;2593:2;2585:6;2582:14;2579:34;;;2609:1;2606;2599:12;2579:34;2632:61;2685:7;2676:6;2665:9;2661:22;2632:61;:::i;:::-;2622:71;;2746:2;2735:9;2731:18;2718:32;2702:48;;2775:2;2765:8;2762:16;2759:36;;;2791:1;2788;2781:12;2759:36;2814:63;2869:7;2858:8;2847:9;2843:24;2814:63;:::i;:::-;2804:73;;2930:3;2919:9;2915:19;2902:33;2886:49;;2960:2;2950:8;2947:16;2944:36;;;2976:1;2973;2966:12;2944:36;;2999:51;3042:7;3031:8;3020:9;3016:24;2999:51;:::i;:::-;2989:61;;;2113:943;;;;;;;;:::o;3061:606::-;3165:6;3173;3181;3189;3197;3250:3;3238:9;3229:7;3225:23;3221:33;3218:53;;;3267:1;3264;3257:12;3218:53;3290:29;3309:9;3290:29;:::i;:::-;3280:39;;3338:38;3372:2;3361:9;3357:18;3338:38;:::i;:::-;3328:48;;3423:2;3412:9;3408:18;3395:32;3385:42;;3474:2;3463:9;3459:18;3446:32;3436:42;;3529:3;3518:9;3514:19;3501:33;3557:18;3549:6;3546:30;3543:50;;;3589:1;3586;3579:12;3543:50;3612:49;3653:7;3644:6;3633:9;3629:22;3612:49;:::i;3672:669::-;3799:6;3807;3815;3868:2;3856:9;3847:7;3843:23;3839:32;3836:52;;;3884:1;3881;3874:12;3836:52;3907:29;3926:9;3907:29;:::i;:::-;3897:39;;3987:2;3976:9;3972:18;3959:32;4010:18;4051:2;4043:6;4040:14;4037:34;;;4067:1;4064;4057:12;4037:34;4090:61;4143:7;4134:6;4123:9;4119:22;4090:61;:::i;:::-;4080:71;;4204:2;4193:9;4189:18;4176:32;4160:48;;4233:2;4223:8;4220:16;4217:36;;;4249:1;4246;4239:12;4217:36;;4272:63;4327:7;4316:8;4305:9;4301:24;4272:63;:::i;:::-;4262:73;;;3672:669;;;;;:::o;4346:254::-;4411:6;4419;4472:2;4460:9;4451:7;4447:23;4443:32;4440:52;;;4488:1;4485;4478:12;4440:52;4511:29;4530:9;4511:29;:::i;:::-;4501:39;;4559:35;4590:2;4579:9;4575:18;4559:35;:::i;4605:254::-;4673:6;4681;4734:2;4722:9;4713:7;4709:23;4705:32;4702:52;;;4750:1;4747;4740:12;4702:52;4773:29;4792:9;4773:29;:::i;:::-;4763:39;4849:2;4834:18;;;;4821:32;;-1:-1:-1;;;4605:254:18:o;4864:322::-;4941:6;4949;4957;5010:2;4998:9;4989:7;4985:23;4981:32;4978:52;;;5026:1;5023;5016:12;4978:52;5049:29;5068:9;5049:29;:::i;:::-;5039:39;5125:2;5110:18;;5097:32;;-1:-1:-1;5176:2:18;5161:18;;;5148:32;;4864:322;-1:-1:-1;;;4864:322:18:o;5191:1219::-;5309:6;5317;5370:2;5358:9;5349:7;5345:23;5341:32;5338:52;;;5386:1;5383;5376:12;5338:52;5426:9;5413:23;5455:18;5496:2;5488:6;5485:14;5482:34;;;5512:1;5509;5502:12;5482:34;5550:6;5539:9;5535:22;5525:32;;5595:7;5588:4;5584:2;5580:13;5576:27;5566:55;;5617:1;5614;5607:12;5566:55;5653:2;5640:16;5675:4;5698:43;5738:2;5698:43;:::i;:::-;5770:2;5764:9;5782:31;5810:2;5802:6;5782:31;:::i;:::-;5848:18;;;5882:15;;;;-1:-1:-1;5917:11:18;;;5959:1;5955:10;;;5947:19;;5943:28;;5940:41;-1:-1:-1;5937:61:18;;;5994:1;5991;5984:12;5937:61;6016:1;6007:10;;6026:169;6040:2;6037:1;6034:9;6026:169;;;6097:23;6116:3;6097:23;:::i;:::-;6085:36;;6058:1;6051:9;;;;;6141:12;;;;6173;;6026:169;;;-1:-1:-1;6214:6:18;-1:-1:-1;;6258:18:18;;6245:32;;-1:-1:-1;;6289:16:18;;;6286:36;;;6318:1;6315;6308:12;6286:36;;6341:63;6396:7;6385:8;6374:9;6370:24;6341:63;:::i;:::-;6331:73;;;5191:1219;;;;;:::o;6415:180::-;6471:6;6524:2;6512:9;6503:7;6499:23;6495:32;6492:52;;;6540:1;6537;6530:12;6492:52;6563:26;6579:9;6563:26;:::i;6600:245::-;6658:6;6711:2;6699:9;6690:7;6686:23;6682:32;6679:52;;;6727:1;6724;6717:12;6679:52;6766:9;6753:23;6785:30;6809:5;6785:30;:::i;6850:249::-;6919:6;6972:2;6960:9;6951:7;6947:23;6943:32;6940:52;;;6988:1;6985;6978:12;6940:52;7020:9;7014:16;7039:30;7063:5;7039:30;:::i;7104:321::-;7173:6;7226:2;7214:9;7205:7;7201:23;7197:32;7194:52;;;7242:1;7239;7232:12;7194:52;7282:9;7269:23;7315:18;7307:6;7304:30;7301:50;;;7347:1;7344;7337:12;7301:50;7370:49;7411:7;7402:6;7391:9;7387:22;7370:49;:::i;:::-;7360:59;7104:321;-1:-1:-1;;;;7104:321:18:o;7430:180::-;7489:6;7542:2;7530:9;7521:7;7517:23;7513:32;7510:52;;;7558:1;7555;7548:12;7510:52;-1:-1:-1;7581:23:18;;7430:180;-1:-1:-1;7430:180:18:o;7615:457::-;7702:6;7710;7718;7771:2;7759:9;7750:7;7746:23;7742:32;7739:52;;;7787:1;7784;7777:12;7739:52;7823:9;7810:23;7800:33;;7884:2;7873:9;7869:18;7856:32;7911:18;7903:6;7900:30;7897:50;;;7943:1;7940;7933:12;7897:50;7966:49;8007:7;7998:6;7987:9;7983:22;7966:49;:::i;:::-;7956:59;;;8062:2;8051:9;8047:18;8034:32;8024:42;;7615:457;;;;;:::o;8077:526::-;8173:6;8181;8189;8197;8250:3;8238:9;8229:7;8225:23;8221:33;8218:53;;;8267:1;8264;8257:12;8218:53;8303:9;8290:23;8280:33;;8364:2;8353:9;8349:18;8336:32;8391:18;8383:6;8380:30;8377:50;;;8423:1;8420;8413:12;8377:50;8446:49;8487:7;8478:6;8467:9;8463:22;8446:49;:::i;:::-;8077:526;;8436:59;;-1:-1:-1;;;;8542:2:18;8527:18;;8514:32;;8593:2;8578:18;8565:32;;8077:526;-1:-1:-1;8077:526:18:o;8608:248::-;8676:6;8684;8737:2;8725:9;8716:7;8712:23;8708:32;8705:52;;;8753:1;8750;8743:12;8705:52;-1:-1:-1;;8776:23:18;;;8846:2;8831:18;;;8818:32;;-1:-1:-1;8608:248:18:o;8861:435::-;8914:3;8952:5;8946:12;8979:6;8974:3;8967:19;9005:4;9034:2;9029:3;9025:12;9018:19;;9071:2;9064:5;9060:14;9092:1;9102:169;9116:6;9113:1;9110:13;9102:169;;;9177:13;;9165:26;;9211:12;;;;9246:15;;;;9138:1;9131:9;9102:169;;;-1:-1:-1;9287:3:18;;8861:435;-1:-1:-1;;;;;8861:435:18:o;9301:257::-;9342:3;9380:5;9374:12;9407:6;9402:3;9395:19;9423:63;9479:6;9472:4;9467:3;9463:14;9456:4;9449:5;9445:16;9423:63;:::i;:::-;9540:2;9519:15;-1:-1:-1;;9515:29:18;9506:39;;;;9547:4;9502:50;;9301:257;-1:-1:-1;;9301:257:18:o;9563:1335::-;9739:3;9777:6;9771:13;9803:4;9816:51;9860:6;9855:3;9850:2;9842:6;9838:15;9816:51;:::i;:::-;9952:13;;9889:16;;;;9925:1;;10012;10034:18;;;;10087;;;;10114:93;;10192:4;10182:8;10178:19;10166:31;;10114:93;10255:2;10245:8;10242:16;10222:18;10219:40;10216:167;;;-1:-1:-1;;;10282:33:18;;10338:4;10335:1;10328:15;10368:4;10289:3;10356:17;10216:167;10399:18;10426:110;;;;10550:1;10545:328;;;;10392:481;;10426:110;-1:-1:-1;;10461:24:18;;10447:39;;10506:20;;;;-1:-1:-1;10426:110:18;;10545:328;25018:1;25011:14;;;25055:4;25042:18;;10640:1;10654:169;10668:8;10665:1;10662:15;10654:169;;;10750:14;;10735:13;;;10728:37;10793:16;;;;10685:10;;10654:169;;;10658:3;;10854:8;10847:5;10843:20;10836:27;;10392:481;-1:-1:-1;10889:3:18;;9563:1335;-1:-1:-1;;;;;;;;;;9563:1335:18:o;11321:826::-;-1:-1:-1;;;;;11718:15:18;;;11700:34;;11770:15;;11765:2;11750:18;;11743:43;11680:3;11817:2;11802:18;;11795:31;;;11643:4;;11849:57;;11886:19;;11878:6;11849:57;:::i;:::-;11954:9;11946:6;11942:22;11937:2;11926:9;11922:18;11915:50;11988:44;12025:6;12017;11988:44;:::i;:::-;11974:58;;12081:9;12073:6;12069:22;12063:3;12052:9;12048:19;12041:51;12109:32;12134:6;12126;12109:32;:::i;:::-;12101:40;11321:826;-1:-1:-1;;;;;;;;11321:826:18:o;12152:560::-;-1:-1:-1;;;;;12449:15:18;;;12431:34;;12501:15;;12496:2;12481:18;;12474:43;12548:2;12533:18;;12526:34;;;12591:2;12576:18;;12569:34;;;12411:3;12634;12619:19;;12612:32;;;12374:4;;12661:45;;12686:19;;12678:6;12661:45;:::i;:::-;12653:53;12152:560;-1:-1:-1;;;;;;;12152:560:18:o;12717:261::-;12896:2;12885:9;12878:21;12859:4;12916:56;12968:2;12957:9;12953:18;12945:6;12916:56;:::i;12983:465::-;13240:2;13229:9;13222:21;13203:4;13266:56;13318:2;13307:9;13303:18;13295:6;13266:56;:::i;:::-;13370:9;13362:6;13358:22;13353:2;13342:9;13338:18;13331:50;13398:44;13435:6;13427;13398:44;:::i;:::-;13390:52;12983:465;-1:-1:-1;;;;;12983:465:18:o;13645:219::-;13794:2;13783:9;13776:21;13757:4;13814:44;13854:2;13843:9;13839:18;13831:6;13814:44;:::i;14290:404::-;14492:2;14474:21;;;14531:2;14511:18;;;14504:30;14570:34;14565:2;14550:18;;14543:62;-1:-1:-1;;;14636:2:18;14621:18;;14614:38;14684:3;14669:19;;14290:404::o;16221:400::-;16423:2;16405:21;;;16462:2;16442:18;;;16435:30;16501:34;16496:2;16481:18;;16474:62;-1:-1:-1;;;16567:2:18;16552:18;;16545:34;16611:3;16596:19;;16221:400::o;17741:405::-;17943:2;17925:21;;;17982:2;17962:18;;;17955:30;18021:34;18016:2;18001:18;;17994:62;-1:-1:-1;;;18087:2:18;18072:18;;18065:39;18136:3;18121:19;;17741:405::o;18496:401::-;18698:2;18680:21;;;18737:2;18717:18;;;18710:30;18776:34;18771:2;18756:18;;18749:62;-1:-1:-1;;;18842:2:18;18827:18;;18820:35;18887:3;18872:19;;18496:401::o;19670:399::-;19872:2;19854:21;;;19911:2;19891:18;;;19884:30;19950:34;19945:2;19930:18;;19923:62;-1:-1:-1;;;20016:2:18;20001:18;;19994:33;20059:3;20044:19;;19670:399::o;20074:406::-;20276:2;20258:21;;;20315:2;20295:18;;;20288:30;20354:34;20349:2;20334:18;;20327:62;-1:-1:-1;;;20420:2:18;20405:18;;20398:40;20470:3;20455:19;;20074:406::o;20485:356::-;20687:2;20669:21;;;20706:18;;;20699:30;20765:34;20760:2;20745:18;;20738:62;20832:2;20817:18;;20485:356::o;22718:404::-;22920:2;22902:21;;;22959:2;22939:18;;;22932:30;22998:34;22993:2;22978:18;;22971:62;-1:-1:-1;;;23064:2:18;23049:18;;23042:38;23112:3;23097:19;;22718:404::o;24065:434::-;24298:6;24287:9;24280:25;24341:3;24336:2;24325:9;24321:18;24314:31;24261:4;24362:45;24402:3;24391:9;24387:19;24379:6;24362:45;:::i;:::-;24438:2;24423:18;;24416:34;;;;-1:-1:-1;24481:2:18;24466:18;24459:34;24354:53;24065:434;-1:-1:-1;;24065:434:18:o;24757:183::-;24817:4;24850:18;24842:6;24839:30;24836:56;;;24872:18;;:::i;:::-;-1:-1:-1;24917:1:18;24913:14;24929:4;24909:25;;24757:183::o;25071:128::-;25111:3;25142:1;25138:6;25135:1;25132:13;25129:39;;;25148:18;;:::i;:::-;-1:-1:-1;25184:9:18;;25071:128::o;25204:217::-;25244:1;25270;25260:132;;25314:10;25309:3;25305:20;25302:1;25295:31;25349:4;25346:1;25339:15;25377:4;25374:1;25367:15;25260:132;-1:-1:-1;25406:9:18;;25204:217::o;25426:168::-;25466:7;25532:1;25528;25524:6;25520:14;25517:1;25514:21;25509:1;25502:9;25495:17;25491:45;25488:71;;;25539:18;;:::i;:::-;-1:-1:-1;25579:9:18;;25426:168::o;25599:125::-;25639:4;25667:1;25664;25661:8;25658:34;;;25672:18;;:::i;:::-;-1:-1:-1;25709:9:18;;25599:125::o;25729:258::-;25801:1;25811:113;25825:6;25822:1;25819:13;25811:113;;;25901:11;;;25895:18;25882:11;;;25875:39;25847:2;25840:10;25811:113;;;25942:6;25939:1;25936:13;25933:48;;;-1:-1:-1;;25977:1:18;25959:16;;25952:27;25729:258::o;25992:380::-;26071:1;26067:12;;;;26114;;;26135:61;;26189:4;26181:6;26177:17;26167:27;;26135:61;26242:2;26234:6;26231:14;26211:18;26208:38;26205:161;;;26288:10;26283:3;26279:20;26276:1;26269:31;26323:4;26320:1;26313:15;26351:4;26348:1;26341:15;26205:161;;25992:380;;;:::o;26377:249::-;26487:2;26468:13;;-1:-1:-1;;26464:27:18;26452:40;;26522:18;26507:34;;26543:22;;;26504:62;26501:88;;;26569:18;;:::i;:::-;26605:2;26598:22;-1:-1:-1;;26377:249:18:o;26631:135::-;26670:3;-1:-1:-1;;26691:17:18;;26688:43;;;26711:18;;:::i;:::-;-1:-1:-1;26758:1:18;26747:13;;26631:135::o;26771:127::-;26832:10;26827:3;26823:20;26820:1;26813:31;26863:4;26860:1;26853:15;26887:4;26884:1;26877:15;26903:127;26964:10;26959:3;26955:20;26952:1;26945:31;26995:4;26992:1;26985:15;27019:4;27016:1;27009:15;27035:127;27096:10;27091:3;27087:20;27084:1;27077:31;27127:4;27124:1;27117:15;27151:4;27148:1;27141:15;27167:179;27202:3;27244:1;27226:16;27223:23;27220:120;;;27290:1;27287;27284;27269:23;-1:-1:-1;27327:1:18;27321:8;27316:3;27312:18;27220:120;27167:179;:::o;27351:671::-;27390:3;27432:4;27414:16;27411:26;27408:39;;;27351:671;:::o;27408:39::-;27474:2;27468:9;-1:-1:-1;;27539:16:18;27535:25;;27532:1;27468:9;27511:50;27590:4;27584:11;27614:16;27649:18;27720:2;27713:4;27705:6;27701:17;27698:25;27693:2;27685:6;27682:14;27679:45;27676:58;;;27727:5;;;;;27351:671;:::o;27676:58::-;27764:6;27758:4;27754:17;27743:28;;27800:3;27794:10;27827:2;27819:6;27816:14;27813:27;;;27833:5;;;;;;27351:671;:::o;27813:27::-;27917:2;27898:16;27892:4;27888:27;27884:36;27877:4;27868:6;27863:3;27859:16;27855:27;27852:69;27849:82;;;27924:5;;;;;;27351:671;:::o;27849:82::-;27940:57;27991:4;27982:6;27974;27970:19;27966:30;27960:4;27940:57;:::i;:::-;-1:-1:-1;28013:3:18;;27351:671;-1:-1:-1;;;;;27351:671:18:o;28027:131::-;-1:-1:-1;;;;;;28101:32:18;;28091:43;;28081:71;;28148:1;28145;28138:12

Swarm Source

ipfs://dbfd911f8ab72348e90b19b257faa5eae3746876e1214e1308eec219ddd953e6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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