ETH Price: $3,340.00 (-0.80%)
Gas: 4 Gwei

Token

Valiant Collection (VLT)
 

Overview

Max Total Supply

339 VLT

Holders

163

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 VLT
0xa41e54f825076f8c1d2b787a4eba0aa1274f3454
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:
Valiant

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 5 of 5: Valiant.sol
// SPDX-License-Identifier: MIT
import "./Context.sol";
import "./Address.sol";
import "./ERC721A.sol";

// File: contracts/Valiant.sol
library SafeMath {
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

struct watchDetail {
    uint256 strap;
    uint256 caseWatch;
    uint256 crown;
    uint256 dial;
}

pragma solidity ^0.8.4;

interface IWhitelist {
    function publicCollection(uint256 _collection) external view returns(bool);

    function whitelist(address _address) external view returns(uint256);

    function getFounderAddress() external view returns(address);
}


contract Valiant is ERC721A, Ownable {
    using SafeMath for uint256;

    string baseUri = "ipfs://bafybeidi6qmlrisjfd3brmcyrc64y6zheewm4hcyp7inuigslv6oqh6kvi/";
    IWhitelist whitelist;

    uint256 public maxSupply;
    uint256 immutable maxMintPerWallet = 2;
    uint256 immutable maxMintFounderWallet = 200;
    uint256 nonce = 0;

    bool isFirstMint = true;

    mapping(uint256 => watchDetail) public watches;
    mapping(address => uint256) public addressToMintNumber;

    event itemsGenerated(uint256 indexed fromTokenId, uint256 indexed toTokenId, address indexed owner);

    constructor(string memory _tokenName, string memory _tokenSymbol, uint256 _maxSupply, address _whitelistAddress) ERC721A(_tokenName, _tokenSymbol) {
        maxSupply = _maxSupply;
        whitelist = IWhitelist(_whitelistAddress);
    }

    receive() external payable{}

    function random() internal returns (uint256) {
        uint256 randomnumber = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce))) % 100;
        nonce++;
        uint8[17] memory bounds = [7, 14, 19, 24, 30, 36, 40, 44, 48, 54, 60, 66, 72, 74, 81, 91, 100];
        for (uint i = 0; i < bounds.length; i++) {
            if (randomnumber <= bounds[i]) {
                return i;
            }
        }
        return type(uint256).max;
    }

    function mintToken(uint256 quantity) external
    {
        if (msg.sender == whitelist.getFounderAddress()) {
            require (_totalMinted().add(quantity) <= maxSupply, "REACH_MAX_SUPPLY");
            require (addressToMintNumber[msg.sender].add(quantity) <= maxMintFounderWallet, "REACH_MAX_MINT");
        } else {
            require (_totalMinted().add(quantity) <= maxSupply - maxMintFounderWallet, "REACH_MAX_SUPPLY");
            require (addressToMintNumber[msg.sender].add(quantity) <= maxMintPerWallet, "REACH_MAX_MINT");
        }

        if (isFirstMint) {
            isFirstMint = false;
        }

        addressToMintNumber[msg.sender] += quantity;
        uint256 tokenId = _nextTokenId();

        for (uint i = 0; i < quantity; i++) {
            watches[tokenId] = watchDetail(random(), random(), random(), random());
            tokenId += 1;
        }

        emit itemsGenerated(tokenId - quantity, tokenId - 1, msg.sender);

        _safeMint(msg.sender, quantity);
    }

    function OwnerMintToken(uint quantity) external {
        require (msg.sender == whitelist.getFounderAddress());
        require (_totalMinted().add(quantity) <= maxSupply);
        require (addressToMintNumber[msg.sender].add(quantity) <= maxMintFounderWallet, "REACH_MAX_MINT");

        if (isFirstMint) {
            require (quantity <= 30);
            isFirstMint = false;
        } else {
            require (quantity <= 40);
        }

        addressToMintNumber[msg.sender] += quantity;
        uint256 tokenId = _nextTokenId();

        for (uint i = 0; i < quantity; i++) {
            watches[tokenId] = watchDetail(random(), random(), random(), random());
            tokenId += 1;
        }

        emit itemsGenerated(tokenId - quantity, tokenId - 1, _msgSender());

        _safeMint(msg.sender, quantity);
    }

    function setWhitelistAddress(address _newWhitelistAddress) external onlyOwner {
        whitelist = IWhitelist(_newWhitelistAddress);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), ".json")) : '';
    }

    function setBaseURI(string calldata _baseUri) external onlyOwner() {
        baseUri = _baseUri;
    }

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

File 1 of 5: Address.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/[email protected]/utils/Address.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 5: Context.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/[email protected]/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

File 3 of 5: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

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

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

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

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

File 4 of 5: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

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

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_whitelistAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"itemsGenerated","type":"event"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"OwnerMintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToMintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWhitelistAddress","type":"address"}],"name":"setWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"watches","outputs":[{"internalType":"uint256","name":"strap","type":"uint256"},{"internalType":"uint256","name":"caseWatch","type":"uint256"},{"internalType":"uint256","name":"crown","type":"uint256"},{"internalType":"uint256","name":"dial","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260405180608001604052806043815260200162003ccb60439139600990816200002e91906200048f565b50600260809081525060c860a0908152506000600c556001600d60006101000a81548160ff0219169083151502179055503480156200006c57600080fd5b5060405162003d0e38038062003d0e833981810160405281019062000092919062000770565b83838160029081620000a591906200048f565b508060039081620000b791906200048f565b50620000c86200014260201b60201c565b6000819055505050620000f0620000e46200014760201b60201c565b6200014f60201b60201c565b81600b8190555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000820565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200029757607f821691505b602082108103620002ad57620002ac6200024f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002d8565b620003238683620002d8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003706200036a62000364846200033b565b62000345565b6200033b565b9050919050565b6000819050919050565b6200038c836200034f565b620003a46200039b8262000377565b848454620002e5565b825550505050565b600090565b620003bb620003ac565b620003c881848462000381565b505050565b5b81811015620003f057620003e4600082620003b1565b600181019050620003ce565b5050565b601f8211156200043f576200040981620002b3565b6200041484620002c8565b8101602085101562000424578190505b6200043c6200043385620002c8565b830182620003cd565b50505b505050565b600082821c905092915050565b6000620004646000198460080262000444565b1980831691505092915050565b60006200047f838362000451565b9150826002028217905092915050565b6200049a8262000215565b67ffffffffffffffff811115620004b657620004b562000220565b5b620004c282546200027e565b620004cf828285620003f4565b600060209050601f831160018114620005075760008415620004f2578287015190505b620004fe858262000471565b8655506200056e565b601f1984166200051786620002b3565b60005b8281101562000541578489015182556001820191506020850194506020810190506200051a565b868310156200056157848901516200055d601f89168262000451565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620005b08262000594565b810181811067ffffffffffffffff82111715620005d257620005d162000220565b5b80604052505050565b6000620005e762000576565b9050620005f58282620005a5565b919050565b600067ffffffffffffffff82111562000618576200061762000220565b5b620006238262000594565b9050602081019050919050565b60005b838110156200065057808201518184015260208101905062000633565b60008484015250505050565b6000620006736200066d84620005fa565b620005db565b9050828152602081018484840111156200069257620006916200058f565b5b6200069f84828562000630565b509392505050565b600082601f830112620006bf57620006be6200058a565b5b8151620006d18482602086016200065c565b91505092915050565b620006e5816200033b565b8114620006f157600080fd5b50565b6000815190506200070581620006da565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000738826200070b565b9050919050565b6200074a816200072b565b81146200075657600080fd5b50565b6000815190506200076a816200073f565b92915050565b600080600080608085870312156200078d576200078c62000580565b5b600085015167ffffffffffffffff811115620007ae57620007ad62000585565b5b620007bc87828801620006a7565b945050602085015167ffffffffffffffff811115620007e057620007df62000585565b5b620007ee87828801620006a7565b93505060406200080187828801620006f4565b9250506060620008148782880162000759565b91505092959194509250565b60805160a05161347762000854600039600081816109a201528181611565015261161e015260006116a701526134776000f3fe60806040526004361061014f5760003560e01c8063715018a6116100b6578063c634d0321161006f578063c634d03214610463578063c87b56dd1461048c578063d0355373146104c9578063d5abeb0114610509578063e985e9c514610534578063f2fde38b1461057157610156565b8063715018a6146103885780638da5cb5b1461039f57806395d89b41146103ca578063a224c745146103f5578063a22cb4651461041e578063b88d4fde1461044757610156565b8063232dcc2411610108578063232dcc241461028457806323b872dd146102ad57806342842e0e146102c957806355f804b3146102e55780636352211e1461030e57806370a082311461034b57610156565b806301ffc9a71461015b57806306fdde0314610198578063081812fc146101c3578063095ea7b31461020057806318160ddd1461021c5780631cefef431461024757610156565b3661015657005b600080fd5b34801561016757600080fd5b50610182600480360381019061017d9190612525565b61059a565b60405161018f919061256d565b60405180910390f35b3480156101a457600080fd5b506101ad61062c565b6040516101ba9190612618565b60405180910390f35b3480156101cf57600080fd5b506101ea60048036038101906101e59190612670565b6106be565b6040516101f791906126de565b60405180910390f35b61021a60048036038101906102159190612725565b61073d565b005b34801561022857600080fd5b50610231610881565b60405161023e9190612774565b60405180910390f35b34801561025357600080fd5b5061026e6004803603810190610269919061278f565b610898565b60405161027b9190612774565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190612670565b6108b0565b005b6102c760048036038101906102c291906127bc565b610c22565b005b6102e360048036038101906102de91906127bc565b610f44565b005b3480156102f157600080fd5b5061030c60048036038101906103079190612874565b610f64565b005b34801561031a57600080fd5b5061033560048036038101906103309190612670565b610ff6565b60405161034291906126de565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d919061278f565b611008565b60405161037f9190612774565b60405180910390f35b34801561039457600080fd5b5061039d6110c0565b005b3480156103ab57600080fd5b506103b4611148565b6040516103c191906126de565b60405180910390f35b3480156103d657600080fd5b506103df611172565b6040516103ec9190612618565b60405180910390f35b34801561040157600080fd5b5061041c6004803603810190610417919061278f565b611204565b005b34801561042a57600080fd5b50610445600480360381019061044091906128ed565b6112c4565b005b610461600480360381019061045c9190612a5d565b6113cf565b005b34801561046f57600080fd5b5061048a60048036038101906104859190612670565b611442565b005b34801561049857600080fd5b506104b360048036038101906104ae9190612670565b611900565b6040516104c09190612618565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb9190612670565b61199e565b6040516105009493929190612ae0565b60405180910390f35b34801561051557600080fd5b5061051e6119ce565b60405161052b9190612774565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612b25565b6119d4565b604051610568919061256d565b60405180910390f35b34801561057d57600080fd5b506105986004803603810190610593919061278f565b611a68565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105f557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106255750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461063b90612b94565b80601f016020809104026020016040519081016040528092919081815260200182805461066790612b94565b80156106b45780601f10610689576101008083540402835291602001916106b4565b820191906000526020600020905b81548152906001019060200180831161069757829003601f168201915b5050505050905090565b60006106c982611b5f565b6106ff576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074882610ff6565b90508073ffffffffffffffffffffffffffffffffffffffff16610769611bbe565b73ffffffffffffffffffffffffffffffffffffffff16146107cc5761079581610790611bbe565b6119d4565b6107cb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061088b611bc6565b6001546000540303905090565b600f6020528060005260406000206000915090505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364b13d726040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109419190612bda565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097857600080fd5b600b5461099582610987611bcb565b611bde90919063ffffffff16565b11156109a057600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000610a1382600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bde90919063ffffffff16565b1115610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b90612c53565b60405180910390fd5b600d60009054906101000a900460ff1615610a9757601e811115610a7757600080fd5b6000600d60006101000a81548160ff021916908315150217905550610aa6565b6028811115610aa557600080fd5b5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610af59190612ca2565b925050819055506000610b06611c05565b905060005b82811015610bb0576040518060800160405280610b26611c0e565b8152602001610b33611c0e565b8152602001610b40611c0e565b8152602001610b4d611c0e565b815250600e600084815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050600182610b9b9190612ca2565b91508080610ba890612cd6565b915050610b0b565b50610bb9611d94565b73ffffffffffffffffffffffffffffffffffffffff16600182610bdc9190612d1e565b8383610be89190612d1e565b7f44467c6e5b86a01046770a7754dec4bd80f96e9784395b50ab540f44a8a2aaf460405160405180910390a4610c1e3383611d9c565b5050565b6000610c2d82611dba565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c94576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ca084611e86565b91509150610cb68187610cb1611bbe565b611ead565b610d0257610ccb86610cc6611bbe565b6119d4565b610d01576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d68576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d758686866001611ef1565b8015610d8057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e4e85610e2a888887611ef7565b7c020000000000000000000000000000000000000000000000000000000017611f1f565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610ed45760006001850190506000600460008381526020019081526020016000205403610ed2576000548114610ed1578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f3c8686866001611f4a565b505050505050565b610f5f838383604051806020016040528060008152506113cf565b505050565b610f6c611d94565b73ffffffffffffffffffffffffffffffffffffffff16610f8a611148565b73ffffffffffffffffffffffffffffffffffffffff1614610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790612d9e565b60405180910390fd5b818160099182610ff1929190612f75565b505050565b600061100182611dba565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361106f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110c8611d94565b73ffffffffffffffffffffffffffffffffffffffff166110e6611148565b73ffffffffffffffffffffffffffffffffffffffff161461113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612d9e565b60405180910390fd5b6111466000611f50565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461118190612b94565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad90612b94565b80156111fa5780601f106111cf576101008083540402835291602001916111fa565b820191906000526020600020905b8154815290600101906020018083116111dd57829003601f168201915b5050505050905090565b61120c611d94565b73ffffffffffffffffffffffffffffffffffffffff1661122a611148565b73ffffffffffffffffffffffffffffffffffffffff1614611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127790612d9e565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600760006112d1611bbe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661137e611bbe565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113c3919061256d565b60405180910390a35050565b6113da848484610c22565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461143c5761140584848484612016565b61143b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364b13d726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190612bda565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361161c57600b5461152282611514611bcb565b611bde90919063ffffffff16565b1115611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a90613091565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006115d682600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bde90919063ffffffff16565b1115611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90612c53565b60405180910390fd5b61175a565b7f0000000000000000000000000000000000000000000000000000000000000000600b5461164a9190612d1e565b61166482611656611bcb565b611bde90919063ffffffff16565b11156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90613091565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061171882600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bde90919063ffffffff16565b1115611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090612c53565b60405180910390fd5b5b600d60009054906101000a900460ff161561178b576000600d60006101000a81548160ff0219169083151502179055505b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117da9190612ca2565b9250508190555060006117eb611c05565b905060005b8281101561189557604051806080016040528061180b611c0e565b8152602001611818611c0e565b8152602001611825611c0e565b8152602001611832611c0e565b815250600e6000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050506001826118809190612ca2565b9150808061188d90612cd6565b9150506117f0565b503373ffffffffffffffffffffffffffffffffffffffff166001826118ba9190612d1e565b83836118c69190612d1e565b7f44467c6e5b86a01046770a7754dec4bd80f96e9784395b50ab540f44a8a2aaf460405160405180910390a46118fc3383611d9c565b5050565b606061190b82611b5f565b611941576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061194b612166565b9050600081510361196b5760405180602001604052806000815250611996565b80611975846121f8565b604051602001611986929190613139565b6040516020818303038152906040525b915050919050565b600e6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a70611d94565b73ffffffffffffffffffffffffffffffffffffffff16611a8e611148565b73ffffffffffffffffffffffffffffffffffffffff1614611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90612d9e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a906131da565b60405180910390fd5b611b5c81611f50565b50565b600081611b6a611bc6565b11158015611b79575060005482105b8015611bb7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611bd5611bc6565b60005403905090565b60008183611bec9190612ca2565b905082811015611bff57611bfe6131fa565b5b92915050565b60008054905090565b60008060644233600c54604051602001611c2a93929190613292565b6040516020818303038152906040528051906020012060001c611c4d91906132fe565b9050600c6000815480929190611c6290612cd6565b91905055506000604051806102200160405280600760ff168152602001600e60ff168152602001601360ff168152602001601860ff168152602001601e60ff168152602001602460ff168152602001602860ff168152602001602c60ff168152602001603060ff168152602001603660ff168152602001603c60ff168152602001604260ff168152602001604860ff168152602001604a60ff168152602001605160ff168152602001605b60ff168152602001606460ff16815250905060005b6011811015611d6a57818160118110611d3e57611d3d61332f565b5b602002015160ff168311611d5757809350505050611d91565b8080611d6290612cd6565b915050611d22565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925050505b90565b600033905090565b611db6828260405180602001604052806000815250612248565b5050565b60008082905080611dc9611bc6565b11611e4f57600054811015611e4e5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611e4c575b60008103611e42576004600083600190039350838152602001908152602001600020549050611e18565b8092505050611e81565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f0e8686846122e5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261203c611bbe565b8786866040518563ffffffff1660e01b815260040161205e94939291906133b3565b6020604051808303816000875af192505050801561209a57506040513d601f19601f820116820180604052508101906120979190613414565b60015b612113573d80600081146120ca576040519150601f19603f3d011682016040523d82523d6000602084013e6120cf565b606091505b50600081510361210b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461217590612b94565b80601f01602080910402602001604051908101604052809291908181526020018280546121a190612b94565b80156121ee5780601f106121c3576101008083540402835291602001916121ee565b820191906000526020600020905b8154815290600101906020018083116121d157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561223357600184039350600a81066030018453600a8104905080612211575b50828103602084039350808452505050919050565b61225283836122ee565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122e057600080549050600083820390505b6122926000868380600101945086612016565b6122c8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061227f5781600054146122dd57600080fd5b50505b505050565b60009392505050565b6000805490506000820361232e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61233b6000848385611ef1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123b2836123a36000866000611ef7565b6123ac856124a9565b17611f1f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461245357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612418565b506000820361248e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506124a46000848385611f4a565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612502816124cd565b811461250d57600080fd5b50565b60008135905061251f816124f9565b92915050565b60006020828403121561253b5761253a6124c3565b5b600061254984828501612510565b91505092915050565b60008115159050919050565b61256781612552565b82525050565b6000602082019050612582600083018461255e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125c25780820151818401526020810190506125a7565b60008484015250505050565b6000601f19601f8301169050919050565b60006125ea82612588565b6125f48185612593565b93506126048185602086016125a4565b61260d816125ce565b840191505092915050565b6000602082019050818103600083015261263281846125df565b905092915050565b6000819050919050565b61264d8161263a565b811461265857600080fd5b50565b60008135905061266a81612644565b92915050565b600060208284031215612686576126856124c3565b5b60006126948482850161265b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126c88261269d565b9050919050565b6126d8816126bd565b82525050565b60006020820190506126f360008301846126cf565b92915050565b612702816126bd565b811461270d57600080fd5b50565b60008135905061271f816126f9565b92915050565b6000806040838503121561273c5761273b6124c3565b5b600061274a85828601612710565b925050602061275b8582860161265b565b9150509250929050565b61276e8161263a565b82525050565b60006020820190506127896000830184612765565b92915050565b6000602082840312156127a5576127a46124c3565b5b60006127b384828501612710565b91505092915050565b6000806000606084860312156127d5576127d46124c3565b5b60006127e386828701612710565b93505060206127f486828701612710565b92505060406128058682870161265b565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126128345761283361280f565b5b8235905067ffffffffffffffff81111561285157612850612814565b5b60208301915083600182028301111561286d5761286c612819565b5b9250929050565b6000806020838503121561288b5761288a6124c3565b5b600083013567ffffffffffffffff8111156128a9576128a86124c8565b5b6128b58582860161281e565b92509250509250929050565b6128ca81612552565b81146128d557600080fd5b50565b6000813590506128e7816128c1565b92915050565b60008060408385031215612904576129036124c3565b5b600061291285828601612710565b9250506020612923858286016128d8565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61296a826125ce565b810181811067ffffffffffffffff8211171561298957612988612932565b5b80604052505050565b600061299c6124b9565b90506129a88282612961565b919050565b600067ffffffffffffffff8211156129c8576129c7612932565b5b6129d1826125ce565b9050602081019050919050565b82818337600083830152505050565b6000612a006129fb846129ad565b612992565b905082815260208101848484011115612a1c57612a1b61292d565b5b612a278482856129de565b509392505050565b600082601f830112612a4457612a4361280f565b5b8135612a548482602086016129ed565b91505092915050565b60008060008060808587031215612a7757612a766124c3565b5b6000612a8587828801612710565b9450506020612a9687828801612710565b9350506040612aa78782880161265b565b925050606085013567ffffffffffffffff811115612ac857612ac76124c8565b5b612ad487828801612a2f565b91505092959194509250565b6000608082019050612af56000830187612765565b612b026020830186612765565b612b0f6040830185612765565b612b1c6060830184612765565b95945050505050565b60008060408385031215612b3c57612b3b6124c3565b5b6000612b4a85828601612710565b9250506020612b5b85828601612710565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bac57607f821691505b602082108103612bbf57612bbe612b65565b5b50919050565b600081519050612bd4816126f9565b92915050565b600060208284031215612bf057612bef6124c3565b5b6000612bfe84828501612bc5565b91505092915050565b7f52454143485f4d41585f4d494e54000000000000000000000000000000000000600082015250565b6000612c3d600e83612593565b9150612c4882612c07565b602082019050919050565b60006020820190508181036000830152612c6c81612c30565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cad8261263a565b9150612cb88361263a565b9250828201905080821115612cd057612ccf612c73565b5b92915050565b6000612ce18261263a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d1357612d12612c73565b5b600182019050919050565b6000612d298261263a565b9150612d348361263a565b9250828203905081811115612d4c57612d4b612c73565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d88602083612593565b9150612d9382612d52565b602082019050919050565b60006020820190508181036000830152612db781612d7b565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612e2b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612dee565b612e358683612dee565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612e72612e6d612e688461263a565b612e4d565b61263a565b9050919050565b6000819050919050565b612e8c83612e57565b612ea0612e9882612e79565b848454612dfb565b825550505050565b600090565b612eb5612ea8565b612ec0818484612e83565b505050565b5b81811015612ee457612ed9600082612ead565b600181019050612ec6565b5050565b601f821115612f2957612efa81612dc9565b612f0384612dde565b81016020851015612f12578190505b612f26612f1e85612dde565b830182612ec5565b50505b505050565b600082821c905092915050565b6000612f4c60001984600802612f2e565b1980831691505092915050565b6000612f658383612f3b565b9150826002028217905092915050565b612f7f8383612dbe565b67ffffffffffffffff811115612f9857612f97612932565b5b612fa28254612b94565b612fad828285612ee8565b6000601f831160018114612fdc5760008415612fca578287013590505b612fd48582612f59565b86555061303c565b601f198416612fea86612dc9565b60005b8281101561301257848901358255600182019150602085019450602081019050612fed565b8683101561302f578489013561302b601f891682612f3b565b8355505b6001600288020188555050505b50505050505050565b7f52454143485f4d41585f535550504c5900000000000000000000000000000000600082015250565b600061307b601083612593565b915061308682613045565b602082019050919050565b600060208201905081810360008301526130aa8161306e565b9050919050565b600081905092915050565b60006130c782612588565b6130d181856130b1565b93506130e18185602086016125a4565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006131236005836130b1565b915061312e826130ed565b600582019050919050565b600061314582856130bc565b915061315182846130bc565b915061315c82613116565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006131c4602683612593565b91506131cf82613168565b604082019050919050565b600060208201905081810360008301526131f3816131b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000819050919050565b61324461323f8261263a565b613229565b82525050565b60008160601b9050919050565b60006132628261324a565b9050919050565b600061327482613257565b9050919050565b61328c613287826126bd565b613269565b82525050565b600061329e8286613233565b6020820191506132ae828561327b565b6014820191506132be8284613233565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133098261263a565b91506133148361263a565b925082613324576133236132cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006133858261335e565b61338f8185613369565b935061339f8185602086016125a4565b6133a8816125ce565b840191505092915050565b60006080820190506133c860008301876126cf565b6133d560208301866126cf565b6133e26040830185612765565b81810360608301526133f4818461337a565b905095945050505050565b60008151905061340e816124f9565b92915050565b60006020828403121561342a576134296124c3565b5b6000613438848285016133ff565b9150509291505056fea2646970667358221220c82ede14cb9032194e8d7ed2968a05baac0539a946bf8d987741d2a439e81f1864736f6c63430008120033697066733a2f2f62616679626569646936716d6c7269736a66643362726d63797263363479367a686565776d346863797037696e756967736c76366f7168366b76692f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000034d211ced52d1f2042ab4296f45ee49dd5bc6a8a000000000000000000000000000000000000000000000000000000000000001256616c69616e7420436f6c6c656374696f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003564c540000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061014f5760003560e01c8063715018a6116100b6578063c634d0321161006f578063c634d03214610463578063c87b56dd1461048c578063d0355373146104c9578063d5abeb0114610509578063e985e9c514610534578063f2fde38b1461057157610156565b8063715018a6146103885780638da5cb5b1461039f57806395d89b41146103ca578063a224c745146103f5578063a22cb4651461041e578063b88d4fde1461044757610156565b8063232dcc2411610108578063232dcc241461028457806323b872dd146102ad57806342842e0e146102c957806355f804b3146102e55780636352211e1461030e57806370a082311461034b57610156565b806301ffc9a71461015b57806306fdde0314610198578063081812fc146101c3578063095ea7b31461020057806318160ddd1461021c5780631cefef431461024757610156565b3661015657005b600080fd5b34801561016757600080fd5b50610182600480360381019061017d9190612525565b61059a565b60405161018f919061256d565b60405180910390f35b3480156101a457600080fd5b506101ad61062c565b6040516101ba9190612618565b60405180910390f35b3480156101cf57600080fd5b506101ea60048036038101906101e59190612670565b6106be565b6040516101f791906126de565b60405180910390f35b61021a60048036038101906102159190612725565b61073d565b005b34801561022857600080fd5b50610231610881565b60405161023e9190612774565b60405180910390f35b34801561025357600080fd5b5061026e6004803603810190610269919061278f565b610898565b60405161027b9190612774565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190612670565b6108b0565b005b6102c760048036038101906102c291906127bc565b610c22565b005b6102e360048036038101906102de91906127bc565b610f44565b005b3480156102f157600080fd5b5061030c60048036038101906103079190612874565b610f64565b005b34801561031a57600080fd5b5061033560048036038101906103309190612670565b610ff6565b60405161034291906126de565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d919061278f565b611008565b60405161037f9190612774565b60405180910390f35b34801561039457600080fd5b5061039d6110c0565b005b3480156103ab57600080fd5b506103b4611148565b6040516103c191906126de565b60405180910390f35b3480156103d657600080fd5b506103df611172565b6040516103ec9190612618565b60405180910390f35b34801561040157600080fd5b5061041c6004803603810190610417919061278f565b611204565b005b34801561042a57600080fd5b50610445600480360381019061044091906128ed565b6112c4565b005b610461600480360381019061045c9190612a5d565b6113cf565b005b34801561046f57600080fd5b5061048a60048036038101906104859190612670565b611442565b005b34801561049857600080fd5b506104b360048036038101906104ae9190612670565b611900565b6040516104c09190612618565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb9190612670565b61199e565b6040516105009493929190612ae0565b60405180910390f35b34801561051557600080fd5b5061051e6119ce565b60405161052b9190612774565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612b25565b6119d4565b604051610568919061256d565b60405180910390f35b34801561057d57600080fd5b506105986004803603810190610593919061278f565b611a68565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105f557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106255750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461063b90612b94565b80601f016020809104026020016040519081016040528092919081815260200182805461066790612b94565b80156106b45780601f10610689576101008083540402835291602001916106b4565b820191906000526020600020905b81548152906001019060200180831161069757829003601f168201915b5050505050905090565b60006106c982611b5f565b6106ff576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074882610ff6565b90508073ffffffffffffffffffffffffffffffffffffffff16610769611bbe565b73ffffffffffffffffffffffffffffffffffffffff16146107cc5761079581610790611bbe565b6119d4565b6107cb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061088b611bc6565b6001546000540303905090565b600f6020528060005260406000206000915090505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364b13d726040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109419190612bda565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097857600080fd5b600b5461099582610987611bcb565b611bde90919063ffffffff16565b11156109a057600080fd5b7f00000000000000000000000000000000000000000000000000000000000000c8610a1382600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bde90919063ffffffff16565b1115610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b90612c53565b60405180910390fd5b600d60009054906101000a900460ff1615610a9757601e811115610a7757600080fd5b6000600d60006101000a81548160ff021916908315150217905550610aa6565b6028811115610aa557600080fd5b5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610af59190612ca2565b925050819055506000610b06611c05565b905060005b82811015610bb0576040518060800160405280610b26611c0e565b8152602001610b33611c0e565b8152602001610b40611c0e565b8152602001610b4d611c0e565b815250600e600084815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050600182610b9b9190612ca2565b91508080610ba890612cd6565b915050610b0b565b50610bb9611d94565b73ffffffffffffffffffffffffffffffffffffffff16600182610bdc9190612d1e565b8383610be89190612d1e565b7f44467c6e5b86a01046770a7754dec4bd80f96e9784395b50ab540f44a8a2aaf460405160405180910390a4610c1e3383611d9c565b5050565b6000610c2d82611dba565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c94576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ca084611e86565b91509150610cb68187610cb1611bbe565b611ead565b610d0257610ccb86610cc6611bbe565b6119d4565b610d01576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d68576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d758686866001611ef1565b8015610d8057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e4e85610e2a888887611ef7565b7c020000000000000000000000000000000000000000000000000000000017611f1f565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610ed45760006001850190506000600460008381526020019081526020016000205403610ed2576000548114610ed1578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f3c8686866001611f4a565b505050505050565b610f5f838383604051806020016040528060008152506113cf565b505050565b610f6c611d94565b73ffffffffffffffffffffffffffffffffffffffff16610f8a611148565b73ffffffffffffffffffffffffffffffffffffffff1614610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790612d9e565b60405180910390fd5b818160099182610ff1929190612f75565b505050565b600061100182611dba565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361106f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110c8611d94565b73ffffffffffffffffffffffffffffffffffffffff166110e6611148565b73ffffffffffffffffffffffffffffffffffffffff161461113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612d9e565b60405180910390fd5b6111466000611f50565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461118190612b94565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad90612b94565b80156111fa5780601f106111cf576101008083540402835291602001916111fa565b820191906000526020600020905b8154815290600101906020018083116111dd57829003601f168201915b5050505050905090565b61120c611d94565b73ffffffffffffffffffffffffffffffffffffffff1661122a611148565b73ffffffffffffffffffffffffffffffffffffffff1614611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127790612d9e565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600760006112d1611bbe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661137e611bbe565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113c3919061256d565b60405180910390a35050565b6113da848484610c22565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461143c5761140584848484612016565b61143b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364b13d726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190612bda565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361161c57600b5461152282611514611bcb565b611bde90919063ffffffff16565b1115611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a90613091565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000c86115d682600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bde90919063ffffffff16565b1115611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90612c53565b60405180910390fd5b61175a565b7f00000000000000000000000000000000000000000000000000000000000000c8600b5461164a9190612d1e565b61166482611656611bcb565b611bde90919063ffffffff16565b11156116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90613091565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000261171882600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bde90919063ffffffff16565b1115611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090612c53565b60405180910390fd5b5b600d60009054906101000a900460ff161561178b576000600d60006101000a81548160ff0219169083151502179055505b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117da9190612ca2565b9250508190555060006117eb611c05565b905060005b8281101561189557604051806080016040528061180b611c0e565b8152602001611818611c0e565b8152602001611825611c0e565b8152602001611832611c0e565b815250600e6000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050506001826118809190612ca2565b9150808061188d90612cd6565b9150506117f0565b503373ffffffffffffffffffffffffffffffffffffffff166001826118ba9190612d1e565b83836118c69190612d1e565b7f44467c6e5b86a01046770a7754dec4bd80f96e9784395b50ab540f44a8a2aaf460405160405180910390a46118fc3383611d9c565b5050565b606061190b82611b5f565b611941576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061194b612166565b9050600081510361196b5760405180602001604052806000815250611996565b80611975846121f8565b604051602001611986929190613139565b6040516020818303038152906040525b915050919050565b600e6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a70611d94565b73ffffffffffffffffffffffffffffffffffffffff16611a8e611148565b73ffffffffffffffffffffffffffffffffffffffff1614611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90612d9e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a906131da565b60405180910390fd5b611b5c81611f50565b50565b600081611b6a611bc6565b11158015611b79575060005482105b8015611bb7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611bd5611bc6565b60005403905090565b60008183611bec9190612ca2565b905082811015611bff57611bfe6131fa565b5b92915050565b60008054905090565b60008060644233600c54604051602001611c2a93929190613292565b6040516020818303038152906040528051906020012060001c611c4d91906132fe565b9050600c6000815480929190611c6290612cd6565b91905055506000604051806102200160405280600760ff168152602001600e60ff168152602001601360ff168152602001601860ff168152602001601e60ff168152602001602460ff168152602001602860ff168152602001602c60ff168152602001603060ff168152602001603660ff168152602001603c60ff168152602001604260ff168152602001604860ff168152602001604a60ff168152602001605160ff168152602001605b60ff168152602001606460ff16815250905060005b6011811015611d6a57818160118110611d3e57611d3d61332f565b5b602002015160ff168311611d5757809350505050611d91565b8080611d6290612cd6565b915050611d22565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925050505b90565b600033905090565b611db6828260405180602001604052806000815250612248565b5050565b60008082905080611dc9611bc6565b11611e4f57600054811015611e4e5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611e4c575b60008103611e42576004600083600190039350838152602001908152602001600020549050611e18565b8092505050611e81565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f0e8686846122e5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261203c611bbe565b8786866040518563ffffffff1660e01b815260040161205e94939291906133b3565b6020604051808303816000875af192505050801561209a57506040513d601f19601f820116820180604052508101906120979190613414565b60015b612113573d80600081146120ca576040519150601f19603f3d011682016040523d82523d6000602084013e6120cf565b606091505b50600081510361210b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461217590612b94565b80601f01602080910402602001604051908101604052809291908181526020018280546121a190612b94565b80156121ee5780601f106121c3576101008083540402835291602001916121ee565b820191906000526020600020905b8154815290600101906020018083116121d157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561223357600184039350600a81066030018453600a8104905080612211575b50828103602084039350808452505050919050565b61225283836122ee565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122e057600080549050600083820390505b6122926000868380600101945086612016565b6122c8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061227f5781600054146122dd57600080fd5b50505b505050565b60009392505050565b6000805490506000820361232e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61233b6000848385611ef1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123b2836123a36000866000611ef7565b6123ac856124a9565b17611f1f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461245357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612418565b506000820361248e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506124a46000848385611f4a565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612502816124cd565b811461250d57600080fd5b50565b60008135905061251f816124f9565b92915050565b60006020828403121561253b5761253a6124c3565b5b600061254984828501612510565b91505092915050565b60008115159050919050565b61256781612552565b82525050565b6000602082019050612582600083018461255e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125c25780820151818401526020810190506125a7565b60008484015250505050565b6000601f19601f8301169050919050565b60006125ea82612588565b6125f48185612593565b93506126048185602086016125a4565b61260d816125ce565b840191505092915050565b6000602082019050818103600083015261263281846125df565b905092915050565b6000819050919050565b61264d8161263a565b811461265857600080fd5b50565b60008135905061266a81612644565b92915050565b600060208284031215612686576126856124c3565b5b60006126948482850161265b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126c88261269d565b9050919050565b6126d8816126bd565b82525050565b60006020820190506126f360008301846126cf565b92915050565b612702816126bd565b811461270d57600080fd5b50565b60008135905061271f816126f9565b92915050565b6000806040838503121561273c5761273b6124c3565b5b600061274a85828601612710565b925050602061275b8582860161265b565b9150509250929050565b61276e8161263a565b82525050565b60006020820190506127896000830184612765565b92915050565b6000602082840312156127a5576127a46124c3565b5b60006127b384828501612710565b91505092915050565b6000806000606084860312156127d5576127d46124c3565b5b60006127e386828701612710565b93505060206127f486828701612710565b92505060406128058682870161265b565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126128345761283361280f565b5b8235905067ffffffffffffffff81111561285157612850612814565b5b60208301915083600182028301111561286d5761286c612819565b5b9250929050565b6000806020838503121561288b5761288a6124c3565b5b600083013567ffffffffffffffff8111156128a9576128a86124c8565b5b6128b58582860161281e565b92509250509250929050565b6128ca81612552565b81146128d557600080fd5b50565b6000813590506128e7816128c1565b92915050565b60008060408385031215612904576129036124c3565b5b600061291285828601612710565b9250506020612923858286016128d8565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61296a826125ce565b810181811067ffffffffffffffff8211171561298957612988612932565b5b80604052505050565b600061299c6124b9565b90506129a88282612961565b919050565b600067ffffffffffffffff8211156129c8576129c7612932565b5b6129d1826125ce565b9050602081019050919050565b82818337600083830152505050565b6000612a006129fb846129ad565b612992565b905082815260208101848484011115612a1c57612a1b61292d565b5b612a278482856129de565b509392505050565b600082601f830112612a4457612a4361280f565b5b8135612a548482602086016129ed565b91505092915050565b60008060008060808587031215612a7757612a766124c3565b5b6000612a8587828801612710565b9450506020612a9687828801612710565b9350506040612aa78782880161265b565b925050606085013567ffffffffffffffff811115612ac857612ac76124c8565b5b612ad487828801612a2f565b91505092959194509250565b6000608082019050612af56000830187612765565b612b026020830186612765565b612b0f6040830185612765565b612b1c6060830184612765565b95945050505050565b60008060408385031215612b3c57612b3b6124c3565b5b6000612b4a85828601612710565b9250506020612b5b85828601612710565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bac57607f821691505b602082108103612bbf57612bbe612b65565b5b50919050565b600081519050612bd4816126f9565b92915050565b600060208284031215612bf057612bef6124c3565b5b6000612bfe84828501612bc5565b91505092915050565b7f52454143485f4d41585f4d494e54000000000000000000000000000000000000600082015250565b6000612c3d600e83612593565b9150612c4882612c07565b602082019050919050565b60006020820190508181036000830152612c6c81612c30565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cad8261263a565b9150612cb88361263a565b9250828201905080821115612cd057612ccf612c73565b5b92915050565b6000612ce18261263a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d1357612d12612c73565b5b600182019050919050565b6000612d298261263a565b9150612d348361263a565b9250828203905081811115612d4c57612d4b612c73565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d88602083612593565b9150612d9382612d52565b602082019050919050565b60006020820190508181036000830152612db781612d7b565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612e2b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612dee565b612e358683612dee565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612e72612e6d612e688461263a565b612e4d565b61263a565b9050919050565b6000819050919050565b612e8c83612e57565b612ea0612e9882612e79565b848454612dfb565b825550505050565b600090565b612eb5612ea8565b612ec0818484612e83565b505050565b5b81811015612ee457612ed9600082612ead565b600181019050612ec6565b5050565b601f821115612f2957612efa81612dc9565b612f0384612dde565b81016020851015612f12578190505b612f26612f1e85612dde565b830182612ec5565b50505b505050565b600082821c905092915050565b6000612f4c60001984600802612f2e565b1980831691505092915050565b6000612f658383612f3b565b9150826002028217905092915050565b612f7f8383612dbe565b67ffffffffffffffff811115612f9857612f97612932565b5b612fa28254612b94565b612fad828285612ee8565b6000601f831160018114612fdc5760008415612fca578287013590505b612fd48582612f59565b86555061303c565b601f198416612fea86612dc9565b60005b8281101561301257848901358255600182019150602085019450602081019050612fed565b8683101561302f578489013561302b601f891682612f3b565b8355505b6001600288020188555050505b50505050505050565b7f52454143485f4d41585f535550504c5900000000000000000000000000000000600082015250565b600061307b601083612593565b915061308682613045565b602082019050919050565b600060208201905081810360008301526130aa8161306e565b9050919050565b600081905092915050565b60006130c782612588565b6130d181856130b1565b93506130e18185602086016125a4565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006131236005836130b1565b915061312e826130ed565b600582019050919050565b600061314582856130bc565b915061315182846130bc565b915061315c82613116565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006131c4602683612593565b91506131cf82613168565b604082019050919050565b600060208201905081810360008301526131f3816131b7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000819050919050565b61324461323f8261263a565b613229565b82525050565b60008160601b9050919050565b60006132628261324a565b9050919050565b600061327482613257565b9050919050565b61328c613287826126bd565b613269565b82525050565b600061329e8286613233565b6020820191506132ae828561327b565b6014820191506132be8284613233565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133098261263a565b91506133148361263a565b925082613324576133236132cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006133858261335e565b61338f8185613369565b935061339f8185602086016125a4565b6133a8816125ce565b840191505092915050565b60006080820190506133c860008301876126cf565b6133d560208301866126cf565b6133e26040830185612765565b81810360608301526133f4818461337a565b905095945050505050565b60008151905061340e816124f9565b92915050565b60006020828403121561342a576134296124c3565b5b6000613438848285016133ff565b9150509291505056fea2646970667358221220c82ede14cb9032194e8d7ed2968a05baac0539a946bf8d987741d2a439e81f1864736f6c63430008120033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000034d211ced52d1f2042ab4296f45ee49dd5bc6a8a000000000000000000000000000000000000000000000000000000000000001256616c69616e7420436f6c6c656374696f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003564c540000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): Valiant Collection
Arg [1] : _tokenSymbol (string): VLT
Arg [2] : _maxSupply (uint256): 2000
Arg [3] : _whitelistAddress (address): 0x34D211ceD52d1f2042ab4296F45ee49Dd5bC6a8A

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [3] : 00000000000000000000000034d211ced52d1f2042ab4296f45ee49dd5bc6a8a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 56616c69616e7420436f6c6c656374696f6e0000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 564c540000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

659:3869:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9155:630:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10039:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16360:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15812:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5894:317;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1084:54:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3009:832;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19903:2764:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22758:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4320:102:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11391:150:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7045:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2651:103:1;;;;;;;;;;;;;:::i;:::-;;2000:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10208:102:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3847:139:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16901:231:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23526:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1998:1005:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3992:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1032:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;854:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17282:162:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2909:201:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9155:630:2;9240:4;9573:10;9558:25;;:11;:25;;;;:101;;;;9649:10;9634:25;;:11;:25;;;;9558:101;:177;;;;9725:10;9710:25;;:11;:25;;;;9558:177;9539:196;;9155:630;;;:::o;10039:98::-;10093:13;10125:5;10118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:98;:::o;16360:214::-;16436:7;16460:16;16468:7;16460;:16::i;:::-;16455:64;;16485:34;;;;;;;;;;;;;;16455:64;16537:15;:24;16553:7;16537:24;;;;;;;;;;;:30;;;;;;;;;;;;16530:37;;16360:214;;;:::o;15812:398::-;15900:13;15916:16;15924:7;15916;:16::i;:::-;15900:32;;15970:5;15947:28;;:19;:17;:19::i;:::-;:28;;;15943:172;;15994:44;16011:5;16018:19;:17;:19::i;:::-;15994:16;:44::i;:::-;15989:126;;16065:35;;;;;;;;;;;;;;15989:126;15943:172;16158:2;16125:15;:24;16141:7;16125:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16195:7;16191:2;16175:28;;16184:5;16175:28;;;;;;;;;;;;15890:320;15812:398;;:::o;5894:317::-;5955:7;6179:15;:13;:15::i;:::-;6164:12;;6148:13;;:28;:46;6141:53;;5894:317;:::o;1084:54:4:-;;;;;;;;;;;;;;;;;:::o;3009:832::-;3090:9;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3076:43;;:10;:43;;;3067:53;;;;;;3171:9;;3139:28;3158:8;3139:14;:12;:14::i;:::-;:18;;:28;;;;:::i;:::-;:41;;3130:51;;;;;;3249:20;3200:45;3236:8;3200:19;:31;3220:10;3200:31;;;;;;;;;;;;;;;;:35;;:45;;;;:::i;:::-;:69;;3191:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;3303:11;;;;;;;;;;;3299:154;;;3351:2;3339:8;:14;;3330:24;;;;;;3382:5;3368:11;;:19;;;;;;;;;;;;;;;;;;3299:154;;;3439:2;3427:8;:14;;3418:24;;;;;;3299:154;3498:8;3463:19;:31;3483:10;3463:31;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;3516:15;3534:14;:12;:14::i;:::-;3516:32;;3564:6;3559:157;3580:8;3576:1;:12;3559:157;;;3628:51;;;;;;;;3640:8;:6;:8::i;:::-;3628:51;;;;3650:8;:6;:8::i;:::-;3628:51;;;;3660:8;:6;:8::i;:::-;3628:51;;;;3670:8;:6;:8::i;:::-;3628:51;;;3609:7;:16;3617:7;3609:16;;;;;;;;;;;:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3704:1;3693:12;;;;;:::i;:::-;;;3590:3;;;;;:::i;:::-;;;;3559:157;;;;3779:12;:10;:12::i;:::-;3731:61;;3776:1;3766:7;:11;;;;:::i;:::-;3756:8;3746:7;:18;;;;:::i;:::-;3731:61;;;;;;;;;;3803:31;3813:10;3825:8;3803:9;:31::i;:::-;3057:784;3009:832;:::o;19903:2764:2:-;20040:27;20070;20089:7;20070:18;:27::i;:::-;20040:57;;20153:4;20112:45;;20128:19;20112:45;;;20108:86;;20166:28;;;;;;;;;;;;;;20108:86;20206:27;20235:23;20262:35;20289:7;20262:26;:35::i;:::-;20205:92;;;;20394:68;20419:15;20436:4;20442:19;:17;:19::i;:::-;20394:24;:68::i;:::-;20389:179;;20481:43;20498:4;20504:19;:17;:19::i;:::-;20481:16;:43::i;:::-;20476:92;;20533:35;;;;;;;;;;;;;;20476:92;20389:179;20597:1;20583:16;;:2;:16;;;20579:52;;20608:23;;;;;;;;;;;;;;20579:52;20642:43;20664:4;20670:2;20674:7;20683:1;20642:21;:43::i;:::-;20774:15;20771:157;;;20912:1;20891:19;20884:30;20771:157;21300:18;:24;21319:4;21300:24;;;;;;;;;;;;;;;;21298:26;;;;;;;;;;;;21368:18;:22;21387:2;21368:22;;;;;;;;;;;;;;;;21366:24;;;;;;;;;;;21683:143;21719:2;21767:45;21782:4;21788:2;21792:19;21767:14;:45::i;:::-;2392:8;21739:73;21683:18;:143::i;:::-;21654:17;:26;21672:7;21654:26;;;;;;;;;;;:172;;;;21994:1;2392:8;21943:19;:47;:52;21939:617;;22015:19;22047:1;22037:7;:11;22015:33;;22202:1;22168:17;:30;22186:11;22168:30;;;;;;;;;;;;:35;22164:378;;22304:13;;22289:11;:28;22285:239;;22482:19;22449:17;:30;22467:11;22449:30;;;;;;;;;;;:52;;;;22285:239;22164:378;21997:559;21939:617;22600:7;22596:2;22581:27;;22590:4;22581:27;;;;;;;;;;;;22618:42;22639:4;22645:2;22649:7;22658:1;22618:20;:42::i;:::-;20030:2637;;;19903:2764;;;:::o;22758:187::-;22899:39;22916:4;22922:2;22926:7;22899:39;;;;;;;;;;;;:16;:39::i;:::-;22758:187;;;:::o;4320:102:4:-;2231:12:1;:10;:12::i;:::-;2220:23;;:7;:5;:7::i;:::-;:23;;;2212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4407:8:4::1;;4397:7;:18;;;;;;;:::i;:::-;;4320:102:::0;;:::o;11391:150:2:-;11463:7;11505:27;11524:7;11505:18;:27::i;:::-;11482:52;;11391:150;;;:::o;7045:230::-;7117:7;7157:1;7140:19;;:5;:19;;;7136:60;;7168:28;;;;;;;;;;;;;;7136:60;1360:13;7213:18;:25;7232:5;7213:25;;;;;;;;;;;;;;;;:55;7206:62;;7045:230;;;:::o;2651:103:1:-;2231:12;:10;:12::i;:::-;2220:23;;:7;:5;:7::i;:::-;:23;;;2212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2716:30:::1;2743:1;2716:18;:30::i;:::-;2651:103::o:0;2000:87::-;2046:7;2073:6;;;;;;;;;;;2066:13;;2000:87;:::o;10208:102:2:-;10264:13;10296:7;10289:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10208:102;:::o;3847:139:4:-;2231:12:1;:10;:12::i;:::-;2220:23;;:7;:5;:7::i;:::-;:23;;;2212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3958:20:4::1;3935:9;;:44;;;;;;;;;;;;;;;;;;3847:139:::0;:::o;16901:231:2:-;17047:8;16995:18;:39;17014:19;:17;:19::i;:::-;16995:39;;;;;;;;;;;;;;;:49;17035:8;16995:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17106:8;17070:55;;17085:19;:17;:19::i;:::-;17070:55;;;17116:8;17070:55;;;;;;:::i;:::-;;;;;;;;16901:231;;:::o;23526:396::-;23695:31;23708:4;23714:2;23718:7;23695:12;:31::i;:::-;23758:1;23740:2;:14;;;:19;23736:180;;23778:56;23809:4;23815:2;23819:7;23828:5;23778:30;:56::i;:::-;23773:143;;23861:40;;;;;;;;;;;;;;23773:143;23736:180;23526:396;;;;:::o;1998:1005:4:-;2076:9;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2062:43;;:10;:43;;;2058:488;;2162:9;;2130:28;2149:8;2130:14;:12;:14::i;:::-;:18;;:28;;;;:::i;:::-;:41;;2121:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2264:20;2215:45;2251:8;2215:19;:31;2235:10;2215:31;;;;;;;;;;;;;;;;:35;;:45;;;;:::i;:::-;:69;;2206:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;2058:488;;;2387:20;2375:9;;:32;;;;:::i;:::-;2343:28;2362:8;2343:14;:12;:14::i;:::-;:18;;:28;;;;:::i;:::-;:64;;2334:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;2500:16;2451:45;2487:8;2451:19;:31;2471:10;2451:31;;;;;;;;;;;;;;;;:35;;:45;;;;:::i;:::-;:65;;2442:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;2058:488;2560:11;;;;;;;;;;;2556:61;;;2601:5;2587:11;;:19;;;;;;;;;;;;;;;;;;2556:61;2662:8;2627:19;:31;2647:10;2627:31;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;2680:15;2698:14;:12;:14::i;:::-;2680:32;;2728:6;2723:157;2744:8;2740:1;:12;2723:157;;;2792:51;;;;;;;;2804:8;:6;:8::i;:::-;2792:51;;;;2814:8;:6;:8::i;:::-;2792:51;;;;2824:8;:6;:8::i;:::-;2792:51;;;;2834:8;:6;:8::i;:::-;2792:51;;;2773:7;:16;2781:7;2773:16;;;;;;;;;;;:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:1;2857:12;;;;;:::i;:::-;;;2754:3;;;;;:::i;:::-;;;;2723:157;;;;2943:10;2895:59;;2940:1;2930:7;:11;;;;:::i;:::-;2920:8;2910:7;:18;;;;:::i;:::-;2895:59;;;;;;;;;;2965:31;2975:10;2987:8;2965:9;:31::i;:::-;2048:955;1998:1005;:::o;3992:322::-;4065:13;4095:16;4103:7;4095;:16::i;:::-;4090:59;;4120:29;;;;;;;;;;;;;;4090:59;4160:21;4184:10;:8;:10::i;:::-;4160:34;;4236:1;4217:7;4211:21;:26;:96;;;;;;;;;;;;;;;;;4264:7;4273:18;4283:7;4273:9;:18::i;:::-;4247:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4211:96;4204:103;;;3992:322;;;:::o;1032:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;854:24::-;;;;:::o;17282:162:2:-;17379:4;17402:18;:25;17421:5;17402:25;;;;;;;;;;;;;;;:35;17428:8;17402:35;;;;;;;;;;;;;;;;;;;;;;;;;17395:42;;17282:162;;;;:::o;2909:201:1:-;2231:12;:10;:12::i;:::-;2220:23;;:7;:5;:7::i;:::-;:23;;;2212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3018:1:::1;2998:22;;:8;:22;;::::0;2990:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3074:28;3093:8;3074:18;:28::i;:::-;2909:201:::0;:::o;17693:277:2:-;17758:4;17812:7;17793:15;:13;:15::i;:::-;:26;;:65;;;;;17845:13;;17835:7;:23;17793:65;:151;;;;;17943:1;2118:8;17895:17;:26;17913:7;17895:26;;;;;;;;;;;;:44;:49;17793:151;17774:170;;17693:277;;;:::o;39437:103::-;39497:7;39523:10;39516:17;;39437:103;:::o;5426:90::-;5482:7;5426:90;:::o;6304:290::-;6359:7;6562:15;:13;:15::i;:::-;6546:13;;:31;6539:38;;6304:290;:::o;157:123:4:-;215:9;240:1;236;:5;;;;:::i;:::-;232:9;;259:1;254;:6;;247:14;;;;:::i;:::-;;157:123;;;;:::o;5590:101:2:-;5645:7;5671:13;;5664:20;;5590:101;:::o;1528:464:4:-;1564:7;1583:20;1681:3;1641:15;1658:10;1670:5;;1624:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1614:63;;;;;;1606:72;;:78;;;;:::i;:::-;1583:101;;1694:5;;:7;;;;;;;;;:::i;:::-;;;;;;1711:23;:94;;;;;;;;1738:1;1711:94;;;;;;1741:2;1711:94;;;;;;1745:2;1711:94;;;;;;1749:2;1711:94;;;;;;1753:2;1711:94;;;;;;1757:2;1711:94;;;;;;1761:2;1711:94;;;;;;1765:2;1711:94;;;;;;1769:2;1711:94;;;;;;1773:2;1711:94;;;;;;1777:2;1711:94;;;;;;1781:2;1711:94;;;;;;1785:2;1711:94;;;;;;1789:2;1711:94;;;;;;1793:2;1711:94;;;;;;1797:2;1711:94;;;;;;1801:3;1711:94;;;;;;;1820:6;1815:137;1836:13;1832:1;:17;1815:137;;;1890:6;1897:1;1890:9;;;;;;;:::i;:::-;;;;;;1874:25;;:12;:25;1870:72;;1926:1;1919:8;;;;;;;1870:72;1851:3;;;;;:::i;:::-;;;;1815:137;;;;1968:17;1961:24;;;;1528:464;;:::o;718:98:1:-;771:7;798:10;791:17;;718:98;:::o;33423:110:2:-;33499:27;33509:2;33513:8;33499:27;;;;;;;;;;;;:9;:27::i;:::-;33423:110;;:::o;12515:1249::-;12582:7;12601:12;12616:7;12601:22;;12681:4;12662:15;:13;:15::i;:::-;:23;12658:1042;;12714:13;;12707:4;:20;12703:997;;;12751:14;12768:17;:23;12786:4;12768:23;;;;;;;;;;;;12751:40;;12883:1;2118:8;12855:6;:24;:29;12851:831;;13510:111;13527:1;13517:6;:11;13510:111;;13569:17;:25;13587:6;;;;;;;13569:25;;;;;;;;;;;;13560:34;;13510:111;;;13653:6;13646:13;;;;;;12851:831;12729:971;12703:997;12658:1042;13726:31;;;;;;;;;;;;;;12515:1249;;;;:::o;18828:474::-;18927:27;18956:23;18995:38;19036:15;:24;19052:7;19036:24;;;;;;;;;;;18995:65;;19210:18;19187:41;;19266:19;19260:26;19241:45;;19173:123;18828:474;;;:::o;18074:646::-;18219:11;18381:16;18374:5;18370:28;18361:37;;18539:16;18528:9;18524:32;18511:45;;18687:15;18676:9;18673:30;18665:5;18654:9;18651:20;18648:56;18638:66;;18074:646;;;;;:::o;24566:154::-;;;;;:::o;38764:304::-;38895:7;38914:16;2513:3;38940:19;:41;;38914:68;;2513:3;39007:31;39018:4;39024:2;39028:9;39007:10;:31::i;:::-;38999:40;;:62;;38992:69;;;38764:304;;;;;:::o;14297:443::-;14377:14;14542:16;14535:5;14531:28;14522:37;;14717:5;14703:11;14678:23;14674:41;14671:52;14664:5;14661:63;14651:73;;14297:443;;;;:::o;25367:153::-;;;;;:::o;3270:191:1:-;3344:16;3363:6;;;;;;;;;;;3344:25;;3389:8;3380:6;;:17;;;;;;;;;;;;;;;;;;3444:8;3413:40;;3434:8;3413:40;;;;;;;;;;;;3333:128;3270:191;:::o;25948:697:2:-;26106:4;26151:2;26126:45;;;26172:19;:17;:19::i;:::-;26193:4;26199:7;26208:5;26126:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26122:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26421:1;26404:6;:13;:18;26400:229;;26449:40;;;;;;;;;;;;;;26400:229;26589:6;26583:13;26574:6;26570:2;26566:15;26559:38;26122:517;26292:54;;;26282:64;;;:6;:64;;;;26275:71;;;25948:697;;;;;;:::o;4428:98:4:-;4480:13;4512:7;4505:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:98;:::o;39637:1708:2:-;39702:17;40130:4;40123;40117:11;40113:22;40220:1;40214:4;40207:15;40293:4;40290:1;40286:12;40279:19;;40373:1;40368:3;40361:14;40474:3;40708:5;40690:419;40716:1;40690:419;;;40755:1;40750:3;40746:11;40739:18;;40923:2;40917:4;40913:13;40909:2;40905:22;40900:3;40892:36;41015:2;41009:4;41005:13;40997:21;;41080:4;40690:419;41070:25;40690:419;40694:21;41146:3;41141;41137:13;41259:4;41254:3;41250:14;41243:21;;41322:6;41317:3;41310:19;39740:1599;;;39637:1708;;;:::o;32675:669::-;32801:19;32807:2;32811:8;32801:5;:19::i;:::-;32877:1;32859:2;:14;;;:19;32855:473;;32898:11;32912:13;;32898:27;;32943:13;32965:8;32959:3;:14;32943:30;;32991:229;33021:62;33060:1;33064:2;33068:7;;;;;;33077:5;33021:30;:62::i;:::-;33016:165;;33118:40;;;;;;;;;;;;;;33016:165;33215:3;33207:5;:11;32991:229;;33300:3;33283:13;;:20;33279:34;;33305:8;;;33279:34;32880:448;;32855:473;32675:669;;;:::o;38475:143::-;38608:6;38475:143;;;;;:::o;27091:2902::-;27163:20;27186:13;;27163:36;;27225:1;27213:8;:13;27209:44;;27235:18;;;;;;;;;;;;;;27209:44;27264:61;27294:1;27298:2;27302:12;27316:8;27264:21;:61::i;:::-;27797:1;1495:2;27767:1;:26;;27766:32;27754:8;:45;27728:18;:22;27747:2;27728:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28069:136;28105:2;28158:33;28181:1;28185:2;28189:1;28158:14;:33::i;:::-;28125:30;28146:8;28125:20;:30::i;:::-;:66;28069:18;:136::i;:::-;28035:17;:31;28053:12;28035:31;;;;;;;;;;;:170;;;;28220:16;28250:11;28279:8;28264:12;:23;28250:37;;28792:16;28788:2;28784:25;28772:37;;29156:12;29117:8;29077:1;29016:25;28958:1;28898;28872:328;29520:1;29506:12;29502:20;29461:339;29560:3;29551:7;29548:16;29461:339;;29774:7;29764:8;29761:1;29734:25;29731:1;29728;29723:59;29612:1;29603:7;29599:15;29588:26;;29461:339;;;29465:75;29843:1;29831:8;:13;29827:45;;29853:19;;;;;;;;;;;;;;29827:45;29903:3;29887:13;:19;;;;27508:2409;;29926:60;29955:1;29959:2;29963:12;29977:8;29926:20;:60::i;:::-;27153:2840;27091:2902;;:::o;14837:318::-;14907:14;15136:1;15126:8;15123:15;15097:24;15093:46;15083:56;;14837:318;;;:::o;7:75:5:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:117;6557:1;6554;6547:12;6585:553;6643:8;6653:6;6703:3;6696:4;6688:6;6684:17;6680:27;6670:122;;6711:79;;:::i;:::-;6670:122;6824:6;6811:20;6801:30;;6854:18;6846:6;6843:30;6840:117;;;6876:79;;:::i;:::-;6840:117;6990:4;6982:6;6978:17;6966:29;;7044:3;7036:4;7028:6;7024:17;7014:8;7010:32;7007:41;7004:128;;;7051:79;;:::i;:::-;7004:128;6585:553;;;;;:::o;7144:529::-;7215:6;7223;7272:2;7260:9;7251:7;7247:23;7243:32;7240:119;;;7278:79;;:::i;:::-;7240:119;7426:1;7415:9;7411:17;7398:31;7456:18;7448:6;7445:30;7442:117;;;7478:79;;:::i;:::-;7442:117;7591:65;7648:7;7639:6;7628:9;7624:22;7591:65;:::i;:::-;7573:83;;;;7369:297;7144:529;;;;;:::o;7679:116::-;7749:21;7764:5;7749:21;:::i;:::-;7742:5;7739:32;7729:60;;7785:1;7782;7775:12;7729:60;7679:116;:::o;7801:133::-;7844:5;7882:6;7869:20;7860:29;;7898:30;7922:5;7898:30;:::i;:::-;7801:133;;;;:::o;7940:468::-;8005:6;8013;8062:2;8050:9;8041:7;8037:23;8033:32;8030:119;;;8068:79;;:::i;:::-;8030:119;8188:1;8213:53;8258:7;8249:6;8238:9;8234:22;8213:53;:::i;:::-;8203:63;;8159:117;8315:2;8341:50;8383:7;8374:6;8363:9;8359:22;8341:50;:::i;:::-;8331:60;;8286:115;7940:468;;;;;:::o;8414:117::-;8523:1;8520;8513:12;8537:180;8585:77;8582:1;8575:88;8682:4;8679:1;8672:15;8706:4;8703:1;8696:15;8723:281;8806:27;8828:4;8806:27;:::i;:::-;8798:6;8794:40;8936:6;8924:10;8921:22;8900:18;8888:10;8885:34;8882:62;8879:88;;;8947:18;;:::i;:::-;8879:88;8987:10;8983:2;8976:22;8766:238;8723:281;;:::o;9010:129::-;9044:6;9071:20;;:::i;:::-;9061:30;;9100:33;9128:4;9120:6;9100:33;:::i;:::-;9010:129;;;:::o;9145:307::-;9206:4;9296:18;9288:6;9285:30;9282:56;;;9318:18;;:::i;:::-;9282:56;9356:29;9378:6;9356:29;:::i;:::-;9348:37;;9440:4;9434;9430:15;9422:23;;9145:307;;;:::o;9458:146::-;9555:6;9550:3;9545;9532:30;9596:1;9587:6;9582:3;9578:16;9571:27;9458:146;;;:::o;9610:423::-;9687:5;9712:65;9728:48;9769:6;9728:48;:::i;:::-;9712:65;:::i;:::-;9703:74;;9800:6;9793:5;9786:21;9838:4;9831:5;9827:16;9876:3;9867:6;9862:3;9858:16;9855:25;9852:112;;;9883:79;;:::i;:::-;9852:112;9973:54;10020:6;10015:3;10010;9973:54;:::i;:::-;9693:340;9610:423;;;;;:::o;10052:338::-;10107:5;10156:3;10149:4;10141:6;10137:17;10133:27;10123:122;;10164:79;;:::i;:::-;10123:122;10281:6;10268:20;10306:78;10380:3;10372:6;10365:4;10357:6;10353:17;10306:78;:::i;:::-;10297:87;;10113:277;10052:338;;;;:::o;10396:943::-;10491:6;10499;10507;10515;10564:3;10552:9;10543:7;10539:23;10535:33;10532:120;;;10571:79;;:::i;:::-;10532:120;10691:1;10716:53;10761:7;10752:6;10741:9;10737:22;10716:53;:::i;:::-;10706:63;;10662:117;10818:2;10844:53;10889:7;10880:6;10869:9;10865:22;10844:53;:::i;:::-;10834:63;;10789:118;10946:2;10972:53;11017:7;11008:6;10997:9;10993:22;10972:53;:::i;:::-;10962:63;;10917:118;11102:2;11091:9;11087:18;11074:32;11133:18;11125:6;11122:30;11119:117;;;11155:79;;:::i;:::-;11119:117;11260:62;11314:7;11305:6;11294:9;11290:22;11260:62;:::i;:::-;11250:72;;11045:287;10396:943;;;;;;;:::o;11345:553::-;11522:4;11560:3;11549:9;11545:19;11537:27;;11574:71;11642:1;11631:9;11627:17;11618:6;11574:71;:::i;:::-;11655:72;11723:2;11712:9;11708:18;11699:6;11655:72;:::i;:::-;11737;11805:2;11794:9;11790:18;11781:6;11737:72;:::i;:::-;11819;11887:2;11876:9;11872:18;11863:6;11819:72;:::i;:::-;11345:553;;;;;;;:::o;11904:474::-;11972:6;11980;12029:2;12017:9;12008:7;12004:23;12000:32;11997:119;;;12035:79;;:::i;:::-;11997:119;12155:1;12180:53;12225:7;12216:6;12205:9;12201:22;12180:53;:::i;:::-;12170:63;;12126:117;12282:2;12308:53;12353:7;12344:6;12333:9;12329:22;12308:53;:::i;:::-;12298:63;;12253:118;11904:474;;;;;:::o;12384:180::-;12432:77;12429:1;12422:88;12529:4;12526:1;12519:15;12553:4;12550:1;12543:15;12570:320;12614:6;12651:1;12645:4;12641:12;12631:22;;12698:1;12692:4;12688:12;12719:18;12709:81;;12775:4;12767:6;12763:17;12753:27;;12709:81;12837:2;12829:6;12826:14;12806:18;12803:38;12800:84;;12856:18;;:::i;:::-;12800:84;12621:269;12570:320;;;:::o;12896:143::-;12953:5;12984:6;12978:13;12969:22;;13000:33;13027:5;13000:33;:::i;:::-;12896:143;;;;:::o;13045:351::-;13115:6;13164:2;13152:9;13143:7;13139:23;13135:32;13132:119;;;13170:79;;:::i;:::-;13132:119;13290:1;13315:64;13371:7;13362:6;13351:9;13347:22;13315:64;:::i;:::-;13305:74;;13261:128;13045:351;;;;:::o;13402:164::-;13542:16;13538:1;13530:6;13526:14;13519:40;13402:164;:::o;13572:366::-;13714:3;13735:67;13799:2;13794:3;13735:67;:::i;:::-;13728:74;;13811:93;13900:3;13811:93;:::i;:::-;13929:2;13924:3;13920:12;13913:19;;13572:366;;;:::o;13944:419::-;14110:4;14148:2;14137:9;14133:18;14125:26;;14197:9;14191:4;14187:20;14183:1;14172:9;14168:17;14161:47;14225:131;14351:4;14225:131;:::i;:::-;14217:139;;13944:419;;;:::o;14369:180::-;14417:77;14414:1;14407:88;14514:4;14511:1;14504:15;14538:4;14535:1;14528:15;14555:191;14595:3;14614:20;14632:1;14614:20;:::i;:::-;14609:25;;14648:20;14666:1;14648:20;:::i;:::-;14643:25;;14691:1;14688;14684:9;14677:16;;14712:3;14709:1;14706:10;14703:36;;;14719:18;;:::i;:::-;14703:36;14555:191;;;;:::o;14752:233::-;14791:3;14814:24;14832:5;14814:24;:::i;:::-;14805:33;;14860:66;14853:5;14850:77;14847:103;;14930:18;;:::i;:::-;14847:103;14977:1;14970:5;14966:13;14959:20;;14752:233;;;:::o;14991:194::-;15031:4;15051:20;15069:1;15051:20;:::i;:::-;15046:25;;15085:20;15103:1;15085:20;:::i;:::-;15080:25;;15129:1;15126;15122:9;15114:17;;15153:1;15147:4;15144:11;15141:37;;;15158:18;;:::i;:::-;15141:37;14991:194;;;;:::o;15191:182::-;15331:34;15327:1;15319:6;15315:14;15308:58;15191:182;:::o;15379:366::-;15521:3;15542:67;15606:2;15601:3;15542:67;:::i;:::-;15535:74;;15618:93;15707:3;15618:93;:::i;:::-;15736:2;15731:3;15727:12;15720:19;;15379:366;;;:::o;15751:419::-;15917:4;15955:2;15944:9;15940:18;15932:26;;16004:9;15998:4;15994:20;15990:1;15979:9;15975:17;15968:47;16032:131;16158:4;16032:131;:::i;:::-;16024:139;;15751:419;;;:::o;16176:97::-;16235:6;16263:3;16253:13;;16176:97;;;;:::o;16279:141::-;16328:4;16351:3;16343:11;;16374:3;16371:1;16364:14;16408:4;16405:1;16395:18;16387:26;;16279:141;;;:::o;16426:93::-;16463:6;16510:2;16505;16498:5;16494:14;16490:23;16480:33;;16426:93;;;:::o;16525:107::-;16569:8;16619:5;16613:4;16609:16;16588:37;;16525:107;;;;:::o;16638:393::-;16707:6;16757:1;16745:10;16741:18;16780:97;16810:66;16799:9;16780:97;:::i;:::-;16898:39;16928:8;16917:9;16898:39;:::i;:::-;16886:51;;16970:4;16966:9;16959:5;16955:21;16946:30;;17019:4;17009:8;17005:19;16998:5;16995:30;16985:40;;16714:317;;16638:393;;;;;:::o;17037:60::-;17065:3;17086:5;17079:12;;17037:60;;;:::o;17103:142::-;17153:9;17186:53;17204:34;17213:24;17231:5;17213:24;:::i;:::-;17204:34;:::i;:::-;17186:53;:::i;:::-;17173:66;;17103:142;;;:::o;17251:75::-;17294:3;17315:5;17308:12;;17251:75;;;:::o;17332:269::-;17442:39;17473:7;17442:39;:::i;:::-;17503:91;17552:41;17576:16;17552:41;:::i;:::-;17544:6;17537:4;17531:11;17503:91;:::i;:::-;17497:4;17490:105;17408:193;17332:269;;;:::o;17607:73::-;17652:3;17607:73;:::o;17686:189::-;17763:32;;:::i;:::-;17804:65;17862:6;17854;17848:4;17804:65;:::i;:::-;17739:136;17686:189;;:::o;17881:186::-;17941:120;17958:3;17951:5;17948:14;17941:120;;;18012:39;18049:1;18042:5;18012:39;:::i;:::-;17985:1;17978:5;17974:13;17965:22;;17941:120;;;17881:186;;:::o;18073:543::-;18174:2;18169:3;18166:11;18163:446;;;18208:38;18240:5;18208:38;:::i;:::-;18292:29;18310:10;18292:29;:::i;:::-;18282:8;18278:44;18475:2;18463:10;18460:18;18457:49;;;18496:8;18481:23;;18457:49;18519:80;18575:22;18593:3;18575:22;:::i;:::-;18565:8;18561:37;18548:11;18519:80;:::i;:::-;18178:431;;18163:446;18073:543;;;:::o;18622:117::-;18676:8;18726:5;18720:4;18716:16;18695:37;;18622:117;;;;:::o;18745:169::-;18789:6;18822:51;18870:1;18866:6;18858:5;18855:1;18851:13;18822:51;:::i;:::-;18818:56;18903:4;18897;18893:15;18883:25;;18796:118;18745:169;;;;:::o;18919:295::-;18995:4;19141:29;19166:3;19160:4;19141:29;:::i;:::-;19133:37;;19203:3;19200:1;19196:11;19190:4;19187:21;19179:29;;18919:295;;;;:::o;19219:1403::-;19343:44;19383:3;19378;19343:44;:::i;:::-;19452:18;19444:6;19441:30;19438:56;;;19474:18;;:::i;:::-;19438:56;19518:38;19550:4;19544:11;19518:38;:::i;:::-;19603:67;19663:6;19655;19649:4;19603:67;:::i;:::-;19697:1;19726:2;19718:6;19715:14;19743:1;19738:632;;;;20414:1;20431:6;20428:84;;;20487:9;20482:3;20478:19;20465:33;20456:42;;20428:84;20538:67;20598:6;20591:5;20538:67;:::i;:::-;20532:4;20525:81;20387:229;19708:908;;19738:632;19790:4;19786:9;19778:6;19774:22;19824:37;19856:4;19824:37;:::i;:::-;19883:1;19897:215;19911:7;19908:1;19905:14;19897:215;;;19997:9;19992:3;19988:19;19975:33;19967:6;19960:49;20048:1;20040:6;20036:14;20026:24;;20095:2;20084:9;20080:18;20067:31;;19934:4;19931:1;19927:12;19922:17;;19897:215;;;20140:6;20131:7;20128:19;20125:186;;;20205:9;20200:3;20196:19;20183:33;20248:48;20290:4;20282:6;20278:17;20267:9;20248:48;:::i;:::-;20240:6;20233:64;20148:163;20125:186;20357:1;20353;20345:6;20341:14;20337:22;20331:4;20324:36;19745:625;;;19708:908;;19318:1304;;;19219:1403;;;:::o;20628:166::-;20768:18;20764:1;20756:6;20752:14;20745:42;20628:166;:::o;20800:366::-;20942:3;20963:67;21027:2;21022:3;20963:67;:::i;:::-;20956:74;;21039:93;21128:3;21039:93;:::i;:::-;21157:2;21152:3;21148:12;21141:19;;20800:366;;;:::o;21172:419::-;21338:4;21376:2;21365:9;21361:18;21353:26;;21425:9;21419:4;21415:20;21411:1;21400:9;21396:17;21389:47;21453:131;21579:4;21453:131;:::i;:::-;21445:139;;21172:419;;;:::o;21597:148::-;21699:11;21736:3;21721:18;;21597:148;;;;:::o;21751:390::-;21857:3;21885:39;21918:5;21885:39;:::i;:::-;21940:89;22022:6;22017:3;21940:89;:::i;:::-;21933:96;;22038:65;22096:6;22091:3;22084:4;22077:5;22073:16;22038:65;:::i;:::-;22128:6;22123:3;22119:16;22112:23;;21861:280;21751:390;;;;:::o;22147:155::-;22287:7;22283:1;22275:6;22271:14;22264:31;22147:155;:::o;22308:400::-;22468:3;22489:84;22571:1;22566:3;22489:84;:::i;:::-;22482:91;;22582:93;22671:3;22582:93;:::i;:::-;22700:1;22695:3;22691:11;22684:18;;22308:400;;;:::o;22714:701::-;22995:3;23017:95;23108:3;23099:6;23017:95;:::i;:::-;23010:102;;23129:95;23220:3;23211:6;23129:95;:::i;:::-;23122:102;;23241:148;23385:3;23241:148;:::i;:::-;23234:155;;23406:3;23399:10;;22714:701;;;;;:::o;23421:225::-;23561:34;23557:1;23549:6;23545:14;23538:58;23630:8;23625:2;23617:6;23613:15;23606:33;23421:225;:::o;23652:366::-;23794:3;23815:67;23879:2;23874:3;23815:67;:::i;:::-;23808:74;;23891:93;23980:3;23891:93;:::i;:::-;24009:2;24004:3;24000:12;23993:19;;23652:366;;;:::o;24024:419::-;24190:4;24228:2;24217:9;24213:18;24205:26;;24277:9;24271:4;24267:20;24263:1;24252:9;24248:17;24241:47;24305:131;24431:4;24305:131;:::i;:::-;24297:139;;24024:419;;;:::o;24449:180::-;24497:77;24494:1;24487:88;24594:4;24591:1;24584:15;24618:4;24615:1;24608:15;24635:79;24674:7;24703:5;24692:16;;24635:79;;;:::o;24720:157::-;24825:45;24845:24;24863:5;24845:24;:::i;:::-;24825:45;:::i;:::-;24820:3;24813:58;24720:157;;:::o;24883:94::-;24916:8;24964:5;24960:2;24956:14;24935:35;;24883:94;;;:::o;24983:::-;25022:7;25051:20;25065:5;25051:20;:::i;:::-;25040:31;;24983:94;;;:::o;25083:100::-;25122:7;25151:26;25171:5;25151:26;:::i;:::-;25140:37;;25083:100;;;:::o;25189:157::-;25294:45;25314:24;25332:5;25314:24;:::i;:::-;25294:45;:::i;:::-;25289:3;25282:58;25189:157;;:::o;25352:538::-;25520:3;25535:75;25606:3;25597:6;25535:75;:::i;:::-;25635:2;25630:3;25626:12;25619:19;;25648:75;25719:3;25710:6;25648:75;:::i;:::-;25748:2;25743:3;25739:12;25732:19;;25761:75;25832:3;25823:6;25761:75;:::i;:::-;25861:2;25856:3;25852:12;25845:19;;25881:3;25874:10;;25352:538;;;;;;:::o;25896:180::-;25944:77;25941:1;25934:88;26041:4;26038:1;26031:15;26065:4;26062:1;26055:15;26082:176;26114:1;26131:20;26149:1;26131:20;:::i;:::-;26126:25;;26165:20;26183:1;26165:20;:::i;:::-;26160:25;;26204:1;26194:35;;26209:18;;:::i;:::-;26194:35;26250:1;26247;26243:9;26238:14;;26082:176;;;;:::o;26264:180::-;26312:77;26309:1;26302:88;26409:4;26406:1;26399:15;26433:4;26430:1;26423:15;26450:98;26501:6;26535:5;26529:12;26519:22;;26450:98;;;:::o;26554:168::-;26637:11;26671:6;26666:3;26659:19;26711:4;26706:3;26702:14;26687:29;;26554:168;;;;:::o;26728:373::-;26814:3;26842:38;26874:5;26842:38;:::i;:::-;26896:70;26959:6;26954:3;26896:70;:::i;:::-;26889:77;;26975:65;27033:6;27028:3;27021:4;27014:5;27010:16;26975:65;:::i;:::-;27065:29;27087:6;27065:29;:::i;:::-;27060:3;27056:39;27049:46;;26818:283;26728:373;;;;:::o;27107:640::-;27302:4;27340:3;27329:9;27325:19;27317:27;;27354:71;27422:1;27411:9;27407:17;27398:6;27354:71;:::i;:::-;27435:72;27503:2;27492:9;27488:18;27479:6;27435:72;:::i;:::-;27517;27585:2;27574:9;27570:18;27561:6;27517:72;:::i;:::-;27636:9;27630:4;27626:20;27621:2;27610:9;27606:18;27599:48;27664:76;27735:4;27726:6;27664:76;:::i;:::-;27656:84;;27107:640;;;;;;;:::o;27753:141::-;27809:5;27840:6;27834:13;27825:22;;27856:32;27882:5;27856:32;:::i;:::-;27753:141;;;;:::o;27900:349::-;27969:6;28018:2;28006:9;27997:7;27993:23;27989:32;27986:119;;;28024:79;;:::i;:::-;27986:119;28144:1;28169:63;28224:7;28215:6;28204:9;28200:22;28169:63;:::i;:::-;28159:73;;28115:127;27900:349;;;;:::o

Swarm Source

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