ETH Price: $3,437.15 (-2.24%)

Token

TheNFTWar (TNW)
 

Overview

Max Total Supply

511 TNW

Holders

394

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TNW
0x21c6babb004e9aaa33d368ba227602686defed3c
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:
TheNFTWar

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-09-05
*/

// SPDX-License-Identifier: MIT

// File: TheNFTWar.sol




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


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


pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 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: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

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

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

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

// File: TheNFTWar.sol




pragma solidity ^0.8.0;



library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


contract TheNFTWar is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;
    using SafeMath for uint256;


    uint256 public MAX_PER_Transaction = 2; // maximum amount that user can mint per transaction
    uint256 public MAX_PER_Transaction_WL = 1; // maximum amount that user can mint per transaction for whitelisted members
    uint256 public MAX_PER_Wallet_WL = 1;
    

    //prices
   
    uint256 public cost = 0.015 ether; 
    uint256 public whiteListCost = 0 ether; // Free for WL
    uint256 public prizeValue= 0.1 ether;

    uint256 public freezeTill= 10; //tokenId till which team will mint
    
    uint256 public season = 1; 


    //supply
    uint256 public  TotalCollectionSize_ = 5555; // total number of nfts
    uint256 public  WL_Supply = 1010; // total number of nfts for wl
    uint256 public  team_supply = 10; // total number of nfts for team
    uint256 public  team_q = 2; // total number of nfts for team

    bool public paused = true;
    bool public revealed = false;
    bool public presaleIsActive = false;
    bool public publicIsActive = false;
    bool public frozen = true;
    bool public roundEnded = false;
    bool public burningActivated = false;

    bool public claimAllowed = false;
    bool public lvlUpgrade = false;

    //war phases
    bool public phaseOne = false;
    bool public phaseTwo = false;
    bool public phaseThree = false;
    bool public phaseFour = false;
    bool public phaseFive = false;




    string public uriSuffix = ".json";
    string private baseTokenURI="http://159.223.214.159/Contract/metadata/";
    string private leaderboardUri="http://159.223.214.159/leaderboard/";
    string public notRevealedUri="http://159.223.214.159/hidden/";

    bytes32 public whitelistMerkleRoot;
    bytes32 public teamMerkleRoot;
    bytes32 public claimMerkleRoot;



    address[] teamAddy=[0x24d900159c233655f4C25B1C8E3AEEF63b39906B,
            0xD6Da993902747e270a40eb050e750Cb24162aA44,
            0xC6605472baE5D5249E0B644958E8a0cab8e3f8eC,
            0xcf9b5cb8AeC81d8aEab6CF4e62DE238E6a7f82d7,
            0xAb1B5812936f8678E7F58837Da146d9dc118BD0E ]; // store as an array
                    // Will be set when battle contract is deployed

    event burned(address indexed burner);
    event roundState(bool state);
    event phaseState(uint256 roundNumber,bool state);
    event mintState(string mintState,bool state);
    event mintedTokens(uint256 total);


    constructor()
        ERC721A(
            "TheNFTWar",
            "TNW"      
        )
    {
        
    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in list"
        );
        _;
    }

    modifier isValidClaim(bytes32[] calldata proofOne, bytes32 root,address proofTwo ) {
        require(
            MerkleProof.verify(
                proofOne,
                root,
                keccak256(abi.encodePacked(proofTwo))
            ),
            "Address does not exist in list"
        );
        _;
    }
    
    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        require(
            price * numberOfTokens == msg.value,
            "Incorrect ETH value sent"
        );
        _;
    }

    function approve(address to, uint256 tokenId) public override {
        if(frozen)
        {
            require(tokenId>freezeTill,"Not allowed yet");
            super.approve(to,tokenId);
        }
        else
        {
            super.approve(to,tokenId);

        }
        
    }

    function setApprovalForAll(address operator, bool approved) public override {
        if(frozen)
        {
            for(uint i=0;i<teamAddy.length;i++)
            {
                if(teamAddy[i]==msg.sender)
                {
                    return;
                }
            }
        }

        super.setApprovalForAll(operator,approved);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        if(tokenId<=freezeTill)
        {
            require(!frozen,"Asset Frozen");
        }
        super.safeTransferFrom(from, to, tokenId);
    }

    function mint(uint256 quantity) public payable {
        require(!paused, "mint is paused");
        require(publicIsActive,"public mint not active");
        require(
            totalSupply() + quantity <= TotalCollectionSize_,
            "reached max supply"
        );
        require(quantity <= MAX_PER_Transaction, "can not mint this many");
        require(msg.value >=_shouldPay(quantity), "Insufficient funds!");

        _safeMint(msg.sender, quantity);
        emit mintedTokens(totalSupply());
    }


    function mintWhitelist(bytes32[] calldata merkleProof,uint256 quantity)
        public
        payable
        isValidMerkleProof(merkleProof, whitelistMerkleRoot)
        isCorrectPayment(whiteListCost, quantity)
    {
        require(!paused, "mint is paused");
        require(presaleIsActive,"Whitelist mint not active");
        uint256 supply = totalSupply();
        require(supply + quantity <= WL_Supply, "max NFT limit exceeded");
        require(numberMinted(msg.sender) + quantity <= MAX_PER_Wallet_WL, "limit per wallet exceeded");
        require(quantity <= MAX_PER_Transaction_WL, "can not mint this many in one transaction");
        _safeMint(msg.sender, quantity);
        emit mintedTokens(totalSupply());

    }

    function mintTeam(bytes32[] calldata merkleProof)
        public
        payable
        isValidMerkleProof(merkleProof, teamMerkleRoot)
        isCorrectPayment(whiteListCost, team_q)
    {
        require(!paused, "mint is paused");
        uint256 supply = totalSupply();
        require(supply + team_q <= team_supply, "max NFT limit exceeded");
        require(numberMinted(msg.sender) + team_q <= team_q, "limit per wallet exceeded");
        _safeMint(msg.sender, team_q);
        emit mintedTokens(totalSupply());

    }

    function _shouldPay(uint256 _quantity) 
        private 
        view
        returns(uint256)
    {
        return cost*_quantity;
    }

    function burn(uint256 tokenId) external{
        //only call from website
        require(burningActivated,"Burning not allowed yet");
        require(ownerOf(tokenId)==msg.sender,"enter tokenId you own");
        require(balanceOf(msg.sender)>1,"You dont own more than 1 token");
        _burn(tokenId);
        emit burned(msg.sender);
    }

    function claimPrize(bytes32[] calldata proofOne,address proofTwo) public nonReentrant isValidClaim(proofOne, claimMerkleRoot,proofTwo) {
        require(claimAllowed,"Cant claim prize right now");
        require(!roundEnded,"Round has ended already");
        (bool os, ) = payable(msg.sender).call{value: prizeValue}("");
        roundEnded=true;
        phaseOne=false;
        phaseTwo=false;
        phaseThree=false;
        phaseFour=false;
        phaseFive=false;
        season++;
        require(os,"claim failed");
    }
 

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return notRevealedUri;
        }

        if(roundEnded==true)
        {
            return leaderboardUri;
        }

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        uriSuffix
                    )
                )
                : "";
    }


    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    }
    
    function setTeamMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        teamMerkleRoot = merkleRoot;
    }

    function setClaimMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        claimMerkleRoot = merkleRoot;
    }

    function addPrizeToContract() payable public onlyOwner returns (uint256)   {
        uint supply=totalSupply();
        return  address(this).balance;
    }

    function getMerkleRoot() public view returns (bytes32) {
        return whitelistMerkleRoot;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }

    function setLeadboardURI(string memory uri) public onlyOwner {
        leaderboardUri = uri;
    }

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


    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return _ownershipOf(tokenId);
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

    function setPrizeValue(uint256 q) public onlyOwner {
        prizeValue = q;
    }

    function setBurningActivated(bool _state) public onlyOwner {
        burningActivated = _state;
    }

    function setClaimAllowed(bool _state) public onlyOwner {
        claimAllowed = _state;
    }

    function setMAX_PER_TransactionWL(uint256 q) public onlyOwner {
        MAX_PER_Transaction_WL = q;
    }
  
    function setMaxPerWallet_WL(uint256 _newLimit) public onlyOwner {
        MAX_PER_Wallet_WL = _newLimit;
    }

    function setMAX_PER_Transaction(uint256 q) public onlyOwner {
        MAX_PER_Transaction = q;
    }
  

    function setMaxTeamSupply(uint256 _newLimit) public onlyOwner {
        team_supply = _newLimit;
    }
   
    function freezeTeam(bool _state) public onlyOwner {
        frozen = _state;
    }    

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setLvlUpgrade(bool _state) public onlyOwner {
        lvlUpgrade = _state;
    }
    
    function setRoundState(bool _state) public onlyOwner {
        roundEnded = _state;
        emit roundState(roundEnded);
    }

    function setPhaseState(bool _state,uint256 phaseNum) public onlyOwner {

        if(phaseNum==1)
        phaseOne=_state;
        else if(phaseNum==2)
        phaseTwo=_state;
        else if(phaseNum==3)
        phaseThree=_state;
        else if(phaseNum==4)
        phaseFour=_state;
        else if(phaseNum==5)
        phaseFive=_state;

        emit phaseState(phaseNum,_state);
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function ActivatePresale(bool _state) public onlyOwner {
        presaleIsActive = _state;
        emit mintState("Whitelist",presaleIsActive);
    }

    function ActivatePublicSale(bool _state) public onlyOwner {
        publicIsActive = _state;
        emit mintState("Public",publicIsActive);

    }

    function SetCollectionSize(uint256 num) public onlyOwner {
        TotalCollectionSize_ = num;
    }

    function SetWlColSize(uint256 num) public onlyOwner {
        WL_Supply = num;

    }
    
    function SetTeamColSize(uint256 num) public onlyOwner {
        team_supply = num;

    }

    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"}],"name":"burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mintState","type":"string"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"mintState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"mintedTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"roundNumber","type":"uint256"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"phaseState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"roundState","type":"event"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"ActivatePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"ActivatePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_PER_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_Transaction_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_Wallet_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"SetCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"SetTeamColSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"SetWlColSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TotalCollectionSize_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_Supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addPrizeToContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burningActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proofOne","type":"bytes32[]"},{"internalType":"address","name":"proofTwo","type":"address"}],"name":"claimPrize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"freezeTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeTill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"lvlUpgrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintTeam","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseFive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseFour","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseOne","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseThree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseTwo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"roundEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"season","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setBurningActivated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setClaimAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setClaimMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setLeadboardURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setLvlUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"setMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"setMAX_PER_TransactionWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setMaxPerWallet_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setMaxTeamSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"},{"internalType":"uint256","name":"phaseNum","type":"uint256"}],"name":"setPhaseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"setPrizeValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRoundState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setTeamMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team_q","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"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":"whiteListCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526002600a556001600b556001600c5566354a6ba7a18000600d556000600e5567016345785d8a0000600f55600a60105560016011556115b36012556103f2601355600a60145560026015556001601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055506000601660026101000a81548160ff0219169083151502179055506000601660036101000a81548160ff0219169083151502179055506001601660046101000a81548160ff0219169083151502179055506000601660056101000a81548160ff0219169083151502179055506000601660066101000a81548160ff0219169083151502179055506000601660076101000a81548160ff0219169083151502179055506000601660086101000a81548160ff0219169083151502179055506000601660096101000a81548160ff02191690831515021790555060006016600a6101000a81548160ff02191690831515021790555060006016600b6101000a81548160ff02191690831515021790555060006016600c6101000a81548160ff02191690831515021790555060006016600d6101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060179080519060200190620002169291906200060a565b50604051806060016040528060298152602001620064b76029913960189080519060200190620002489291906200060a565b50604051806060016040528060238152602001620064e060239139601990805190602001906200027a9291906200060a565b506040518060400160405280601e81526020017f687474703a2f2f3135392e3232332e3231342e3135392f68696464656e2f0000815250601a9080519060200190620002c89291906200060a565b506040518060a001604052807324d900159c233655f4c25b1c8e3aeef63b39906b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173d6da993902747e270a40eb050e750cb24162aa4473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c6605472bae5d5249e0b644958e8a0cab8e3f8ec73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173cf9b5cb8aec81d8aeab6cf4e62de238e6a7f82d773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ab1b5812936f8678e7f58837da146d9dc118bd0e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601e906005620004429291906200069b565b503480156200045057600080fd5b506040518060400160405280600981526020017f5468654e465457617200000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f544e570000000000000000000000000000000000000000000000000000000000815250620004dd620004d16200053560201b60201c565b6200053d60201b60201c565b8160039080519060200190620004f59291906200060a565b5080600490805190602001906200050e9291906200060a565b506200051f6200060160201b60201c565b60018190555050506001600981905550620007ae565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620006189062000749565b90600052602060002090601f0160209004810192826200063c576000855562000688565b82601f106200065757805160ff191683800117855562000688565b8280016001018555821562000688579182015b82811115620006875782518255916020019190600101906200066a565b5b5090506200069791906200072a565b5090565b82805482825590600052602060002090810192821562000717579160200282015b82811115620007165782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620006bc565b5b5090506200072691906200072a565b5090565b5b80821115620007455760008160009055506001016200072b565b5090565b600060028204905060018216806200076257607f821691505b602082108114156200077957620007786200077f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615cf980620007be6000396000f3fe60806040526004361061047d5760003560e01c8063813232d811610255578063b3531d2111610144578063e0a80853116100c1578063f2fde38b11610085578063f2fde38b14611115578063f5bd57141461113e578063f918a75614611167578063fd1e296214611190578063fd529085146111b9578063ff8c6dad146111e25761047d565b8063e0a8085314611030578063e11f02d714611059578063e1356e7714611084578063e4a749d6146110ad578063e985e9c5146110d85761047d565b8063c50b0fb011610108578063c50b0fb014610f37578063c87b56dd14610f62578063d73bdab814610f9f578063dc33e68114610fca578063dc47dced146110075761047d565b8063b3531d2114610e82578063b88d4fde14610eab578063b9156c5914610ed4578063bd32fb6614610ef0578063c263abb914610f195761047d565b806395d89b41116101d2578063a1dddb0311610196578063a1dddb0314610dbe578063a22cb46514610de7578063a6d612f914610e10578063aa98e0c614610e2c578063ae8910ff14610e575761047d565b806395d89b4114610cfa5780639bb7204e14610d255780639c4dab5214610d4e578063a0712d6814610d79578063a0a7274114610d955761047d565b806390369001116102195780639036900114610c1357806390f0d94614610c3e5780639231ab2a14610c675780639257e04414610ca457806393ea642a14610ccf5761047d565b8063813232d814610b40578063872f0b9714610b695780638827932014610b945780638da5cb5b14610bbf5780638e84c48114610bea5761047d565b806330f72cd41161037157806351830227116102ee5780635c975abb116102b25780635c975abb14610a5b5780636352211e14610a8657806370a0823114610ac3578063715018a614610b0057806372ed128114610b175761047d565b8063518302271461098857806351d7ff93146109b35780635503a0e8146109de578063554e87d214610a0957806355f804b314610a325761047d565b80633ccfd60b116103355780633ccfd60b146108cb57806342842e0e146108e257806342966c681461090b57806349590657146109345780634cc8788d1461095f5761047d565b806330f72cd4146107f657806331d43ca51461082157806336e73c081461084a578063391fce3c146108755780633a34b6c6146108a05761047d565b80630b6234b1116103ff57806323b872dd116103c357806323b872dd1461072357806325dc45ce1461074c57806329140819146107755780632a920456146107a05780632f63c02b146107cb5761047d565b80630b6234b11461064e5780630e7752091461067957806313faede6146106a457806318160ddd146106cf5780631efa410c146106fa5761047d565b806306fdde031161044657806306fdde0314610569578063081812fc14610594578063081c8c44146105d1578063095ea7b3146105fc57806309a853dd146106255761047d565b8062c434a11461048257806301ffc9a7146104ad57806302329a29146104ea578063033a02d614610513578063054f7d9c1461053e575b600080fd5b34801561048e57600080fd5b5061049761120d565b6040516104a4919061528c565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf91906147b1565b611213565b6040516104e19190614edd565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190614717565b6112a5565b005b34801561051f57600080fd5b506105286112ca565b6040516105359190614edd565b60405180910390f35b34801561054a57600080fd5b506105536112dd565b6040516105609190614edd565b60405180910390f35b34801561057557600080fd5b5061057e6112f0565b60405161058b9190614f13565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190614854565b611382565b6040516105c89190614e76565b60405180910390f35b3480156105dd57600080fd5b506105e6611401565b6040516105f39190614f13565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e91906145ca565b61148f565b005b34801561063157600080fd5b5061064c60048036038101906106479190614657565b611506565b005b34801561065a57600080fd5b50610663611824565b6040516106709190614edd565b60405180910390f35b34801561068557600080fd5b5061068e611837565b60405161069b919061528c565b60405180910390f35b3480156106b057600080fd5b506106b961183d565b6040516106c6919061528c565b60405180910390f35b3480156106db57600080fd5b506106e4611843565b6040516106f1919061528c565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190614717565b61185a565b005b34801561072f57600080fd5b5061074a600480360381019061074591906144b4565b6118c5565b005b34801561075857600080fd5b50610773600480360381019061076e9190614854565b611bea565b005b34801561078157600080fd5b5061078a611bfc565b6040516107979190614ef8565b60405180910390f35b3480156107ac57600080fd5b506107b5611c02565b6040516107c29190614edd565b60405180910390f35b3480156107d757600080fd5b506107e0611c15565b6040516107ed919061528c565b60405180910390f35b34801561080257600080fd5b5061080b611c1b565b6040516108189190614edd565b60405180910390f35b34801561082d57600080fd5b506108486004803603810190610843919061480b565b611c2e565b005b34801561085657600080fd5b5061085f611c50565b60405161086c9190614edd565b60405180910390f35b34801561088157600080fd5b5061088a611c63565b6040516108979190614edd565b60405180910390f35b3480156108ac57600080fd5b506108b5611c76565b6040516108c2919061528c565b60405180910390f35b3480156108d757600080fd5b506108e0611c7c565b005b3480156108ee57600080fd5b50610909600480360381019061090491906144b4565b611d5a565b005b34801561091757600080fd5b50610932600480360381019061092d9190614854565b611dc4565b005b34801561094057600080fd5b50610949611f23565b6040516109569190614ef8565b60405180910390f35b34801561096b57600080fd5b5061098660048036038101906109819190614854565b611f2d565b005b34801561099457600080fd5b5061099d611f3f565b6040516109aa9190614edd565b60405180910390f35b3480156109bf57600080fd5b506109c8611f52565b6040516109d5919061528c565b60405180910390f35b3480156109ea57600080fd5b506109f3611f58565b604051610a009190614f13565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b9190614717565b611fe6565b005b348015610a3e57600080fd5b50610a596004803603810190610a54919061480b565b61200b565b005b348015610a6757600080fd5b50610a7061202d565b604051610a7d9190614edd565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa89190614854565b612040565b604051610aba9190614e76565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae59190614447565b612052565b604051610af7919061528c565b60405180910390f35b348015610b0c57600080fd5b50610b1561210b565b005b348015610b2357600080fd5b50610b3e6004803603810190610b399190614717565b61211f565b005b348015610b4c57600080fd5b50610b676004803603810190610b629190614854565b612144565b005b348015610b7557600080fd5b50610b7e612156565b604051610b8b9190614edd565b60405180910390f35b348015610ba057600080fd5b50610ba9612169565b604051610bb6919061528c565b60405180910390f35b348015610bcb57600080fd5b50610bd461216f565b604051610be19190614e76565b60405180910390f35b348015610bf657600080fd5b50610c116004803603810190610c0c9190614717565b612198565b005b348015610c1f57600080fd5b50610c286121bd565b604051610c359190614edd565b60405180910390f35b348015610c4a57600080fd5b50610c656004803603810190610c609190614854565b6121d0565b005b348015610c7357600080fd5b50610c8e6004803603810190610c899190614854565b6121e2565b604051610c9b9190615271565b60405180910390f35b348015610cb057600080fd5b50610cb96121fa565b604051610cc6919061528c565b60405180910390f35b348015610cdb57600080fd5b50610ce4612200565b604051610cf1919061528c565b60405180910390f35b348015610d0657600080fd5b50610d0f612206565b604051610d1c9190614f13565b60405180910390f35b348015610d3157600080fd5b50610d4c6004803603810190610d479190614717565b612298565b005b348015610d5a57600080fd5b50610d63612303565b604051610d709190614ef8565b60405180910390f35b610d936004803603810190610d8e9190614854565b612309565b005b348015610da157600080fd5b50610dbc6004803603810190610db79190614854565b6124da565b005b348015610dca57600080fd5b50610de56004803603810190610de09190614854565b6124ec565b005b348015610df357600080fd5b50610e0e6004803603810190610e09919061458a565b6124fe565b005b610e2a6004803603810190610e2591906146b7565b6125bf565b005b348015610e3857600080fd5b50610e416128b1565b604051610e4e9190614ef8565b60405180910390f35b348015610e6357600080fd5b50610e6c6128b7565b604051610e799190614edd565b60405180910390f35b348015610e8e57600080fd5b50610ea96004803603810190610ea49190614854565b6128ca565b005b348015610eb757600080fd5b50610ed26004803603810190610ecd9190614507565b6128dc565b005b610eee6004803603810190610ee9919061460a565b61294f565b005b348015610efc57600080fd5b50610f176004803603810190610f129190614784565b612bb4565b005b610f21612bc6565b604051610f2e919061528c565b60405180910390f35b348015610f4357600080fd5b50610f4c612be3565b604051610f59919061528c565b60405180910390f35b348015610f6e57600080fd5b50610f896004803603810190610f849190614854565b612be9565b604051610f969190614f13565b60405180910390f35b348015610fab57600080fd5b50610fb4612df0565b604051610fc1919061528c565b60405180910390f35b348015610fd657600080fd5b50610ff16004803603810190610fec9190614447565b612df6565b604051610ffe919061528c565b60405180910390f35b34801561101357600080fd5b5061102e60048036038101906110299190614784565b612e08565b005b34801561103c57600080fd5b5061105760048036038101906110529190614717565b612e1a565b005b34801561106557600080fd5b5061106e612e3f565b60405161107b9190614edd565b60405180910390f35b34801561109057600080fd5b506110ab60048036038101906110a69190614717565b612e52565b005b3480156110b957600080fd5b506110c2612ebd565b6040516110cf9190614edd565b60405180910390f35b3480156110e457600080fd5b506110ff60048036038101906110fa9190614474565b612ed0565b60405161110c9190614edd565b60405180910390f35b34801561112157600080fd5b5061113c60048036038101906111379190614447565b612f64565b005b34801561114a57600080fd5b5061116560048036038101906111609190614717565b612fe8565b005b34801561117357600080fd5b5061118e60048036038101906111899190614744565b61300d565b005b34801561119c57600080fd5b506111b760048036038101906111b29190614784565b61311a565b005b3480156111c557600080fd5b506111e060048036038101906111db9190614854565b61312c565b005b3480156111ee57600080fd5b506111f761313e565b604051611204919061528c565b60405180910390f35b60155481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061126e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061129e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6112ad613144565b80601660006101000a81548160ff02191690831515021790555050565b601660039054906101000a900460ff1681565b601660049054906101000a900460ff1681565b6060600380546112ff906155b2565b80601f016020809104026020016040519081016040528092919081815260200182805461132b906155b2565b80156113785780601f1061134d57610100808354040283529160200191611378565b820191906000526020600020905b81548152906001019060200180831161135b57829003601f168201915b5050505050905090565b600061138d826131c2565b6113c3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601a805461140e906155b2565b80601f016020809104026020016040519081016040528092919081815260200182805461143a906155b2565b80156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b505050505081565b601660049054906101000a900460ff16156114f75760105481116114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90615183565b60405180910390fd5b6114f28282613221565b611502565b6115018282613221565b5b5050565b6002600954141561154c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611543906151c3565b60405180910390fd5b60026009819055508282601d54836115cc848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836040516020016115b19190614e15565b60405160208183030381529060405280519060200120613365565b61160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290615015565b60405180910390fd5b601660079054906101000a900460ff1661165a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165190614fd5565b60405180910390fd5b601660059054906101000a900460ff16156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190614f95565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600f546040516116d290614e61565b60006040518083038185875af1925050503d806000811461170f576040519150601f19603f3d011682016040523d82523d6000602084013e611714565b606091505b505090506001601660056101000a81548160ff0219169083151502179055506000601660096101000a81548160ff02191690831515021790555060006016600a6101000a81548160ff02191690831515021790555060006016600b6101000a81548160ff02191690831515021790555060006016600c6101000a81548160ff02191690831515021790555060006016600d6101000a81548160ff021916908315150217905550601160008154809291906117cd90615615565b919050555080611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990615075565b60405180910390fd5b50505050506001600981905550505050565b601660089054906101000a900460ff1681565b60125481565b600d5481565b600061184d61337c565b6002546001540303905090565b611862613144565b80601660026101000a81548160ff0219169083151502179055507fea7e1448745990626daf2b1f28dac744727f66e64ff31d57fd9fe03afc77f751601660029054906101000a900460ff166040516118ba9190615135565b60405180910390a150565b60006118d082613385565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611937576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061194384613453565b91509150611959818761195461347a565b613482565b6119a55761196e8661196961347a565b612ed0565b6119a4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611a0c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a1986868660016134c6565b8015611a2457600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611af285611ace8888876134cc565b7c0200000000000000000000000000000000000000000000000000000000176134f4565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611b7a576000600185019050600060056000838152602001908152602001600020541415611b78576001548114611b77578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611be2868686600161351f565b505050505050565b611bf2613144565b80600a8190555050565b601c5481565b6016600c9054906101000a900460ff1681565b600c5481565b601660029054906101000a900460ff1681565b611c36613144565b8060199080519060200190611c4c9291906141a1565b5050565b601660069054906101000a900460ff1681565b6016600b9054906101000a900460ff1681565b60145481565b611c84613144565b60026009541415611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc1906151c3565b60405180910390fd5b60026009819055506000611cdc61216f565b73ffffffffffffffffffffffffffffffffffffffff1647604051611cff90614e61565b60006040518083038185875af1925050503d8060008114611d3c576040519150601f19603f3d011682016040523d82523d6000602084013e611d41565b606091505b5050905080611d4f57600080fd5b506001600981905550565b6010548111611db457601660049054906101000a900460ff1615611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa90614f55565b60405180910390fd5b5b611dbf838383613525565b505050565b601660069054906101000a900460ff16611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90614ff5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611e3382612040565b73ffffffffffffffffffffffffffffffffffffffff1614611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8090615055565b60405180910390fd5b6001611e9433612052565b11611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb90615231565b60405180910390fd5b611edd81613545565b3373ffffffffffffffffffffffffffffffffffffffff167fa7509b837bd682d7e733f9bba758c1a39c72bd8f2a6d47a7ab048524def3e8f560405160405180910390a250565b6000601b54905090565b611f35613144565b80600c8190555050565b601660019054906101000a900460ff1681565b600a5481565b60178054611f65906155b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f91906155b2565b8015611fde5780601f10611fb357610100808354040283529160200191611fde565b820191906000526020600020905b815481529060010190602001808311611fc157829003601f168201915b505050505081565b611fee613144565b80601660046101000a81548160ff02191690831515021790555050565b612013613144565b80601890805190602001906120299291906141a1565b5050565b601660009054906101000a900460ff1681565b600061204b82613385565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b612113613144565b61211d6000613553565b565b612127613144565b80601660066101000a81548160ff02191690831515021790555050565b61214c613144565b80600f8190555050565b601660079054906101000a900460ff1681565b600f5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6121a0613144565b80601660076101000a81548160ff02191690831515021790555050565b601660099054906101000a900460ff1681565b6121d8613144565b8060148190555050565b6121ea614227565b6121f382613617565b9050919050565b600e5481565b60135481565b606060048054612215906155b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612241906155b2565b801561228e5780601f106122635761010080835404028352916020019161228e565b820191906000526020600020905b81548152906001019060200180831161227157829003601f168201915b5050505050905090565b6122a0613144565b80601660036101000a81548160ff0219169083151502179055507fea7e1448745990626daf2b1f28dac744727f66e64ff31d57fd9fe03afc77f751601660039054906101000a900460ff166040516122f89190615203565b60405180910390a150565b601d5481565b601660009054906101000a900460ff1615612359576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612350906151e3565b60405180910390fd5b601660039054906101000a900460ff166123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90614fb5565b60405180910390fd5b601254816123b4611843565b6123be91906153ba565b11156123ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f6906150b5565b60405180910390fd5b600a54811115612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b90615163565b60405180910390fd5b61244d81613637565b34101561248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690615251565b60405180910390fd5b612499338261364e565b7f7ef758d471bdcc939d0394eed713f54f3cd824eb882722cc852893dfada4fdde6124c2611843565b6040516124cf919061528c565b60405180910390a150565b6124e2613144565b80600b8190555050565b6124f4613144565b8060148190555050565b601660049054906101000a900460ff16156125b05760005b601e805490508110156125ae573373ffffffffffffffffffffffffffffffffffffffff16601e828154811061254e5761254d615740565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561259b57506125bb565b80806125a690615615565b915050612516565b505b6125ba828261366c565b5b5050565b8282601b54612636838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050823360405160200161261b9190614e15565b60405160208183030381529060405280519060200120613365565b612675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266c90615015565b60405180910390fd5b600e54843481836126869190615441565b146126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd906151a3565b60405180910390fd5b601660009054906101000a900460ff1615612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d906151e3565b60405180910390fd5b601660029054906101000a900460ff16612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90615035565b60405180910390fd5b600061276f611843565b9050601354878261278091906153ba565b11156127c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b890615095565b60405180910390fd5b600c54876127ce33612df6565b6127d891906153ba565b1115612819576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612810906150d5565b60405180910390fd5b600b5487111561285e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285590614f35565b60405180910390fd5b612868338861364e565b7f7ef758d471bdcc939d0394eed713f54f3cd824eb882722cc852893dfada4fdde612891611843565b60405161289e919061528c565b60405180910390a1505050505050505050565b601b5481565b601660059054906101000a900460ff1681565b6128d2613144565b8060128190555050565b6128e78484846118c5565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461294957612912848484846137e4565b612948576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b8181601c546129c6838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016129ab9190614e15565b60405160208183030381529060405280519060200120613365565b612a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fc90615015565b60405180910390fd5b600e54601554348183612a189190615441565b14612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f906151a3565b60405180910390fd5b601660009054906101000a900460ff1615612aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9f906151e3565b60405180910390fd5b6000612ab2611843565b905060145460155482612ac591906153ba565b1115612b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afd90615095565b60405180910390fd5b601554601554612b1533612df6565b612b1f91906153ba565b1115612b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b57906150d5565b60405180910390fd5b612b6c3360155461364e565b7f7ef758d471bdcc939d0394eed713f54f3cd824eb882722cc852893dfada4fdde612b95611843565b604051612ba2919061528c565b60405180910390a15050505050505050565b612bbc613144565b80601b8190555050565b6000612bd0613144565b6000612bda611843565b90504791505090565b60115481565b6060612bf4826131c2565b612c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2a90615115565b60405180910390fd5b60001515601660019054906101000a900460ff1615151415612ce157601a8054612c5c906155b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612c88906155b2565b8015612cd55780601f10612caa57610100808354040283529160200191612cd5565b820191906000526020600020905b815481529060010190602001808311612cb857829003601f168201915b50505050509050612deb565b60011515601660059054906101000a900460ff1615151415612d8f5760198054612d0a906155b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612d36906155b2565b8015612d835780601f10612d5857610100808354040283529160200191612d83565b820191906000526020600020905b815481529060010190602001808311612d6657829003601f168201915b50505050509050612deb565b6000612d99613944565b90506000815111612db95760405180602001604052806000815250612de7565b80612dc3846139d6565b6017604051602001612dd793929190614e30565b6040516020818303038152906040525b9150505b919050565b600b5481565b6000612e0182613b37565b9050919050565b612e10613144565b80601c8190555050565b612e22613144565b80601660016101000a81548160ff02191690831515021790555050565b6016600a9054906101000a900460ff1681565b612e5a613144565b80601660056101000a81548160ff0219169083151502179055507f8b423d1f3e7da9fd12188001033b7e1480bde2887443c910d3d2bc91d35e9d38601660059054906101000a900460ff16604051612eb29190614edd565b60405180910390a150565b6016600d9054906101000a900460ff1681565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612f6c613144565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd390614f75565b60405180910390fd5b612fe581613553565b50565b612ff0613144565b80601660086101000a81548160ff02191690831515021790555050565b613015613144565b600181141561303d5781601660096101000a81548160ff0219169083151502179055506130dd565b600281141561306557816016600a6101000a81548160ff0219169083151502179055506130dc565b600381141561308d57816016600b6101000a81548160ff0219169083151502179055506130db565b60048114156130b557816016600c6101000a81548160ff0219169083151502179055506130da565b60058114156130d957816016600d6101000a81548160ff0219169083151502179055505b5b5b5b5b7f8853ef8e1c7913dea7500747de8fa6539e078a7abf467ffa81bd0b4b6b1b7685818360405161310e9291906152a7565b60405180910390a15050565b613122613144565b80601d8190555050565b613134613144565b8060138190555050565b60105481565b61314c613b8e565b73ffffffffffffffffffffffffffffffffffffffff1661316a61216f565b73ffffffffffffffffffffffffffffffffffffffff16146131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b7906150f5565b60405180910390fd5b565b6000816131cd61337c565b111580156131dc575060015482105b801561321a575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600061322c82612040565b90508073ffffffffffffffffffffffffffffffffffffffff1661324d61347a565b73ffffffffffffffffffffffffffffffffffffffff16146132b0576132798161327461347a565b612ed0565b6132af576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000826133728584613b96565b1490509392505050565b60006001905090565b6000808290508061339461337c565b1161341c5760015481101561341b5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415613419575b600081141561340f5760056000836001900393508381526020019081526020016000205490506133e4565b809250505061344e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86134e3868684613c0b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b613540838383604051806020016040528060008152506128dc565b505050565b613550816000613c14565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61361f614227565b61363061362b83613385565b613e68565b9050919050565b600081600d546136479190615441565b9050919050565b613668828260405180602001604052806000815250613f1e565b5050565b61367461347a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136d9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006136e661347a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661379361347a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516137d89190614edd565b60405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261380a61347a565b8786866040518563ffffffff1660e01b815260040161382c9493929190614e91565b602060405180830381600087803b15801561384657600080fd5b505af192505050801561387757506040513d601f19601f8201168201806040525081019061387491906147de565b60015b6138f1573d80600081146138a7576040519150601f19603f3d011682016040523d82523d6000602084013e6138ac565b606091505b506000815114156138e9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060188054613953906155b2565b80601f016020809104026020016040519081016040528092919081815260200182805461397f906155b2565b80156139cc5780601f106139a1576101008083540402835291602001916139cc565b820191906000526020600020905b8154815290600101906020018083116139af57829003601f168201915b5050505050905090565b60606000821415613a1e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b32565b600082905060005b60008214613a50578080613a3990615615565b915050600a82613a499190615410565b9150613a26565b60008167ffffffffffffffff811115613a6c57613a6b61576f565b5b6040519080825280601f01601f191660200182016040528015613a9e5781602001600182028036833780820191505090505b5090505b60008514613b2b57600182613ab7919061549b565b9150600a85613ac69190615682565b6030613ad291906153ba565b60f81b818381518110613ae857613ae7615740565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b249190615410565b9450613aa2565b8093505050505b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60008082905060005b8451811015613c00576000858281518110613bbd57613bbc615740565b5b60200260200101519050808311613bdf57613bd88382613fbc565b9250613bec565b613be98184613fbc565b92505b508080613bf890615615565b915050613b9f565b508091505092915050565b60009392505050565b6000613c1f83613385565b90506000819050600080613c3286613453565b915091508415613c9b57613c4e8184613c4961347a565b613482565b613c9a57613c6383613c5e61347a565b612ed0565b613c99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b613ca98360008860016134c6565b8015613cb457600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613d5c83613d19856000886134cc565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176134f4565b600560008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415613de4576000600187019050600060056000838152602001908152602001600020541415613de2576001548114613de1578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613e4e83600088600161351f565b600260008154809291906001019190505550505050505050565b613e70614227565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b613f288383613fd3565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613fb75760006001549050600083820390505b613f6960008683806001019450866137e4565b613f9f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613f56578160015414613fb457600080fd5b50505b505050565b600082600052816020526040600020905092915050565b600060015490506000821415614015576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61402260008483856134c6565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506140998361408a60008660006134cc565b61409385614191565b176134f4565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461413a57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506140ff565b506000821415614176576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600181905550505061418c600084838561351f565b505050565b60006001821460e11b9050919050565b8280546141ad906155b2565b90600052602060002090601f0160209004810192826141cf5760008555614216565b82601f106141e857805160ff1916838001178555614216565b82800160010185558215614216579182015b828111156142155782518255916020019190600101906141fa565b5b5090506142239190614276565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b8082111561428f576000816000905550600101614277565b5090565b60006142a66142a1846152f5565b6152d0565b9050828152602081018484840111156142c2576142c16157ad565b5b6142cd848285615570565b509392505050565b60006142e86142e384615326565b6152d0565b905082815260208101848484011115614304576143036157ad565b5b61430f848285615570565b509392505050565b60008135905061432681615c50565b92915050565b60008083601f840112614342576143416157a3565b5b8235905067ffffffffffffffff81111561435f5761435e61579e565b5b60208301915083602082028301111561437b5761437a6157a8565b5b9250929050565b60008135905061439181615c67565b92915050565b6000813590506143a681615c7e565b92915050565b6000813590506143bb81615c95565b92915050565b6000815190506143d081615c95565b92915050565b600082601f8301126143eb576143ea6157a3565b5b81356143fb848260208601614293565b91505092915050565b600082601f830112614419576144186157a3565b5b81356144298482602086016142d5565b91505092915050565b60008135905061444181615cac565b92915050565b60006020828403121561445d5761445c6157b7565b5b600061446b84828501614317565b91505092915050565b6000806040838503121561448b5761448a6157b7565b5b600061449985828601614317565b92505060206144aa85828601614317565b9150509250929050565b6000806000606084860312156144cd576144cc6157b7565b5b60006144db86828701614317565b93505060206144ec86828701614317565b92505060406144fd86828701614432565b9150509250925092565b60008060008060808587031215614521576145206157b7565b5b600061452f87828801614317565b945050602061454087828801614317565b935050604061455187828801614432565b925050606085013567ffffffffffffffff811115614572576145716157b2565b5b61457e878288016143d6565b91505092959194509250565b600080604083850312156145a1576145a06157b7565b5b60006145af85828601614317565b92505060206145c085828601614382565b9150509250929050565b600080604083850312156145e1576145e06157b7565b5b60006145ef85828601614317565b925050602061460085828601614432565b9150509250929050565b60008060208385031215614621576146206157b7565b5b600083013567ffffffffffffffff81111561463f5761463e6157b2565b5b61464b8582860161432c565b92509250509250929050565b6000806000604084860312156146705761466f6157b7565b5b600084013567ffffffffffffffff81111561468e5761468d6157b2565b5b61469a8682870161432c565b935093505060206146ad86828701614317565b9150509250925092565b6000806000604084860312156146d0576146cf6157b7565b5b600084013567ffffffffffffffff8111156146ee576146ed6157b2565b5b6146fa8682870161432c565b9350935050602061470d86828701614432565b9150509250925092565b60006020828403121561472d5761472c6157b7565b5b600061473b84828501614382565b91505092915050565b6000806040838503121561475b5761475a6157b7565b5b600061476985828601614382565b925050602061477a85828601614432565b9150509250929050565b60006020828403121561479a576147996157b7565b5b60006147a884828501614397565b91505092915050565b6000602082840312156147c7576147c66157b7565b5b60006147d5848285016143ac565b91505092915050565b6000602082840312156147f4576147f36157b7565b5b6000614802848285016143c1565b91505092915050565b600060208284031215614821576148206157b7565b5b600082013567ffffffffffffffff81111561483f5761483e6157b2565b5b61484b84828501614404565b91505092915050565b60006020828403121561486a576148696157b7565b5b600061487884828501614432565b91505092915050565b61488a816154cf565b82525050565b614899816154cf565b82525050565b6148b06148ab826154cf565b61565e565b82525050565b6148bf816154e1565b82525050565b6148ce816154e1565b82525050565b6148dd816154ed565b82525050565b60006148ee8261536c565b6148f88185615382565b935061490881856020860161557f565b614911816157bc565b840191505092915050565b600061492782615377565b614931818561539e565b935061494181856020860161557f565b61494a816157bc565b840191505092915050565b600061496082615377565b61496a81856153af565b935061497a81856020860161557f565b80840191505092915050565b60008154614993816155b2565b61499d81866153af565b945060018216600081146149b857600181146149c9576149fc565b60ff198316865281860193506149fc565b6149d285615357565b60005b838110156149f4578154818901526001820191506020810190506149d5565b838801955050505b50505092915050565b6000614a1260298361539e565b9150614a1d826157da565b604082019050919050565b6000614a35600c8361539e565b9150614a4082615829565b602082019050919050565b6000614a5860268361539e565b9150614a6382615852565b604082019050919050565b6000614a7b60178361539e565b9150614a86826158a1565b602082019050919050565b6000614a9e60168361539e565b9150614aa9826158ca565b602082019050919050565b6000614ac1601a8361539e565b9150614acc826158f3565b602082019050919050565b6000614ae460178361539e565b9150614aef8261591c565b602082019050919050565b6000614b07601e8361539e565b9150614b1282615945565b602082019050919050565b6000614b2a60198361539e565b9150614b358261596e565b602082019050919050565b6000614b4d60158361539e565b9150614b5882615997565b602082019050919050565b6000614b70600c8361539e565b9150614b7b826159c0565b602082019050919050565b6000614b9360168361539e565b9150614b9e826159e9565b602082019050919050565b6000614bb660128361539e565b9150614bc182615a12565b602082019050919050565b6000614bd960198361539e565b9150614be482615a3b565b602082019050919050565b6000614bfc60208361539e565b9150614c0782615a64565b602082019050919050565b6000614c1f602f8361539e565b9150614c2a82615a8d565b604082019050919050565b6000614c4260098361539e565b9150614c4d82615adc565b602082019050919050565b6000614c65600083615393565b9150614c7082615b05565b600082019050919050565b6000614c8860168361539e565b9150614c9382615b08565b602082019050919050565b6000614cab600f8361539e565b9150614cb682615b31565b602082019050919050565b6000614cce60188361539e565b9150614cd982615b5a565b602082019050919050565b6000614cf1601f8361539e565b9150614cfc82615b83565b602082019050919050565b6000614d14600e8361539e565b9150614d1f82615bac565b602082019050919050565b6000614d3760068361539e565b9150614d4282615bd5565b602082019050919050565b6000614d5a601e8361539e565b9150614d6582615bfe565b602082019050919050565b6000614d7d60138361539e565b9150614d8882615c27565b602082019050919050565b608082016000820151614da96000850182614881565b506020820151614dbc6020850182614e06565b506040820151614dcf60408501826148b6565b506060820151614de26060850182614de8565b50505050565b614df181615543565b82525050565b614e0081615552565b82525050565b614e0f8161555c565b82525050565b6000614e21828461489f565b60148201915081905092915050565b6000614e3c8286614955565b9150614e488285614955565b9150614e548284614986565b9150819050949350505050565b6000614e6c82614c58565b9150819050919050565b6000602082019050614e8b6000830184614890565b92915050565b6000608082019050614ea66000830187614890565b614eb36020830186614890565b614ec06040830185614df7565b8181036060830152614ed281846148e3565b905095945050505050565b6000602082019050614ef260008301846148c5565b92915050565b6000602082019050614f0d60008301846148d4565b92915050565b60006020820190508181036000830152614f2d818461491c565b905092915050565b60006020820190508181036000830152614f4e81614a05565b9050919050565b60006020820190508181036000830152614f6e81614a28565b9050919050565b60006020820190508181036000830152614f8e81614a4b565b9050919050565b60006020820190508181036000830152614fae81614a6e565b9050919050565b60006020820190508181036000830152614fce81614a91565b9050919050565b60006020820190508181036000830152614fee81614ab4565b9050919050565b6000602082019050818103600083015261500e81614ad7565b9050919050565b6000602082019050818103600083015261502e81614afa565b9050919050565b6000602082019050818103600083015261504e81614b1d565b9050919050565b6000602082019050818103600083015261506e81614b40565b9050919050565b6000602082019050818103600083015261508e81614b63565b9050919050565b600060208201905081810360008301526150ae81614b86565b9050919050565b600060208201905081810360008301526150ce81614ba9565b9050919050565b600060208201905081810360008301526150ee81614bcc565b9050919050565b6000602082019050818103600083015261510e81614bef565b9050919050565b6000602082019050818103600083015261512e81614c12565b9050919050565b6000604082019050818103600083015261514e81614c35565b905061515d60208301846148c5565b92915050565b6000602082019050818103600083015261517c81614c7b565b9050919050565b6000602082019050818103600083015261519c81614c9e565b9050919050565b600060208201905081810360008301526151bc81614cc1565b9050919050565b600060208201905081810360008301526151dc81614ce4565b9050919050565b600060208201905081810360008301526151fc81614d07565b9050919050565b6000604082019050818103600083015261521c81614d2a565b905061522b60208301846148c5565b92915050565b6000602082019050818103600083015261524a81614d4d565b9050919050565b6000602082019050818103600083015261526a81614d70565b9050919050565b60006080820190506152866000830184614d93565b92915050565b60006020820190506152a16000830184614df7565b92915050565b60006040820190506152bc6000830185614df7565b6152c960208301846148c5565b9392505050565b60006152da6152eb565b90506152e682826155e4565b919050565b6000604051905090565b600067ffffffffffffffff8211156153105761530f61576f565b5b615319826157bc565b9050602081019050919050565b600067ffffffffffffffff8211156153415761534061576f565b5b61534a826157bc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006153c582615552565b91506153d083615552565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615405576154046156b3565b5b828201905092915050565b600061541b82615552565b915061542683615552565b925082615436576154356156e2565b5b828204905092915050565b600061544c82615552565b915061545783615552565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154905761548f6156b3565b5b828202905092915050565b60006154a682615552565b91506154b183615552565b9250828210156154c4576154c36156b3565b5b828203905092915050565b60006154da82615523565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561559d578082015181840152602081019050615582565b838111156155ac576000848401525b50505050565b600060028204905060018216806155ca57607f821691505b602082108114156155de576155dd615711565b5b50919050565b6155ed826157bc565b810181811067ffffffffffffffff8211171561560c5761560b61576f565b5b80604052505050565b600061562082615552565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615653576156526156b3565b5b600182019050919050565b600061566982615670565b9050919050565b600061567b826157cd565b9050919050565b600061568d82615552565b915061569883615552565b9250826156a8576156a76156e2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f63616e206e6f74206d696e742074686973206d616e7920696e206f6e6520747260008201527f616e73616374696f6e0000000000000000000000000000000000000000000000602082015250565b7f41737365742046726f7a656e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f526f756e642068617320656e64656420616c7265616479000000000000000000600082015250565b7f7075626c6963206d696e74206e6f742061637469766500000000000000000000600082015250565b7f43616e7420636c61696d207072697a65207269676874206e6f77000000000000600082015250565b7f4275726e696e67206e6f7420616c6c6f77656420796574000000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f57686974656c697374206d696e74206e6f742061637469766500000000000000600082015250565b7f656e74657220746f6b656e496420796f75206f776e0000000000000000000000600082015250565b7f636c61696d206661696c65640000000000000000000000000000000000000000600082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f6c696d6974207065722077616c6c657420657863656564656400000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f57686974656c6973740000000000000000000000000000000000000000000000600082015250565b50565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f4e6f7420616c6c6f776564207965740000000000000000000000000000000000600082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6d696e7420697320706175736564000000000000000000000000000000000000600082015250565b7f5075626c69630000000000000000000000000000000000000000000000000000600082015250565b7f596f7520646f6e74206f776e206d6f7265207468616e203120746f6b656e0000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b615c59816154cf565b8114615c6457600080fd5b50565b615c70816154e1565b8114615c7b57600080fd5b50565b615c87816154ed565b8114615c9257600080fd5b50565b615c9e816154f7565b8114615ca957600080fd5b50565b615cb581615552565b8114615cc057600080fd5b5056fea2646970667358221220abe08b15e04f003b1e52d0e50701b0c09bc09e0cafe525f8e2902a548d8a343664736f6c63430008070033687474703a2f2f3135392e3232332e3231342e3135392f436f6e74726163742f6d657461646174612f687474703a2f2f3135392e3232332e3231342e3135392f6c6561646572626f6172642f

Deployed Bytecode

0x60806040526004361061047d5760003560e01c8063813232d811610255578063b3531d2111610144578063e0a80853116100c1578063f2fde38b11610085578063f2fde38b14611115578063f5bd57141461113e578063f918a75614611167578063fd1e296214611190578063fd529085146111b9578063ff8c6dad146111e25761047d565b8063e0a8085314611030578063e11f02d714611059578063e1356e7714611084578063e4a749d6146110ad578063e985e9c5146110d85761047d565b8063c50b0fb011610108578063c50b0fb014610f37578063c87b56dd14610f62578063d73bdab814610f9f578063dc33e68114610fca578063dc47dced146110075761047d565b8063b3531d2114610e82578063b88d4fde14610eab578063b9156c5914610ed4578063bd32fb6614610ef0578063c263abb914610f195761047d565b806395d89b41116101d2578063a1dddb0311610196578063a1dddb0314610dbe578063a22cb46514610de7578063a6d612f914610e10578063aa98e0c614610e2c578063ae8910ff14610e575761047d565b806395d89b4114610cfa5780639bb7204e14610d255780639c4dab5214610d4e578063a0712d6814610d79578063a0a7274114610d955761047d565b806390369001116102195780639036900114610c1357806390f0d94614610c3e5780639231ab2a14610c675780639257e04414610ca457806393ea642a14610ccf5761047d565b8063813232d814610b40578063872f0b9714610b695780638827932014610b945780638da5cb5b14610bbf5780638e84c48114610bea5761047d565b806330f72cd41161037157806351830227116102ee5780635c975abb116102b25780635c975abb14610a5b5780636352211e14610a8657806370a0823114610ac3578063715018a614610b0057806372ed128114610b175761047d565b8063518302271461098857806351d7ff93146109b35780635503a0e8146109de578063554e87d214610a0957806355f804b314610a325761047d565b80633ccfd60b116103355780633ccfd60b146108cb57806342842e0e146108e257806342966c681461090b57806349590657146109345780634cc8788d1461095f5761047d565b806330f72cd4146107f657806331d43ca51461082157806336e73c081461084a578063391fce3c146108755780633a34b6c6146108a05761047d565b80630b6234b1116103ff57806323b872dd116103c357806323b872dd1461072357806325dc45ce1461074c57806329140819146107755780632a920456146107a05780632f63c02b146107cb5761047d565b80630b6234b11461064e5780630e7752091461067957806313faede6146106a457806318160ddd146106cf5780631efa410c146106fa5761047d565b806306fdde031161044657806306fdde0314610569578063081812fc14610594578063081c8c44146105d1578063095ea7b3146105fc57806309a853dd146106255761047d565b8062c434a11461048257806301ffc9a7146104ad57806302329a29146104ea578063033a02d614610513578063054f7d9c1461053e575b600080fd5b34801561048e57600080fd5b5061049761120d565b6040516104a4919061528c565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf91906147b1565b611213565b6040516104e19190614edd565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190614717565b6112a5565b005b34801561051f57600080fd5b506105286112ca565b6040516105359190614edd565b60405180910390f35b34801561054a57600080fd5b506105536112dd565b6040516105609190614edd565b60405180910390f35b34801561057557600080fd5b5061057e6112f0565b60405161058b9190614f13565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190614854565b611382565b6040516105c89190614e76565b60405180910390f35b3480156105dd57600080fd5b506105e6611401565b6040516105f39190614f13565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e91906145ca565b61148f565b005b34801561063157600080fd5b5061064c60048036038101906106479190614657565b611506565b005b34801561065a57600080fd5b50610663611824565b6040516106709190614edd565b60405180910390f35b34801561068557600080fd5b5061068e611837565b60405161069b919061528c565b60405180910390f35b3480156106b057600080fd5b506106b961183d565b6040516106c6919061528c565b60405180910390f35b3480156106db57600080fd5b506106e4611843565b6040516106f1919061528c565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190614717565b61185a565b005b34801561072f57600080fd5b5061074a600480360381019061074591906144b4565b6118c5565b005b34801561075857600080fd5b50610773600480360381019061076e9190614854565b611bea565b005b34801561078157600080fd5b5061078a611bfc565b6040516107979190614ef8565b60405180910390f35b3480156107ac57600080fd5b506107b5611c02565b6040516107c29190614edd565b60405180910390f35b3480156107d757600080fd5b506107e0611c15565b6040516107ed919061528c565b60405180910390f35b34801561080257600080fd5b5061080b611c1b565b6040516108189190614edd565b60405180910390f35b34801561082d57600080fd5b506108486004803603810190610843919061480b565b611c2e565b005b34801561085657600080fd5b5061085f611c50565b60405161086c9190614edd565b60405180910390f35b34801561088157600080fd5b5061088a611c63565b6040516108979190614edd565b60405180910390f35b3480156108ac57600080fd5b506108b5611c76565b6040516108c2919061528c565b60405180910390f35b3480156108d757600080fd5b506108e0611c7c565b005b3480156108ee57600080fd5b50610909600480360381019061090491906144b4565b611d5a565b005b34801561091757600080fd5b50610932600480360381019061092d9190614854565b611dc4565b005b34801561094057600080fd5b50610949611f23565b6040516109569190614ef8565b60405180910390f35b34801561096b57600080fd5b5061098660048036038101906109819190614854565b611f2d565b005b34801561099457600080fd5b5061099d611f3f565b6040516109aa9190614edd565b60405180910390f35b3480156109bf57600080fd5b506109c8611f52565b6040516109d5919061528c565b60405180910390f35b3480156109ea57600080fd5b506109f3611f58565b604051610a009190614f13565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b9190614717565b611fe6565b005b348015610a3e57600080fd5b50610a596004803603810190610a54919061480b565b61200b565b005b348015610a6757600080fd5b50610a7061202d565b604051610a7d9190614edd565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa89190614854565b612040565b604051610aba9190614e76565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae59190614447565b612052565b604051610af7919061528c565b60405180910390f35b348015610b0c57600080fd5b50610b1561210b565b005b348015610b2357600080fd5b50610b3e6004803603810190610b399190614717565b61211f565b005b348015610b4c57600080fd5b50610b676004803603810190610b629190614854565b612144565b005b348015610b7557600080fd5b50610b7e612156565b604051610b8b9190614edd565b60405180910390f35b348015610ba057600080fd5b50610ba9612169565b604051610bb6919061528c565b60405180910390f35b348015610bcb57600080fd5b50610bd461216f565b604051610be19190614e76565b60405180910390f35b348015610bf657600080fd5b50610c116004803603810190610c0c9190614717565b612198565b005b348015610c1f57600080fd5b50610c286121bd565b604051610c359190614edd565b60405180910390f35b348015610c4a57600080fd5b50610c656004803603810190610c609190614854565b6121d0565b005b348015610c7357600080fd5b50610c8e6004803603810190610c899190614854565b6121e2565b604051610c9b9190615271565b60405180910390f35b348015610cb057600080fd5b50610cb96121fa565b604051610cc6919061528c565b60405180910390f35b348015610cdb57600080fd5b50610ce4612200565b604051610cf1919061528c565b60405180910390f35b348015610d0657600080fd5b50610d0f612206565b604051610d1c9190614f13565b60405180910390f35b348015610d3157600080fd5b50610d4c6004803603810190610d479190614717565b612298565b005b348015610d5a57600080fd5b50610d63612303565b604051610d709190614ef8565b60405180910390f35b610d936004803603810190610d8e9190614854565b612309565b005b348015610da157600080fd5b50610dbc6004803603810190610db79190614854565b6124da565b005b348015610dca57600080fd5b50610de56004803603810190610de09190614854565b6124ec565b005b348015610df357600080fd5b50610e0e6004803603810190610e09919061458a565b6124fe565b005b610e2a6004803603810190610e2591906146b7565b6125bf565b005b348015610e3857600080fd5b50610e416128b1565b604051610e4e9190614ef8565b60405180910390f35b348015610e6357600080fd5b50610e6c6128b7565b604051610e799190614edd565b60405180910390f35b348015610e8e57600080fd5b50610ea96004803603810190610ea49190614854565b6128ca565b005b348015610eb757600080fd5b50610ed26004803603810190610ecd9190614507565b6128dc565b005b610eee6004803603810190610ee9919061460a565b61294f565b005b348015610efc57600080fd5b50610f176004803603810190610f129190614784565b612bb4565b005b610f21612bc6565b604051610f2e919061528c565b60405180910390f35b348015610f4357600080fd5b50610f4c612be3565b604051610f59919061528c565b60405180910390f35b348015610f6e57600080fd5b50610f896004803603810190610f849190614854565b612be9565b604051610f969190614f13565b60405180910390f35b348015610fab57600080fd5b50610fb4612df0565b604051610fc1919061528c565b60405180910390f35b348015610fd657600080fd5b50610ff16004803603810190610fec9190614447565b612df6565b604051610ffe919061528c565b60405180910390f35b34801561101357600080fd5b5061102e60048036038101906110299190614784565b612e08565b005b34801561103c57600080fd5b5061105760048036038101906110529190614717565b612e1a565b005b34801561106557600080fd5b5061106e612e3f565b60405161107b9190614edd565b60405180910390f35b34801561109057600080fd5b506110ab60048036038101906110a69190614717565b612e52565b005b3480156110b957600080fd5b506110c2612ebd565b6040516110cf9190614edd565b60405180910390f35b3480156110e457600080fd5b506110ff60048036038101906110fa9190614474565b612ed0565b60405161110c9190614edd565b60405180910390f35b34801561112157600080fd5b5061113c60048036038101906111379190614447565b612f64565b005b34801561114a57600080fd5b5061116560048036038101906111609190614717565b612fe8565b005b34801561117357600080fd5b5061118e60048036038101906111899190614744565b61300d565b005b34801561119c57600080fd5b506111b760048036038101906111b29190614784565b61311a565b005b3480156111c557600080fd5b506111e060048036038101906111db9190614854565b61312c565b005b3480156111ee57600080fd5b506111f761313e565b604051611204919061528c565b60405180910390f35b60155481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061126e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061129e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6112ad613144565b80601660006101000a81548160ff02191690831515021790555050565b601660039054906101000a900460ff1681565b601660049054906101000a900460ff1681565b6060600380546112ff906155b2565b80601f016020809104026020016040519081016040528092919081815260200182805461132b906155b2565b80156113785780601f1061134d57610100808354040283529160200191611378565b820191906000526020600020905b81548152906001019060200180831161135b57829003601f168201915b5050505050905090565b600061138d826131c2565b6113c3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601a805461140e906155b2565b80601f016020809104026020016040519081016040528092919081815260200182805461143a906155b2565b80156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b505050505081565b601660049054906101000a900460ff16156114f75760105481116114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90615183565b60405180910390fd5b6114f28282613221565b611502565b6115018282613221565b5b5050565b6002600954141561154c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611543906151c3565b60405180910390fd5b60026009819055508282601d54836115cc848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836040516020016115b19190614e15565b60405160208183030381529060405280519060200120613365565b61160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290615015565b60405180910390fd5b601660079054906101000a900460ff1661165a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165190614fd5565b60405180910390fd5b601660059054906101000a900460ff16156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190614f95565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600f546040516116d290614e61565b60006040518083038185875af1925050503d806000811461170f576040519150601f19603f3d011682016040523d82523d6000602084013e611714565b606091505b505090506001601660056101000a81548160ff0219169083151502179055506000601660096101000a81548160ff02191690831515021790555060006016600a6101000a81548160ff02191690831515021790555060006016600b6101000a81548160ff02191690831515021790555060006016600c6101000a81548160ff02191690831515021790555060006016600d6101000a81548160ff021916908315150217905550601160008154809291906117cd90615615565b919050555080611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990615075565b60405180910390fd5b50505050506001600981905550505050565b601660089054906101000a900460ff1681565b60125481565b600d5481565b600061184d61337c565b6002546001540303905090565b611862613144565b80601660026101000a81548160ff0219169083151502179055507fea7e1448745990626daf2b1f28dac744727f66e64ff31d57fd9fe03afc77f751601660029054906101000a900460ff166040516118ba9190615135565b60405180910390a150565b60006118d082613385565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611937576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061194384613453565b91509150611959818761195461347a565b613482565b6119a55761196e8661196961347a565b612ed0565b6119a4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611a0c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a1986868660016134c6565b8015611a2457600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611af285611ace8888876134cc565b7c0200000000000000000000000000000000000000000000000000000000176134f4565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611b7a576000600185019050600060056000838152602001908152602001600020541415611b78576001548114611b77578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611be2868686600161351f565b505050505050565b611bf2613144565b80600a8190555050565b601c5481565b6016600c9054906101000a900460ff1681565b600c5481565b601660029054906101000a900460ff1681565b611c36613144565b8060199080519060200190611c4c9291906141a1565b5050565b601660069054906101000a900460ff1681565b6016600b9054906101000a900460ff1681565b60145481565b611c84613144565b60026009541415611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc1906151c3565b60405180910390fd5b60026009819055506000611cdc61216f565b73ffffffffffffffffffffffffffffffffffffffff1647604051611cff90614e61565b60006040518083038185875af1925050503d8060008114611d3c576040519150601f19603f3d011682016040523d82523d6000602084013e611d41565b606091505b5050905080611d4f57600080fd5b506001600981905550565b6010548111611db457601660049054906101000a900460ff1615611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa90614f55565b60405180910390fd5b5b611dbf838383613525565b505050565b601660069054906101000a900460ff16611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90614ff5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16611e3382612040565b73ffffffffffffffffffffffffffffffffffffffff1614611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8090615055565b60405180910390fd5b6001611e9433612052565b11611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb90615231565b60405180910390fd5b611edd81613545565b3373ffffffffffffffffffffffffffffffffffffffff167fa7509b837bd682d7e733f9bba758c1a39c72bd8f2a6d47a7ab048524def3e8f560405160405180910390a250565b6000601b54905090565b611f35613144565b80600c8190555050565b601660019054906101000a900460ff1681565b600a5481565b60178054611f65906155b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f91906155b2565b8015611fde5780601f10611fb357610100808354040283529160200191611fde565b820191906000526020600020905b815481529060010190602001808311611fc157829003601f168201915b505050505081565b611fee613144565b80601660046101000a81548160ff02191690831515021790555050565b612013613144565b80601890805190602001906120299291906141a1565b5050565b601660009054906101000a900460ff1681565b600061204b82613385565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b612113613144565b61211d6000613553565b565b612127613144565b80601660066101000a81548160ff02191690831515021790555050565b61214c613144565b80600f8190555050565b601660079054906101000a900460ff1681565b600f5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6121a0613144565b80601660076101000a81548160ff02191690831515021790555050565b601660099054906101000a900460ff1681565b6121d8613144565b8060148190555050565b6121ea614227565b6121f382613617565b9050919050565b600e5481565b60135481565b606060048054612215906155b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612241906155b2565b801561228e5780601f106122635761010080835404028352916020019161228e565b820191906000526020600020905b81548152906001019060200180831161227157829003601f168201915b5050505050905090565b6122a0613144565b80601660036101000a81548160ff0219169083151502179055507fea7e1448745990626daf2b1f28dac744727f66e64ff31d57fd9fe03afc77f751601660039054906101000a900460ff166040516122f89190615203565b60405180910390a150565b601d5481565b601660009054906101000a900460ff1615612359576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612350906151e3565b60405180910390fd5b601660039054906101000a900460ff166123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90614fb5565b60405180910390fd5b601254816123b4611843565b6123be91906153ba565b11156123ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f6906150b5565b60405180910390fd5b600a54811115612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b90615163565b60405180910390fd5b61244d81613637565b34101561248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690615251565b60405180910390fd5b612499338261364e565b7f7ef758d471bdcc939d0394eed713f54f3cd824eb882722cc852893dfada4fdde6124c2611843565b6040516124cf919061528c565b60405180910390a150565b6124e2613144565b80600b8190555050565b6124f4613144565b8060148190555050565b601660049054906101000a900460ff16156125b05760005b601e805490508110156125ae573373ffffffffffffffffffffffffffffffffffffffff16601e828154811061254e5761254d615740565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561259b57506125bb565b80806125a690615615565b915050612516565b505b6125ba828261366c565b5b5050565b8282601b54612636838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050823360405160200161261b9190614e15565b60405160208183030381529060405280519060200120613365565b612675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266c90615015565b60405180910390fd5b600e54843481836126869190615441565b146126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd906151a3565b60405180910390fd5b601660009054906101000a900460ff1615612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d906151e3565b60405180910390fd5b601660029054906101000a900460ff16612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90615035565b60405180910390fd5b600061276f611843565b9050601354878261278091906153ba565b11156127c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b890615095565b60405180910390fd5b600c54876127ce33612df6565b6127d891906153ba565b1115612819576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612810906150d5565b60405180910390fd5b600b5487111561285e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285590614f35565b60405180910390fd5b612868338861364e565b7f7ef758d471bdcc939d0394eed713f54f3cd824eb882722cc852893dfada4fdde612891611843565b60405161289e919061528c565b60405180910390a1505050505050505050565b601b5481565b601660059054906101000a900460ff1681565b6128d2613144565b8060128190555050565b6128e78484846118c5565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461294957612912848484846137e4565b612948576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b8181601c546129c6838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016129ab9190614e15565b60405160208183030381529060405280519060200120613365565b612a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fc90615015565b60405180910390fd5b600e54601554348183612a189190615441565b14612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f906151a3565b60405180910390fd5b601660009054906101000a900460ff1615612aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9f906151e3565b60405180910390fd5b6000612ab2611843565b905060145460155482612ac591906153ba565b1115612b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afd90615095565b60405180910390fd5b601554601554612b1533612df6565b612b1f91906153ba565b1115612b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b57906150d5565b60405180910390fd5b612b6c3360155461364e565b7f7ef758d471bdcc939d0394eed713f54f3cd824eb882722cc852893dfada4fdde612b95611843565b604051612ba2919061528c565b60405180910390a15050505050505050565b612bbc613144565b80601b8190555050565b6000612bd0613144565b6000612bda611843565b90504791505090565b60115481565b6060612bf4826131c2565b612c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2a90615115565b60405180910390fd5b60001515601660019054906101000a900460ff1615151415612ce157601a8054612c5c906155b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612c88906155b2565b8015612cd55780601f10612caa57610100808354040283529160200191612cd5565b820191906000526020600020905b815481529060010190602001808311612cb857829003601f168201915b50505050509050612deb565b60011515601660059054906101000a900460ff1615151415612d8f5760198054612d0a906155b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612d36906155b2565b8015612d835780601f10612d5857610100808354040283529160200191612d83565b820191906000526020600020905b815481529060010190602001808311612d6657829003601f168201915b50505050509050612deb565b6000612d99613944565b90506000815111612db95760405180602001604052806000815250612de7565b80612dc3846139d6565b6017604051602001612dd793929190614e30565b6040516020818303038152906040525b9150505b919050565b600b5481565b6000612e0182613b37565b9050919050565b612e10613144565b80601c8190555050565b612e22613144565b80601660016101000a81548160ff02191690831515021790555050565b6016600a9054906101000a900460ff1681565b612e5a613144565b80601660056101000a81548160ff0219169083151502179055507f8b423d1f3e7da9fd12188001033b7e1480bde2887443c910d3d2bc91d35e9d38601660059054906101000a900460ff16604051612eb29190614edd565b60405180910390a150565b6016600d9054906101000a900460ff1681565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612f6c613144565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd390614f75565b60405180910390fd5b612fe581613553565b50565b612ff0613144565b80601660086101000a81548160ff02191690831515021790555050565b613015613144565b600181141561303d5781601660096101000a81548160ff0219169083151502179055506130dd565b600281141561306557816016600a6101000a81548160ff0219169083151502179055506130dc565b600381141561308d57816016600b6101000a81548160ff0219169083151502179055506130db565b60048114156130b557816016600c6101000a81548160ff0219169083151502179055506130da565b60058114156130d957816016600d6101000a81548160ff0219169083151502179055505b5b5b5b5b7f8853ef8e1c7913dea7500747de8fa6539e078a7abf467ffa81bd0b4b6b1b7685818360405161310e9291906152a7565b60405180910390a15050565b613122613144565b80601d8190555050565b613134613144565b8060138190555050565b60105481565b61314c613b8e565b73ffffffffffffffffffffffffffffffffffffffff1661316a61216f565b73ffffffffffffffffffffffffffffffffffffffff16146131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b7906150f5565b60405180910390fd5b565b6000816131cd61337c565b111580156131dc575060015482105b801561321a575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600061322c82612040565b90508073ffffffffffffffffffffffffffffffffffffffff1661324d61347a565b73ffffffffffffffffffffffffffffffffffffffff16146132b0576132798161327461347a565b612ed0565b6132af576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000826133728584613b96565b1490509392505050565b60006001905090565b6000808290508061339461337c565b1161341c5760015481101561341b5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415613419575b600081141561340f5760056000836001900393508381526020019081526020016000205490506133e4565b809250505061344e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86134e3868684613c0b565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b613540838383604051806020016040528060008152506128dc565b505050565b613550816000613c14565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61361f614227565b61363061362b83613385565b613e68565b9050919050565b600081600d546136479190615441565b9050919050565b613668828260405180602001604052806000815250613f1e565b5050565b61367461347a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136d9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006136e661347a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661379361347a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516137d89190614edd565b60405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261380a61347a565b8786866040518563ffffffff1660e01b815260040161382c9493929190614e91565b602060405180830381600087803b15801561384657600080fd5b505af192505050801561387757506040513d601f19601f8201168201806040525081019061387491906147de565b60015b6138f1573d80600081146138a7576040519150601f19603f3d011682016040523d82523d6000602084013e6138ac565b606091505b506000815114156138e9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060188054613953906155b2565b80601f016020809104026020016040519081016040528092919081815260200182805461397f906155b2565b80156139cc5780601f106139a1576101008083540402835291602001916139cc565b820191906000526020600020905b8154815290600101906020018083116139af57829003601f168201915b5050505050905090565b60606000821415613a1e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b32565b600082905060005b60008214613a50578080613a3990615615565b915050600a82613a499190615410565b9150613a26565b60008167ffffffffffffffff811115613a6c57613a6b61576f565b5b6040519080825280601f01601f191660200182016040528015613a9e5781602001600182028036833780820191505090505b5090505b60008514613b2b57600182613ab7919061549b565b9150600a85613ac69190615682565b6030613ad291906153ba565b60f81b818381518110613ae857613ae7615740565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b249190615410565b9450613aa2565b8093505050505b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60008082905060005b8451811015613c00576000858281518110613bbd57613bbc615740565b5b60200260200101519050808311613bdf57613bd88382613fbc565b9250613bec565b613be98184613fbc565b92505b508080613bf890615615565b915050613b9f565b508091505092915050565b60009392505050565b6000613c1f83613385565b90506000819050600080613c3286613453565b915091508415613c9b57613c4e8184613c4961347a565b613482565b613c9a57613c6383613c5e61347a565b612ed0565b613c99576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b613ca98360008860016134c6565b8015613cb457600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613d5c83613d19856000886134cc565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176134f4565b600560008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415613de4576000600187019050600060056000838152602001908152602001600020541415613de2576001548114613de1578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613e4e83600088600161351f565b600260008154809291906001019190505550505050505050565b613e70614227565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b613f288383613fd3565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613fb75760006001549050600083820390505b613f6960008683806001019450866137e4565b613f9f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613f56578160015414613fb457600080fd5b50505b505050565b600082600052816020526040600020905092915050565b600060015490506000821415614015576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61402260008483856134c6565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506140998361408a60008660006134cc565b61409385614191565b176134f4565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461413a57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506140ff565b506000821415614176576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600181905550505061418c600084838561351f565b505050565b60006001821460e11b9050919050565b8280546141ad906155b2565b90600052602060002090601f0160209004810192826141cf5760008555614216565b82601f106141e857805160ff1916838001178555614216565b82800160010185558215614216579182015b828111156142155782518255916020019190600101906141fa565b5b5090506142239190614276565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b8082111561428f576000816000905550600101614277565b5090565b60006142a66142a1846152f5565b6152d0565b9050828152602081018484840111156142c2576142c16157ad565b5b6142cd848285615570565b509392505050565b60006142e86142e384615326565b6152d0565b905082815260208101848484011115614304576143036157ad565b5b61430f848285615570565b509392505050565b60008135905061432681615c50565b92915050565b60008083601f840112614342576143416157a3565b5b8235905067ffffffffffffffff81111561435f5761435e61579e565b5b60208301915083602082028301111561437b5761437a6157a8565b5b9250929050565b60008135905061439181615c67565b92915050565b6000813590506143a681615c7e565b92915050565b6000813590506143bb81615c95565b92915050565b6000815190506143d081615c95565b92915050565b600082601f8301126143eb576143ea6157a3565b5b81356143fb848260208601614293565b91505092915050565b600082601f830112614419576144186157a3565b5b81356144298482602086016142d5565b91505092915050565b60008135905061444181615cac565b92915050565b60006020828403121561445d5761445c6157b7565b5b600061446b84828501614317565b91505092915050565b6000806040838503121561448b5761448a6157b7565b5b600061449985828601614317565b92505060206144aa85828601614317565b9150509250929050565b6000806000606084860312156144cd576144cc6157b7565b5b60006144db86828701614317565b93505060206144ec86828701614317565b92505060406144fd86828701614432565b9150509250925092565b60008060008060808587031215614521576145206157b7565b5b600061452f87828801614317565b945050602061454087828801614317565b935050604061455187828801614432565b925050606085013567ffffffffffffffff811115614572576145716157b2565b5b61457e878288016143d6565b91505092959194509250565b600080604083850312156145a1576145a06157b7565b5b60006145af85828601614317565b92505060206145c085828601614382565b9150509250929050565b600080604083850312156145e1576145e06157b7565b5b60006145ef85828601614317565b925050602061460085828601614432565b9150509250929050565b60008060208385031215614621576146206157b7565b5b600083013567ffffffffffffffff81111561463f5761463e6157b2565b5b61464b8582860161432c565b92509250509250929050565b6000806000604084860312156146705761466f6157b7565b5b600084013567ffffffffffffffff81111561468e5761468d6157b2565b5b61469a8682870161432c565b935093505060206146ad86828701614317565b9150509250925092565b6000806000604084860312156146d0576146cf6157b7565b5b600084013567ffffffffffffffff8111156146ee576146ed6157b2565b5b6146fa8682870161432c565b9350935050602061470d86828701614432565b9150509250925092565b60006020828403121561472d5761472c6157b7565b5b600061473b84828501614382565b91505092915050565b6000806040838503121561475b5761475a6157b7565b5b600061476985828601614382565b925050602061477a85828601614432565b9150509250929050565b60006020828403121561479a576147996157b7565b5b60006147a884828501614397565b91505092915050565b6000602082840312156147c7576147c66157b7565b5b60006147d5848285016143ac565b91505092915050565b6000602082840312156147f4576147f36157b7565b5b6000614802848285016143c1565b91505092915050565b600060208284031215614821576148206157b7565b5b600082013567ffffffffffffffff81111561483f5761483e6157b2565b5b61484b84828501614404565b91505092915050565b60006020828403121561486a576148696157b7565b5b600061487884828501614432565b91505092915050565b61488a816154cf565b82525050565b614899816154cf565b82525050565b6148b06148ab826154cf565b61565e565b82525050565b6148bf816154e1565b82525050565b6148ce816154e1565b82525050565b6148dd816154ed565b82525050565b60006148ee8261536c565b6148f88185615382565b935061490881856020860161557f565b614911816157bc565b840191505092915050565b600061492782615377565b614931818561539e565b935061494181856020860161557f565b61494a816157bc565b840191505092915050565b600061496082615377565b61496a81856153af565b935061497a81856020860161557f565b80840191505092915050565b60008154614993816155b2565b61499d81866153af565b945060018216600081146149b857600181146149c9576149fc565b60ff198316865281860193506149fc565b6149d285615357565b60005b838110156149f4578154818901526001820191506020810190506149d5565b838801955050505b50505092915050565b6000614a1260298361539e565b9150614a1d826157da565b604082019050919050565b6000614a35600c8361539e565b9150614a4082615829565b602082019050919050565b6000614a5860268361539e565b9150614a6382615852565b604082019050919050565b6000614a7b60178361539e565b9150614a86826158a1565b602082019050919050565b6000614a9e60168361539e565b9150614aa9826158ca565b602082019050919050565b6000614ac1601a8361539e565b9150614acc826158f3565b602082019050919050565b6000614ae460178361539e565b9150614aef8261591c565b602082019050919050565b6000614b07601e8361539e565b9150614b1282615945565b602082019050919050565b6000614b2a60198361539e565b9150614b358261596e565b602082019050919050565b6000614b4d60158361539e565b9150614b5882615997565b602082019050919050565b6000614b70600c8361539e565b9150614b7b826159c0565b602082019050919050565b6000614b9360168361539e565b9150614b9e826159e9565b602082019050919050565b6000614bb660128361539e565b9150614bc182615a12565b602082019050919050565b6000614bd960198361539e565b9150614be482615a3b565b602082019050919050565b6000614bfc60208361539e565b9150614c0782615a64565b602082019050919050565b6000614c1f602f8361539e565b9150614c2a82615a8d565b604082019050919050565b6000614c4260098361539e565b9150614c4d82615adc565b602082019050919050565b6000614c65600083615393565b9150614c7082615b05565b600082019050919050565b6000614c8860168361539e565b9150614c9382615b08565b602082019050919050565b6000614cab600f8361539e565b9150614cb682615b31565b602082019050919050565b6000614cce60188361539e565b9150614cd982615b5a565b602082019050919050565b6000614cf1601f8361539e565b9150614cfc82615b83565b602082019050919050565b6000614d14600e8361539e565b9150614d1f82615bac565b602082019050919050565b6000614d3760068361539e565b9150614d4282615bd5565b602082019050919050565b6000614d5a601e8361539e565b9150614d6582615bfe565b602082019050919050565b6000614d7d60138361539e565b9150614d8882615c27565b602082019050919050565b608082016000820151614da96000850182614881565b506020820151614dbc6020850182614e06565b506040820151614dcf60408501826148b6565b506060820151614de26060850182614de8565b50505050565b614df181615543565b82525050565b614e0081615552565b82525050565b614e0f8161555c565b82525050565b6000614e21828461489f565b60148201915081905092915050565b6000614e3c8286614955565b9150614e488285614955565b9150614e548284614986565b9150819050949350505050565b6000614e6c82614c58565b9150819050919050565b6000602082019050614e8b6000830184614890565b92915050565b6000608082019050614ea66000830187614890565b614eb36020830186614890565b614ec06040830185614df7565b8181036060830152614ed281846148e3565b905095945050505050565b6000602082019050614ef260008301846148c5565b92915050565b6000602082019050614f0d60008301846148d4565b92915050565b60006020820190508181036000830152614f2d818461491c565b905092915050565b60006020820190508181036000830152614f4e81614a05565b9050919050565b60006020820190508181036000830152614f6e81614a28565b9050919050565b60006020820190508181036000830152614f8e81614a4b565b9050919050565b60006020820190508181036000830152614fae81614a6e565b9050919050565b60006020820190508181036000830152614fce81614a91565b9050919050565b60006020820190508181036000830152614fee81614ab4565b9050919050565b6000602082019050818103600083015261500e81614ad7565b9050919050565b6000602082019050818103600083015261502e81614afa565b9050919050565b6000602082019050818103600083015261504e81614b1d565b9050919050565b6000602082019050818103600083015261506e81614b40565b9050919050565b6000602082019050818103600083015261508e81614b63565b9050919050565b600060208201905081810360008301526150ae81614b86565b9050919050565b600060208201905081810360008301526150ce81614ba9565b9050919050565b600060208201905081810360008301526150ee81614bcc565b9050919050565b6000602082019050818103600083015261510e81614bef565b9050919050565b6000602082019050818103600083015261512e81614c12565b9050919050565b6000604082019050818103600083015261514e81614c35565b905061515d60208301846148c5565b92915050565b6000602082019050818103600083015261517c81614c7b565b9050919050565b6000602082019050818103600083015261519c81614c9e565b9050919050565b600060208201905081810360008301526151bc81614cc1565b9050919050565b600060208201905081810360008301526151dc81614ce4565b9050919050565b600060208201905081810360008301526151fc81614d07565b9050919050565b6000604082019050818103600083015261521c81614d2a565b905061522b60208301846148c5565b92915050565b6000602082019050818103600083015261524a81614d4d565b9050919050565b6000602082019050818103600083015261526a81614d70565b9050919050565b60006080820190506152866000830184614d93565b92915050565b60006020820190506152a16000830184614df7565b92915050565b60006040820190506152bc6000830185614df7565b6152c960208301846148c5565b9392505050565b60006152da6152eb565b90506152e682826155e4565b919050565b6000604051905090565b600067ffffffffffffffff8211156153105761530f61576f565b5b615319826157bc565b9050602081019050919050565b600067ffffffffffffffff8211156153415761534061576f565b5b61534a826157bc565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006153c582615552565b91506153d083615552565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615405576154046156b3565b5b828201905092915050565b600061541b82615552565b915061542683615552565b925082615436576154356156e2565b5b828204905092915050565b600061544c82615552565b915061545783615552565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154905761548f6156b3565b5b828202905092915050565b60006154a682615552565b91506154b183615552565b9250828210156154c4576154c36156b3565b5b828203905092915050565b60006154da82615523565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561559d578082015181840152602081019050615582565b838111156155ac576000848401525b50505050565b600060028204905060018216806155ca57607f821691505b602082108114156155de576155dd615711565b5b50919050565b6155ed826157bc565b810181811067ffffffffffffffff8211171561560c5761560b61576f565b5b80604052505050565b600061562082615552565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615653576156526156b3565b5b600182019050919050565b600061566982615670565b9050919050565b600061567b826157cd565b9050919050565b600061568d82615552565b915061569883615552565b9250826156a8576156a76156e2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f63616e206e6f74206d696e742074686973206d616e7920696e206f6e6520747260008201527f616e73616374696f6e0000000000000000000000000000000000000000000000602082015250565b7f41737365742046726f7a656e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f526f756e642068617320656e64656420616c7265616479000000000000000000600082015250565b7f7075626c6963206d696e74206e6f742061637469766500000000000000000000600082015250565b7f43616e7420636c61696d207072697a65207269676874206e6f77000000000000600082015250565b7f4275726e696e67206e6f7420616c6c6f77656420796574000000000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f57686974656c697374206d696e74206e6f742061637469766500000000000000600082015250565b7f656e74657220746f6b656e496420796f75206f776e0000000000000000000000600082015250565b7f636c61696d206661696c65640000000000000000000000000000000000000000600082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f6c696d6974207065722077616c6c657420657863656564656400000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f57686974656c6973740000000000000000000000000000000000000000000000600082015250565b50565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f4e6f7420616c6c6f776564207965740000000000000000000000000000000000600082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6d696e7420697320706175736564000000000000000000000000000000000000600082015250565b7f5075626c69630000000000000000000000000000000000000000000000000000600082015250565b7f596f7520646f6e74206f776e206d6f7265207468616e203120746f6b656e0000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b615c59816154cf565b8114615c6457600080fd5b50565b615c70816154e1565b8114615c7b57600080fd5b50565b615c87816154ed565b8114615c9257600080fd5b50565b615c9e816154f7565b8114615ca957600080fd5b50565b615cb581615552565b8114615cc057600080fd5b5056fea2646970667358221220abe08b15e04f003b1e52d0e50701b0c09bc09e0cafe525f8e2902a548d8a343664736f6c63430008070033

Deployed Bytecode Sourcemap

64385:12041:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65301:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22097:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74959:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65478:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65519:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22999:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29514:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66108:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67937:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71259:544;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65672:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65085:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64810:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18750:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75793:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33221:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74634:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66219:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65836;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64740:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65436:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73395:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65588:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65799:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65229:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73923:160;;;;;;;;;;;;;:::i;:::-;;68623:280;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70901:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73178:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74514:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65401:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64517:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65916:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74863:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73286:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65369:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24392:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19934:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2845:103;;;;;;;;;;;;;:::i;:::-;;74183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74091:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65633:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64911:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2197:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74294:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65729:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76323:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73747:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64851:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65159:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23175:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75953:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66255:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68911:525;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74397:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74748:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68245:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69446:747;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66178:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65551:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76113:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36917:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70201:541;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72635:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73011:159;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65034:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71814:811;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64615:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73626:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72769:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75698:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65764:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75149:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65872:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30537:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3103:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75046:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75286:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72889:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76223:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64956:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65301:26;;;;:::o;22097:639::-;22182:4;22521:10;22506:25;;:11;:25;;;;:102;;;;22598:10;22583:25;;:11;:25;;;;22506:102;:179;;;;22675:10;22660:25;;:11;:25;;;;22506:179;22486:199;;22097:639;;;:::o;74959:79::-;2083:13;:11;:13::i;:::-;75024:6:::1;75015;;:15;;;;;;;;;;;;;;;;;;74959:79:::0;:::o;65478:34::-;;;;;;;;;;;;;:::o;65519:25::-;;;;;;;;;;;;;:::o;22999:100::-;23053:13;23086:5;23079:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22999:100;:::o;29514:218::-;29590:7;29615:16;29623:7;29615;:16::i;:::-;29610:64;;29640:34;;;;;;;;;;;;;;29610:64;29694:15;:24;29710:7;29694:24;;;;;;;;;;;:30;;;;;;;;;;;;29687:37;;29514:218;;;:::o;66108:61::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67937:300::-;68013:6;;;;;;;;;;;68010:210;;;68061:10;;68053:7;:18;68045:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;68105:25;68119:2;68122:7;68105:13;:25::i;:::-;68010:210;;;68181:25;68195:2;68198:7;68181:13;:25::i;:::-;68010:210;67937:300;;:::o;71259:544::-;55752:1;55900:7;;:19;;55892:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55752:1;55966:7;:18;;;;71358:8:::1;;71368:15;;71384:8;67495:139;67532:8;;67495:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67559:4;67609:8;67592:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;67582:37;;;;;;67495:18;:139::i;:::-;67473:219;;;;;;;;;;;;:::i;:::-;;;;;;;;;71413:12:::2;;;;;;;;;;;71405:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;71475:10;;;;;;;;;;;71474:11;71466:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;71524:7;71545:10;71537:24;;71569:10;;71537:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71523:61;;;71606:4;71595:10;;:15;;;;;;;;;;;;;;;;;;71630:5;71621:8;;:14;;;;;;;;;;;;;;;;;;71655:5;71646:8;;:14;;;;;;;;;;;;;;;;;;71682:5;71671:10;;:16;;;;;;;;;;;;;;;;;;71708:5;71698:9;;:15;;;;;;;;;;;;;;;;;;71734:5;71724:9;;:15;;;;;;;;;;;;;;;;;;71750:6;;:8;;;;;;;;;:::i;:::-;;;;;;71777:2;71769:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;71394:409;55997:1:::1;;;;55708::::0;56009:7;:22;;;;71259:544;;;:::o;65672:30::-;;;;;;;;;;;;;:::o;65085:43::-;;;;:::o;64810:33::-;;;;:::o;18750:323::-;18811:7;19039:15;:13;:15::i;:::-;19024:12;;19008:13;;:28;:46;19001:53;;18750:323;:::o;75793:152::-;2083:13;:11;:13::i;:::-;75877:6:::1;75859:15;;:24;;;;;;;;;;;;;;;;;;75899:38;75921:15;;;;;;;;;;;75899:38;;;;;;:::i;:::-;;;;;;;;75793:152:::0;:::o;33221:2817::-;33355:27;33385;33404:7;33385:18;:27::i;:::-;33355:57;;33470:4;33429:45;;33445:19;33429:45;;;33425:86;;33483:28;;;;;;;;;;;;;;33425:86;33525:27;33554:23;33581:35;33608:7;33581:26;:35::i;:::-;33524:92;;;;33716:68;33741:15;33758:4;33764:19;:17;:19::i;:::-;33716:24;:68::i;:::-;33711:180;;33804:43;33821:4;33827:19;:17;:19::i;:::-;33804:16;:43::i;:::-;33799:92;;33856:35;;;;;;;;;;;;;;33799:92;33711:180;33922:1;33908:16;;:2;:16;;;33904:52;;;33933:23;;;;;;;;;;;;;;33904:52;33969:43;33991:4;33997:2;34001:7;34010:1;33969:21;:43::i;:::-;34105:15;34102:160;;;34245:1;34224:19;34217:30;34102:160;34642:18;:24;34661:4;34642:24;;;;;;;;;;;;;;;;34640:26;;;;;;;;;;;;34711:18;:22;34730:2;34711:22;;;;;;;;;;;;;;;;34709:24;;;;;;;;;;;35033:146;35070:2;35119:45;35134:4;35140:2;35144:19;35119:14;:45::i;:::-;15149:8;35091:73;35033:18;:146::i;:::-;35004:17;:26;35022:7;35004:26;;;;;;;;;;;:175;;;;35350:1;15149:8;35299:19;:47;:52;35295:627;;;35372:19;35404:1;35394:7;:11;35372:33;;35561:1;35527:17;:30;35545:11;35527:30;;;;;;;;;;;;:35;35523:384;;;35665:13;;35650:11;:28;35646:242;;35845:19;35812:17;:30;35830:11;35812:30;;;;;;;;;;;:52;;;;35646:242;35523:384;35353:569;35295:627;35969:7;35965:2;35950:27;;35959:4;35950:27;;;;;;;;;;;;35988:42;36009:4;36015:2;36019:7;36028:1;35988:20;:42::i;:::-;33344:2694;;;33221:2817;;;:::o;74634:102::-;2083:13;:11;:13::i;:::-;74727:1:::1;74705:19;:23;;;;74634:102:::0;:::o;66219:29::-;;;;:::o;65836:::-;;;;;;;;;;;;;:::o;64740:36::-;;;;:::o;65436:35::-;;;;;;;;;;;;;:::o;73395:100::-;2083:13;:11;:13::i;:::-;73484:3:::1;73467:14;:20;;;;;;;;;;;;:::i;:::-;;73395:100:::0;:::o;65588:36::-;;;;;;;;;;;;;:::o;65799:30::-;;;;;;;;;;;;;:::o;65229:32::-;;;;:::o;73923:160::-;2083:13;:11;:13::i;:::-;55752:1:::1;55900:7;;:19;;55892:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55752:1;55966:7;:18;;;;73985:7:::2;74006;:5;:7::i;:::-;73998:21;;74027;73998:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73984:69;;;74072:2;74064:11;;;::::0;::::2;;73973:110;55708:1:::1;56009:7;:22;;;;73923:160::o:0;68623:280::-;68765:10;;68756:7;:19;68753:91;;68810:6;;;;;;;;;;;68809:7;68801:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;68753:91;68854:41;68877:4;68883:2;68887:7;68854:22;:41::i;:::-;68623:280;;;:::o;70901:350::-;70993:16;;;;;;;;;;;70985:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;71073:10;71055:28;;:16;71063:7;71055;:16::i;:::-;:28;;;71047:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71149:1;71127:21;71137:10;71127:9;:21::i;:::-;:23;71119:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;71195:14;71201:7;71195:5;:14::i;:::-;71232:10;71225:18;;;;;;;;;;;;70901:350;:::o;73178:100::-;73224:7;73251:19;;73244:26;;73178:100;:::o;74514:112::-;2083:13;:11;:13::i;:::-;74609:9:::1;74589:17;:29;;;;74514:112:::0;:::o;65401:28::-;;;;;;;;;;;;;:::o;64517:38::-;;;;:::o;65916:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74863:84::-;2083:13;:11;:13::i;:::-;74933:6:::1;74924;;:15;;;;;;;;;;;;;;;;;;74863:84:::0;:::o;73286:101::-;2083:13;:11;:13::i;:::-;73372:7:::1;73357:12;:22;;;;;;;;;;;;:::i;:::-;;73286:101:::0;:::o;65369:25::-;;;;;;;;;;;;;:::o;24392:152::-;24464:7;24507:27;24526:7;24507:18;:27::i;:::-;24484:52;;24392:152;;;:::o;19934:233::-;20006:7;20047:1;20030:19;;:5;:19;;;20026:60;;;20058:28;;;;;;;;;;;;;;20026:60;14093:13;20104:18;:25;20123:5;20104:25;;;;;;;;;;;;;;;;:55;20097:62;;19934:233;;;:::o;2845:103::-;2083:13;:11;:13::i;:::-;2910:30:::1;2937:1;2910:18;:30::i;:::-;2845:103::o:0;74183:::-;2083:13;:11;:13::i;:::-;74272:6:::1;74253:16;;:25;;;;;;;;;;;;;;;;;;74183:103:::0;:::o;74091:84::-;2083:13;:11;:13::i;:::-;74166:1:::1;74153:10;:14;;;;74091:84:::0;:::o;65633:32::-;;;;;;;;;;;;;:::o;64911:36::-;;;;:::o;2197:87::-;2243:7;2270:6;;;;;;;;;;;2263:13;;2197:87;:::o;74294:95::-;2083:13;:11;:13::i;:::-;74375:6:::1;74360:12;;:21;;;;;;;;;;;;;;;;;;74294:95:::0;:::o;65729:28::-;;;;;;;;;;;;;:::o;76323:92::-;2083:13;:11;:13::i;:::-;76402:3:::1;76388:11;:17;;;;76323:92:::0;:::o;73747:168::-;73840:21;;:::i;:::-;73886;73899:7;73886:12;:21::i;:::-;73879:28;;73747:168;;;:::o;64851:38::-;;;;:::o;65159:32::-;;;;:::o;23175:104::-;23231:13;23264:7;23257:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23175:104;:::o;75953:152::-;2083:13;:11;:13::i;:::-;76039:6:::1;76022:14;;:23;;;;;;;;;;;;;;;;;;76061:34;76080:14;;;;;;;;;;;76061:34;;;;;;:::i;:::-;;;;;;;;75953:152:::0;:::o;66255:30::-;;;;:::o;68911:525::-;68978:6;;;;;;;;;;;68977:7;68969:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;69022:14;;;;;;;;;;;69014:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;69123:20;;69111:8;69095:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;69073:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;69220:19;;69208:8;:31;;69200:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;69297:20;69308:8;69297:10;:20::i;:::-;69285:9;:32;;69277:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;69354:31;69364:10;69376:8;69354:9;:31::i;:::-;69401:27;69414:13;:11;:13::i;:::-;69401:27;;;;;;:::i;:::-;;;;;;;;68911:525;:::o;74397:107::-;2083:13;:11;:13::i;:::-;74495:1:::1;74470:22;:26;;;;74397:107:::0;:::o;74748:104::-;2083:13;:11;:13::i;:::-;74835:9:::1;74821:11;:23;;;;74748:104:::0;:::o;68245:372::-;68335:6;;;;;;;;;;;68332:223;;;68371:6;68367:177;68382:8;:15;;;;68380:1;:17;68367:177;;;68451:10;68438:23;;:8;68447:1;68438:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:23;;;68435:94;;;68503:7;;;68435:94;68398:3;;;;;:::i;:::-;;;;68367:177;;;;68332:223;68567:42;68591:8;68600;68567:23;:42::i;:::-;68245:372;;;:::o;69446:747::-;69579:11;;69592:19;;67149:144;67186:11;;67149:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67216:4;67266:10;67249:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;67239:39;;;;;;67149:18;:144::i;:::-;67127:224;;;;;;;;;;;;:::i;:::-;;;;;;;;;69639:13:::1;;69654:8;67848:9;67830:14;67822:5;:22;;;;:::i;:::-;:35;67800:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;69689:6:::2;;;;;;;;;;;69688:7;69680:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;69733:15;;;;;;;;;;;69725:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;69788:14;69805:13;:11;:13::i;:::-;69788:30;;69858:9;;69846:8;69837:6;:17;;;;:::i;:::-;:30;;69829:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;69952:17;;69940:8;69913:24;69926:10;69913:12;:24::i;:::-;:35;;;;:::i;:::-;:56;;69905:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;70030:22;;70018:8;:34;;70010:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;70109:31;70119:10;70131:8;70109:9;:31::i;:::-;70156:27;70169:13;:11;:13::i;:::-;70156:27;;;;;;:::i;:::-;;;;;;;;69669:524;67362:1:::1;;69446:747:::0;;;;;;:::o;66178:34::-;;;;:::o;65551:30::-;;;;;;;;;;;;;:::o;76113:102::-;2083:13;:11;:13::i;:::-;76204:3:::1;76181:20;:26;;;;76113:102:::0;:::o;36917:399::-;37084:31;37097:4;37103:2;37107:7;37084:12;:31::i;:::-;37148:1;37130:2;:14;;;:19;37126:183;;37169:56;37200:4;37206:2;37210:7;37219:5;37169:30;:56::i;:::-;37164:145;;37253:40;;;;;;;;;;;;;;37164:145;37126:183;36917:399;;;;:::o;70201:541::-;70312:11;;70325:14;;67149:144;67186:11;;67149:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67216:4;67266:10;67249:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;67239:39;;;;;;67149:18;:144::i;:::-;67127:224;;;;;;;;;;;;:::i;:::-;;;;;;;;;70367:13:::1;;70382:6;;67848:9;67830:14;67822:5;:22;;;;:::i;:::-;:35;67800:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;70415:6:::2;;;;;;;;;;;70414:7;70406:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;70451:14;70468:13;:11;:13::i;:::-;70451:30;;70519:11;;70509:6;;70500;:15;;;;:::i;:::-;:30;;70492:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;70613:6;;70603;;70576:24;70589:10;70576:12;:24::i;:::-;:33;;;;:::i;:::-;:43;;70568:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;70660:29;70670:10;70682:6;;70660:9;:29::i;:::-;70705:27;70718:13;:11;:13::i;:::-;70705:27;;;;;;:::i;:::-;;;;;;;;70395:347;67362:1:::1;;70201:541:::0;;;;;:::o;72635:122::-;2083:13;:11;:13::i;:::-;72739:10:::1;72717:19;:32;;;;72635:122:::0;:::o;73011:159::-;73075:7;2083:13;:11;:13::i;:::-;73097:11:::1;73109:13;:11;:13::i;:::-;73097:25;;73141:21;73133:29;;;73011:159:::0;:::o;65034:25::-;;;;:::o;71814:811::-;71932:13;71985:16;71993:7;71985;:16::i;:::-;71963:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;72105:5;72093:17;;:8;;;;;;;;;;;:17;;;72089:71;;;72134:14;72127:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72089:71;72187:4;72175:16;;:10;;;;;;;;;;;:16;;;72172:78;;;72224:14;72217:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72172:78;72262:28;72293:10;:8;:10::i;:::-;72262:41;;72365:1;72340:14;72334:28;:32;:283;;;;;;;;;;;;;;;;;72458:14;72499:18;:7;:16;:18::i;:::-;72544:9;72415:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72334:283;72314:303;;;71814:811;;;;:::o;64615:41::-;;;;:::o;73626:113::-;73684:7;73711:20;73725:5;73711:13;:20::i;:::-;73704:27;;73626:113;;;:::o;72769:112::-;2083:13;:11;:13::i;:::-;72863:10:::1;72846:14;:27;;;;72769:112:::0;:::o;75698:87::-;2083:13;:11;:13::i;:::-;75771:6:::1;75760:8;;:17;;;;;;;;;;;;;;;;;;75698:87:::0;:::o;65764:28::-;;;;;;;;;;;;;:::o;75149:129::-;2083:13;:11;:13::i;:::-;75226:6:::1;75213:10;;:19;;;;;;;;;;;;;;;;;;75248:22;75259:10;;;;;;;;;;;75248:22;;;;;;:::i;:::-;;;;;;;;75149:129:::0;:::o;65872:29::-;;;;;;;;;;;;;:::o;30537:164::-;30634:4;30658:18;:25;30677:5;30658:25;;;;;;;;;;;;;;;:35;30684:8;30658:35;;;;;;;;;;;;;;;;;;;;;;;;;30651:42;;30537:164;;;;:::o;3103:201::-;2083:13;:11;:13::i;:::-;3212:1:::1;3192:22;;:8;:22;;;;3184:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3268:28;3287:8;3268:18;:28::i;:::-;3103:201:::0;:::o;75046:91::-;2083:13;:11;:13::i;:::-;75123:6:::1;75110:10;;:19;;;;;;;;;;;;;;;;;;75046:91:::0;:::o;75286:404::-;2083:13;:11;:13::i;:::-;75382:1:::1;75372:8;:11;75369:268;;;75403:6;75394:8;;:15;;;;;;;;;;;;;;;;;;75369:268;;;75438:1;75428:8;:11;75425:212;;;75459:6;75450:8;;:15;;;;;;;;;;;;;;;;;;75425:212;;;75494:1;75484:8;:11;75481:156;;;75517:6;75506:10;;:17;;;;;;;;;;;;;;;;;;75481:156;;;75552:1;75542:8;:11;75539:98;;;75574:6;75564:9;;:16;;;;;;;;;;;;;;;;;;75539:98;;;75609:1;75599:8;:11;75596:41;;;75631:6;75621:9;;:16;;;;;;;;;;;;;;;;;;75596:41;75539:98;75481:156;75425:212;75369:268;75655:27;75666:8;75675:6;75655:27;;;;;;;:::i;:::-;;;;;;;;75286:404:::0;;:::o;72889:114::-;2083:13;:11;:13::i;:::-;72985:10:::1;72967:15;:28;;;;72889:114:::0;:::o;76223:88::-;2083:13;:11;:13::i;:::-;76298:3:::1;76286:9;:15;;;;76223:88:::0;:::o;64956:29::-;;;;:::o;2362:132::-;2437:12;:10;:12::i;:::-;2426:23;;:7;:5;:7::i;:::-;:23;;;2418:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2362:132::o;30959:282::-;31024:4;31080:7;31061:15;:13;:15::i;:::-;:26;;:66;;;;;31114:13;;31104:7;:23;31061:66;:153;;;;;31213:1;14869:8;31165:17;:26;31183:7;31165:26;;;;;;;;;;;;:44;:49;31061:153;31041:173;;30959:282;;;:::o;28923:432::-;29004:13;29020:16;29028:7;29020;:16::i;:::-;29004:32;;29078:5;29055:28;;:19;:17;:19::i;:::-;:28;;;29051:187;;29107:44;29124:5;29131:19;:17;:19::i;:::-;29107:16;:44::i;:::-;29102:136;;29183:35;;;;;;;;;;;;;;29102:136;29051:187;29287:2;29254:15;:24;29270:7;29254:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;29329:7;29325:2;29309:28;;29318:5;29309:28;;;;;;;;;;;;28993:362;28923:432;;:::o;54609:190::-;54734:4;54787;54758:25;54771:5;54778:4;54758:12;:25::i;:::-;:33;54751:40;;54609:190;;;;;:::o;18266:92::-;18322:7;18349:1;18342:8;;18266:92;:::o;25547:1275::-;25614:7;25634:12;25649:7;25634:22;;25717:4;25698:15;:13;:15::i;:::-;:23;25694:1061;;25751:13;;25744:4;:20;25740:1015;;;25789:14;25806:17;:23;25824:4;25806:23;;;;;;;;;;;;25789:40;;25923:1;14869:8;25895:6;:24;:29;25891:845;;;26560:113;26577:1;26567:6;:11;26560:113;;;26620:17;:25;26638:6;;;;;;;26620:25;;;;;;;;;;;;26611:34;;26560:113;;;26706:6;26699:13;;;;;;25891:845;25766:989;25740:1015;25694:1061;26783:31;;;;;;;;;;;;;;25547:1275;;;;:::o;32122:479::-;32224:27;32253:23;32294:38;32335:15;:24;32351:7;32335:24;;;;;;;;;;;32294:65;;32506:18;32483:41;;32563:19;32557:26;32538:45;;32468:126;32122:479;;;:::o;52724:105::-;52784:7;52811:10;52804:17;;52724:105;:::o;31350:659::-;31499:11;31664:16;31657:5;31653:28;31644:37;;31824:16;31813:9;31809:32;31796:45;;31974:15;31963:9;31960:30;31952:5;31941:9;31938:20;31935:56;31925:66;;31350:659;;;;;:::o;37978:159::-;;;;;:::o;52033:311::-;52168:7;52188:16;15273:3;52214:19;:41;;52188:68;;15273:3;52282:31;52293:4;52299:2;52303:9;52282:10;:31::i;:::-;52274:40;;:62;;52267:69;;;52033:311;;;;;:::o;27370:450::-;27450:14;27618:16;27611:5;27607:28;27598:37;;27795:5;27781:11;27756:23;27752:41;27749:52;27742:5;27739:63;27729:73;;27370:450;;;;:::o;38802:158::-;;;;;:::o;36134:185::-;36272:39;36289:4;36295:2;36299:7;36272:39;;;;;;;;;;;;:16;:39::i;:::-;36134:185;;;:::o;46936:88::-;46995:21;47001:7;47010:5;46995;:21::i;:::-;46936:88;:::o;3464:191::-;3538:16;3557:6;;;;;;;;;;;3538:25;;3583:8;3574:6;;:17;;;;;;;;;;;;;;;;;;3638:8;3607:40;;3628:8;3607:40;;;;;;;;;;;;3527:128;3464:191;:::o;24733:166::-;24803:21;;:::i;:::-;24844:47;24863:27;24882:7;24863:18;:27::i;:::-;24844:18;:47::i;:::-;24837:54;;24733:166;;;:::o;70750:143::-;70839:7;70876:9;70871:4;;:14;;;;:::i;:::-;70864:21;;70750:143;;;:::o;46557:112::-;46634:27;46644:2;46648:8;46634:27;;;;;;;;;;;;:9;:27::i;:::-;46557:112;;:::o;30072:308::-;30183:19;:17;:19::i;:::-;30171:31;;:8;:31;;;30167:61;;;30211:17;;;;;;;;;;;;;;30167:61;30293:8;30241:18;:39;30260:19;:17;:19::i;:::-;30241:39;;;;;;;;;;;;;;;:49;30281:8;30241:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;30353:8;30317:55;;30332:19;:17;:19::i;:::-;30317:55;;;30363:8;30317:55;;;;;;:::i;:::-;;;;;;;;30072:308;;:::o;39400:716::-;39563:4;39609:2;39584:45;;;39630:19;:17;:19::i;:::-;39651:4;39657:7;39666:5;39584:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39580:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39884:1;39867:6;:13;:18;39863:235;;;39913:40;;;;;;;;;;;;;;39863:235;40056:6;40050:13;40041:6;40037:2;40033:15;40026:38;39580:529;39753:54;;;39743:64;;;:6;:64;;;;39736:71;;;39400:716;;;;;;:::o;73503:113::-;73563:13;73596:12;73589:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73503:113;:::o;63005:532::-;63061:13;63100:1;63091:5;:10;63087:53;;;63118:10;;;;;;;;;;;;;;;;;;;;;63087:53;63150:12;63165:5;63150:20;;63181:14;63206:78;63221:1;63213:4;:9;63206:78;;63239:8;;;;;:::i;:::-;;;;63270:2;63262:10;;;;;:::i;:::-;;;63206:78;;;63294:19;63326:6;63316:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63294:39;;63344:154;63360:1;63351:5;:10;63344:154;;63388:1;63378:11;;;;;:::i;:::-;;;63455:2;63447:5;:10;;;;:::i;:::-;63434:2;:24;;;;:::i;:::-;63421:39;;63404:6;63411;63404:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;63484:2;63475:11;;;;;:::i;:::-;;;63344:154;;;63522:6;63508:21;;;;;63005:532;;;;:::o;20249:178::-;20310:7;14093:13;14231:2;20338:18;:25;20357:5;20338:25;;;;;;;;;;;;;;;;:50;;20337:82;20330:89;;20249:178;;;:::o;748:98::-;801:7;828:10;821:17;;748:98;:::o;54807:549::-;54917:7;54942:20;54965:4;54942:27;;54985:9;54980:339;55004:5;:12;55000:1;:16;54980:339;;;55038:20;55061:5;55067:1;55061:8;;;;;;;;:::i;:::-;;;;;;;;55038:31;;55104:12;55088;:28;55084:224;;55152:42;55167:12;55181;55152:14;:42::i;:::-;55137:57;;55084:224;;;55250:42;55265:12;55279;55250:14;:42::i;:::-;55235:57;;55084:224;55023:296;55018:3;;;;;:::i;:::-;;;;54980:339;;;;55336:12;55329:19;;;54807:549;;;;:::o;51734:147::-;51871:6;51734:147;;;;;:::o;47253:3081::-;47333:27;47363;47382:7;47363:18;:27::i;:::-;47333:57;;47403:12;47434:19;47403:52;;47469:27;47498:23;47525:35;47552:7;47525:26;:35::i;:::-;47468:92;;;;47577:13;47573:316;;;47698:68;47723:15;47740:4;47746:19;:17;:19::i;:::-;47698:24;:68::i;:::-;47693:184;;47790:43;47807:4;47813:19;:17;:19::i;:::-;47790:16;:43::i;:::-;47785:92;;47842:35;;;;;;;;;;;;;;47785:92;47693:184;47573:316;47901:51;47923:4;47937:1;47941:7;47950:1;47901:21;:51::i;:::-;48045:15;48042:160;;;48185:1;48164:19;48157:30;48042:160;48863:1;14358:3;48833:1;:26;;48832:32;48804:18;:24;48823:4;48804:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;49131:176;49168:4;49239:53;49254:4;49268:1;49272:19;49239:14;:53::i;:::-;15149:8;14869;49192:43;49191:101;49131:18;:176::i;:::-;49102:17;:26;49120:7;49102:26;;;;;;;;;;;:205;;;;49478:1;15149:8;49427:19;:47;:52;49423:627;;;49500:19;49532:1;49522:7;:11;49500:33;;49689:1;49655:17;:30;49673:11;49655:30;;;;;;;;;;;;:35;49651:384;;;49793:13;;49778:11;:28;49774:242;;49973:19;49940:17;:30;49958:11;49940:30;;;;;;;;;;;:52;;;;49774:242;49651:384;49481:569;49423:627;50105:7;50101:1;50078:35;;50087:4;50078:35;;;;;;;;;;;;50124:50;50145:4;50159:1;50163:7;50172:1;50124:20;:50::i;:::-;50301:12;;:14;;;;;;;;;;;;;47322:3012;;;;47253:3081;;:::o;26921:366::-;26987:31;;:::i;:::-;27064:6;27031:9;:14;;:41;;;;;;;;;;;14752:3;27117:6;:33;;27083:9;:24;;:68;;;;;;;;;;;27209:1;14869:8;27181:6;:24;:29;;27162:9;:16;;:48;;;;;;;;;;;15273:3;27250:6;:28;;27221:9;:19;;:58;;;;;;;;;;;26921:366;;;:::o;45784:689::-;45915:19;45921:2;45925:8;45915:5;:19::i;:::-;45994:1;45976:2;:14;;;:19;45972:483;;46016:11;46030:13;;46016:27;;46062:13;46084:8;46078:3;:14;46062:30;;46111:233;46142:62;46181:1;46185:2;46189:7;;;;;;46198:5;46142:30;:62::i;:::-;46137:167;;46240:40;;;;;;;;;;;;;;46137:167;46339:3;46331:5;:11;46111:233;;46426:3;46409:13;;:20;46405:34;;46431:8;;;46405:34;45997:458;;45972:483;45784:689;;;:::o;55364:256::-;55459:13;55527:1;55521:4;55514:15;55556:1;55550:4;55543:15;55597:4;55591;55581:21;55572:30;;55364:256;;;;:::o;40578:2454::-;40651:20;40674:13;;40651:36;;40714:1;40702:8;:13;40698:44;;;40724:18;;;;;;;;;;;;;;40698:44;40755:61;40785:1;40789:2;40793:12;40807:8;40755:21;:61::i;:::-;41299:1;14231:2;41269:1;:26;;41268:32;41256:8;:45;41230:18;:22;41249:2;41230:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;41578:139;41615:2;41669:33;41692:1;41696:2;41700:1;41669:14;:33::i;:::-;41636:30;41657:8;41636:20;:30::i;:::-;:66;41578:18;:139::i;:::-;41544:17;:31;41562:12;41544:31;;;;;;;;;;;:173;;;;41734:16;41765:11;41794:8;41779:12;:23;41765:37;;42049:16;42045:2;42041:25;42029:37;;42421:12;42381:8;42340:1;42278:25;42219:1;42158;42131:335;42546:1;42532:12;42528:20;42486:346;42587:3;42578:7;42575:16;42486:346;;42805:7;42795:8;42792:1;42765:25;42762:1;42759;42754:59;42640:1;42631:7;42627:15;42616:26;;42486:346;;;42490:77;42877:1;42865:8;:13;42861:45;;;42887:19;;;;;;;;;;;;;;42861:45;42939:3;42923:13;:19;;;;41004:1950;;42964:60;42993:1;42997:2;43001:12;43015:8;42964:20;:60::i;:::-;40640:2392;40578:2454;;:::o;27922:324::-;27992:14;28225:1;28215:8;28212:15;28186:24;28182:46;28172:56;;27922:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:559::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6653:1;6642:9;6638:17;6625:31;6683:18;6675:6;6672:30;6669:117;;;6705:79;;:::i;:::-;6669:117;6818:80;6890:7;6881:6;6870:9;6866:22;6818:80;:::i;:::-;6800:98;;;;6596:312;6356:559;;;;;:::o;6921:704::-;7016:6;7024;7032;7081:2;7069:9;7060:7;7056:23;7052:32;7049:119;;;7087:79;;:::i;:::-;7049:119;7235:1;7224:9;7220:17;7207:31;7265:18;7257:6;7254:30;7251:117;;;7287:79;;:::i;:::-;7251:117;7400:80;7472:7;7463:6;7452:9;7448:22;7400:80;:::i;:::-;7382:98;;;;7178:312;7529:2;7555:53;7600:7;7591:6;7580:9;7576:22;7555:53;:::i;:::-;7545:63;;7500:118;6921:704;;;;;:::o;7631:::-;7726:6;7734;7742;7791:2;7779:9;7770:7;7766:23;7762:32;7759:119;;;7797:79;;:::i;:::-;7759:119;7945:1;7934:9;7930:17;7917:31;7975:18;7967:6;7964:30;7961:117;;;7997:79;;:::i;:::-;7961:117;8110:80;8182:7;8173:6;8162:9;8158:22;8110:80;:::i;:::-;8092:98;;;;7888:312;8239:2;8265:53;8310:7;8301:6;8290:9;8286:22;8265:53;:::i;:::-;8255:63;;8210:118;7631:704;;;;;:::o;8341:323::-;8397:6;8446:2;8434:9;8425:7;8421:23;8417:32;8414:119;;;8452:79;;:::i;:::-;8414:119;8572:1;8597:50;8639:7;8630:6;8619:9;8615:22;8597:50;:::i;:::-;8587:60;;8543:114;8341:323;;;;:::o;8670:468::-;8735:6;8743;8792:2;8780:9;8771:7;8767:23;8763:32;8760:119;;;8798:79;;:::i;:::-;8760:119;8918:1;8943:50;8985:7;8976:6;8965:9;8961:22;8943:50;:::i;:::-;8933:60;;8889:114;9042:2;9068:53;9113:7;9104:6;9093:9;9089:22;9068:53;:::i;:::-;9058:63;;9013:118;8670:468;;;;;:::o;9144:329::-;9203:6;9252:2;9240:9;9231:7;9227:23;9223:32;9220:119;;;9258:79;;:::i;:::-;9220:119;9378:1;9403:53;9448:7;9439:6;9428:9;9424:22;9403:53;:::i;:::-;9393:63;;9349:117;9144:329;;;;:::o;9479:327::-;9537:6;9586:2;9574:9;9565:7;9561:23;9557:32;9554:119;;;9592:79;;:::i;:::-;9554:119;9712:1;9737:52;9781:7;9772:6;9761:9;9757:22;9737:52;:::i;:::-;9727:62;;9683:116;9479:327;;;;:::o;9812:349::-;9881:6;9930:2;9918:9;9909:7;9905:23;9901:32;9898:119;;;9936:79;;:::i;:::-;9898:119;10056:1;10081:63;10136:7;10127:6;10116:9;10112:22;10081:63;:::i;:::-;10071:73;;10027:127;9812:349;;;;:::o;10167:509::-;10236:6;10285:2;10273:9;10264:7;10260:23;10256:32;10253:119;;;10291:79;;:::i;:::-;10253:119;10439:1;10428:9;10424:17;10411:31;10469:18;10461:6;10458:30;10455:117;;;10491:79;;:::i;:::-;10455:117;10596:63;10651:7;10642:6;10631:9;10627:22;10596:63;:::i;:::-;10586:73;;10382:287;10167:509;;;;:::o;10682:329::-;10741:6;10790:2;10778:9;10769:7;10765:23;10761:32;10758:119;;;10796:79;;:::i;:::-;10758:119;10916:1;10941:53;10986:7;10977:6;10966:9;10962:22;10941:53;:::i;:::-;10931:63;;10887:117;10682:329;;;;:::o;11017:108::-;11094:24;11112:5;11094:24;:::i;:::-;11089:3;11082:37;11017:108;;:::o;11131:118::-;11218:24;11236:5;11218:24;:::i;:::-;11213:3;11206:37;11131:118;;:::o;11255:157::-;11360:45;11380:24;11398:5;11380:24;:::i;:::-;11360:45;:::i;:::-;11355:3;11348:58;11255:157;;:::o;11418:99::-;11489:21;11504:5;11489:21;:::i;:::-;11484:3;11477:34;11418:99;;:::o;11523:109::-;11604:21;11619:5;11604:21;:::i;:::-;11599:3;11592:34;11523:109;;:::o;11638:118::-;11725:24;11743:5;11725:24;:::i;:::-;11720:3;11713:37;11638:118;;:::o;11762:360::-;11848:3;11876:38;11908:5;11876:38;:::i;:::-;11930:70;11993:6;11988:3;11930:70;:::i;:::-;11923:77;;12009:52;12054:6;12049:3;12042:4;12035:5;12031:16;12009:52;:::i;:::-;12086:29;12108:6;12086:29;:::i;:::-;12081:3;12077:39;12070:46;;11852:270;11762:360;;;;:::o;12128:364::-;12216:3;12244:39;12277:5;12244:39;:::i;:::-;12299:71;12363:6;12358:3;12299:71;:::i;:::-;12292:78;;12379:52;12424:6;12419:3;12412:4;12405:5;12401:16;12379:52;:::i;:::-;12456:29;12478:6;12456:29;:::i;:::-;12451:3;12447:39;12440:46;;12220:272;12128:364;;;;:::o;12498:377::-;12604:3;12632:39;12665:5;12632:39;:::i;:::-;12687:89;12769:6;12764:3;12687:89;:::i;:::-;12680:96;;12785:52;12830:6;12825:3;12818:4;12811:5;12807:16;12785:52;:::i;:::-;12862:6;12857:3;12853:16;12846:23;;12608:267;12498:377;;;;:::o;12905:845::-;13008:3;13045:5;13039:12;13074:36;13100:9;13074:36;:::i;:::-;13126:89;13208:6;13203:3;13126:89;:::i;:::-;13119:96;;13246:1;13235:9;13231:17;13262:1;13257:137;;;;13408:1;13403:341;;;;13224:520;;13257:137;13341:4;13337:9;13326;13322:25;13317:3;13310:38;13377:6;13372:3;13368:16;13361:23;;13257:137;;13403:341;13470:38;13502:5;13470:38;:::i;:::-;13530:1;13544:154;13558:6;13555:1;13552:13;13544:154;;;13632:7;13626:14;13622:1;13617:3;13613:11;13606:35;13682:1;13673:7;13669:15;13658:26;;13580:4;13577:1;13573:12;13568:17;;13544:154;;;13727:6;13722:3;13718:16;13711:23;;13410:334;;13224:520;;13012:738;;12905:845;;;;:::o;13756:366::-;13898:3;13919:67;13983:2;13978:3;13919:67;:::i;:::-;13912:74;;13995:93;14084:3;13995:93;:::i;:::-;14113:2;14108:3;14104:12;14097:19;;13756:366;;;:::o;14128:::-;14270:3;14291:67;14355:2;14350:3;14291:67;:::i;:::-;14284:74;;14367:93;14456:3;14367:93;:::i;:::-;14485:2;14480:3;14476:12;14469:19;;14128:366;;;:::o;14500:::-;14642:3;14663:67;14727:2;14722:3;14663:67;:::i;:::-;14656:74;;14739:93;14828:3;14739:93;:::i;:::-;14857:2;14852:3;14848:12;14841:19;;14500:366;;;:::o;14872:::-;15014:3;15035:67;15099:2;15094:3;15035:67;:::i;:::-;15028:74;;15111:93;15200:3;15111:93;:::i;:::-;15229:2;15224:3;15220:12;15213:19;;14872:366;;;:::o;15244:::-;15386:3;15407:67;15471:2;15466:3;15407:67;:::i;:::-;15400:74;;15483:93;15572:3;15483:93;:::i;:::-;15601:2;15596:3;15592:12;15585:19;;15244:366;;;:::o;15616:::-;15758:3;15779:67;15843:2;15838:3;15779:67;:::i;:::-;15772:74;;15855:93;15944:3;15855:93;:::i;:::-;15973:2;15968:3;15964:12;15957:19;;15616:366;;;:::o;15988:::-;16130:3;16151:67;16215:2;16210:3;16151:67;:::i;:::-;16144:74;;16227:93;16316:3;16227:93;:::i;:::-;16345:2;16340:3;16336:12;16329:19;;15988:366;;;:::o;16360:::-;16502:3;16523:67;16587:2;16582:3;16523:67;:::i;:::-;16516:74;;16599:93;16688:3;16599:93;:::i;:::-;16717:2;16712:3;16708:12;16701:19;;16360:366;;;:::o;16732:::-;16874:3;16895:67;16959:2;16954:3;16895:67;:::i;:::-;16888:74;;16971:93;17060:3;16971:93;:::i;:::-;17089:2;17084:3;17080:12;17073:19;;16732:366;;;:::o;17104:::-;17246:3;17267:67;17331:2;17326:3;17267:67;:::i;:::-;17260:74;;17343:93;17432:3;17343:93;:::i;:::-;17461:2;17456:3;17452:12;17445:19;;17104:366;;;:::o;17476:::-;17618:3;17639:67;17703:2;17698:3;17639:67;:::i;:::-;17632:74;;17715:93;17804:3;17715:93;:::i;:::-;17833:2;17828:3;17824:12;17817:19;;17476:366;;;:::o;17848:::-;17990:3;18011:67;18075:2;18070:3;18011:67;:::i;:::-;18004:74;;18087:93;18176:3;18087:93;:::i;:::-;18205:2;18200:3;18196:12;18189:19;;17848:366;;;:::o;18220:::-;18362:3;18383:67;18447:2;18442:3;18383:67;:::i;:::-;18376:74;;18459:93;18548:3;18459:93;:::i;:::-;18577:2;18572:3;18568:12;18561:19;;18220:366;;;:::o;18592:::-;18734:3;18755:67;18819:2;18814:3;18755:67;:::i;:::-;18748:74;;18831:93;18920:3;18831:93;:::i;:::-;18949:2;18944:3;18940:12;18933:19;;18592:366;;;:::o;18964:::-;19106:3;19127:67;19191:2;19186:3;19127:67;:::i;:::-;19120:74;;19203:93;19292:3;19203:93;:::i;:::-;19321:2;19316:3;19312:12;19305:19;;18964:366;;;:::o;19336:::-;19478:3;19499:67;19563:2;19558:3;19499:67;:::i;:::-;19492:74;;19575:93;19664:3;19575:93;:::i;:::-;19693:2;19688:3;19684:12;19677:19;;19336:366;;;:::o;19708:365::-;19850:3;19871:66;19935:1;19930:3;19871:66;:::i;:::-;19864:73;;19946:93;20035:3;19946:93;:::i;:::-;20064:2;20059:3;20055:12;20048:19;;19708:365;;;:::o;20079:398::-;20238:3;20259:83;20340:1;20335:3;20259:83;:::i;:::-;20252:90;;20351:93;20440:3;20351:93;:::i;:::-;20469:1;20464:3;20460:11;20453:18;;20079:398;;;:::o;20483:366::-;20625:3;20646:67;20710:2;20705:3;20646:67;:::i;:::-;20639:74;;20722:93;20811:3;20722:93;:::i;:::-;20840:2;20835:3;20831:12;20824:19;;20483:366;;;:::o;20855:::-;20997:3;21018:67;21082:2;21077:3;21018:67;:::i;:::-;21011:74;;21094:93;21183:3;21094:93;:::i;:::-;21212:2;21207:3;21203:12;21196:19;;20855:366;;;:::o;21227:::-;21369:3;21390:67;21454:2;21449:3;21390:67;:::i;:::-;21383:74;;21466:93;21555:3;21466:93;:::i;:::-;21584:2;21579:3;21575:12;21568:19;;21227:366;;;:::o;21599:::-;21741:3;21762:67;21826:2;21821:3;21762:67;:::i;:::-;21755:74;;21838:93;21927:3;21838:93;:::i;:::-;21956:2;21951:3;21947:12;21940:19;;21599:366;;;:::o;21971:::-;22113:3;22134:67;22198:2;22193:3;22134:67;:::i;:::-;22127:74;;22210:93;22299:3;22210:93;:::i;:::-;22328:2;22323:3;22319:12;22312:19;;21971:366;;;:::o;22343:365::-;22485:3;22506:66;22570:1;22565:3;22506:66;:::i;:::-;22499:73;;22581:93;22670:3;22581:93;:::i;:::-;22699:2;22694:3;22690:12;22683:19;;22343:365;;;:::o;22714:366::-;22856:3;22877:67;22941:2;22936:3;22877:67;:::i;:::-;22870:74;;22953:93;23042:3;22953:93;:::i;:::-;23071:2;23066:3;23062:12;23055:19;;22714:366;;;:::o;23086:::-;23228:3;23249:67;23313:2;23308:3;23249:67;:::i;:::-;23242:74;;23325:93;23414:3;23325:93;:::i;:::-;23443:2;23438:3;23434:12;23427:19;;23086:366;;;:::o;23530:874::-;23689:4;23684:3;23680:14;23776:4;23769:5;23765:16;23759:23;23795:63;23852:4;23847:3;23843:14;23829:12;23795:63;:::i;:::-;23704:164;23960:4;23953:5;23949:16;23943:23;23979:61;24034:4;24029:3;24025:14;24011:12;23979:61;:::i;:::-;23878:172;24134:4;24127:5;24123:16;24117:23;24153:57;24204:4;24199:3;24195:14;24181:12;24153:57;:::i;:::-;24060:160;24307:4;24300:5;24296:16;24290:23;24326:61;24381:4;24376:3;24372:14;24358:12;24326:61;:::i;:::-;24230:167;23658:746;23530:874;;:::o;24410:105::-;24485:23;24502:5;24485:23;:::i;:::-;24480:3;24473:36;24410:105;;:::o;24521:118::-;24608:24;24626:5;24608:24;:::i;:::-;24603:3;24596:37;24521:118;;:::o;24645:105::-;24720:23;24737:5;24720:23;:::i;:::-;24715:3;24708:36;24645:105;;:::o;24756:256::-;24868:3;24883:75;24954:3;24945:6;24883:75;:::i;:::-;24983:2;24978:3;24974:12;24967:19;;25003:3;24996:10;;24756:256;;;;:::o;25018:589::-;25243:3;25265:95;25356:3;25347:6;25265:95;:::i;:::-;25258:102;;25377:95;25468:3;25459:6;25377:95;:::i;:::-;25370:102;;25489:92;25577:3;25568:6;25489:92;:::i;:::-;25482:99;;25598:3;25591:10;;25018:589;;;;;;:::o;25613:379::-;25797:3;25819:147;25962:3;25819:147;:::i;:::-;25812:154;;25983:3;25976:10;;25613:379;;;:::o;25998:222::-;26091:4;26129:2;26118:9;26114:18;26106:26;;26142:71;26210:1;26199:9;26195:17;26186:6;26142:71;:::i;:::-;25998:222;;;;:::o;26226:640::-;26421:4;26459:3;26448:9;26444:19;26436:27;;26473:71;26541:1;26530:9;26526:17;26517:6;26473:71;:::i;:::-;26554:72;26622:2;26611:9;26607:18;26598:6;26554:72;:::i;:::-;26636;26704:2;26693:9;26689:18;26680:6;26636:72;:::i;:::-;26755:9;26749:4;26745:20;26740:2;26729:9;26725:18;26718:48;26783:76;26854:4;26845:6;26783:76;:::i;:::-;26775:84;;26226:640;;;;;;;:::o;26872:210::-;26959:4;26997:2;26986:9;26982:18;26974:26;;27010:65;27072:1;27061:9;27057:17;27048:6;27010:65;:::i;:::-;26872:210;;;;:::o;27088:222::-;27181:4;27219:2;27208:9;27204:18;27196:26;;27232:71;27300:1;27289:9;27285:17;27276:6;27232:71;:::i;:::-;27088:222;;;;:::o;27316:313::-;27429:4;27467:2;27456:9;27452:18;27444:26;;27516:9;27510:4;27506:20;27502:1;27491:9;27487:17;27480:47;27544:78;27617:4;27608:6;27544:78;:::i;:::-;27536:86;;27316:313;;;;:::o;27635:419::-;27801:4;27839:2;27828:9;27824:18;27816:26;;27888:9;27882:4;27878:20;27874:1;27863:9;27859:17;27852:47;27916:131;28042:4;27916:131;:::i;:::-;27908:139;;27635:419;;;:::o;28060:::-;28226:4;28264:2;28253:9;28249:18;28241:26;;28313:9;28307:4;28303:20;28299:1;28288:9;28284:17;28277:47;28341:131;28467:4;28341:131;:::i;:::-;28333:139;;28060:419;;;:::o;28485:::-;28651:4;28689:2;28678:9;28674:18;28666:26;;28738:9;28732:4;28728:20;28724:1;28713:9;28709:17;28702:47;28766:131;28892:4;28766:131;:::i;:::-;28758:139;;28485:419;;;:::o;28910:::-;29076:4;29114:2;29103:9;29099:18;29091:26;;29163:9;29157:4;29153:20;29149:1;29138:9;29134:17;29127:47;29191:131;29317:4;29191:131;:::i;:::-;29183:139;;28910:419;;;:::o;29335:::-;29501:4;29539:2;29528:9;29524:18;29516:26;;29588:9;29582:4;29578:20;29574:1;29563:9;29559:17;29552:47;29616:131;29742:4;29616:131;:::i;:::-;29608:139;;29335:419;;;:::o;29760:::-;29926:4;29964:2;29953:9;29949:18;29941:26;;30013:9;30007:4;30003:20;29999:1;29988:9;29984:17;29977:47;30041:131;30167:4;30041:131;:::i;:::-;30033:139;;29760:419;;;:::o;30185:::-;30351:4;30389:2;30378:9;30374:18;30366:26;;30438:9;30432:4;30428:20;30424:1;30413:9;30409:17;30402:47;30466:131;30592:4;30466:131;:::i;:::-;30458:139;;30185:419;;;:::o;30610:::-;30776:4;30814:2;30803:9;30799:18;30791:26;;30863:9;30857:4;30853:20;30849:1;30838:9;30834:17;30827:47;30891:131;31017:4;30891:131;:::i;:::-;30883:139;;30610:419;;;:::o;31035:::-;31201:4;31239:2;31228:9;31224:18;31216:26;;31288:9;31282:4;31278:20;31274:1;31263:9;31259:17;31252:47;31316:131;31442:4;31316:131;:::i;:::-;31308:139;;31035:419;;;:::o;31460:::-;31626:4;31664:2;31653:9;31649:18;31641:26;;31713:9;31707:4;31703:20;31699:1;31688:9;31684:17;31677:47;31741:131;31867:4;31741:131;:::i;:::-;31733:139;;31460:419;;;:::o;31885:::-;32051:4;32089:2;32078:9;32074:18;32066:26;;32138:9;32132:4;32128:20;32124:1;32113:9;32109:17;32102:47;32166:131;32292:4;32166:131;:::i;:::-;32158:139;;31885:419;;;:::o;32310:::-;32476:4;32514:2;32503:9;32499:18;32491:26;;32563:9;32557:4;32553:20;32549:1;32538:9;32534:17;32527:47;32591:131;32717:4;32591:131;:::i;:::-;32583:139;;32310:419;;;:::o;32735:::-;32901:4;32939:2;32928:9;32924:18;32916:26;;32988:9;32982:4;32978:20;32974:1;32963:9;32959:17;32952:47;33016:131;33142:4;33016:131;:::i;:::-;33008:139;;32735:419;;;:::o;33160:::-;33326:4;33364:2;33353:9;33349:18;33341:26;;33413:9;33407:4;33403:20;33399:1;33388:9;33384:17;33377:47;33441:131;33567:4;33441:131;:::i;:::-;33433:139;;33160:419;;;:::o;33585:::-;33751:4;33789:2;33778:9;33774:18;33766:26;;33838:9;33832:4;33828:20;33824:1;33813:9;33809:17;33802:47;33866:131;33992:4;33866:131;:::i;:::-;33858:139;;33585:419;;;:::o;34010:::-;34176:4;34214:2;34203:9;34199:18;34191:26;;34263:9;34257:4;34253:20;34249:1;34238:9;34234:17;34227:47;34291:131;34417:4;34291:131;:::i;:::-;34283:139;;34010:419;;;:::o;34435:517::-;34623:4;34661:2;34650:9;34646:18;34638:26;;34710:9;34704:4;34700:20;34696:1;34685:9;34681:17;34674:47;34738:131;34864:4;34738:131;:::i;:::-;34730:139;;34879:66;34941:2;34930:9;34926:18;34917:6;34879:66;:::i;:::-;34435:517;;;;:::o;34958:419::-;35124:4;35162:2;35151:9;35147:18;35139:26;;35211:9;35205:4;35201:20;35197:1;35186:9;35182:17;35175:47;35239:131;35365:4;35239:131;:::i;:::-;35231:139;;34958:419;;;:::o;35383:::-;35549:4;35587:2;35576:9;35572:18;35564:26;;35636:9;35630:4;35626:20;35622:1;35611:9;35607:17;35600:47;35664:131;35790:4;35664:131;:::i;:::-;35656:139;;35383:419;;;:::o;35808:::-;35974:4;36012:2;36001:9;35997:18;35989:26;;36061:9;36055:4;36051:20;36047:1;36036:9;36032:17;36025:47;36089:131;36215:4;36089:131;:::i;:::-;36081:139;;35808:419;;;:::o;36233:::-;36399:4;36437:2;36426:9;36422:18;36414:26;;36486:9;36480:4;36476:20;36472:1;36461:9;36457:17;36450:47;36514:131;36640:4;36514:131;:::i;:::-;36506:139;;36233:419;;;:::o;36658:::-;36824:4;36862:2;36851:9;36847:18;36839:26;;36911:9;36905:4;36901:20;36897:1;36886:9;36882:17;36875:47;36939:131;37065:4;36939:131;:::i;:::-;36931:139;;36658:419;;;:::o;37083:517::-;37271:4;37309:2;37298:9;37294:18;37286:26;;37358:9;37352:4;37348:20;37344:1;37333:9;37329:17;37322:47;37386:131;37512:4;37386:131;:::i;:::-;37378:139;;37527:66;37589:2;37578:9;37574:18;37565:6;37527:66;:::i;:::-;37083:517;;;;:::o;37606:419::-;37772:4;37810:2;37799:9;37795:18;37787:26;;37859:9;37853:4;37849:20;37845:1;37834:9;37830:17;37823:47;37887:131;38013:4;37887:131;:::i;:::-;37879:139;;37606:419;;;:::o;38031:::-;38197:4;38235:2;38224:9;38220:18;38212:26;;38284:9;38278:4;38274:20;38270:1;38259:9;38255:17;38248:47;38312:131;38438:4;38312:131;:::i;:::-;38304:139;;38031:419;;;:::o;38456:347::-;38611:4;38649:3;38638:9;38634:19;38626:27;;38663:133;38793:1;38782:9;38778:17;38769:6;38663:133;:::i;:::-;38456:347;;;;:::o;38809:222::-;38902:4;38940:2;38929:9;38925:18;38917:26;;38953:71;39021:1;39010:9;39006:17;38997:6;38953:71;:::i;:::-;38809:222;;;;:::o;39037:320::-;39152:4;39190:2;39179:9;39175:18;39167:26;;39203:71;39271:1;39260:9;39256:17;39247:6;39203:71;:::i;:::-;39284:66;39346:2;39335:9;39331:18;39322:6;39284:66;:::i;:::-;39037:320;;;;;:::o;39363:129::-;39397:6;39424:20;;:::i;:::-;39414:30;;39453:33;39481:4;39473:6;39453:33;:::i;:::-;39363:129;;;:::o;39498:75::-;39531:6;39564:2;39558:9;39548:19;;39498:75;:::o;39579:307::-;39640:4;39730:18;39722:6;39719:30;39716:56;;;39752:18;;:::i;:::-;39716:56;39790:29;39812:6;39790:29;:::i;:::-;39782:37;;39874:4;39868;39864:15;39856:23;;39579:307;;;:::o;39892:308::-;39954:4;40044:18;40036:6;40033:30;40030:56;;;40066:18;;:::i;:::-;40030:56;40104:29;40126:6;40104:29;:::i;:::-;40096:37;;40188:4;40182;40178:15;40170:23;;39892:308;;;:::o;40206:141::-;40255:4;40278:3;40270:11;;40301:3;40298:1;40291:14;40335:4;40332:1;40322:18;40314:26;;40206:141;;;:::o;40353:98::-;40404:6;40438:5;40432:12;40422:22;;40353:98;;;:::o;40457:99::-;40509:6;40543:5;40537:12;40527:22;;40457:99;;;:::o;40562:168::-;40645:11;40679:6;40674:3;40667:19;40719:4;40714:3;40710:14;40695:29;;40562:168;;;;:::o;40736:147::-;40837:11;40874:3;40859:18;;40736:147;;;;:::o;40889:169::-;40973:11;41007:6;41002:3;40995:19;41047:4;41042:3;41038:14;41023:29;;40889:169;;;;:::o;41064:148::-;41166:11;41203:3;41188:18;;41064:148;;;;:::o;41218:305::-;41258:3;41277:20;41295:1;41277:20;:::i;:::-;41272:25;;41311:20;41329:1;41311:20;:::i;:::-;41306:25;;41465:1;41397:66;41393:74;41390:1;41387:81;41384:107;;;41471:18;;:::i;:::-;41384:107;41515:1;41512;41508:9;41501:16;;41218:305;;;;:::o;41529:185::-;41569:1;41586:20;41604:1;41586:20;:::i;:::-;41581:25;;41620:20;41638:1;41620:20;:::i;:::-;41615:25;;41659:1;41649:35;;41664:18;;:::i;:::-;41649:35;41706:1;41703;41699:9;41694:14;;41529:185;;;;:::o;41720:348::-;41760:7;41783:20;41801:1;41783:20;:::i;:::-;41778:25;;41817:20;41835:1;41817:20;:::i;:::-;41812:25;;42005:1;41937:66;41933:74;41930:1;41927:81;41922:1;41915:9;41908:17;41904:105;41901:131;;;42012:18;;:::i;:::-;41901:131;42060:1;42057;42053:9;42042:20;;41720:348;;;;:::o;42074:191::-;42114:4;42134:20;42152:1;42134:20;:::i;:::-;42129:25;;42168:20;42186:1;42168:20;:::i;:::-;42163:25;;42207:1;42204;42201:8;42198:34;;;42212:18;;:::i;:::-;42198:34;42257:1;42254;42250:9;42242:17;;42074:191;;;;:::o;42271:96::-;42308:7;42337:24;42355:5;42337:24;:::i;:::-;42326:35;;42271:96;;;:::o;42373:90::-;42407:7;42450:5;42443:13;42436:21;42425:32;;42373:90;;;:::o;42469:77::-;42506:7;42535:5;42524:16;;42469:77;;;:::o;42552:149::-;42588:7;42628:66;42621:5;42617:78;42606:89;;42552:149;;;:::o;42707:126::-;42744:7;42784:42;42777:5;42773:54;42762:65;;42707:126;;;:::o;42839:91::-;42875:7;42915:8;42908:5;42904:20;42893:31;;42839:91;;;:::o;42936:77::-;42973:7;43002:5;42991:16;;42936:77;;;:::o;43019:101::-;43055:7;43095:18;43088:5;43084:30;43073:41;;43019:101;;;:::o;43126:154::-;43210:6;43205:3;43200;43187:30;43272:1;43263:6;43258:3;43254:16;43247:27;43126:154;;;:::o;43286:307::-;43354:1;43364:113;43378:6;43375:1;43372:13;43364:113;;;43463:1;43458:3;43454:11;43448:18;43444:1;43439:3;43435:11;43428:39;43400:2;43397:1;43393:10;43388:15;;43364:113;;;43495:6;43492:1;43489:13;43486:101;;;43575:1;43566:6;43561:3;43557:16;43550:27;43486:101;43335:258;43286:307;;;:::o;43599:320::-;43643:6;43680:1;43674:4;43670:12;43660:22;;43727:1;43721:4;43717:12;43748:18;43738:81;;43804:4;43796:6;43792:17;43782:27;;43738:81;43866:2;43858:6;43855:14;43835:18;43832:38;43829:84;;;43885:18;;:::i;:::-;43829:84;43650:269;43599:320;;;:::o;43925:281::-;44008:27;44030:4;44008:27;:::i;:::-;44000:6;43996:40;44138:6;44126:10;44123:22;44102:18;44090:10;44087:34;44084:62;44081:88;;;44149:18;;:::i;:::-;44081:88;44189:10;44185:2;44178:22;43968:238;43925:281;;:::o;44212:233::-;44251:3;44274:24;44292:5;44274:24;:::i;:::-;44265:33;;44320:66;44313:5;44310:77;44307:103;;;44390:18;;:::i;:::-;44307:103;44437:1;44430:5;44426:13;44419:20;;44212:233;;;:::o;44451:100::-;44490:7;44519:26;44539:5;44519:26;:::i;:::-;44508:37;;44451:100;;;:::o;44557:94::-;44596:7;44625:20;44639:5;44625:20;:::i;:::-;44614:31;;44557:94;;;:::o;44657:176::-;44689:1;44706:20;44724:1;44706:20;:::i;:::-;44701:25;;44740:20;44758:1;44740:20;:::i;:::-;44735:25;;44779:1;44769:35;;44784:18;;:::i;:::-;44769:35;44825:1;44822;44818:9;44813:14;;44657:176;;;;:::o;44839:180::-;44887:77;44884:1;44877:88;44984:4;44981:1;44974:15;45008:4;45005:1;44998:15;45025:180;45073:77;45070:1;45063:88;45170:4;45167:1;45160:15;45194:4;45191:1;45184:15;45211:180;45259:77;45256:1;45249:88;45356:4;45353:1;45346:15;45380:4;45377:1;45370:15;45397:180;45445:77;45442:1;45435:88;45542:4;45539:1;45532:15;45566:4;45563:1;45556:15;45583:180;45631:77;45628:1;45621:88;45728:4;45725:1;45718:15;45752:4;45749:1;45742:15;45769:117;45878:1;45875;45868:12;45892:117;46001:1;45998;45991:12;46015:117;46124:1;46121;46114:12;46138:117;46247:1;46244;46237:12;46261:117;46370:1;46367;46360:12;46384:117;46493:1;46490;46483:12;46507:102;46548:6;46599:2;46595:7;46590:2;46583:5;46579:14;46575:28;46565:38;;46507:102;;;:::o;46615:94::-;46648:8;46696:5;46692:2;46688:14;46667:35;;46615:94;;;:::o;46715:228::-;46855:34;46851:1;46843:6;46839:14;46832:58;46924:11;46919:2;46911:6;46907:15;46900:36;46715:228;:::o;46949:162::-;47089:14;47085:1;47077:6;47073:14;47066:38;46949:162;:::o;47117:225::-;47257:34;47253:1;47245:6;47241:14;47234:58;47326:8;47321:2;47313:6;47309:15;47302:33;47117:225;:::o;47348:173::-;47488:25;47484:1;47476:6;47472:14;47465:49;47348:173;:::o;47527:172::-;47667:24;47663:1;47655:6;47651:14;47644:48;47527:172;:::o;47705:176::-;47845:28;47841:1;47833:6;47829:14;47822:52;47705:176;:::o;47887:173::-;48027:25;48023:1;48015:6;48011:14;48004:49;47887:173;:::o;48066:180::-;48206:32;48202:1;48194:6;48190:14;48183:56;48066:180;:::o;48252:175::-;48392:27;48388:1;48380:6;48376:14;48369:51;48252:175;:::o;48433:171::-;48573:23;48569:1;48561:6;48557:14;48550:47;48433:171;:::o;48610:162::-;48750:14;48746:1;48738:6;48734:14;48727:38;48610:162;:::o;48778:172::-;48918:24;48914:1;48906:6;48902:14;48895:48;48778:172;:::o;48956:168::-;49096:20;49092:1;49084:6;49080:14;49073:44;48956:168;:::o;49130:175::-;49270:27;49266:1;49258:6;49254:14;49247:51;49130:175;:::o;49311:182::-;49451:34;49447:1;49439:6;49435:14;49428:58;49311:182;:::o;49499:234::-;49639:34;49635:1;49627:6;49623:14;49616:58;49708:17;49703:2;49695:6;49691:15;49684:42;49499:234;:::o;49739:159::-;49879:11;49875:1;49867:6;49863:14;49856:35;49739:159;:::o;49904:114::-;;:::o;50024:172::-;50164:24;50160:1;50152:6;50148:14;50141:48;50024:172;:::o;50202:165::-;50342:17;50338:1;50330:6;50326:14;50319:41;50202:165;:::o;50373:174::-;50513:26;50509:1;50501:6;50497:14;50490:50;50373:174;:::o;50553:181::-;50693:33;50689:1;50681:6;50677:14;50670:57;50553:181;:::o;50740:164::-;50880:16;50876:1;50868:6;50864:14;50857:40;50740:164;:::o;50910:156::-;51050:8;51046:1;51038:6;51034:14;51027:32;50910:156;:::o;51072:180::-;51212:32;51208:1;51200:6;51196:14;51189:56;51072:180;:::o;51258:169::-;51398:21;51394:1;51386:6;51382:14;51375:45;51258:169;:::o;51433:122::-;51506:24;51524:5;51506:24;:::i;:::-;51499:5;51496:35;51486:63;;51545:1;51542;51535:12;51486:63;51433:122;:::o;51561:116::-;51631:21;51646:5;51631:21;:::i;:::-;51624:5;51621:32;51611:60;;51667:1;51664;51657:12;51611:60;51561:116;:::o;51683:122::-;51756:24;51774:5;51756:24;:::i;:::-;51749:5;51746:35;51736:63;;51795:1;51792;51785:12;51736:63;51683:122;:::o;51811:120::-;51883:23;51900:5;51883:23;:::i;:::-;51876:5;51873:34;51863:62;;51921:1;51918;51911:12;51863:62;51811:120;:::o;51937:122::-;52010:24;52028:5;52010:24;:::i;:::-;52003:5;52000:35;51990:63;;52049:1;52046;52039:12;51990:63;51937:122;:::o

Swarm Source

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