ETH Price: $3,354.47 (-2.76%)
Gas: 3 Gwei

Token

SynergyV1 (0xSynergy)
 

Overview

Max Total Supply

333 0xSynergy

Holders

154

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 0xSynergy
0x972f479fd93a95e16dbf0e1542e367df252c661f
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:
ZeroXSynergy

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-20
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

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

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

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

    // ==============================
    //            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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

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

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

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

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

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721ABurnable compliant contract.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;

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

pragma solidity ^0.8.4;

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

pragma solidity ^0.8.4;

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

pragma solidity ^0.8.4;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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`
    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 => address) private _tokenApprovals;

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

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 auxillary 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 auxillary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {// Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * 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 ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    //
                    // We can directly compare the packed value.
                    // If the address is zero, packed is zero.
                    while (packed == 0) {
                        packed = _packedOwnerships[--curr];
                    }
                    return packed;
                }
            }
    }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
    unchecked {
        // Updates:
        // - `balance += quantity`.
        // - `numberMinted += quantity`.
        //
        // We can directly add to the balance and number minted.
        _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] =
        _addressToUint256(to) |
        (block.timestamp << BITPOS_START_TIMESTAMP) |
        (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

        uint256 updatedIndex = startTokenId;
        uint256 end = updatedIndex + quantity;

        if (to.code.length != 0) {
            do {
                emit Transfer(address(0), to, updatedIndex);
                if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
            }
            while (updatedIndex < end);
            // Reentrancy protection
            if (_currentIndex != startTokenId) revert();
        } else {
            do {
                emit Transfer(address(0), to, updatedIndex++);
            }
            while (updatedIndex < end);
        }
        _currentIndex = updatedIndex;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
    unchecked {
        // Updates:
        // - `balance += quantity`.
        // - `numberMinted += quantity`.
        //
        // We can directly add to the balance and number minted.
        _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] =
        _addressToUint256(to) |
        (block.timestamp << BITPOS_START_TIMESTAMP) |
        (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

        uint256 updatedIndex = startTokenId;
        uint256 end = updatedIndex + quantity;

        do {
            emit Transfer(address(0), to, updatedIndex++);
        }
        while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
        isApprovedForAll(from, _msgSenderERC721A()) ||
        getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
        _addressToUint256(to) |
        (block.timestamp << BITPOS_START_TIMESTAMP) |
        BITMASK_NEXT_INITIALIZED;

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

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
        _addressToUint256(from) |
        (block.timestamp << BITPOS_START_TIMESTAMP) |
        BITMASK_BURNED |
        BITMASK_NEXT_INITIALIZED;

        // 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++;
    }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _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))
                }
            }
        }
    }

    /**
     * @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 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 returns (string memory ptr) {
        assembly {
        // The maximum value of a uint256 contains 78 digits (1 byte per digit),
        // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
        // We will need 1 32-byte word to store the length,
        // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
        // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

        // We write the string from the rightmost digit to the leftmost digit.
        // The following is essentially a do-while loop that also handles the zero case.
        // Costs a bit more than early returning for the zero case,
        // but cheaper in terms of deployment and overall runtime costs.
            for {
            // Initialize and perform the first pass without check.
                let temp := value
            // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
            // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
            // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {// Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

pragma solidity ^0.8.4;

/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

pragma solidity ^0.8.4;

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
    unchecked {
        uint256 tokenIdsLength = tokenIds.length;
        TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
        for (uint256 i; i != tokenIdsLength; ++i) {
            ownerships[i] = explicitOwnershipOf(tokenIds[i]);
        }
        return ownerships;
    }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
    unchecked {
        if (start >= stop) revert InvalidQueryRange();
        uint256 tokenIdsIdx;
        uint256 stopLimit = _nextTokenId();
        // Set `start = max(start, _startTokenId())`.
        if (start < _startTokenId()) {
            start = _startTokenId();
        }
        // Set `stop = min(stop, stopLimit)`.
        if (stop > stopLimit) {
            stop = stopLimit;
        }
        uint256 tokenIdsMaxLength = balanceOf(owner);
        // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
        // to cater for cases where `balanceOf(owner)` is too big.
        if (start < stop) {
            uint256 rangeLength = stop - start;
            if (rangeLength < tokenIdsMaxLength) {
                tokenIdsMaxLength = rangeLength;
            }
        } else {
            tokenIdsMaxLength = 0;
        }
        uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
        if (tokenIdsMaxLength == 0) {
            return tokenIds;
        }
        // We need to call `explicitOwnershipOf(start)`,
        // because the slot at `start` may not be initialized.
        TokenOwnership memory ownership = explicitOwnershipOf(start);
        address currOwnershipAddr;
        // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
        // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
        if (!ownership.burned) {
            currOwnershipAddr = ownership.addr;
        }
        for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
            ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                tokenIds[tokenIdsIdx++] = i;
            }
        }
        // Downsize the array to fit.
        assembly {
            mstore(tokenIds, tokenIdsIdx)
        }
        return tokenIds;
    }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
    unchecked {
        uint256 tokenIdsIdx;
        address currOwnershipAddr;
        uint256 tokenIdsLength = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenIdsLength);
        TokenOwnership memory ownership;
        for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
            ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                tokenIds[tokenIdsIdx++] = i;
            }
        }
        return tokenIds;
    }
    }
}


pragma solidity ^0.8.4;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex;
                // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

contract ZeroXSynergy is ERC721AQueryable, ERC721ABurnable, Ownable {
    using EnumerableSet for EnumerableSet.UintSet;

    uint256 public constant MAX_SUPPLY = 333;

    uint256 public maxByWallet = 1;
    mapping(address => uint256) public mintedByWallet;

    // 0:close | 1:open
    bool public saleState;

    bool public collectMarketing = true;

    //baseURI
    string public baseURI;

    //uriSuffix
    string public uriSuffix;

    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI_,
        string memory uriSuffix_
    ) ERC721A(name, symbol) {
        baseURI = baseURI_;
        uriSuffix = uriSuffix_;
    }

    uint256 public MINT_PRICE = .01 ether;

    /******************** PUBLIC ********************/

    function mint(uint256 amount) external payable {
        require(msg.sender == tx.origin, "not allowed");
        require(saleState, "Sale is closed!");
        require(_totalMinted() + amount <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
        require(amount > 0, "Amount can't be 0");
        require(amount + mintedByWallet[msg.sender] <= maxByWallet, "Exceed maxByWallet");

        if (collectMarketing) {
            require(amount * MINT_PRICE <= msg.value, "Invalid payment amount");
        }

        mintedByWallet[msg.sender] += amount;

        _safeMint(msg.sender, amount);
    }

    /******************** OVERRIDES ********************/

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

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

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

        if (bytes(baseURI).length == 0) {
            return _toString(tokenId);
        }

        return string(abi.encodePacked(baseURI, _toString(tokenId), uriSuffix));
    }

    /******************** OWNER ********************/

    /// @notice Set baseURI.
    /// @param newBaseURI New baseURI.
    /// @param newUriSuffix New uriSuffix.
    function setBaseURI(string memory newBaseURI, string memory newUriSuffix) external onlyOwner {
        baseURI = newBaseURI;
        uriSuffix = newUriSuffix;
    }

    /// @notice Set saleState.
    /// @param newSaleState New sale state.
    function setSaleState(bool newSaleState) external onlyOwner {
        saleState = newSaleState;
    }

    /// @notice Set collectMarketing.
    /// @param newCollectMarketing New collect marketing flag.
    function setCollectMarketing(bool newCollectMarketing) external onlyOwner {
        collectMarketing = newCollectMarketing;
    }

    /// @notice Set maxByWallet.
    /// @param newMaxByWallet New max by wallet
    function setMaxByWallet(uint256 newMaxByWallet) external onlyOwner {
        maxByWallet = newMaxByWallet;
    }

    /******************** ALPHA MINT ********************/

    function alphaMint(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        require(!saleState, "sale is open!");
        require(addresses.length == count.length, "mismatching lengths!");

        for (uint256 i; i < addresses.length; i++) {
            _safeMint(addresses[i], count[i]);
        }

        require(_totalMinted() <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"uriSuffix_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"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"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"alphaMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"maxByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"newBaseURI","type":"string"},{"internalType":"string","name":"newUriSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newCollectMarketing","type":"bool"}],"name":"setCollectMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxByWallet","type":"uint256"}],"name":"setMaxByWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSaleState","type":"bool"}],"name":"setSaleState","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260016009556001600b60016101000a81548160ff021916908315150217905550662386f26fc10000600e553480156200003c57600080fd5b50604051620049513803806200495183398181016040528101906200006291906200030f565b838381600290805190602001906200007c929190620001e1565b50806003908051906020019062000095929190620001e1565b50620000a66200010a60201b60201c565b6000819055505050620000ce620000c26200011360201b60201c565b6200011b60201b60201c565b81600c9080519060200190620000e6929190620001e1565b5080600d9080519060200190620000ff929190620001e1565b505050505062000581565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ef9062000492565b90600052602060002090601f0160209004810192826200021357600085556200025f565b82601f106200022e57805160ff19168380011785556200025f565b828001600101855582156200025f579182015b828111156200025e57825182559160200191906001019062000241565b5b5090506200026e919062000272565b5090565b5b808211156200028d57600081600090555060010162000273565b5090565b6000620002a8620002a28462000426565b620003fd565b905082815260208101848484011115620002c757620002c662000561565b5b620002d48482856200045c565b509392505050565b600082601f830112620002f457620002f36200055c565b5b81516200030684826020860162000291565b91505092915050565b600080600080608085870312156200032c576200032b6200056b565b5b600085015167ffffffffffffffff8111156200034d576200034c62000566565b5b6200035b87828801620002dc565b945050602085015167ffffffffffffffff8111156200037f576200037e62000566565b5b6200038d87828801620002dc565b935050604085015167ffffffffffffffff811115620003b157620003b062000566565b5b620003bf87828801620002dc565b925050606085015167ffffffffffffffff811115620003e357620003e262000566565b5b620003f187828801620002dc565b91505092959194509250565b6000620004096200041c565b9050620004178282620004c8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200044457620004436200052d565b5b6200044f8262000570565b9050602081019050919050565b60005b838110156200047c5780820151818401526020810190506200045f565b838111156200048c576000848401525b50505050565b60006002820490506001821680620004ab57607f821691505b60208210811415620004c257620004c1620004fe565b5b50919050565b620004d38262000570565b810181811067ffffffffffffffff82111715620004f557620004f46200052d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6143c080620005916000396000f3fe60806040526004361061021a5760003560e01c80636790a9de11610123578063a0712d68116100ab578063c4e370951161006f578063c4e37095146107d8578063c87b56dd14610801578063e985e9c51461083e578063f09a03c01461087b578063f2fde38b146108a45761021a565b8063a0712d6814610702578063a22cb4651461071e578063b88d4fde14610747578063c002d23d14610770578063c23dc68f1461079b5761021a565b80638462151c116100f25780638462151c146106075780638da5cb5b146106445780639434b8051461066f57806395d89b411461069a57806399a2557a146106c55761021a565b80636790a9de1461055f5780636c0360eb1461058857806370a08231146105b3578063715018a6146105f05761021a565b806332cb6b0c116101a657806342966c681161017557806342966c68146104665780635503a0e81461048f5780635bbb2177146104ba578063603f4d52146104f75780636352211e146105225761021a565b806332cb6b0c146103d057806334ecc70a146103fb5780633ccfd60b1461042657806342842e0e1461043d5761021a565b80630d758111116101ed5780630d758111146102ed57806317d985141461032a57806318160ddd1461035357806323b872dd1461037e5780632e067421146103a75761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906134f9565b6108cd565b6040516102539190613b2d565b60405180910390f35b34801561026857600080fd5b5061027161095f565b60405161027e9190613b48565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906135cb565b6109f1565b6040516102bb9190613a82565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e6919061336f565b610a6d565b005b3480156102f957600080fd5b50610314600480360381019061030f91906131ec565b610c14565b6040516103219190613cc5565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c91906134cc565b610c2c565b005b34801561035f57600080fd5b50610368610cc5565b6040516103759190613cc5565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190613259565b610cdc565b005b3480156103b357600080fd5b506103ce60048036038101906103c991906135cb565b610cec565b005b3480156103dc57600080fd5b506103e5610d72565b6040516103f29190613cc5565b60405180910390f35b34801561040757600080fd5b50610410610d78565b60405161041d9190613cc5565b60405180910390f35b34801561043257600080fd5b5061043b610d7e565b005b34801561044957600080fd5b50610464600480360381019061045f9190613259565b610e4a565b005b34801561047257600080fd5b5061048d600480360381019061048891906135cb565b610e6a565b005b34801561049b57600080fd5b506104a4610e78565b6040516104b19190613b48565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613483565b610f06565b6040516104ee9190613ae9565b60405180910390f35b34801561050357600080fd5b5061050c610fc7565b6040516105199190613b2d565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906135cb565b610fda565b6040516105569190613a82565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190613553565b610fec565b005b34801561059457600080fd5b5061059d61109a565b6040516105aa9190613b48565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906131ec565b611128565b6040516105e79190613cc5565b60405180910390f35b3480156105fc57600080fd5b506106056111e1565b005b34801561061357600080fd5b5061062e600480360381019061062991906131ec565b611269565b60405161063b9190613b0b565b60405180910390f35b34801561065057600080fd5b506106596113b3565b6040516106669190613a82565b60405180910390f35b34801561067b57600080fd5b506106846113dd565b6040516106919190613b2d565b60405180910390f35b3480156106a657600080fd5b506106af6113f0565b6040516106bc9190613b48565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e791906133af565b611482565b6040516106f99190613b0b565b60405180910390f35b61071c600480360381019061071791906135cb565b611696565b005b34801561072a57600080fd5b506107456004803603810190610740919061332f565b611945565b005b34801561075357600080fd5b5061076e600480360381019061076991906132ac565b611abd565b005b34801561077c57600080fd5b50610785611b30565b6040516107929190613cc5565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd91906135cb565b611b36565b6040516107cf9190613caa565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa91906134cc565b611ba0565b005b34801561080d57600080fd5b50610828600480360381019061082391906135cb565b611c39565b6040516108359190613b48565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190613219565b611cd7565b6040516108729190613b2d565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d9190613402565b611d6b565b005b3480156108b057600080fd5b506108cb60048036038101906108c691906131ec565b611f3d565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109585750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096e90613fd7565b80601f016020809104026020016040519081016040528092919081815260200182805461099a90613fd7565b80156109e75780601f106109bc576101008083540402835291602001916109e7565b820191906000526020600020905b8154815290600101906020018083116109ca57829003601f168201915b5050505050905090565b60006109fc82612035565b610a32576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7882612094565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aff612162565b73ffffffffffffffffffffffffffffffffffffffff1614610b6257610b2b81610b26612162565b611cd7565b610b61576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a6020528060005260406000206000915090505481565b610c3461216a565b73ffffffffffffffffffffffffffffffffffffffff16610c526113b3565b73ffffffffffffffffffffffffffffffffffffffff1614610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f90613c6a565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6000610ccf612172565b6001546000540303905090565b610ce783838361217b565b505050565b610cf461216a565b73ffffffffffffffffffffffffffffffffffffffff16610d126113b3565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90613c6a565b60405180910390fd5b8060098190555050565b61014d81565b60095481565b610d8661216a565b73ffffffffffffffffffffffffffffffffffffffff16610da46113b3565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190613c6a565b60405180910390fd5b610e026113b3565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e47573d6000803e3d6000fd5b50565b610e6583838360405180602001604052806000815250611abd565b505050565b610e75816001612525565b50565b600d8054610e8590613fd7565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb190613fd7565b8015610efe5780601f10610ed357610100808354040283529160200191610efe565b820191906000526020600020905b815481529060010190602001808311610ee157829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff811115610f2a57610f29614110565b5b604051908082528060200260200182016040528015610f6357816020015b610f50612e73565b815260200190600190039081610f485790505b50905060005b828114610fbc57610f93858281518110610f8657610f856140e1565b5b6020026020010151611b36565b828281518110610fa657610fa56140e1565b5b6020026020010181905250806001019050610f69565b508092505050919050565b600b60009054906101000a900460ff1681565b6000610fe582612094565b9050919050565b610ff461216a565b73ffffffffffffffffffffffffffffffffffffffff166110126113b3565b73ffffffffffffffffffffffffffffffffffffffff1614611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90613c6a565b60405180910390fd5b81600c908051906020019061107e929190612eb6565b5080600d9080519060200190611095929190612eb6565b505050565b600c80546110a790613fd7565b80601f01602080910402602001604051908101604052809291908181526020018280546110d390613fd7565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611190576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111e961216a565b73ffffffffffffffffffffffffffffffffffffffff166112076113b3565b73ffffffffffffffffffffffffffffffffffffffff161461125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613c6a565b60405180910390fd5b61126760006127fd565b565b6060600080600061127985611128565b905060008167ffffffffffffffff81111561129757611296614110565b5b6040519080825280602002602001820160405280156112c55781602001602082028036833780820191505090505b5090506112d0612e73565b60006112da612172565b90505b8386146113a5576112ed816128c3565b91508160400151156112fe5761139a565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461133e57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611399578083878060010198508151811061138c5761138b6140e1565b5b6020026020010181815250505b5b8060010190506112dd565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60019054906101000a900460ff1681565b6060600380546113ff90613fd7565b80601f016020809104026020016040519081016040528092919081815260200182805461142b90613fd7565b80156114785780601f1061144d57610100808354040283529160200191611478565b820191906000526020600020905b81548152906001019060200180831161145b57829003601f168201915b5050505050905090565b60608183106114bd576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806114c86128ee565b90506114d2612172565b8510156114e4576114e1612172565b94505b808411156114f0578093505b60006114fb87611128565b90508486101561151e576000868603905081811015611518578091505b50611523565b600090505b60008167ffffffffffffffff81111561153f5761153e614110565b5b60405190808252806020026020018201604052801561156d5781602001602082028036833780820191505090505b5090506000821415611585578094505050505061168f565b600061159088611b36565b9050600081604001516115a557816000015190505b60008990505b8881141580156115bb5750848714155b15611681576115c9816128c3565b92508260400151156115da57611676565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461161a57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116755780848880600101995081518110611668576116676140e1565b5b6020026020010181815250505b5b8060010190506115ab565b508583528296505050505050505b9392505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90613c2a565b60405180910390fd5b600b60009054906101000a900460ff16611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90613c0a565b60405180910390fd5b61014d8161175f6128f7565b6117699190613e5d565b11156117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a190613c8a565b60405180910390fd5b600081116117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490613c4a565b60405180910390fd5b600954600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261183b9190613e5d565b111561187c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187390613b8a565b60405180910390fd5b600b60019054906101000a900460ff16156118e25734600e54826118a09190613eb3565b11156118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d890613bca565b60405180910390fd5b5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119319190613e5d565b92505081905550611942338261290a565b50565b61194d612162565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119bf612162565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a6c612162565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab19190613b2d565b60405180910390a35050565b611ac884848461217b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b2a57611af384848484612928565b611b29576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e5481565b611b3e612e73565b611b46612e73565b611b4e612172565b831080611b625750611b5e6128ee565b8310155b15611b705780915050611b9b565b611b79836128c3565b9050806040015115611b8e5780915050611b9b565b611b9783612a88565b9150505b919050565b611ba861216a565b73ffffffffffffffffffffffffffffffffffffffff16611bc66113b3565b73ffffffffffffffffffffffffffffffffffffffff1614611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1390613c6a565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6060611c4482612035565b611c7a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c8054611c8990613fd7565b90501415611ca157611c9a82612aa8565b9050611cd2565b600c611cac83612aa8565b600d604051602001611cc093929190613a51565b60405160208183030381529060405290505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d7361216a565b73ffffffffffffffffffffffffffffffffffffffff16611d916113b3565b73ffffffffffffffffffffffffffffffffffffffff1614611de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dde90613c6a565b60405180910390fd5b600b60009054906101000a900460ff1615611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90613b6a565b60405180910390fd5b818190508484905014611e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7690613bea565b60405180910390fd5b60005b84849050811015611eea57611ed7858583818110611ea357611ea26140e1565b5b9050602002016020810190611eb891906131ec565b848484818110611ecb57611eca6140e1565b5b9050602002013561290a565b8080611ee29061403a565b915050611e82565b5061014d611ef66128f7565b1115611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90613c8a565b60405180910390fd5b50505050565b611f4561216a565b73ffffffffffffffffffffffffffffffffffffffff16611f636113b3565b73ffffffffffffffffffffffffffffffffffffffff1614611fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb090613c6a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202090613baa565b60405180910390fd5b612032816127fd565b50565b600081612040612172565b1115801561204f575060005482105b801561208d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806120a3612172565b1161212b5760005481101561212a5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612128575b600081141561211e5760046000836001900393508381526020019081526020016000205490506120f3565b809250505061215d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b600061218682612094565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121ed576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661220e612162565b73ffffffffffffffffffffffffffffffffffffffff16148061223d575061223c85612237612162565b611cd7565b5b80612282575061224b612162565b73ffffffffffffffffffffffffffffffffffffffff1661226a846109f1565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122bb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612322576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61232f8585856001612b02565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61242c86612b08565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156124b65760006001840190506000600460008381526020019081526020016000205414156124b45760005481146124b3578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461251e8585856001612b12565b5050505050565b600061253083612094565b90506000819050821561260d5760008173ffffffffffffffffffffffffffffffffffffffff1661255e612162565b73ffffffffffffffffffffffffffffffffffffffff16148061258d575061258c82612587612162565b611cd7565b5b806125d2575061259b612162565b73ffffffffffffffffffffffffffffffffffffffff166125ba866109f1565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061260b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61261b816000866001612b02565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b6126f084612b08565b171717600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561277b576000600185019050600060046000838152602001908152602001600020541415612779576000548114612778578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127e5816000866001612b12565b60016000815480929190600101919050555050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128cb612e73565b6128e76004600084815260200190815260200160002054612b18565b9050919050565b60008054905090565b6000612901612172565b60005403905090565b612924828260405180602001604052806000815250612bb4565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261294e612162565b8786866040518563ffffffff1660e01b81526004016129709493929190613a9d565b602060405180830381600087803b15801561298a57600080fd5b505af19250505080156129bb57506040513d601f19601f820116820180604052508101906129b89190613526565b60015b612a35573d80600081146129eb576040519150601f19603f3d011682016040523d82523d6000602084013e6129f0565b606091505b50600081511415612a2d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612a90612e73565b612aa1612a9c83612094565b612b18565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612aee57600183039250600a81066030018353600a81049050612ace565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b612b20612e73565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c21576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612c5c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c696000858386612b02565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612cce60018514612e69565b901b60a042901b612cde86612b08565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612de2575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d926000878480600101955087612928565b612dc8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612d23578260005414612ddd57600080fd5b612e4d565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612de3575b816000819055505050612e636000858386612b12565b50505050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b828054612ec290613fd7565b90600052602060002090601f016020900481019282612ee45760008555612f2b565b82601f10612efd57805160ff1916838001178555612f2b565b82800160010185558215612f2b579182015b82811115612f2a578251825591602001919060010190612f0f565b5b509050612f389190612f3c565b5090565b5b80821115612f55576000816000905550600101612f3d565b5090565b6000612f6c612f6784613d05565b613ce0565b90508083825260208201905082856020860282011115612f8f57612f8e614149565b5b60005b85811015612fbf5781612fa588826131d7565b845260208401935060208301925050600181019050612f92565b5050509392505050565b6000612fdc612fd784613d31565b613ce0565b905082815260208101848484011115612ff857612ff761414e565b5b613003848285613f95565b509392505050565b600061301e61301984613d62565b613ce0565b90508281526020810184848401111561303a5761303961414e565b5b613045848285613f95565b509392505050565b60008135905061305c8161432e565b92915050565b60008083601f84011261307857613077614144565b5b8235905067ffffffffffffffff8111156130955761309461413f565b5b6020830191508360208202830111156130b1576130b0614149565b5b9250929050565b60008083601f8401126130ce576130cd614144565b5b8235905067ffffffffffffffff8111156130eb576130ea61413f565b5b60208301915083602082028301111561310757613106614149565b5b9250929050565b600082601f83011261312357613122614144565b5b8135613133848260208601612f59565b91505092915050565b60008135905061314b81614345565b92915050565b6000813590506131608161435c565b92915050565b6000815190506131758161435c565b92915050565b600082601f8301126131905761318f614144565b5b81356131a0848260208601612fc9565b91505092915050565b600082601f8301126131be576131bd614144565b5b81356131ce84826020860161300b565b91505092915050565b6000813590506131e681614373565b92915050565b60006020828403121561320257613201614158565b5b60006132108482850161304d565b91505092915050565b600080604083850312156132305761322f614158565b5b600061323e8582860161304d565b925050602061324f8582860161304d565b9150509250929050565b60008060006060848603121561327257613271614158565b5b60006132808682870161304d565b93505060206132918682870161304d565b92505060406132a2868287016131d7565b9150509250925092565b600080600080608085870312156132c6576132c5614158565b5b60006132d48782880161304d565b94505060206132e58782880161304d565b93505060406132f6878288016131d7565b925050606085013567ffffffffffffffff81111561331757613316614153565b5b6133238782880161317b565b91505092959194509250565b6000806040838503121561334657613345614158565b5b60006133548582860161304d565b92505060206133658582860161313c565b9150509250929050565b6000806040838503121561338657613385614158565b5b60006133948582860161304d565b92505060206133a5858286016131d7565b9150509250929050565b6000806000606084860312156133c8576133c7614158565b5b60006133d68682870161304d565b93505060206133e7868287016131d7565b92505060406133f8868287016131d7565b9150509250925092565b6000806000806040858703121561341c5761341b614158565b5b600085013567ffffffffffffffff81111561343a57613439614153565b5b61344687828801613062565b9450945050602085013567ffffffffffffffff81111561346957613468614153565b5b613475878288016130b8565b925092505092959194509250565b60006020828403121561349957613498614158565b5b600082013567ffffffffffffffff8111156134b7576134b6614153565b5b6134c38482850161310e565b91505092915050565b6000602082840312156134e2576134e1614158565b5b60006134f08482850161313c565b91505092915050565b60006020828403121561350f5761350e614158565b5b600061351d84828501613151565b91505092915050565b60006020828403121561353c5761353b614158565b5b600061354a84828501613166565b91505092915050565b6000806040838503121561356a57613569614158565b5b600083013567ffffffffffffffff81111561358857613587614153565b5b613594858286016131a9565b925050602083013567ffffffffffffffff8111156135b5576135b4614153565b5b6135c1858286016131a9565b9150509250929050565b6000602082840312156135e1576135e0614158565b5b60006135ef848285016131d7565b91505092915050565b600061360483836139a0565b60608301905092915050565b600061361c8383613a24565b60208301905092915050565b61363181613f0d565b82525050565b61364081613f0d565b82525050565b600061365182613dc8565b61365b8185613e0e565b935061366683613d93565b8060005b8381101561369757815161367e88826135f8565b975061368983613df4565b92505060018101905061366a565b5085935050505092915050565b60006136af82613dd3565b6136b98185613e1f565b93506136c483613da3565b8060005b838110156136f55781516136dc8882613610565b97506136e783613e01565b9250506001810190506136c8565b5085935050505092915050565b61370b81613f1f565b82525050565b61371a81613f1f565b82525050565b600061372b82613dde565b6137358185613e30565b9350613745818560208601613fa4565b61374e8161415d565b840191505092915050565b600061376482613de9565b61376e8185613e41565b935061377e818560208601613fa4565b6137878161415d565b840191505092915050565b600061379d82613de9565b6137a78185613e52565b93506137b7818560208601613fa4565b80840191505092915050565b600081546137d081613fd7565b6137da8186613e52565b945060018216600081146137f5576001811461380657613839565b60ff19831686528186019350613839565b61380f85613db3565b60005b8381101561383157815481890152600182019150602081019050613812565b838801955050505b50505092915050565b600061384f600d83613e41565b915061385a8261416e565b602082019050919050565b6000613872601283613e41565b915061387d82614197565b602082019050919050565b6000613895602683613e41565b91506138a0826141c0565b604082019050919050565b60006138b8601683613e41565b91506138c38261420f565b602082019050919050565b60006138db601483613e41565b91506138e682614238565b602082019050919050565b60006138fe600f83613e41565b915061390982614261565b602082019050919050565b6000613921600b83613e41565b915061392c8261428a565b602082019050919050565b6000613944601183613e41565b915061394f826142b3565b602082019050919050565b6000613967602083613e41565b9150613972826142dc565b602082019050919050565b600061398a601183613e41565b915061399582614305565b602082019050919050565b6060820160008201516139b66000850182613628565b5060208201516139c96020850182613a42565b5060408201516139dc6040850182613702565b50505050565b6060820160008201516139f86000850182613628565b506020820151613a0b6020850182613a42565b506040820151613a1e6040850182613702565b50505050565b613a2d81613f77565b82525050565b613a3c81613f77565b82525050565b613a4b81613f81565b82525050565b6000613a5d82866137c3565b9150613a698285613792565b9150613a7582846137c3565b9150819050949350505050565b6000602082019050613a976000830184613637565b92915050565b6000608082019050613ab26000830187613637565b613abf6020830186613637565b613acc6040830185613a33565b8181036060830152613ade8184613720565b905095945050505050565b60006020820190508181036000830152613b038184613646565b905092915050565b60006020820190508181036000830152613b2581846136a4565b905092915050565b6000602082019050613b426000830184613711565b92915050565b60006020820190508181036000830152613b628184613759565b905092915050565b60006020820190508181036000830152613b8381613842565b9050919050565b60006020820190508181036000830152613ba381613865565b9050919050565b60006020820190508181036000830152613bc381613888565b9050919050565b60006020820190508181036000830152613be3816138ab565b9050919050565b60006020820190508181036000830152613c03816138ce565b9050919050565b60006020820190508181036000830152613c23816138f1565b9050919050565b60006020820190508181036000830152613c4381613914565b9050919050565b60006020820190508181036000830152613c6381613937565b9050919050565b60006020820190508181036000830152613c838161395a565b9050919050565b60006020820190508181036000830152613ca38161397d565b9050919050565b6000606082019050613cbf60008301846139e2565b92915050565b6000602082019050613cda6000830184613a33565b92915050565b6000613cea613cfb565b9050613cf68282614009565b919050565b6000604051905090565b600067ffffffffffffffff821115613d2057613d1f614110565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d4c57613d4b614110565b5b613d558261415d565b9050602081019050919050565b600067ffffffffffffffff821115613d7d57613d7c614110565b5b613d868261415d565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e6882613f77565b9150613e7383613f77565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ea857613ea7614083565b5b828201905092915050565b6000613ebe82613f77565b9150613ec983613f77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f0257613f01614083565b5b828202905092915050565b6000613f1882613f57565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613fc2578082015181840152602081019050613fa7565b83811115613fd1576000848401525b50505050565b60006002820490506001821680613fef57607f821691505b60208210811415614003576140026140b2565b5b50919050565b6140128261415d565b810181811067ffffffffffffffff8211171561403157614030614110565b5b80604052505050565b600061404582613f77565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407857614077614083565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f73616c65206973206f70656e2100000000000000000000000000000000000000600082015250565b7f457863656564206d6178427957616c6c65740000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b7f6d69736d61746368696e67206c656e6774687321000000000000000000000000600082015250565b7f53616c6520697320636c6f736564210000000000000000000000000000000000600082015250565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f416d6f756e742063616e27742062652030000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f457863656564204d41585f535550504c59000000000000000000000000000000600082015250565b61433781613f0d565b811461434257600080fd5b50565b61434e81613f1f565b811461435957600080fd5b50565b61436581613f2b565b811461437057600080fd5b50565b61437c81613f77565b811461438757600080fd5b5056fea2646970667358221220f8fc293a643b7e7fa4c0e4bc65e9d1d7d6a3bc63e67878f0e7742d210e36aab464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000953796e65726779563100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009307853796e65726779000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80636790a9de11610123578063a0712d68116100ab578063c4e370951161006f578063c4e37095146107d8578063c87b56dd14610801578063e985e9c51461083e578063f09a03c01461087b578063f2fde38b146108a45761021a565b8063a0712d6814610702578063a22cb4651461071e578063b88d4fde14610747578063c002d23d14610770578063c23dc68f1461079b5761021a565b80638462151c116100f25780638462151c146106075780638da5cb5b146106445780639434b8051461066f57806395d89b411461069a57806399a2557a146106c55761021a565b80636790a9de1461055f5780636c0360eb1461058857806370a08231146105b3578063715018a6146105f05761021a565b806332cb6b0c116101a657806342966c681161017557806342966c68146104665780635503a0e81461048f5780635bbb2177146104ba578063603f4d52146104f75780636352211e146105225761021a565b806332cb6b0c146103d057806334ecc70a146103fb5780633ccfd60b1461042657806342842e0e1461043d5761021a565b80630d758111116101ed5780630d758111146102ed57806317d985141461032a57806318160ddd1461035357806323b872dd1461037e5780632e067421146103a75761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906134f9565b6108cd565b6040516102539190613b2d565b60405180910390f35b34801561026857600080fd5b5061027161095f565b60405161027e9190613b48565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906135cb565b6109f1565b6040516102bb9190613a82565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e6919061336f565b610a6d565b005b3480156102f957600080fd5b50610314600480360381019061030f91906131ec565b610c14565b6040516103219190613cc5565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c91906134cc565b610c2c565b005b34801561035f57600080fd5b50610368610cc5565b6040516103759190613cc5565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190613259565b610cdc565b005b3480156103b357600080fd5b506103ce60048036038101906103c991906135cb565b610cec565b005b3480156103dc57600080fd5b506103e5610d72565b6040516103f29190613cc5565b60405180910390f35b34801561040757600080fd5b50610410610d78565b60405161041d9190613cc5565b60405180910390f35b34801561043257600080fd5b5061043b610d7e565b005b34801561044957600080fd5b50610464600480360381019061045f9190613259565b610e4a565b005b34801561047257600080fd5b5061048d600480360381019061048891906135cb565b610e6a565b005b34801561049b57600080fd5b506104a4610e78565b6040516104b19190613b48565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613483565b610f06565b6040516104ee9190613ae9565b60405180910390f35b34801561050357600080fd5b5061050c610fc7565b6040516105199190613b2d565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906135cb565b610fda565b6040516105569190613a82565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190613553565b610fec565b005b34801561059457600080fd5b5061059d61109a565b6040516105aa9190613b48565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906131ec565b611128565b6040516105e79190613cc5565b60405180910390f35b3480156105fc57600080fd5b506106056111e1565b005b34801561061357600080fd5b5061062e600480360381019061062991906131ec565b611269565b60405161063b9190613b0b565b60405180910390f35b34801561065057600080fd5b506106596113b3565b6040516106669190613a82565b60405180910390f35b34801561067b57600080fd5b506106846113dd565b6040516106919190613b2d565b60405180910390f35b3480156106a657600080fd5b506106af6113f0565b6040516106bc9190613b48565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e791906133af565b611482565b6040516106f99190613b0b565b60405180910390f35b61071c600480360381019061071791906135cb565b611696565b005b34801561072a57600080fd5b506107456004803603810190610740919061332f565b611945565b005b34801561075357600080fd5b5061076e600480360381019061076991906132ac565b611abd565b005b34801561077c57600080fd5b50610785611b30565b6040516107929190613cc5565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd91906135cb565b611b36565b6040516107cf9190613caa565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa91906134cc565b611ba0565b005b34801561080d57600080fd5b50610828600480360381019061082391906135cb565b611c39565b6040516108359190613b48565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190613219565b611cd7565b6040516108729190613b2d565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d9190613402565b611d6b565b005b3480156108b057600080fd5b506108cb60048036038101906108c691906131ec565b611f3d565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109585750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096e90613fd7565b80601f016020809104026020016040519081016040528092919081815260200182805461099a90613fd7565b80156109e75780601f106109bc576101008083540402835291602001916109e7565b820191906000526020600020905b8154815290600101906020018083116109ca57829003601f168201915b5050505050905090565b60006109fc82612035565b610a32576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7882612094565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aff612162565b73ffffffffffffffffffffffffffffffffffffffff1614610b6257610b2b81610b26612162565b611cd7565b610b61576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a6020528060005260406000206000915090505481565b610c3461216a565b73ffffffffffffffffffffffffffffffffffffffff16610c526113b3565b73ffffffffffffffffffffffffffffffffffffffff1614610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f90613c6a565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6000610ccf612172565b6001546000540303905090565b610ce783838361217b565b505050565b610cf461216a565b73ffffffffffffffffffffffffffffffffffffffff16610d126113b3565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90613c6a565b60405180910390fd5b8060098190555050565b61014d81565b60095481565b610d8661216a565b73ffffffffffffffffffffffffffffffffffffffff16610da46113b3565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190613c6a565b60405180910390fd5b610e026113b3565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e47573d6000803e3d6000fd5b50565b610e6583838360405180602001604052806000815250611abd565b505050565b610e75816001612525565b50565b600d8054610e8590613fd7565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb190613fd7565b8015610efe5780601f10610ed357610100808354040283529160200191610efe565b820191906000526020600020905b815481529060010190602001808311610ee157829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff811115610f2a57610f29614110565b5b604051908082528060200260200182016040528015610f6357816020015b610f50612e73565b815260200190600190039081610f485790505b50905060005b828114610fbc57610f93858281518110610f8657610f856140e1565b5b6020026020010151611b36565b828281518110610fa657610fa56140e1565b5b6020026020010181905250806001019050610f69565b508092505050919050565b600b60009054906101000a900460ff1681565b6000610fe582612094565b9050919050565b610ff461216a565b73ffffffffffffffffffffffffffffffffffffffff166110126113b3565b73ffffffffffffffffffffffffffffffffffffffff1614611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90613c6a565b60405180910390fd5b81600c908051906020019061107e929190612eb6565b5080600d9080519060200190611095929190612eb6565b505050565b600c80546110a790613fd7565b80601f01602080910402602001604051908101604052809291908181526020018280546110d390613fd7565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611190576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111e961216a565b73ffffffffffffffffffffffffffffffffffffffff166112076113b3565b73ffffffffffffffffffffffffffffffffffffffff161461125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613c6a565b60405180910390fd5b61126760006127fd565b565b6060600080600061127985611128565b905060008167ffffffffffffffff81111561129757611296614110565b5b6040519080825280602002602001820160405280156112c55781602001602082028036833780820191505090505b5090506112d0612e73565b60006112da612172565b90505b8386146113a5576112ed816128c3565b91508160400151156112fe5761139a565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461133e57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611399578083878060010198508151811061138c5761138b6140e1565b5b6020026020010181815250505b5b8060010190506112dd565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60019054906101000a900460ff1681565b6060600380546113ff90613fd7565b80601f016020809104026020016040519081016040528092919081815260200182805461142b90613fd7565b80156114785780601f1061144d57610100808354040283529160200191611478565b820191906000526020600020905b81548152906001019060200180831161145b57829003601f168201915b5050505050905090565b60608183106114bd576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806114c86128ee565b90506114d2612172565b8510156114e4576114e1612172565b94505b808411156114f0578093505b60006114fb87611128565b90508486101561151e576000868603905081811015611518578091505b50611523565b600090505b60008167ffffffffffffffff81111561153f5761153e614110565b5b60405190808252806020026020018201604052801561156d5781602001602082028036833780820191505090505b5090506000821415611585578094505050505061168f565b600061159088611b36565b9050600081604001516115a557816000015190505b60008990505b8881141580156115bb5750848714155b15611681576115c9816128c3565b92508260400151156115da57611676565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461161a57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116755780848880600101995081518110611668576116676140e1565b5b6020026020010181815250505b5b8060010190506115ab565b508583528296505050505050505b9392505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb90613c2a565b60405180910390fd5b600b60009054906101000a900460ff16611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90613c0a565b60405180910390fd5b61014d8161175f6128f7565b6117699190613e5d565b11156117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a190613c8a565b60405180910390fd5b600081116117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490613c4a565b60405180910390fd5b600954600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261183b9190613e5d565b111561187c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187390613b8a565b60405180910390fd5b600b60019054906101000a900460ff16156118e25734600e54826118a09190613eb3565b11156118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d890613bca565b60405180910390fd5b5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119319190613e5d565b92505081905550611942338261290a565b50565b61194d612162565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119bf612162565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a6c612162565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab19190613b2d565b60405180910390a35050565b611ac884848461217b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b2a57611af384848484612928565b611b29576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e5481565b611b3e612e73565b611b46612e73565b611b4e612172565b831080611b625750611b5e6128ee565b8310155b15611b705780915050611b9b565b611b79836128c3565b9050806040015115611b8e5780915050611b9b565b611b9783612a88565b9150505b919050565b611ba861216a565b73ffffffffffffffffffffffffffffffffffffffff16611bc66113b3565b73ffffffffffffffffffffffffffffffffffffffff1614611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1390613c6a565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6060611c4482612035565b611c7a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c8054611c8990613fd7565b90501415611ca157611c9a82612aa8565b9050611cd2565b600c611cac83612aa8565b600d604051602001611cc093929190613a51565b60405160208183030381529060405290505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d7361216a565b73ffffffffffffffffffffffffffffffffffffffff16611d916113b3565b73ffffffffffffffffffffffffffffffffffffffff1614611de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dde90613c6a565b60405180910390fd5b600b60009054906101000a900460ff1615611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90613b6a565b60405180910390fd5b818190508484905014611e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7690613bea565b60405180910390fd5b60005b84849050811015611eea57611ed7858583818110611ea357611ea26140e1565b5b9050602002016020810190611eb891906131ec565b848484818110611ecb57611eca6140e1565b5b9050602002013561290a565b8080611ee29061403a565b915050611e82565b5061014d611ef66128f7565b1115611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90613c8a565b60405180910390fd5b50505050565b611f4561216a565b73ffffffffffffffffffffffffffffffffffffffff16611f636113b3565b73ffffffffffffffffffffffffffffffffffffffff1614611fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb090613c6a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202090613baa565b60405180910390fd5b612032816127fd565b50565b600081612040612172565b1115801561204f575060005482105b801561208d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806120a3612172565b1161212b5760005481101561212a5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612128575b600081141561211e5760046000836001900393508381526020019081526020016000205490506120f3565b809250505061215d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b600061218682612094565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146121ed576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661220e612162565b73ffffffffffffffffffffffffffffffffffffffff16148061223d575061223c85612237612162565b611cd7565b5b80612282575061224b612162565b73ffffffffffffffffffffffffffffffffffffffff1661226a846109f1565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122bb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612322576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61232f8585856001612b02565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61242c86612b08565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156124b65760006001840190506000600460008381526020019081526020016000205414156124b45760005481146124b3578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461251e8585856001612b12565b5050505050565b600061253083612094565b90506000819050821561260d5760008173ffffffffffffffffffffffffffffffffffffffff1661255e612162565b73ffffffffffffffffffffffffffffffffffffffff16148061258d575061258c82612587612162565b611cd7565b5b806125d2575061259b612162565b73ffffffffffffffffffffffffffffffffffffffff166125ba866109f1565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061260b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61261b816000866001612b02565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b6126f084612b08565b171717600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561277b576000600185019050600060046000838152602001908152602001600020541415612779576000548114612778578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127e5816000866001612b12565b60016000815480929190600101919050555050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128cb612e73565b6128e76004600084815260200190815260200160002054612b18565b9050919050565b60008054905090565b6000612901612172565b60005403905090565b612924828260405180602001604052806000815250612bb4565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261294e612162565b8786866040518563ffffffff1660e01b81526004016129709493929190613a9d565b602060405180830381600087803b15801561298a57600080fd5b505af19250505080156129bb57506040513d601f19601f820116820180604052508101906129b89190613526565b60015b612a35573d80600081146129eb576040519150601f19603f3d011682016040523d82523d6000602084013e6129f0565b606091505b50600081511415612a2d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612a90612e73565b612aa1612a9c83612094565b612b18565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612aee57600183039250600a81066030018353600a81049050612ace565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b612b20612e73565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c21576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612c5c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c696000858386612b02565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612cce60018514612e69565b901b60a042901b612cde86612b08565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612de2575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d926000878480600101955087612928565b612dc8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612d23578260005414612ddd57600080fd5b612e4d565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612de3575b816000819055505050612e636000858386612b12565b50505050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b828054612ec290613fd7565b90600052602060002090601f016020900481019282612ee45760008555612f2b565b82601f10612efd57805160ff1916838001178555612f2b565b82800160010185558215612f2b579182015b82811115612f2a578251825591602001919060010190612f0f565b5b509050612f389190612f3c565b5090565b5b80821115612f55576000816000905550600101612f3d565b5090565b6000612f6c612f6784613d05565b613ce0565b90508083825260208201905082856020860282011115612f8f57612f8e614149565b5b60005b85811015612fbf5781612fa588826131d7565b845260208401935060208301925050600181019050612f92565b5050509392505050565b6000612fdc612fd784613d31565b613ce0565b905082815260208101848484011115612ff857612ff761414e565b5b613003848285613f95565b509392505050565b600061301e61301984613d62565b613ce0565b90508281526020810184848401111561303a5761303961414e565b5b613045848285613f95565b509392505050565b60008135905061305c8161432e565b92915050565b60008083601f84011261307857613077614144565b5b8235905067ffffffffffffffff8111156130955761309461413f565b5b6020830191508360208202830111156130b1576130b0614149565b5b9250929050565b60008083601f8401126130ce576130cd614144565b5b8235905067ffffffffffffffff8111156130eb576130ea61413f565b5b60208301915083602082028301111561310757613106614149565b5b9250929050565b600082601f83011261312357613122614144565b5b8135613133848260208601612f59565b91505092915050565b60008135905061314b81614345565b92915050565b6000813590506131608161435c565b92915050565b6000815190506131758161435c565b92915050565b600082601f8301126131905761318f614144565b5b81356131a0848260208601612fc9565b91505092915050565b600082601f8301126131be576131bd614144565b5b81356131ce84826020860161300b565b91505092915050565b6000813590506131e681614373565b92915050565b60006020828403121561320257613201614158565b5b60006132108482850161304d565b91505092915050565b600080604083850312156132305761322f614158565b5b600061323e8582860161304d565b925050602061324f8582860161304d565b9150509250929050565b60008060006060848603121561327257613271614158565b5b60006132808682870161304d565b93505060206132918682870161304d565b92505060406132a2868287016131d7565b9150509250925092565b600080600080608085870312156132c6576132c5614158565b5b60006132d48782880161304d565b94505060206132e58782880161304d565b93505060406132f6878288016131d7565b925050606085013567ffffffffffffffff81111561331757613316614153565b5b6133238782880161317b565b91505092959194509250565b6000806040838503121561334657613345614158565b5b60006133548582860161304d565b92505060206133658582860161313c565b9150509250929050565b6000806040838503121561338657613385614158565b5b60006133948582860161304d565b92505060206133a5858286016131d7565b9150509250929050565b6000806000606084860312156133c8576133c7614158565b5b60006133d68682870161304d565b93505060206133e7868287016131d7565b92505060406133f8868287016131d7565b9150509250925092565b6000806000806040858703121561341c5761341b614158565b5b600085013567ffffffffffffffff81111561343a57613439614153565b5b61344687828801613062565b9450945050602085013567ffffffffffffffff81111561346957613468614153565b5b613475878288016130b8565b925092505092959194509250565b60006020828403121561349957613498614158565b5b600082013567ffffffffffffffff8111156134b7576134b6614153565b5b6134c38482850161310e565b91505092915050565b6000602082840312156134e2576134e1614158565b5b60006134f08482850161313c565b91505092915050565b60006020828403121561350f5761350e614158565b5b600061351d84828501613151565b91505092915050565b60006020828403121561353c5761353b614158565b5b600061354a84828501613166565b91505092915050565b6000806040838503121561356a57613569614158565b5b600083013567ffffffffffffffff81111561358857613587614153565b5b613594858286016131a9565b925050602083013567ffffffffffffffff8111156135b5576135b4614153565b5b6135c1858286016131a9565b9150509250929050565b6000602082840312156135e1576135e0614158565b5b60006135ef848285016131d7565b91505092915050565b600061360483836139a0565b60608301905092915050565b600061361c8383613a24565b60208301905092915050565b61363181613f0d565b82525050565b61364081613f0d565b82525050565b600061365182613dc8565b61365b8185613e0e565b935061366683613d93565b8060005b8381101561369757815161367e88826135f8565b975061368983613df4565b92505060018101905061366a565b5085935050505092915050565b60006136af82613dd3565b6136b98185613e1f565b93506136c483613da3565b8060005b838110156136f55781516136dc8882613610565b97506136e783613e01565b9250506001810190506136c8565b5085935050505092915050565b61370b81613f1f565b82525050565b61371a81613f1f565b82525050565b600061372b82613dde565b6137358185613e30565b9350613745818560208601613fa4565b61374e8161415d565b840191505092915050565b600061376482613de9565b61376e8185613e41565b935061377e818560208601613fa4565b6137878161415d565b840191505092915050565b600061379d82613de9565b6137a78185613e52565b93506137b7818560208601613fa4565b80840191505092915050565b600081546137d081613fd7565b6137da8186613e52565b945060018216600081146137f5576001811461380657613839565b60ff19831686528186019350613839565b61380f85613db3565b60005b8381101561383157815481890152600182019150602081019050613812565b838801955050505b50505092915050565b600061384f600d83613e41565b915061385a8261416e565b602082019050919050565b6000613872601283613e41565b915061387d82614197565b602082019050919050565b6000613895602683613e41565b91506138a0826141c0565b604082019050919050565b60006138b8601683613e41565b91506138c38261420f565b602082019050919050565b60006138db601483613e41565b91506138e682614238565b602082019050919050565b60006138fe600f83613e41565b915061390982614261565b602082019050919050565b6000613921600b83613e41565b915061392c8261428a565b602082019050919050565b6000613944601183613e41565b915061394f826142b3565b602082019050919050565b6000613967602083613e41565b9150613972826142dc565b602082019050919050565b600061398a601183613e41565b915061399582614305565b602082019050919050565b6060820160008201516139b66000850182613628565b5060208201516139c96020850182613a42565b5060408201516139dc6040850182613702565b50505050565b6060820160008201516139f86000850182613628565b506020820151613a0b6020850182613a42565b506040820151613a1e6040850182613702565b50505050565b613a2d81613f77565b82525050565b613a3c81613f77565b82525050565b613a4b81613f81565b82525050565b6000613a5d82866137c3565b9150613a698285613792565b9150613a7582846137c3565b9150819050949350505050565b6000602082019050613a976000830184613637565b92915050565b6000608082019050613ab26000830187613637565b613abf6020830186613637565b613acc6040830185613a33565b8181036060830152613ade8184613720565b905095945050505050565b60006020820190508181036000830152613b038184613646565b905092915050565b60006020820190508181036000830152613b2581846136a4565b905092915050565b6000602082019050613b426000830184613711565b92915050565b60006020820190508181036000830152613b628184613759565b905092915050565b60006020820190508181036000830152613b8381613842565b9050919050565b60006020820190508181036000830152613ba381613865565b9050919050565b60006020820190508181036000830152613bc381613888565b9050919050565b60006020820190508181036000830152613be3816138ab565b9050919050565b60006020820190508181036000830152613c03816138ce565b9050919050565b60006020820190508181036000830152613c23816138f1565b9050919050565b60006020820190508181036000830152613c4381613914565b9050919050565b60006020820190508181036000830152613c6381613937565b9050919050565b60006020820190508181036000830152613c838161395a565b9050919050565b60006020820190508181036000830152613ca38161397d565b9050919050565b6000606082019050613cbf60008301846139e2565b92915050565b6000602082019050613cda6000830184613a33565b92915050565b6000613cea613cfb565b9050613cf68282614009565b919050565b6000604051905090565b600067ffffffffffffffff821115613d2057613d1f614110565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d4c57613d4b614110565b5b613d558261415d565b9050602081019050919050565b600067ffffffffffffffff821115613d7d57613d7c614110565b5b613d868261415d565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e6882613f77565b9150613e7383613f77565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ea857613ea7614083565b5b828201905092915050565b6000613ebe82613f77565b9150613ec983613f77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f0257613f01614083565b5b828202905092915050565b6000613f1882613f57565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613fc2578082015181840152602081019050613fa7565b83811115613fd1576000848401525b50505050565b60006002820490506001821680613fef57607f821691505b60208210811415614003576140026140b2565b5b50919050565b6140128261415d565b810181811067ffffffffffffffff8211171561403157614030614110565b5b80604052505050565b600061404582613f77565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407857614077614083565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f73616c65206973206f70656e2100000000000000000000000000000000000000600082015250565b7f457863656564206d6178427957616c6c65740000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b7f6d69736d61746368696e67206c656e6774687321000000000000000000000000600082015250565b7f53616c6520697320636c6f736564210000000000000000000000000000000000600082015250565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f416d6f756e742063616e27742062652030000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f457863656564204d41585f535550504c59000000000000000000000000000000600082015250565b61433781613f0d565b811461434257600080fd5b50565b61434e81613f1f565b811461435957600080fd5b50565b61436581613f2b565b811461437057600080fd5b50565b61437c81613f77565b811461438757600080fd5b5056fea2646970667358221220f8fc293a643b7e7fa4c0e4bc65e9d1d7d6a3bc63e67878f0e7742d210e36aab464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000953796e65726779563100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009307853796e65726779000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): SynergyV1
Arg [1] : symbol (string): 0xSynergy
Arg [2] : baseURI_ (string): ,
Arg [3] : uriSuffix_ (string):

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 53796e6572677956310000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [7] : 307853796e657267790000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 2c00000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62156:3637:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18757:612;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25781:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25241:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62371:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64859:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17835:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26667:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65081:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62285:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62334:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65684:106;;;;;;;;;;;;;:::i;:::-;;26908:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43790:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62590:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45290:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62454:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23502:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64393:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62543:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19433:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13028:103;;;;;;;;;;;;;:::i;:::-;;48854:812;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12377:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62484:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23882:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46116:2289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62973:601;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26057:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27164:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62869:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44711:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64645:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63868:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26436:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65265:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13286:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18757:612;18842:4;19153:10;19138:25;;:11;:25;;;;:98;;;;19226:10;19211:25;;:11;:25;;;;19138:98;:171;;;;19299:10;19284:25;;:11;:25;;;;19138:171;19122:187;;18757:612;;;:::o;23713:100::-;23767:13;23800:5;23793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23713:100;:::o;25781:204::-;25849:7;25874:16;25882:7;25874;:16::i;:::-;25869:64;;25899:34;;;;;;;;;;;;;;25869:64;25953:15;:24;25969:7;25953:24;;;;;;;;;;;;;;;;;;;;;25946:31;;25781:204;;;:::o;25241:474::-;25314:13;25346:27;25365:7;25346:18;:27::i;:::-;25314:61;;25396:5;25390:11;;:2;:11;;;25386:48;;;25410:24;;;;;;;;;;;;;;25386:48;25474:5;25451:28;;:19;:17;:19::i;:::-;:28;;;25447:175;;25499:44;25516:5;25523:19;:17;:19::i;:::-;25499:16;:44::i;:::-;25494:128;;25571:35;;;;;;;;;;;;;;25494:128;25447:175;25661:2;25634:15;:24;25650:7;25634:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25699:7;25695:2;25679:28;;25688:5;25679:28;;;;;;;;;;;;25303:412;25241:474;;:::o;62371:49::-;;;;;;;;;;;;;;;;;:::o;64859:131::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64963:19:::1;64944:16;;:38;;;;;;;;;;;;;;;;;;64859:131:::0;:::o;17835:303::-;17888:7;18108:15;:13;:15::i;:::-;18093:12;;18077:13;;:28;:46;18070:53;;17835:303;:::o;26667:170::-;26801:28;26811:4;26817:2;26821:7;26801:9;:28::i;:::-;26667:170;;;:::o;65081:114::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65173:14:::1;65159:11;:28;;;;65081:114:::0;:::o;62285:40::-;62322:3;62285:40;:::o;62334:30::-;;;;:::o;65684:106::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65742:7:::1;:5;:7::i;:::-;65734:25;;:48;65760:21;65734:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65684:106::o:0;26908:185::-;27046:39;27063:4;27069:2;27073:7;27046:39;;;;;;;;;;;;:16;:39::i;:::-;26908:185;;;:::o;43790:94::-;43856:20;43862:7;43871:4;43856:5;:20::i;:::-;43790:94;:::o;62590:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45290:436::-;45379:23;45432:22;45457:8;:15;45432:40;;45483:34;45541:14;45520:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45483:73;;45572:9;45567:117;45588:14;45583:1;:19;45567:117;;45640:32;45660:8;45669:1;45660:11;;;;;;;;:::i;:::-;;;;;;;;45640:19;:32::i;:::-;45624:10;45635:1;45624:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;45604:3;;;;;45567:117;;;;45701:10;45694:17;;;;45290:436;;;:::o;62454:21::-;;;;;;;;;;;;;:::o;23502:144::-;23566:7;23609:27;23628:7;23609:18;:27::i;:::-;23586:52;;23502:144;;;:::o;64393:167::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64507:10:::1;64497:7;:20;;;;;;;;;;;;:::i;:::-;;64540:12;64528:9;:24;;;;;;;;;;;;:::i;:::-;;64393:167:::0;;:::o;62543:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19433:224::-;19497:7;19538:1;19521:19;;:5;:19;;;19517:60;;;19549:28;;;;;;;;;;;;;;19517:60;14805:13;19595:18;:25;19614:5;19595:25;;;;;;;;;;;;;;;;:54;19588:61;;19433:224;;;:::o;13028:103::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13093:30:::1;13120:1;13093:18;:30::i;:::-;13028:103::o:0;48854:812::-;48924:16;48970:19;49000:25;49036:22;49061:16;49071:5;49061:9;:16::i;:::-;49036:41;;49088:25;49130:14;49116:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49088:57;;49156:31;;:::i;:::-;49203:9;49215:15;:13;:15::i;:::-;49203:27;;49198:428;49247:14;49232:11;:29;49198:428;;49295:15;49308:1;49295:12;:15::i;:::-;49283:27;;49329:9;:16;;;49325:65;;;49366:8;;49325:65;49434:1;49408:28;;:9;:14;;;:28;;;49404:103;;49477:9;:14;;;49457:34;;49404:103;49546:5;49525:26;;:17;:26;;;49521:94;;;49598:1;49572:8;49581:13;;;;;;49572:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;49521:94;49198:428;49263:3;;;;;49198:428;;;;49643:8;49636:15;;;;;;;48854:812;;;:::o;12377:87::-;12423:7;12450:6;;;;;;;;;;;12443:13;;12377:87;:::o;62484:35::-;;;;;;;;;;;;;:::o;23882:104::-;23938:13;23971:7;23964:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23882:104;:::o;46116:2289::-;46251:16;46310:4;46301:5;:13;46297:45;;46323:19;;;;;;;;;;;;;;46297:45;46353:19;46383:17;46403:14;:12;:14::i;:::-;46383:34;;46495:15;:13;:15::i;:::-;46487:5;:23;46483:79;;;46535:15;:13;:15::i;:::-;46527:23;;46483:79;46630:9;46623:4;:16;46619:65;;;46663:9;46656:16;;46619:65;46694:25;46722:16;46732:5;46722:9;:16::i;:::-;46694:44;;46904:4;46896:5;:12;46892:250;;;46925:19;46954:5;46947:4;:12;46925:34;;46992:17;46978:11;:31;46974:103;;;47050:11;47030:31;;46974:103;46910:178;46892:250;;;47129:1;47109:21;;46892:250;47152:25;47194:17;47180:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47152:60;;47248:1;47227:17;:22;47223:70;;;47273:8;47266:15;;;;;;;;47223:70;47425:31;47459:26;47479:5;47459:19;:26::i;:::-;47425:60;;47496:25;47729:9;:16;;;47724:84;;47782:9;:14;;;47762:34;;47724:84;47823:9;47835:5;47823:17;;47818:434;47847:4;47842:1;:9;;:45;;;;;47870:17;47855:11;:32;;47842:45;47818:434;;;47921:15;47934:1;47921:12;:15::i;:::-;47909:27;;47955:9;:16;;;47951:65;;;47992:8;;47951:65;48060:1;48034:28;;:9;:14;;;:28;;;48030:103;;48103:9;:14;;;48083:34;;48030:103;48172:5;48151:26;;:17;:26;;;48147:94;;;48224:1;48198:8;48207:13;;;;;;48198:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;48147:94;47818:434;47889:3;;;;;47818:434;;;;48342:11;48332:8;48325:29;48382:8;48375:15;;;;;;;;46116:2289;;;;;;:::o;62973:601::-;63053:9;63039:23;;:10;:23;;;63031:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;63097:9;;;;;;;;;;;63089:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;62322:3;63162:6;63145:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:37;;63137:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63232:1;63223:6;:10;63215:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;63313:11;;63283:14;:26;63298:10;63283:26;;;;;;;;;;;;;;;;63274:6;:35;;;;:::i;:::-;:50;;63266:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;63364:16;;;;;;;;;;;63360:116;;;63428:9;63414:10;;63405:6;:19;;;;:::i;:::-;:32;;63397:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63360:116;63518:6;63488:14;:26;63503:10;63488:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;63537:29;63547:10;63559:6;63537:9;:29::i;:::-;62973:601;:::o;26057:308::-;26168:19;:17;:19::i;:::-;26156:31;;:8;:31;;;26152:61;;;26196:17;;;;;;;;;;;;;;26152:61;26278:8;26226:18;:39;26245:19;:17;:19::i;:::-;26226:39;;;;;;;;;;;;;;;:49;26266:8;26226:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26338:8;26302:55;;26317:19;:17;:19::i;:::-;26302:55;;;26348:8;26302:55;;;;;;:::i;:::-;;;;;;;;26057:308;;:::o;27164:396::-;27331:28;27341:4;27347:2;27351:7;27331:9;:28::i;:::-;27392:1;27374:2;:14;;;:19;27370:183;;27413:56;27444:4;27450:2;27454:7;27463:5;27413:30;:56::i;:::-;27408:145;;27497:40;;;;;;;;;;;;;;27408:145;27370:183;27164:396;;;;:::o;62869:37::-;;;;:::o;44711:420::-;44787:21;;:::i;:::-;44821:31;;:::i;:::-;44877:15;:13;:15::i;:::-;44867:7;:25;:54;;;;44907:14;:12;:14::i;:::-;44896:7;:25;;44867:54;44863:103;;;44945:9;44938:16;;;;;44863:103;44988:21;45001:7;44988:12;:21::i;:::-;44976:33;;45024:9;:16;;;45020:65;;;45064:9;45057:16;;;;;45020:65;45102:21;45115:7;45102:12;:21::i;:::-;45095:28;;;44711:420;;;;:::o;64645:103::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64728:12:::1;64716:9;;:24;;;;;;;;;;;;;;;;;;64645:103:::0;:::o;63868:346::-;63941:13;63972:16;63980:7;63972;:16::i;:::-;63967:59;;63997:29;;;;;;;;;;;;;;63967:59;64068:1;64049:7;64043:21;;;;;:::i;:::-;;;:26;64039:84;;;64093:18;64103:7;64093:9;:18::i;:::-;64086:25;;;;64039:84;64166:7;64175:18;64185:7;64175:9;:18::i;:::-;64195:9;64149:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64135:71;;63868:346;;;;:::o;26436:164::-;26533:4;26557:18;:25;26576:5;26557:25;;;;;;;;;;;;;;;:35;26583:8;26557:35;;;;;;;;;;;;;;;;;;;;;;;;;26550:42;;26436:164;;;;:::o;65265:411::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65379:9:::1;;;;;;;;;;;65378:10;65370:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;65445:5;;:12;;65425:9;;:16;;:32;65417:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;65500:9;65495:103;65515:9;;:16;;65511:1;:20;65495:103;;;65553:33;65563:9;;65573:1;65563:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65577:5;;65583:1;65577:8;;;;;;;:::i;:::-;;;;;;;;65553:9;:33::i;:::-;65533:3;;;;;:::i;:::-;;;;65495:103;;;;62322:3;65618:14;:12;:14::i;:::-;:28;;65610:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65265:411:::0;;;;:::o;13286:201::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13395:1:::1;13375:22;;:8;:22;;;;13367:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13451:28;13470:8;13451:18;:28::i;:::-;13286:201:::0;:::o;27815:270::-;27872:4;27924:7;27905:15;:13;:15::i;:::-;:26;;:62;;;;;27954:13;;27944:7;:23;27905:62;:144;;;;;28048:1;15575:8;28001:17;:26;28019:7;28001:26;;;;;;;;;;;;:43;:48;27905:144;27889:160;;27815:270;;;:::o;21070:1049::-;21137:7;21157:12;21172:7;21157:22;;21232:4;21213:15;:13;:15::i;:::-;:23;21209:847;;21262:13;;21255:4;:20;21251:805;;;21296:14;21313:17;:23;21331:4;21313:23;;;;;;;;;;;;21296:40;;21421:1;15575:8;21394:6;:23;:28;21390:651;;;21881:105;21898:1;21888:6;:11;21881:105;;;21937:17;:25;21955:6;;;;;;;21937:25;;;;;;;;;;;;21928:34;;21881:105;;;22015:6;22008:13;;;;;;21390:651;21277:779;21251:805;21209:847;22080:31;;;;;;;;;;;;;;21070:1049;;;;:::o;41310:105::-;41370:7;41397:10;41390:17;;41310:105;:::o;11217:98::-;11270:7;11297:10;11290:17;;11217:98;:::o;63643:101::-;63708:7;63735:1;63728:8;;63643:101;:::o;32834:2409::-;32949:27;32979;32998:7;32979:18;:27::i;:::-;32949:57;;33064:4;33023:45;;33039:19;33023:45;;;33019:86;;33077:28;;;;;;;;;;;;;;33019:86;33118:22;33167:4;33144:27;;:19;:17;:19::i;:::-;:27;;;:83;;;;33184:43;33201:4;33207:19;:17;:19::i;:::-;33184:16;:43::i;:::-;33144:83;:139;;;;33264:19;:17;:19::i;:::-;33240:43;;:20;33252:7;33240:11;:20::i;:::-;:43;;;33144:139;33118:166;;33302:17;33297:66;;33328:35;;;;;;;;;;;;;;33297:66;33392:1;33378:16;;:2;:16;;;33374:52;;;33403:23;;;;;;;;;;;;;;33374:52;33439:43;33461:4;33467:2;33471:7;33480:1;33439:21;:43::i;:::-;33555:15;:24;33571:7;33555:24;;;;;;;;;;;;33548:31;;;;;;;;;;;33935:18;:24;33954:4;33935:24;;;;;;;;;;;;;;;;33933:26;;;;;;;;;;;;34009:18;:22;34028:2;34009:22;;;;;;;;;;;;;;;;34007:24;;;;;;;;;;;15853:8;15459:3;34359:15;:41;;34325:21;34343:2;34325:17;:21::i;:::-;:76;:112;34287:17;:26;34305:7;34287:26;;;;;;;;;;;:150;;;;34599:1;15853:8;34549:19;:46;:51;34545:586;;;34617:19;34649:1;34639:7;:11;34617:33;;34798:1;34764:17;:30;34782:11;34764:30;;;;;;;;;;;;:35;34760:360;;;34894:13;;34879:11;:28;34875:230;;35066:19;35033:17;:30;35051:11;35033:30;;;;;;;;;;;:52;;;;34875:230;34760:360;34602:529;34545:586;35174:7;35170:2;35155:27;;35164:4;35155:27;;;;;;;;;;;;35193:42;35214:4;35220:2;35224:7;35233:1;35193:20;:42::i;:::-;32938:2305;;32834:2409;;;:::o;35639:2648::-;35719:27;35749;35768:7;35749:18;:27::i;:::-;35719:57;;35789:12;35820:19;35789:52;;35858:13;35854:303;;;35888:22;35937:4;35914:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;35958:43;35975:4;35981:19;:17;:19::i;:::-;35958:16;:43::i;:::-;35914:87;:147;;;;36042:19;:17;:19::i;:::-;36018:43;;:20;36030:7;36018:11;:20::i;:::-;:43;;;35914:147;35888:174;;36084:17;36079:66;;36110:35;;;;;;;;;;;;;;36079:66;35873:284;35854:303;36169:51;36191:4;36205:1;36209:7;36218:1;36169:21;:51::i;:::-;36293:15;:24;36309:7;36293:24;;;;;;;;;;;;36286:31;;;;;;;;;;;36932:1;15068:3;36903:1;:25;;36902:31;36874:18;:24;36893:4;36874:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;15853:8;15575;15459:3;37221:15;:41;;37185:23;37203:4;37185:17;:23::i;:::-;:78;:104;:140;37147:17;:26;37165:7;37147:26;;;;;;;;;;;:178;;;;37487:1;15853:8;37437:19;:46;:51;37433:586;;;37505:19;37537:1;37527:7;:11;37505:33;;37686:1;37652:17;:30;37670:11;37652:30;;;;;;;;;;;;:35;37648:360;;;37782:13;;37767:11;:28;37763:230;;37954:19;37921:17;:30;37939:11;37921:30;;;;;;;;;;;:52;;;;37763:230;37648:360;37490:529;37433:586;38070:7;38066:1;38043:35;;38052:4;38043:35;;;;;;;;;;;;38089:50;38110:4;38124:1;38128:7;38137:1;38089:20;:50::i;:::-;38258:12;;:14;;;;;;;;;;;;;35708:2579;;35639:2648;;:::o;13647:191::-;13721:16;13740:6;;;;;;;;;;;13721:25;;13766:8;13757:6;;:17;;;;;;;;;;;;;;;;;;13821:8;13790:40;;13811:8;13790:40;;;;;;;;;;;;13710:128;13647:191;:::o;22626:153::-;22686:21;;:::i;:::-;22727:44;22746:17;:24;22764:5;22746:24;;;;;;;;;;;;22727:18;:44::i;:::-;22720:51;;22626:153;;;:::o;17530:95::-;17577:7;17604:13;;17597:20;;17530:95;:::o;18236:273::-;18283:7;18479:15;:13;:15::i;:::-;18463:13;;:31;18456:38;;18236:273;:::o;28169:104::-;28238:27;28248:2;28252:8;28238:27;;;;;;;;;;;;:9;:27::i;:::-;28169:104;;:::o;38779:716::-;38942:4;38988:2;38963:45;;;39009:19;:17;:19::i;:::-;39030:4;39036:7;39045:5;38963:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38959:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39263:1;39246:6;:13;:18;39242:235;;;39292:40;;;;;;;;;;;;;;39242:235;39435:6;39429:13;39420:6;39416:2;39412:15;39405:38;38959:529;39132:54;;;39122:64;;;:6;:64;;;;39115:71;;;38779:716;;;;;;:::o;23282:158::-;23344:21;;:::i;:::-;23385:47;23404:27;23423:7;23404:18;:27::i;:::-;23385:18;:47::i;:::-;23378:54;;23282:158;;;:::o;41521:1878::-;41578:17;41981:3;41974:4;41968:11;41964:21;41957:28;;42068:3;42062:4;42055:17;42170:3;42606:5;42732:1;42727:3;42723:11;42716:18;;42865:2;42859:4;42855:13;42851:2;42847:22;42842:3;42834:36;42906:2;42900:4;42896:13;42888:21;;42502:663;42925:4;42502:663;;;43094:1;43089:3;43085:11;43078:18;;43145:2;43139:4;43135:13;43131:2;43127:22;43122:3;43114:36;43016:2;43010:4;43006:13;42998:21;;42502:663;;;42506:418;43204:3;43199;43195:13;43315:2;43310:3;43306:12;43299:19;;43374:6;43369:3;43362:19;41617:1775;;41521:1878;;;:::o;40143:159::-;;;;;:::o;24802:148::-;24866:14;24927:5;24917:15;;24802:148;;;:::o;40961:158::-;;;;;:::o;22213:322::-;22279:31;;:::i;:::-;22356:6;22323:9;:14;;:41;;;;;;;;;;;15459:3;22409:6;:32;;22375:9;:24;;:67;;;;;;;;;;;22499:1;15575:8;22472:6;:23;:28;;22453:9;:16;;:47;;;;;;;;;;;22213:322;;;:::o;28646:2114::-;28769:20;28792:13;;28769:36;;28834:1;28820:16;;:2;:16;;;28816:48;;;28845:19;;;;;;;;;;;;;;28816:48;28891:1;28879:8;:13;28875:44;;;28901:18;;;;;;;;;;;;;;28875:44;28932:61;28962:1;28966:2;28970:12;28984:8;28932:21;:61::i;:::-;29508:1;14942:2;29479:1;:25;;29478:31;29466:8;:44;29440:18;:22;29459:2;29440:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;15718:3;29861:29;29888:1;29876:8;:13;29861:14;:29::i;:::-;:56;;15459:3;29806:15;:41;;29772:21;29790:2;29772:17;:21::i;:::-;:76;:146;29729:17;:31;29747:12;29729:31;;;;;;;;;;;:189;;;;29931:20;29954:12;29931:35;;29977:11;30006:8;29991:12;:23;29977:37;;30049:1;30031:2;:14;;;:19;30027:609;;30067:306;30119:12;30115:2;30094:38;;30111:1;30094:38;;;;;;;;;;;;30156:69;30195:1;30199:2;30203:14;;;;;;30219:5;30156:30;:69::i;:::-;30151:166;;30257:40;;;;;;;;;;;;;;30151:166;30368:3;30353:12;:18;30067:306;;30446:12;30429:13;;:29;30425:43;;30460:8;;;30425:43;30027:609;;;30501:124;30553:14;;;;;;30549:2;30528:40;;30545:1;30528:40;;;;;;;;;;;;30620:3;30605:12;:18;30501:124;;30027:609;30662:12;30646:13;:28;;;;29241:1441;;30692:60;30721:1;30725:2;30729:12;30743:8;30692:20;:60::i;:::-;28758:2002;28646:2114;;;:::o;25037:142::-;25095:14;25156:5;25146:15;;25037:142;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:::-;2412:8;2422:6;2472:3;2465:4;2457:6;2453:17;2449:27;2439:122;;2480:79;;:::i;:::-;2439:122;2593:6;2580:20;2570:30;;2623:18;2615:6;2612:30;2609:117;;;2645:79;;:::i;:::-;2609:117;2759:4;2751:6;2747:17;2735:29;;2813:3;2805:4;2797:6;2793:17;2783:8;2779:32;2776:41;2773:128;;;2820:79;;:::i;:::-;2773:128;2339:568;;;;;:::o;2930:370::-;3001:5;3050:3;3043:4;3035:6;3031:17;3027:27;3017:122;;3058:79;;:::i;:::-;3017:122;3175:6;3162:20;3200:94;3290:3;3282:6;3275:4;3267:6;3263:17;3200:94;:::i;:::-;3191:103;;3007:293;2930:370;;;;:::o;3306:133::-;3349:5;3387:6;3374:20;3365:29;;3403:30;3427:5;3403:30;:::i;:::-;3306:133;;;;:::o;3445:137::-;3490:5;3528:6;3515:20;3506:29;;3544:32;3570:5;3544:32;:::i;:::-;3445:137;;;;:::o;3588:141::-;3644:5;3675:6;3669:13;3660:22;;3691:32;3717:5;3691:32;:::i;:::-;3588:141;;;;:::o;3748:338::-;3803:5;3852:3;3845:4;3837:6;3833:17;3829:27;3819:122;;3860:79;;:::i;:::-;3819:122;3977:6;3964:20;4002:78;4076:3;4068:6;4061:4;4053:6;4049:17;4002:78;:::i;:::-;3993:87;;3809:277;3748:338;;;;:::o;4106:340::-;4162:5;4211:3;4204:4;4196:6;4192:17;4188:27;4178:122;;4219:79;;:::i;:::-;4178:122;4336:6;4323:20;4361:79;4436:3;4428:6;4421:4;4413:6;4409:17;4361:79;:::i;:::-;4352:88;;4168:278;4106:340;;;;:::o;4452:139::-;4498:5;4536:6;4523:20;4514:29;;4552:33;4579:5;4552:33;:::i;:::-;4452:139;;;;:::o;4597:329::-;4656:6;4705:2;4693:9;4684:7;4680:23;4676:32;4673:119;;;4711:79;;:::i;:::-;4673:119;4831:1;4856:53;4901:7;4892:6;4881:9;4877:22;4856:53;:::i;:::-;4846:63;;4802:117;4597:329;;;;:::o;4932:474::-;5000:6;5008;5057:2;5045:9;5036:7;5032:23;5028:32;5025:119;;;5063:79;;:::i;:::-;5025:119;5183:1;5208:53;5253:7;5244:6;5233:9;5229:22;5208:53;:::i;:::-;5198:63;;5154:117;5310:2;5336:53;5381:7;5372:6;5361:9;5357:22;5336:53;:::i;:::-;5326:63;;5281:118;4932:474;;;;;:::o;5412:619::-;5489:6;5497;5505;5554:2;5542:9;5533:7;5529:23;5525:32;5522:119;;;5560:79;;:::i;:::-;5522:119;5680:1;5705:53;5750:7;5741:6;5730:9;5726:22;5705:53;:::i;:::-;5695:63;;5651:117;5807:2;5833:53;5878:7;5869:6;5858:9;5854:22;5833:53;:::i;:::-;5823:63;;5778:118;5935:2;5961:53;6006:7;5997:6;5986:9;5982:22;5961:53;:::i;:::-;5951:63;;5906:118;5412:619;;;;;:::o;6037:943::-;6132:6;6140;6148;6156;6205:3;6193:9;6184:7;6180:23;6176:33;6173:120;;;6212:79;;:::i;:::-;6173:120;6332:1;6357:53;6402:7;6393:6;6382:9;6378:22;6357:53;:::i;:::-;6347:63;;6303:117;6459:2;6485:53;6530:7;6521:6;6510:9;6506:22;6485:53;:::i;:::-;6475:63;;6430:118;6587:2;6613:53;6658:7;6649:6;6638:9;6634:22;6613:53;:::i;:::-;6603:63;;6558:118;6743:2;6732:9;6728:18;6715:32;6774:18;6766:6;6763:30;6760:117;;;6796:79;;:::i;:::-;6760:117;6901:62;6955:7;6946:6;6935:9;6931:22;6901:62;:::i;:::-;6891:72;;6686:287;6037:943;;;;;;;:::o;6986:468::-;7051:6;7059;7108:2;7096:9;7087:7;7083:23;7079:32;7076:119;;;7114:79;;:::i;:::-;7076:119;7234:1;7259:53;7304:7;7295:6;7284:9;7280:22;7259:53;:::i;:::-;7249:63;;7205:117;7361:2;7387:50;7429:7;7420:6;7409:9;7405:22;7387:50;:::i;:::-;7377:60;;7332:115;6986:468;;;;;:::o;7460:474::-;7528:6;7536;7585:2;7573:9;7564:7;7560:23;7556:32;7553:119;;;7591:79;;:::i;:::-;7553:119;7711:1;7736:53;7781:7;7772:6;7761:9;7757:22;7736:53;:::i;:::-;7726:63;;7682:117;7838:2;7864:53;7909:7;7900:6;7889:9;7885:22;7864:53;:::i;:::-;7854:63;;7809:118;7460:474;;;;;:::o;7940:619::-;8017:6;8025;8033;8082:2;8070:9;8061:7;8057:23;8053:32;8050:119;;;8088:79;;:::i;:::-;8050:119;8208:1;8233:53;8278:7;8269:6;8258:9;8254:22;8233:53;:::i;:::-;8223:63;;8179:117;8335:2;8361:53;8406:7;8397:6;8386:9;8382:22;8361:53;:::i;:::-;8351:63;;8306:118;8463:2;8489:53;8534:7;8525:6;8514:9;8510:22;8489:53;:::i;:::-;8479:63;;8434:118;7940:619;;;;;:::o;8565:934::-;8687:6;8695;8703;8711;8760:2;8748:9;8739:7;8735:23;8731:32;8728:119;;;8766:79;;:::i;:::-;8728:119;8914:1;8903:9;8899:17;8886:31;8944:18;8936:6;8933:30;8930:117;;;8966:79;;:::i;:::-;8930:117;9079:80;9151:7;9142:6;9131:9;9127:22;9079:80;:::i;:::-;9061:98;;;;8857:312;9236:2;9225:9;9221:18;9208:32;9267:18;9259:6;9256:30;9253:117;;;9289:79;;:::i;:::-;9253:117;9402:80;9474:7;9465:6;9454:9;9450:22;9402:80;:::i;:::-;9384:98;;;;9179:313;8565:934;;;;;;;:::o;9505:539::-;9589:6;9638:2;9626:9;9617:7;9613:23;9609:32;9606:119;;;9644:79;;:::i;:::-;9606:119;9792:1;9781:9;9777:17;9764:31;9822:18;9814:6;9811:30;9808:117;;;9844:79;;:::i;:::-;9808:117;9949:78;10019:7;10010:6;9999:9;9995:22;9949:78;:::i;:::-;9939:88;;9735:302;9505:539;;;;:::o;10050:323::-;10106:6;10155:2;10143:9;10134:7;10130:23;10126:32;10123:119;;;10161:79;;:::i;:::-;10123:119;10281:1;10306:50;10348:7;10339:6;10328:9;10324:22;10306:50;:::i;:::-;10296:60;;10252:114;10050:323;;;;:::o;10379:327::-;10437:6;10486:2;10474:9;10465:7;10461:23;10457:32;10454:119;;;10492:79;;:::i;:::-;10454:119;10612:1;10637:52;10681:7;10672:6;10661:9;10657:22;10637:52;:::i;:::-;10627:62;;10583:116;10379:327;;;;:::o;10712:349::-;10781:6;10830:2;10818:9;10809:7;10805:23;10801:32;10798:119;;;10836:79;;:::i;:::-;10798:119;10956:1;10981:63;11036:7;11027:6;11016:9;11012:22;10981:63;:::i;:::-;10971:73;;10927:127;10712:349;;;;:::o;11067:834::-;11155:6;11163;11212:2;11200:9;11191:7;11187:23;11183:32;11180:119;;;11218:79;;:::i;:::-;11180:119;11366:1;11355:9;11351:17;11338:31;11396:18;11388:6;11385:30;11382:117;;;11418:79;;:::i;:::-;11382:117;11523:63;11578:7;11569:6;11558:9;11554:22;11523:63;:::i;:::-;11513:73;;11309:287;11663:2;11652:9;11648:18;11635:32;11694:18;11686:6;11683:30;11680:117;;;11716:79;;:::i;:::-;11680:117;11821:63;11876:7;11867:6;11856:9;11852:22;11821:63;:::i;:::-;11811:73;;11606:288;11067:834;;;;;:::o;11907:329::-;11966:6;12015:2;12003:9;11994:7;11990:23;11986:32;11983:119;;;12021:79;;:::i;:::-;11983:119;12141:1;12166:53;12211:7;12202:6;12191:9;12187:22;12166:53;:::i;:::-;12156:63;;12112:117;11907:329;;;;:::o;12242:299::-;12371:10;12392:106;12494:3;12486:6;12392:106;:::i;:::-;12530:4;12525:3;12521:14;12507:28;;12242:299;;;;:::o;12547:179::-;12616:10;12637:46;12679:3;12671:6;12637:46;:::i;:::-;12715:4;12710:3;12706:14;12692:28;;12547:179;;;;:::o;12732:108::-;12809:24;12827:5;12809:24;:::i;:::-;12804:3;12797:37;12732:108;;:::o;12846:118::-;12933:24;12951:5;12933:24;:::i;:::-;12928:3;12921:37;12846:118;;:::o;13046:972::-;13225:3;13254:84;13332:5;13254:84;:::i;:::-;13354:116;13463:6;13458:3;13354:116;:::i;:::-;13347:123;;13494:86;13574:5;13494:86;:::i;:::-;13603:7;13634:1;13619:374;13644:6;13641:1;13638:13;13619:374;;;13720:6;13714:13;13747:123;13866:3;13851:13;13747:123;:::i;:::-;13740:130;;13893:90;13976:6;13893:90;:::i;:::-;13883:100;;13679:314;13666:1;13663;13659:9;13654:14;;13619:374;;;13623:14;14009:3;14002:10;;13230:788;;;13046:972;;;;:::o;14054:732::-;14173:3;14202:54;14250:5;14202:54;:::i;:::-;14272:86;14351:6;14346:3;14272:86;:::i;:::-;14265:93;;14382:56;14432:5;14382:56;:::i;:::-;14461:7;14492:1;14477:284;14502:6;14499:1;14496:13;14477:284;;;14578:6;14572:13;14605:63;14664:3;14649:13;14605:63;:::i;:::-;14598:70;;14691:60;14744:6;14691:60;:::i;:::-;14681:70;;14537:224;14524:1;14521;14517:9;14512:14;;14477:284;;;14481:14;14777:3;14770:10;;14178:608;;;14054:732;;;;:::o;14792:99::-;14863:21;14878:5;14863:21;:::i;:::-;14858:3;14851:34;14792:99;;:::o;14897:109::-;14978:21;14993:5;14978:21;:::i;:::-;14973:3;14966:34;14897:109;;:::o;15012:360::-;15098:3;15126:38;15158:5;15126:38;:::i;:::-;15180:70;15243:6;15238:3;15180:70;:::i;:::-;15173:77;;15259:52;15304:6;15299:3;15292:4;15285:5;15281:16;15259:52;:::i;:::-;15336:29;15358:6;15336:29;:::i;:::-;15331:3;15327:39;15320:46;;15102:270;15012:360;;;;:::o;15378:364::-;15466:3;15494:39;15527:5;15494:39;:::i;:::-;15549:71;15613:6;15608:3;15549:71;:::i;:::-;15542:78;;15629:52;15674:6;15669:3;15662:4;15655:5;15651:16;15629:52;:::i;:::-;15706:29;15728:6;15706:29;:::i;:::-;15701:3;15697:39;15690:46;;15470:272;15378:364;;;;:::o;15748:377::-;15854:3;15882:39;15915:5;15882:39;:::i;:::-;15937:89;16019:6;16014:3;15937:89;:::i;:::-;15930:96;;16035:52;16080:6;16075:3;16068:4;16061:5;16057:16;16035:52;:::i;:::-;16112:6;16107:3;16103:16;16096:23;;15858:267;15748:377;;;;:::o;16155:845::-;16258:3;16295:5;16289:12;16324:36;16350:9;16324:36;:::i;:::-;16376:89;16458:6;16453:3;16376:89;:::i;:::-;16369:96;;16496:1;16485:9;16481:17;16512:1;16507:137;;;;16658:1;16653:341;;;;16474:520;;16507:137;16591:4;16587:9;16576;16572:25;16567:3;16560:38;16627:6;16622:3;16618:16;16611:23;;16507:137;;16653:341;16720:38;16752:5;16720:38;:::i;:::-;16780:1;16794:154;16808:6;16805:1;16802:13;16794:154;;;16882:7;16876:14;16872:1;16867:3;16863:11;16856:35;16932:1;16923:7;16919:15;16908:26;;16830:4;16827:1;16823:12;16818:17;;16794:154;;;16977:6;16972:3;16968:16;16961:23;;16660:334;;16474:520;;16262:738;;16155:845;;;;:::o;17006:366::-;17148:3;17169:67;17233:2;17228:3;17169:67;:::i;:::-;17162:74;;17245:93;17334:3;17245:93;:::i;:::-;17363:2;17358:3;17354:12;17347:19;;17006:366;;;:::o;17378:::-;17520:3;17541:67;17605:2;17600:3;17541:67;:::i;:::-;17534:74;;17617:93;17706:3;17617:93;:::i;:::-;17735:2;17730:3;17726:12;17719:19;;17378:366;;;:::o;17750:::-;17892:3;17913:67;17977:2;17972:3;17913:67;:::i;:::-;17906:74;;17989:93;18078:3;17989:93;:::i;:::-;18107:2;18102:3;18098:12;18091:19;;17750:366;;;:::o;18122:::-;18264:3;18285:67;18349:2;18344:3;18285:67;:::i;:::-;18278:74;;18361:93;18450:3;18361:93;:::i;:::-;18479:2;18474:3;18470:12;18463:19;;18122:366;;;:::o;18494:::-;18636:3;18657:67;18721:2;18716:3;18657:67;:::i;:::-;18650:74;;18733:93;18822:3;18733:93;:::i;:::-;18851:2;18846:3;18842:12;18835:19;;18494:366;;;:::o;18866:::-;19008:3;19029:67;19093:2;19088:3;19029:67;:::i;:::-;19022:74;;19105:93;19194:3;19105:93;:::i;:::-;19223:2;19218:3;19214:12;19207:19;;18866:366;;;:::o;19238:::-;19380:3;19401:67;19465:2;19460:3;19401:67;:::i;:::-;19394:74;;19477:93;19566:3;19477:93;:::i;:::-;19595:2;19590:3;19586:12;19579:19;;19238:366;;;:::o;19610:::-;19752:3;19773:67;19837:2;19832:3;19773:67;:::i;:::-;19766:74;;19849:93;19938:3;19849:93;:::i;:::-;19967:2;19962:3;19958:12;19951:19;;19610:366;;;:::o;19982:::-;20124:3;20145:67;20209:2;20204:3;20145:67;:::i;:::-;20138:74;;20221:93;20310:3;20221:93;:::i;:::-;20339:2;20334:3;20330:12;20323:19;;19982:366;;;:::o;20354:::-;20496:3;20517:67;20581:2;20576:3;20517:67;:::i;:::-;20510:74;;20593:93;20682:3;20593:93;:::i;:::-;20711:2;20706:3;20702:12;20695:19;;20354:366;;;:::o;20798:685::-;20945:4;20940:3;20936:14;21032:4;21025:5;21021:16;21015:23;21051:63;21108:4;21103:3;21099:14;21085:12;21051:63;:::i;:::-;20960:164;21216:4;21209:5;21205:16;21199:23;21235:61;21290:4;21285:3;21281:14;21267:12;21235:61;:::i;:::-;21134:172;21390:4;21383:5;21379:16;21373:23;21409:57;21460:4;21455:3;21451:14;21437:12;21409:57;:::i;:::-;21316:160;20914:569;20798:685;;:::o;21561:695::-;21718:4;21713:3;21709:14;21805:4;21798:5;21794:16;21788:23;21824:63;21881:4;21876:3;21872:14;21858:12;21824:63;:::i;:::-;21733:164;21989:4;21982:5;21978:16;21972:23;22008:61;22063:4;22058:3;22054:14;22040:12;22008:61;:::i;:::-;21907:172;22163:4;22156:5;22152:16;22146:23;22182:57;22233:4;22228:3;22224:14;22210:12;22182:57;:::i;:::-;22089:160;21687:569;21561:695;;:::o;22262:108::-;22339:24;22357:5;22339:24;:::i;:::-;22334:3;22327:37;22262:108;;:::o;22376:118::-;22463:24;22481:5;22463:24;:::i;:::-;22458:3;22451:37;22376:118;;:::o;22500:105::-;22575:23;22592:5;22575:23;:::i;:::-;22570:3;22563:36;22500:105;;:::o;22611:583::-;22833:3;22855:92;22943:3;22934:6;22855:92;:::i;:::-;22848:99;;22964:95;23055:3;23046:6;22964:95;:::i;:::-;22957:102;;23076:92;23164:3;23155:6;23076:92;:::i;:::-;23069:99;;23185:3;23178:10;;22611:583;;;;;;:::o;23200:222::-;23293:4;23331:2;23320:9;23316:18;23308:26;;23344:71;23412:1;23401:9;23397:17;23388:6;23344:71;:::i;:::-;23200:222;;;;:::o;23428:640::-;23623:4;23661:3;23650:9;23646:19;23638:27;;23675:71;23743:1;23732:9;23728:17;23719:6;23675:71;:::i;:::-;23756:72;23824:2;23813:9;23809:18;23800:6;23756:72;:::i;:::-;23838;23906:2;23895:9;23891:18;23882:6;23838:72;:::i;:::-;23957:9;23951:4;23947:20;23942:2;23931:9;23927:18;23920:48;23985:76;24056:4;24047:6;23985:76;:::i;:::-;23977:84;;23428:640;;;;;;;:::o;24074:493::-;24277:4;24315:2;24304:9;24300:18;24292:26;;24364:9;24358:4;24354:20;24350:1;24339:9;24335:17;24328:47;24392:168;24555:4;24546:6;24392:168;:::i;:::-;24384:176;;24074:493;;;;:::o;24573:373::-;24716:4;24754:2;24743:9;24739:18;24731:26;;24803:9;24797:4;24793:20;24789:1;24778:9;24774:17;24767:47;24831:108;24934:4;24925:6;24831:108;:::i;:::-;24823:116;;24573:373;;;;:::o;24952:210::-;25039:4;25077:2;25066:9;25062:18;25054:26;;25090:65;25152:1;25141:9;25137:17;25128:6;25090:65;:::i;:::-;24952:210;;;;:::o;25168:313::-;25281:4;25319:2;25308:9;25304:18;25296:26;;25368:9;25362:4;25358:20;25354:1;25343:9;25339:17;25332:47;25396:78;25469:4;25460:6;25396:78;:::i;:::-;25388:86;;25168:313;;;;:::o;25487:419::-;25653:4;25691:2;25680:9;25676:18;25668:26;;25740:9;25734:4;25730:20;25726:1;25715:9;25711:17;25704:47;25768:131;25894:4;25768:131;:::i;:::-;25760:139;;25487:419;;;:::o;25912:::-;26078:4;26116:2;26105:9;26101:18;26093:26;;26165:9;26159:4;26155:20;26151:1;26140:9;26136:17;26129:47;26193:131;26319:4;26193:131;:::i;:::-;26185:139;;25912:419;;;:::o;26337:::-;26503:4;26541:2;26530:9;26526:18;26518:26;;26590:9;26584:4;26580:20;26576:1;26565:9;26561:17;26554:47;26618:131;26744:4;26618:131;:::i;:::-;26610:139;;26337:419;;;:::o;26762:::-;26928:4;26966:2;26955:9;26951:18;26943:26;;27015:9;27009:4;27005:20;27001:1;26990:9;26986:17;26979:47;27043:131;27169:4;27043:131;:::i;:::-;27035:139;;26762:419;;;:::o;27187:::-;27353:4;27391:2;27380:9;27376:18;27368:26;;27440:9;27434:4;27430:20;27426:1;27415:9;27411:17;27404:47;27468:131;27594:4;27468:131;:::i;:::-;27460:139;;27187:419;;;:::o;27612:::-;27778:4;27816:2;27805:9;27801:18;27793:26;;27865:9;27859:4;27855:20;27851:1;27840:9;27836:17;27829:47;27893:131;28019:4;27893:131;:::i;:::-;27885:139;;27612:419;;;:::o;28037:::-;28203:4;28241:2;28230:9;28226:18;28218:26;;28290:9;28284:4;28280:20;28276:1;28265:9;28261:17;28254:47;28318:131;28444:4;28318:131;:::i;:::-;28310:139;;28037:419;;;:::o;28462:::-;28628:4;28666:2;28655:9;28651:18;28643:26;;28715:9;28709:4;28705:20;28701:1;28690:9;28686:17;28679:47;28743:131;28869:4;28743:131;:::i;:::-;28735:139;;28462:419;;;:::o;28887:::-;29053:4;29091:2;29080:9;29076:18;29068:26;;29140:9;29134:4;29130:20;29126:1;29115:9;29111:17;29104:47;29168:131;29294:4;29168:131;:::i;:::-;29160:139;;28887:419;;;:::o;29312:::-;29478:4;29516:2;29505:9;29501:18;29493:26;;29565:9;29559:4;29555:20;29551:1;29540:9;29536:17;29529:47;29593:131;29719:4;29593:131;:::i;:::-;29585:139;;29312:419;;;:::o;29737:342::-;29890:4;29928:2;29917:9;29913:18;29905:26;;29941:131;30069:1;30058:9;30054:17;30045:6;29941:131;:::i;:::-;29737:342;;;;:::o;30085:222::-;30178:4;30216:2;30205:9;30201:18;30193:26;;30229:71;30297:1;30286:9;30282:17;30273:6;30229:71;:::i;:::-;30085:222;;;;:::o;30313:129::-;30347:6;30374:20;;:::i;:::-;30364:30;;30403:33;30431:4;30423:6;30403:33;:::i;:::-;30313:129;;;:::o;30448:75::-;30481:6;30514:2;30508:9;30498:19;;30448:75;:::o;30529:311::-;30606:4;30696:18;30688:6;30685:30;30682:56;;;30718:18;;:::i;:::-;30682:56;30768:4;30760:6;30756:17;30748:25;;30828:4;30822;30818:15;30810:23;;30529:311;;;:::o;30846:307::-;30907:4;30997:18;30989:6;30986:30;30983:56;;;31019:18;;:::i;:::-;30983:56;31057:29;31079:6;31057:29;:::i;:::-;31049:37;;31141:4;31135;31131:15;31123:23;;30846:307;;;:::o;31159:308::-;31221:4;31311:18;31303:6;31300:30;31297:56;;;31333:18;;:::i;:::-;31297:56;31371:29;31393:6;31371:29;:::i;:::-;31363:37;;31455:4;31449;31445:15;31437:23;;31159:308;;;:::o;31473:162::-;31570:4;31593:3;31585:11;;31623:4;31618:3;31614:14;31606:22;;31473:162;;;:::o;31641:132::-;31708:4;31731:3;31723:11;;31761:4;31756:3;31752:14;31744:22;;31641:132;;;:::o;31779:141::-;31828:4;31851:3;31843:11;;31874:3;31871:1;31864:14;31908:4;31905:1;31895:18;31887:26;;31779:141;;;:::o;31926:144::-;32023:6;32057:5;32051:12;32041:22;;31926:144;;;:::o;32076:114::-;32143:6;32177:5;32171:12;32161:22;;32076:114;;;:::o;32196:98::-;32247:6;32281:5;32275:12;32265:22;;32196:98;;;:::o;32300:99::-;32352:6;32386:5;32380:12;32370:22;;32300:99;;;:::o;32405:143::-;32505:4;32537;32532:3;32528:14;32520:22;;32405:143;;;:::o;32554:113::-;32624:4;32656;32651:3;32647:14;32639:22;;32554:113;;;:::o;32673:214::-;32802:11;32836:6;32831:3;32824:19;32876:4;32871:3;32867:14;32852:29;;32673:214;;;;:::o;32893:184::-;32992:11;33026:6;33021:3;33014:19;33066:4;33061:3;33057:14;33042:29;;32893:184;;;;:::o;33083:168::-;33166:11;33200:6;33195:3;33188:19;33240:4;33235:3;33231:14;33216:29;;33083:168;;;;:::o;33257:169::-;33341:11;33375:6;33370:3;33363:19;33415:4;33410:3;33406:14;33391:29;;33257:169;;;;:::o;33432:148::-;33534:11;33571:3;33556:18;;33432:148;;;;:::o;33586:305::-;33626:3;33645:20;33663:1;33645:20;:::i;:::-;33640:25;;33679:20;33697:1;33679:20;:::i;:::-;33674:25;;33833:1;33765:66;33761:74;33758:1;33755:81;33752:107;;;33839:18;;:::i;:::-;33752:107;33883:1;33880;33876:9;33869:16;;33586:305;;;;:::o;33897:348::-;33937:7;33960:20;33978:1;33960:20;:::i;:::-;33955:25;;33994:20;34012:1;33994:20;:::i;:::-;33989:25;;34182:1;34114:66;34110:74;34107:1;34104:81;34099:1;34092:9;34085:17;34081:105;34078:131;;;34189:18;;:::i;:::-;34078:131;34237:1;34234;34230:9;34219:20;;33897:348;;;;:::o;34251:96::-;34288:7;34317:24;34335:5;34317:24;:::i;:::-;34306:35;;34251:96;;;:::o;34353:90::-;34387:7;34430:5;34423:13;34416:21;34405:32;;34353:90;;;:::o;34449:149::-;34485:7;34525:66;34518:5;34514:78;34503:89;;34449:149;;;:::o;34604:126::-;34641:7;34681:42;34674:5;34670:54;34659:65;;34604:126;;;:::o;34736:77::-;34773:7;34802:5;34791:16;;34736:77;;;:::o;34819:101::-;34855:7;34895:18;34888:5;34884:30;34873:41;;34819:101;;;:::o;34926:154::-;35010:6;35005:3;35000;34987:30;35072:1;35063:6;35058:3;35054:16;35047:27;34926:154;;;:::o;35086:307::-;35154:1;35164:113;35178:6;35175:1;35172:13;35164:113;;;35263:1;35258:3;35254:11;35248:18;35244:1;35239:3;35235:11;35228:39;35200:2;35197:1;35193:10;35188:15;;35164:113;;;35295:6;35292:1;35289:13;35286:101;;;35375:1;35366:6;35361:3;35357:16;35350:27;35286:101;35135:258;35086:307;;;:::o;35399:320::-;35443:6;35480:1;35474:4;35470:12;35460:22;;35527:1;35521:4;35517:12;35548:18;35538:81;;35604:4;35596:6;35592:17;35582:27;;35538:81;35666:2;35658:6;35655:14;35635:18;35632:38;35629:84;;;35685:18;;:::i;:::-;35629:84;35450:269;35399:320;;;:::o;35725:281::-;35808:27;35830:4;35808:27;:::i;:::-;35800:6;35796:40;35938:6;35926:10;35923:22;35902:18;35890:10;35887:34;35884:62;35881:88;;;35949:18;;:::i;:::-;35881:88;35989:10;35985:2;35978:22;35768:238;35725:281;;:::o;36012:233::-;36051:3;36074:24;36092:5;36074:24;:::i;:::-;36065:33;;36120:66;36113:5;36110:77;36107:103;;;36190:18;;:::i;:::-;36107:103;36237:1;36230:5;36226:13;36219:20;;36012:233;;;:::o;36251:180::-;36299:77;36296:1;36289:88;36396:4;36393:1;36386:15;36420:4;36417:1;36410:15;36437:180;36485:77;36482:1;36475:88;36582:4;36579:1;36572:15;36606:4;36603:1;36596:15;36623:180;36671:77;36668:1;36661:88;36768:4;36765:1;36758:15;36792:4;36789:1;36782:15;36809:180;36857:77;36854:1;36847:88;36954:4;36951:1;36944:15;36978:4;36975:1;36968:15;36995:117;37104:1;37101;37094:12;37118:117;37227:1;37224;37217:12;37241:117;37350:1;37347;37340:12;37364:117;37473:1;37470;37463:12;37487:117;37596:1;37593;37586:12;37610:117;37719:1;37716;37709:12;37733:102;37774:6;37825:2;37821:7;37816:2;37809:5;37805:14;37801:28;37791:38;;37733:102;;;:::o;37841:163::-;37981:15;37977:1;37969:6;37965:14;37958:39;37841:163;:::o;38010:168::-;38150:20;38146:1;38138:6;38134:14;38127:44;38010:168;:::o;38184:225::-;38324:34;38320:1;38312:6;38308:14;38301:58;38393:8;38388:2;38380:6;38376:15;38369:33;38184:225;:::o;38415:172::-;38555:24;38551:1;38543:6;38539:14;38532:48;38415:172;:::o;38593:170::-;38733:22;38729:1;38721:6;38717:14;38710:46;38593:170;:::o;38769:165::-;38909:17;38905:1;38897:6;38893:14;38886:41;38769:165;:::o;38940:161::-;39080:13;39076:1;39068:6;39064:14;39057:37;38940:161;:::o;39107:167::-;39247:19;39243:1;39235:6;39231:14;39224:43;39107:167;:::o;39280:182::-;39420:34;39416:1;39408:6;39404:14;39397:58;39280:182;:::o;39468:167::-;39608:19;39604:1;39596:6;39592:14;39585:43;39468:167;:::o;39641:122::-;39714:24;39732:5;39714:24;:::i;:::-;39707:5;39704:35;39694:63;;39753:1;39750;39743:12;39694:63;39641:122;:::o;39769:116::-;39839:21;39854:5;39839:21;:::i;:::-;39832:5;39829:32;39819:60;;39875:1;39872;39865:12;39819:60;39769:116;:::o;39891:120::-;39963:23;39980:5;39963:23;:::i;:::-;39956:5;39953:34;39943:62;;40001:1;39998;39991:12;39943:62;39891:120;:::o;40017:122::-;40090:24;40108:5;40090:24;:::i;:::-;40083:5;40080:35;40070:63;;40129:1;40126;40119:12;40070:63;40017:122;:::o

Swarm Source

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