ETH Price: $3,417.71 (+3.11%)

Token

Saint Robotica (SR)
 

Overview

Max Total Supply

3,671 SR

Holders

539

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
flow4.eth
Balance
10 SR
0x810816a0f73590d43160d6ec14399acb8124e4bb
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:
SaintRobotica

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-11
*/

// SPDX-License-Identifier: MIT
// File: contracts/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: contracts/contract.sol


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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]     * ===    * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed 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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// 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.sol



pragma solidity ^0.8.0;

error ApprovalCallerNotOwnerNorApproved();











/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable, 
  Ownable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;
  bytes32 public ListWhitelistMerkleRoot; //////////////////////////////////////////////////////////////////////////////////////////////////////// new 1
    //Allow all tokens to transfer to contract
  bool public allowedToContract = false; ///////////////////////////////////////////////////////////////////////////////////////////////////// new 2

  // 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 ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

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

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

    // Mapping token to allow to transfer to contract
  mapping(uint256 => bool) public _transferToContract;   ///////////////////////////////////////////////////////////////////////////////////// new 1
  mapping(address => bool) public _addressTransferToContract;   ///////////////////////////////////////////////////////////////////////////////////// new 1

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721A: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

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

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

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

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

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

    function setAllowToContract() external onlyOwner {
        allowedToContract = !allowedToContract;
    }

    function setAllowTokenToContract(uint256 _tokenId, bool _allow) external onlyOwner {
        _transferToContract[_tokenId] = _allow;
    }

    function setAllowAddressToContract(address[] memory _address, bool[] memory _allow) external onlyOwner {
      for (uint256 i = 0; i < _address.length; i++) {
        _addressTransferToContract[_address[i]] = _allow[i];
      }
    }

    function setListWhitelistMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        ListWhitelistMerkleRoot = _merkleRoot;
    }

    function isInTheWhitelist(bytes32[] calldata _merkleProof) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        bytes32 leaf2 = keccak256(abi.encodePacked(tx.origin));
        require(MerkleProof.verify(_merkleProof, ListWhitelistMerkleRoot, leaf) || MerkleProof.verify(_merkleProof, ListWhitelistMerkleRoot, leaf2), "Invalid proof!");
        return true;
    }

  /**
   * @dev See {IERC721-approve}.
   */
    function approve(address to, uint256 tokenId) virtual public override {
        require(to != _msgSender(), "ERC721A: approve to caller");
        address owner = ERC721A.ownerOf(tokenId);
        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }
        if(!allowedToContract && !_transferToContract[tokenId]){
            if (to.isContract()) {
                revert ("Sales will be opened after mint is complete.");
            } else {
                _approve(to, tokenId, owner);
            }
        } else {
            _approve(to, tokenId, owner);
        }
    }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
    function setApprovalForAll(address operator, bool approved) virtual public override {
        require(operator != _msgSender(), "ERC721A: approve to caller");
        
        if(!allowedToContract && !_addressTransferToContract[msg.sender]){
            if (operator.isContract()) {
                revert ("Sales will be opened after mint is complete.");
            } else {
                _operatorApprovals[_msgSender()][operator] = approved;
                emit ApprovalForAll(_msgSender(), operator, approved);
            }
        } else {
            _operatorApprovals[_msgSender()][operator] = approved;
            emit ApprovalForAll(_msgSender(), operator, approved);
        }
    }

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) virtual public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

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

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

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

    // Clear approvals from the previous owner
    _approve(address(0), tokenId, prevOwnership.addr);

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

  /**
   * @dev Approve `to` to operate on `tokenId`
   *
   * Emits a {Approval} event.
   */
  function _approve(
    address to,
    uint256 tokenId,
    address owner
  ) private {
    _tokenApprovals[tokenId] = to;
    emit Approval(owner, to, tokenId);
  }

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * 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`.
   */
  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.
   *
   * 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` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}
// File: mycontract.sol

pragma solidity ^0.8.0;

contract SaintRobotica is Ownable, ERC721A, ReentrancyGuard, DefaultOperatorFilterer {

  uint256 public immutable maxPerAddressDuringMint;
  uint public maxSupply = 3773;

  struct SaleConfig {
    uint32 MintStartTime;
    uint256 Price;
  }

  SaleConfig public saleConfig;

  constructor(
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) ERC721A("Saint Robotica", "SR", maxBatchSize_, collectionSize_) {
    maxPerAddressDuringMint = maxBatchSize_;
  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

  function getMaxSupply() view public returns(uint256){
    return maxSupply;
  }

  function PublicMint(uint256 quantity) external payable callerIsUser {    
    require(isPublicSaleOn(),"sale has not started yet");
    require(quantity <= maxPerAddressDuringMint, "reached max supply");
    require(totalSupply() + quantity <= collectionSize, "reached max supply");   
      require(
      numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint,
      "can not mint this many"
    );
    _safeMint(msg.sender, quantity);
  }

  function isPublicSaleOn() public view returns (bool) {
    return
      saleConfig.MintStartTime != 0 &&
      block.timestamp >= saleConfig.MintStartTime;
  }

  uint256 public constant Price = 0 ether;

  function InitInfoOfSale(
    uint32 mintStartTime,
    uint256 price
  ) external onlyOwner {
    saleConfig = SaleConfig(
    mintStartTime,
    price
    );
  }

  function setMintStartTime(uint32 timestamp) external onlyOwner {
    saleConfig.MintStartTime = timestamp;
  }

  string private _baseTokenURI;

  function withdraw() external onlyOwner {
      selfdestruct(payable(msg.sender));
  }

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

  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint32","name":"mintStartTime","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"InitInfoOfSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ListWhitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_addressTransferToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_transferToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"struct ERC721A.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":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isInTheWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint32","name":"MintStartTime","type":"uint32"},{"internalType":"uint256","name":"Price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"bool[]","name":"_allow","type":"bool[]"}],"name":"setAllowAddressToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAllowToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_allow","type":"bool"}],"name":"setAllowTokenToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setListWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405260006001556000600360006101000a81548160ff0219169083151502179055506000600c55610ebd600e553480156200003c57600080fd5b50604051620060fb380380620060fb8339818101604052810190620000629190620005a4565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600e81526020017f5361696e7420526f626f746963610000000000000000000000000000000000008152506040518060400160405280600281526020017f5352000000000000000000000000000000000000000000000000000000000000815250858562000107620000fb620003e860201b60201c565b620003f060201b60201c565b600081116200014d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001449062000672565b60405180910390fd5b6000821162000193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018a906200070a565b60405180910390fd5b8360049080519060200190620001ab929190620004b4565b508260059080519060200190620001c4929190620004b4565b508160a081815250508060808181525050505050506001600d8190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003d65780156200029c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200026292919062000771565b600060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b50505050620003d5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000356576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200031c92919062000771565b600060405180830381600087803b1580156200033757600080fd5b505af11580156200034c573d6000803e3d6000fd5b50505050620003d4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200039f91906200079e565b600060405180830381600087803b158015620003ba57600080fd5b505af1158015620003cf573d6000803e3d6000fd5b505050505b5b5b50508160c0818152505050506200081f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004c290620007ea565b90600052602060002090601f016020900481019282620004e6576000855562000532565b82601f106200050157805160ff191683800117855562000532565b8280016001018555821562000532579182015b828111156200053157825182559160200191906001019062000514565b5b50905062000541919062000545565b5090565b5b808211156200056057600081600090555060010162000546565b5090565b600080fd5b6000819050919050565b6200057e8162000569565b81146200058a57600080fd5b50565b6000815190506200059e8162000573565b92915050565b60008060408385031215620005be57620005bd62000564565b5b6000620005ce858286016200058d565b9250506020620005e1858286016200058d565b9150509250929050565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60006200065a602e83620005eb565b91506200066782620005fc565b604082019050919050565b600060208201905081810360008301526200068d816200064b565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620006f2602783620005eb565b9150620006ff8262000694565b604082019050919050565b600060208201905081810360008301526200072581620006e3565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000759826200072c565b9050919050565b6200076b816200074c565b82525050565b600060408201905062000788600083018562000760565b62000797602083018462000760565b9392505050565b6000602082019050620007b5600083018462000760565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080357607f821691505b602082108103620008195762000818620007bb565b5b50919050565b60805160a05160c0516158906200086b6000396000818161164c0152818161181f01526118f701526000818161229a015281816122c3015261337b0152600061188201526158906000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063b1f7f0eb116100b6578063d5abeb011161007a578063d5abeb0114610900578063d7224ba01461092b578063dc33e68114610956578063e985e9c514610993578063f2fde38b146109d0578063fdb8e34e146109f95761025c565b8063b1f7f0eb146107f7578063b758f90314610834578063b88d4fde1461085d578063c080519714610886578063c87b56dd146108c35761025c565b806390aa0b0f1161010857806390aa0b0f146106f35780639231ab2a1461071f57806395d89b411461075c5780639dfde201146107875780639fb17e34146107b2578063a22cb465146107ce5761025c565b8063715018a614610632578063801fe59b146106495780638942932d146106605780638bc35c2f1461069d5780638da5cb5b146106c85761025c565b806341f43434116101dd57806355a55465116101a157806355a554651461051457806355f804b31461053d5780636352211e1461056657806367ba5ecc146105a35780636f58ec48146105cc57806370a08231146105f55761025c565b806341f434341461042d57806342842e0e146104585780634aaf78f1146104815780634c0f38c2146104ac5780634f6ccce7146104d75761025c565b806323b872dd1161022457806323b872dd1461035a5780632a13614c146103835780632f745c59146103ae5780633ccfd60b146103eb5780633f5e4741146104025761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b31461030657806318160ddd1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613ab7565b610a22565b6040516102959190613aff565b60405180910390f35b3480156102aa57600080fd5b506102b3610b6c565b6040516102c09190613bb3565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613c0b565b610bfe565b6040516102fd9190613c79565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613cc0565b610c83565b005b34801561033b57600080fd5b50610344610d8d565b6040516103519190613d0f565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613d2a565b610d97565b005b34801561038f57600080fd5b50610398610ee7565b6040516103a59190613d96565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613cc0565b610eed565b6040516103e29190613d0f565b60405180910390f35b3480156103f757600080fd5b506104006110e9565b005b34801561040e57600080fd5b5061041761110a565b6040516104249190613aff565b60405180910390f35b34801561043957600080fd5b50610442611157565b60405161044f9190613e10565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613d2a565b611169565b005b34801561048d57600080fd5b506104966112b9565b6040516104a39190613aff565b60405180910390f35b3480156104b857600080fd5b506104c16112cc565b6040516104ce9190613d0f565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613c0b565b6112d6565b60405161050b9190613d0f565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190613e57565b611329565b005b34801561054957600080fd5b50610564600480360381019061055f9190613efc565b611360565b005b34801561057257600080fd5b5061058d60048036038101906105889190613c0b565b61137e565b60405161059a9190613c79565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613f75565b611394565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613fde565b6113a6565b005b34801561060157600080fd5b5061061c6004803603810190610617919061400b565b6113d5565b6040516106299190613d0f565b60405180910390f35b34801561063e57600080fd5b506106476114bd565b005b34801561065557600080fd5b5061065e6114d1565b005b34801561066c57600080fd5b506106876004803603810190610682919061408e565b611505565b6040516106949190613aff565b60405180910390f35b3480156106a957600080fd5b506106b261164a565b6040516106bf9190613d0f565b60405180910390f35b3480156106d457600080fd5b506106dd61166e565b6040516106ea9190613c79565b60405180910390f35b3480156106ff57600080fd5b50610708611697565b6040516107169291906140ea565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613c0b565b6116b9565b6040516107539190614174565b60405180910390f35b34801561076857600080fd5b506107716116d1565b60405161077e9190613bb3565b60405180910390f35b34801561079357600080fd5b5061079c611763565b6040516107a99190613d0f565b60405180910390f35b6107cc60048036038101906107c79190613c0b565b611768565b005b3480156107da57600080fd5b506107f560048036038101906107f0919061418f565b611978565b005b34801561080357600080fd5b5061081e6004803603810190610819919061400b565b611a82565b60405161082b9190613aff565b60405180910390f35b34801561084057600080fd5b5061085b600480360381019061085691906141cf565b611aa2565b005b34801561086957600080fd5b50610884600480360381019061087f919061433f565b611aff565b005b34801561089257600080fd5b506108ad60048036038101906108a89190613c0b565b611c52565b6040516108ba9190613aff565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613c0b565b611c72565b6040516108f79190613bb3565b60405180910390f35b34801561090c57600080fd5b50610915611d19565b6040516109229190613d0f565b60405180910390f35b34801561093757600080fd5b50610940611d1f565b60405161094d9190613d0f565b60405180910390f35b34801561096257600080fd5b5061097d6004803603810190610978919061400b565b611d25565b60405161098a9190613d0f565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b591906143c2565b611d37565b6040516109c79190613aff565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f2919061400b565b611e1c565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190614588565b611e9f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b655750610b6482611f56565b5b9050919050565b606060048054610b7b9061462f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba79061462f565b8015610bf45780601f10610bc957610100808354040283529160200191610bf4565b820191906000526020600020905b815481529060010190602001808311610bd757829003601f168201915b5050505050905090565b6000610c0982611fc0565b610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f906146d2565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d7e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610cfb9291906146f2565b602060405180830381865afa158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190614730565b610d7d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d749190613c79565b60405180910390fd5b5b610d888383611fce565b505050565b6000600154905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ed5573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e0957610e04848484612198565b610ee1565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e529291906146f2565b602060405180830381865afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190614730565b610ed457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ecb9190613c79565b60405180910390fd5b5b610ee0848484612198565b5b50505050565b60025481565b6000610ef8836113d5565b8210610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f30906147cf565b60405180910390fd5b6000610f43610d8d565b905060008060005b838110156110a7576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461103d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611093578684036110845781955050505050506110e3565b838061108f9061481e565b9450505b50808061109f9061481e565b915050610f4b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da906148d8565b60405180910390fd5b92915050565b6110f16121a8565b3373ffffffffffffffffffffffffffffffffffffffff16ff5b600080600f60000160009054906101000a900463ffffffff1663ffffffff16141580156111525750600f60000160009054906101000a900463ffffffff1663ffffffff164210155b905090565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156112a7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111db576111d6848484612226565b6112b3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016112249291906146f2565b602060405180830381865afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112659190614730565b6112a657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161129d9190613c79565b60405180910390fd5b5b6112b2848484612226565b5b50505050565b600360009054906101000a900460ff1681565b6000600e54905090565b60006112e0610d8d565b8210611321576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113189061496a565b60405180910390fd5b819050919050565b6113316121a8565b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6113686121a8565b81816011919061137992919061396e565b505050565b600061138982612246565b600001519050919050565b61139c6121a8565b8060028190555050565b6113ae6121a8565b80600f60000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906149fc565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114c56121a8565b6114cf6000612449565b565b6114d96121a8565b600360009054906101000a900460ff1615600360006101000a81548160ff021916908315150217905550565b600080336040516020016115199190614a64565b6040516020818303038152906040528051906020012090506000326040516020016115449190614a64565b6040516020818303038152906040528051906020012090506115aa858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548461250d565b806115ff57506115fe858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548361250d565b5b61163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590614acb565b60405180910390fd5b60019250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f8060000160009054906101000a900463ffffffff16908060010154905082565b6116c16139f4565b6116ca82612246565b9050919050565b6060600580546116e09061462f565b80601f016020809104026020016040519081016040528092919081815260200182805461170c9061462f565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b5050505050905090565b600081565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90614b37565b60405180910390fd5b6117de61110a565b61181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614ba3565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790614c0f565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816118aa610d8d565b6118b49190614c2f565b11156118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90614c0f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161192033611d25565b61192a9190614c2f565b111561196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614cd1565b60405180910390fd5b6119753382612524565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a73576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119f09291906146f2565b602060405180830381865afa158015611a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a319190614730565b611a7257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a699190613c79565b60405180910390fd5b5b611a7d8383612542565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b611aaa6121a8565b60405180604001604052808363ffffffff16815260200182815250600f60008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c3e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b7257611b6d8585858561289a565b611c4b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611bbb9291906146f2565b602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190614730565b611c3d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c349190613c79565b60405180910390fd5b5b611c4a8585858561289a565b5b5050505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6060611c7d82611fc0565b611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614d63565b60405180910390fd5b6000611cc66128f6565b90506000815111611ce65760405180602001604052806000815250611d11565b80611cf084612988565b604051602001611d01929190614e0b565b6040516020818303038152906040525b915050919050565b600e5481565b600c5481565b6000611d3082612ae8565b9050919050565b600073aba85cef4c2d276c2dd730748676874be0cac90473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d895760019050611e16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b92915050565b611e246121a8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90614eac565b60405180910390fd5b611e9c81612449565b50565b611ea76121a8565b60005b8251811015611f5157818181518110611ec657611ec5614ecc565b5b6020026020010151600b6000858481518110611ee557611ee4614ecc565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f499061481e565b915050611eaa565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b611fd6612bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a90614f47565b60405180910390fd5b600061204e8261137e565b90508073ffffffffffffffffffffffffffffffffffffffff1661206f612bd0565b73ffffffffffffffffffffffffffffffffffffffff16141580156120a1575061209f8161209a612bd0565b611d37565b155b156120d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360009054906101000a900460ff161580156121135750600a600083815260200190815260200160002060009054906101000a900460ff16155b15612187576121378373ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e90614fd9565b60405180910390fd5b612182838383612bfb565b612193565b612192838383612bfb565b5b505050565b6121a3838383612cad565b505050565b6121b0612bd0565b73ffffffffffffffffffffffffffffffffffffffff166121ce61166e565b73ffffffffffffffffffffffffffffffffffffffff1614612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b90615045565b60405180910390fd5b565b61224183838360405180602001604052806000815250611aff565b505050565b61224e6139f4565b61225782611fc0565b612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d906150d7565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106122fa5760017f0000000000000000000000000000000000000000000000000000000000000000846122ed91906150f7565b6122f79190614c2f565b90505b60008390505b818110612408576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123f457809350505050612444565b5080806124009061512b565b915050612300565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b906151c6565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008261251a8584613264565b1490509392505050565b61253e8282604051806020016040528060008152506132ba565b5050565b61254a612bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae90614f47565b60405180910390fd5b600360009054906101000a900460ff1615801561261e5750600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561278e576126428273ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990614fd9565b60405180910390fd5b806009600061268f612bd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661273c612bd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127819190613aff565b60405180910390a3612896565b806009600061279b612bd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612848612bd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161288d9190613aff565b60405180910390a35b5050565b6128a5848484612cad565b6128b184848484613799565b6128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790615258565b60405180910390fd5b50505050565b6060601180546129059061462f565b80601f01602080910402602001604051908101604052809291908181526020018280546129319061462f565b801561297e5780601f106129535761010080835404028352916020019161297e565b820191906000526020600020905b81548152906001019060200180831161296157829003601f168201915b5050505050905090565b6060600082036129cf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae3565b600082905060005b60008214612a015780806129ea9061481e565b915050600a826129fa91906152a7565b91506129d7565b60008167ffffffffffffffff811115612a1d57612a1c614214565b5b6040519080825280601f01601f191660200182016040528015612a4f5781602001600182028036833780820191505090505b5090505b60008514612adc57600182612a6891906150f7565b9150600a85612a7791906152d8565b6030612a839190614c2f565b60f81b818381518110612a9957612a98614ecc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad591906152a7565b9450612a53565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f9061537b565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612cb882612246565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612cdf612bd0565b73ffffffffffffffffffffffffffffffffffffffff161480612d3b5750612d04612bd0565b73ffffffffffffffffffffffffffffffffffffffff16612d2384610bfe565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d575750612d568260000151612d51612bd0565b611d37565b5b905080612d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d909061540d565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e029061549f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7190615531565b60405180910390fd5b612e878585856001613920565b612e976000848460000151612bfb565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612f05919061556d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612fa991906155a1565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846130af9190614c2f565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036131f45761312481611fc0565b156131f3576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325c8686866001613926565b505050505050565b60008082905060005b84518110156132af5761329a8286838151811061328d5761328c614ecc565b5b602002602001015161392c565b915080806132a79061481e565b91505061326d565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332790615659565b60405180910390fd5b61333981611fc0565b15613379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613370906156c5565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d390615757565b60405180910390fd5b6133e96000858386613920565b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134e691906155a1565b6fffffffffffffffffffffffffffffffff16815260200185836020015161350d91906155a1565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561377c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461371c6000888488613799565b61375b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375290615258565b60405180910390fd5b81806137669061481e565b92505080806137749061481e565b9150506136ab565b50806001819055506137916000878588613926565b505050505050565b60006137ba8473ffffffffffffffffffffffffffffffffffffffff16612bd8565b15613913578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137e3612bd0565b8786866040518563ffffffff1660e01b815260040161380594939291906157cc565b6020604051808303816000875af192505050801561384157506040513d601f19601f8201168201806040525081019061383e919061582d565b60015b6138c3573d8060008114613871576040519150601f19603f3d011682016040523d82523d6000602084013e613876565b606091505b5060008151036138bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b290615258565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613918565b600190505b949350505050565b50505050565b50505050565b60008183106139445761393f8284613957565b61394f565b61394e8383613957565b5b905092915050565b600082600052816020526040600020905092915050565b82805461397a9061462f565b90600052602060002090601f01602090048101928261399c57600085556139e3565b82601f106139b557803560ff19168380011785556139e3565b828001600101855582156139e3579182015b828111156139e25782358255916020019190600101906139c7565b5b5090506139f09190613a2e565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613a47576000816000905550600101613a2f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a9481613a5f565b8114613a9f57600080fd5b50565b600081359050613ab181613a8b565b92915050565b600060208284031215613acd57613acc613a55565b5b6000613adb84828501613aa2565b91505092915050565b60008115159050919050565b613af981613ae4565b82525050565b6000602082019050613b146000830184613af0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b54578082015181840152602081019050613b39565b83811115613b63576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b8582613b1a565b613b8f8185613b25565b9350613b9f818560208601613b36565b613ba881613b69565b840191505092915050565b60006020820190508181036000830152613bcd8184613b7a565b905092915050565b6000819050919050565b613be881613bd5565b8114613bf357600080fd5b50565b600081359050613c0581613bdf565b92915050565b600060208284031215613c2157613c20613a55565b5b6000613c2f84828501613bf6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c6382613c38565b9050919050565b613c7381613c58565b82525050565b6000602082019050613c8e6000830184613c6a565b92915050565b613c9d81613c58565b8114613ca857600080fd5b50565b600081359050613cba81613c94565b92915050565b60008060408385031215613cd757613cd6613a55565b5b6000613ce585828601613cab565b9250506020613cf685828601613bf6565b9150509250929050565b613d0981613bd5565b82525050565b6000602082019050613d246000830184613d00565b92915050565b600080600060608486031215613d4357613d42613a55565b5b6000613d5186828701613cab565b9350506020613d6286828701613cab565b9250506040613d7386828701613bf6565b9150509250925092565b6000819050919050565b613d9081613d7d565b82525050565b6000602082019050613dab6000830184613d87565b92915050565b6000819050919050565b6000613dd6613dd1613dcc84613c38565b613db1565b613c38565b9050919050565b6000613de882613dbb565b9050919050565b6000613dfa82613ddd565b9050919050565b613e0a81613def565b82525050565b6000602082019050613e256000830184613e01565b92915050565b613e3481613ae4565b8114613e3f57600080fd5b50565b600081359050613e5181613e2b565b92915050565b60008060408385031215613e6e57613e6d613a55565b5b6000613e7c85828601613bf6565b9250506020613e8d85828601613e42565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613ebc57613ebb613e97565b5b8235905067ffffffffffffffff811115613ed957613ed8613e9c565b5b602083019150836001820283011115613ef557613ef4613ea1565b5b9250929050565b60008060208385031215613f1357613f12613a55565b5b600083013567ffffffffffffffff811115613f3157613f30613a5a565b5b613f3d85828601613ea6565b92509250509250929050565b613f5281613d7d565b8114613f5d57600080fd5b50565b600081359050613f6f81613f49565b92915050565b600060208284031215613f8b57613f8a613a55565b5b6000613f9984828501613f60565b91505092915050565b600063ffffffff82169050919050565b613fbb81613fa2565b8114613fc657600080fd5b50565b600081359050613fd881613fb2565b92915050565b600060208284031215613ff457613ff3613a55565b5b600061400284828501613fc9565b91505092915050565b60006020828403121561402157614020613a55565b5b600061402f84828501613cab565b91505092915050565b60008083601f84011261404e5761404d613e97565b5b8235905067ffffffffffffffff81111561406b5761406a613e9c565b5b60208301915083602082028301111561408757614086613ea1565b5b9250929050565b600080602083850312156140a5576140a4613a55565b5b600083013567ffffffffffffffff8111156140c3576140c2613a5a565b5b6140cf85828601614038565b92509250509250929050565b6140e481613fa2565b82525050565b60006040820190506140ff60008301856140db565b61410c6020830184613d00565b9392505050565b61411c81613c58565b82525050565b600067ffffffffffffffff82169050919050565b61413f81614122565b82525050565b60408201600082015161415b6000850182614113565b50602082015161416e6020850182614136565b50505050565b60006040820190506141896000830184614145565b92915050565b600080604083850312156141a6576141a5613a55565b5b60006141b485828601613cab565b92505060206141c585828601613e42565b9150509250929050565b600080604083850312156141e6576141e5613a55565b5b60006141f485828601613fc9565b925050602061420585828601613bf6565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61424c82613b69565b810181811067ffffffffffffffff8211171561426b5761426a614214565b5b80604052505050565b600061427e613a4b565b905061428a8282614243565b919050565b600067ffffffffffffffff8211156142aa576142a9614214565b5b6142b382613b69565b9050602081019050919050565b82818337600083830152505050565b60006142e26142dd8461428f565b614274565b9050828152602081018484840111156142fe576142fd61420f565b5b6143098482856142c0565b509392505050565b600082601f83011261432657614325613e97565b5b81356143368482602086016142cf565b91505092915050565b6000806000806080858703121561435957614358613a55565b5b600061436787828801613cab565b945050602061437887828801613cab565b935050604061438987828801613bf6565b925050606085013567ffffffffffffffff8111156143aa576143a9613a5a565b5b6143b687828801614311565b91505092959194509250565b600080604083850312156143d9576143d8613a55565b5b60006143e785828601613cab565b92505060206143f885828601613cab565b9150509250929050565b600067ffffffffffffffff82111561441d5761441c614214565b5b602082029050602081019050919050565b600061444161443c84614402565b614274565b9050808382526020820190506020840283018581111561446457614463613ea1565b5b835b8181101561448d57806144798882613cab565b845260208401935050602081019050614466565b5050509392505050565b600082601f8301126144ac576144ab613e97565b5b81356144bc84826020860161442e565b91505092915050565b600067ffffffffffffffff8211156144e0576144df614214565b5b602082029050602081019050919050565b60006145046144ff846144c5565b614274565b9050808382526020820190506020840283018581111561452757614526613ea1565b5b835b81811015614550578061453c8882613e42565b845260208401935050602081019050614529565b5050509392505050565b600082601f83011261456f5761456e613e97565b5b813561457f8482602086016144f1565b91505092915050565b6000806040838503121561459f5761459e613a55565b5b600083013567ffffffffffffffff8111156145bd576145bc613a5a565b5b6145c985828601614497565b925050602083013567ffffffffffffffff8111156145ea576145e9613a5a565b5b6145f68582860161455a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061464757607f821691505b60208210810361465a57614659614600565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006146bc602d83613b25565b91506146c782614660565b604082019050919050565b600060208201905081810360008301526146eb816146af565b9050919050565b60006040820190506147076000830185613c6a565b6147146020830184613c6a565b9392505050565b60008151905061472a81613e2b565b92915050565b60006020828403121561474657614745613a55565b5b60006147548482850161471b565b91505092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b9602283613b25565b91506147c48261475d565b604082019050919050565b600060208201905081810360008301526147e8816147ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061482982613bd5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361485b5761485a6147ef565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006148c2602e83613b25565b91506148cd82614866565b604082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614954602383613b25565b915061495f826148f8565b604082019050919050565b6000602082019050818103600083015261498381614947565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006149e6602b83613b25565b91506149f18261498a565b604082019050919050565b60006020820190508181036000830152614a15816149d9565b9050919050565b60008160601b9050919050565b6000614a3482614a1c565b9050919050565b6000614a4682614a29565b9050919050565b614a5e614a5982613c58565b614a3b565b82525050565b6000614a708284614a4d565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614ab5600e83613b25565b9150614ac082614a7f565b602082019050919050565b60006020820190508181036000830152614ae481614aa8565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614b21601e83613b25565b9150614b2c82614aeb565b602082019050919050565b60006020820190508181036000830152614b5081614b14565b9050919050565b7f73616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b6000614b8d601883613b25565b9150614b9882614b57565b602082019050919050565b60006020820190508181036000830152614bbc81614b80565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000614bf9601283613b25565b9150614c0482614bc3565b602082019050919050565b60006020820190508181036000830152614c2881614bec565b9050919050565b6000614c3a82613bd5565b9150614c4583613bd5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7a57614c796147ef565b5b828201905092915050565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b6000614cbb601683613b25565b9150614cc682614c85565b602082019050919050565b60006020820190508181036000830152614cea81614cae565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d4d602f83613b25565b9150614d5882614cf1565b604082019050919050565b60006020820190508181036000830152614d7c81614d40565b9050919050565b600081905092915050565b6000614d9982613b1a565b614da38185614d83565b9350614db3818560208601613b36565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614df5600583614d83565b9150614e0082614dbf565b600582019050919050565b6000614e178285614d8e565b9150614e238284614d8e565b9150614e2e82614de8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e96602683613b25565b9150614ea182614e3a565b604082019050919050565b60006020820190508181036000830152614ec581614e89565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614f31601a83613b25565b9150614f3c82614efb565b602082019050919050565b60006020820190508181036000830152614f6081614f24565b9050919050565b7f53616c65732077696c6c206265206f70656e6564206166746572206d696e742060008201527f697320636f6d706c6574652e0000000000000000000000000000000000000000602082015250565b6000614fc3602c83613b25565b9150614fce82614f67565b604082019050919050565b60006020820190508181036000830152614ff281614fb6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061502f602083613b25565b915061503a82614ff9565b602082019050919050565b6000602082019050818103600083015261505e81615022565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006150c1602a83613b25565b91506150cc82615065565b604082019050919050565b600060208201905081810360008301526150f0816150b4565b9050919050565b600061510282613bd5565b915061510d83613bd5565b9250828210156151205761511f6147ef565b5b828203905092915050565b600061513682613bd5565b915060008203615149576151486147ef565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006151b0602f83613b25565b91506151bb82615154565b604082019050919050565b600060208201905081810360008301526151df816151a3565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000615242603383613b25565b915061524d826151e6565b604082019050919050565b6000602082019050818103600083015261527181615235565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152b282613bd5565b91506152bd83613bd5565b9250826152cd576152cc615278565b5b828204905092915050565b60006152e382613bd5565b91506152ee83613bd5565b9250826152fe576152fd615278565b5b828206905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000615365603183613b25565b915061537082615309565b604082019050919050565b6000602082019050818103600083015261539481615358565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006153f7603283613b25565b91506154028261539b565b604082019050919050565b60006020820190508181036000830152615426816153ea565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615489602683613b25565b91506154948261542d565b604082019050919050565b600060208201905081810360008301526154b88161547c565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061551b602583613b25565b9150615526826154bf565b604082019050919050565b6000602082019050818103600083015261554a8161550e565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061557882615551565b915061558383615551565b925082821015615596576155956147ef565b5b828203905092915050565b60006155ac82615551565b91506155b783615551565b9250826fffffffffffffffffffffffffffffffff038211156155dc576155db6147ef565b5b828201905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615643602183613b25565b915061564e826155e7565b604082019050919050565b6000602082019050818103600083015261567281615636565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b60006156af601d83613b25565b91506156ba82615679565b602082019050919050565b600060208201905081810360008301526156de816156a2565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615741602283613b25565b915061574c826156e5565b604082019050919050565b6000602082019050818103600083015261577081615734565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061579e82615777565b6157a88185615782565b93506157b8818560208601613b36565b6157c181613b69565b840191505092915050565b60006080820190506157e16000830187613c6a565b6157ee6020830186613c6a565b6157fb6040830185613d00565b818103606083015261580d8184615793565b905095945050505050565b60008151905061582781613a8b565b92915050565b60006020828403121561584357615842613a55565b5b600061585184828501615818565b9150509291505056fea26469706673582212201ea1cb535ee8602ad0053f84de6c1c17b59d63bab17b89ea80d05e3dc9a57f2264736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000002710

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063b1f7f0eb116100b6578063d5abeb011161007a578063d5abeb0114610900578063d7224ba01461092b578063dc33e68114610956578063e985e9c514610993578063f2fde38b146109d0578063fdb8e34e146109f95761025c565b8063b1f7f0eb146107f7578063b758f90314610834578063b88d4fde1461085d578063c080519714610886578063c87b56dd146108c35761025c565b806390aa0b0f1161010857806390aa0b0f146106f35780639231ab2a1461071f57806395d89b411461075c5780639dfde201146107875780639fb17e34146107b2578063a22cb465146107ce5761025c565b8063715018a614610632578063801fe59b146106495780638942932d146106605780638bc35c2f1461069d5780638da5cb5b146106c85761025c565b806341f43434116101dd57806355a55465116101a157806355a554651461051457806355f804b31461053d5780636352211e1461056657806367ba5ecc146105a35780636f58ec48146105cc57806370a08231146105f55761025c565b806341f434341461042d57806342842e0e146104585780634aaf78f1146104815780634c0f38c2146104ac5780634f6ccce7146104d75761025c565b806323b872dd1161022457806323b872dd1461035a5780632a13614c146103835780632f745c59146103ae5780633ccfd60b146103eb5780633f5e4741146104025761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b31461030657806318160ddd1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613ab7565b610a22565b6040516102959190613aff565b60405180910390f35b3480156102aa57600080fd5b506102b3610b6c565b6040516102c09190613bb3565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613c0b565b610bfe565b6040516102fd9190613c79565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613cc0565b610c83565b005b34801561033b57600080fd5b50610344610d8d565b6040516103519190613d0f565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613d2a565b610d97565b005b34801561038f57600080fd5b50610398610ee7565b6040516103a59190613d96565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613cc0565b610eed565b6040516103e29190613d0f565b60405180910390f35b3480156103f757600080fd5b506104006110e9565b005b34801561040e57600080fd5b5061041761110a565b6040516104249190613aff565b60405180910390f35b34801561043957600080fd5b50610442611157565b60405161044f9190613e10565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613d2a565b611169565b005b34801561048d57600080fd5b506104966112b9565b6040516104a39190613aff565b60405180910390f35b3480156104b857600080fd5b506104c16112cc565b6040516104ce9190613d0f565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613c0b565b6112d6565b60405161050b9190613d0f565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190613e57565b611329565b005b34801561054957600080fd5b50610564600480360381019061055f9190613efc565b611360565b005b34801561057257600080fd5b5061058d60048036038101906105889190613c0b565b61137e565b60405161059a9190613c79565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613f75565b611394565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613fde565b6113a6565b005b34801561060157600080fd5b5061061c6004803603810190610617919061400b565b6113d5565b6040516106299190613d0f565b60405180910390f35b34801561063e57600080fd5b506106476114bd565b005b34801561065557600080fd5b5061065e6114d1565b005b34801561066c57600080fd5b506106876004803603810190610682919061408e565b611505565b6040516106949190613aff565b60405180910390f35b3480156106a957600080fd5b506106b261164a565b6040516106bf9190613d0f565b60405180910390f35b3480156106d457600080fd5b506106dd61166e565b6040516106ea9190613c79565b60405180910390f35b3480156106ff57600080fd5b50610708611697565b6040516107169291906140ea565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613c0b565b6116b9565b6040516107539190614174565b60405180910390f35b34801561076857600080fd5b506107716116d1565b60405161077e9190613bb3565b60405180910390f35b34801561079357600080fd5b5061079c611763565b6040516107a99190613d0f565b60405180910390f35b6107cc60048036038101906107c79190613c0b565b611768565b005b3480156107da57600080fd5b506107f560048036038101906107f0919061418f565b611978565b005b34801561080357600080fd5b5061081e6004803603810190610819919061400b565b611a82565b60405161082b9190613aff565b60405180910390f35b34801561084057600080fd5b5061085b600480360381019061085691906141cf565b611aa2565b005b34801561086957600080fd5b50610884600480360381019061087f919061433f565b611aff565b005b34801561089257600080fd5b506108ad60048036038101906108a89190613c0b565b611c52565b6040516108ba9190613aff565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613c0b565b611c72565b6040516108f79190613bb3565b60405180910390f35b34801561090c57600080fd5b50610915611d19565b6040516109229190613d0f565b60405180910390f35b34801561093757600080fd5b50610940611d1f565b60405161094d9190613d0f565b60405180910390f35b34801561096257600080fd5b5061097d6004803603810190610978919061400b565b611d25565b60405161098a9190613d0f565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b591906143c2565b611d37565b6040516109c79190613aff565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f2919061400b565b611e1c565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190614588565b611e9f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b655750610b6482611f56565b5b9050919050565b606060048054610b7b9061462f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba79061462f565b8015610bf45780601f10610bc957610100808354040283529160200191610bf4565b820191906000526020600020905b815481529060010190602001808311610bd757829003601f168201915b5050505050905090565b6000610c0982611fc0565b610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f906146d2565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d7e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610cfb9291906146f2565b602060405180830381865afa158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190614730565b610d7d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d749190613c79565b60405180910390fd5b5b610d888383611fce565b505050565b6000600154905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ed5573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e0957610e04848484612198565b610ee1565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e529291906146f2565b602060405180830381865afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190614730565b610ed457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ecb9190613c79565b60405180910390fd5b5b610ee0848484612198565b5b50505050565b60025481565b6000610ef8836113d5565b8210610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f30906147cf565b60405180910390fd5b6000610f43610d8d565b905060008060005b838110156110a7576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461103d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611093578684036110845781955050505050506110e3565b838061108f9061481e565b9450505b50808061109f9061481e565b915050610f4b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da906148d8565b60405180910390fd5b92915050565b6110f16121a8565b3373ffffffffffffffffffffffffffffffffffffffff16ff5b600080600f60000160009054906101000a900463ffffffff1663ffffffff16141580156111525750600f60000160009054906101000a900463ffffffff1663ffffffff164210155b905090565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156112a7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111db576111d6848484612226565b6112b3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016112249291906146f2565b602060405180830381865afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112659190614730565b6112a657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161129d9190613c79565b60405180910390fd5b5b6112b2848484612226565b5b50505050565b600360009054906101000a900460ff1681565b6000600e54905090565b60006112e0610d8d565b8210611321576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113189061496a565b60405180910390fd5b819050919050565b6113316121a8565b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6113686121a8565b81816011919061137992919061396e565b505050565b600061138982612246565b600001519050919050565b61139c6121a8565b8060028190555050565b6113ae6121a8565b80600f60000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906149fc565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114c56121a8565b6114cf6000612449565b565b6114d96121a8565b600360009054906101000a900460ff1615600360006101000a81548160ff021916908315150217905550565b600080336040516020016115199190614a64565b6040516020818303038152906040528051906020012090506000326040516020016115449190614a64565b6040516020818303038152906040528051906020012090506115aa858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548461250d565b806115ff57506115fe858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548361250d565b5b61163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590614acb565b60405180910390fd5b60019250505092915050565b7f000000000000000000000000000000000000000000000000000000000000001481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f8060000160009054906101000a900463ffffffff16908060010154905082565b6116c16139f4565b6116ca82612246565b9050919050565b6060600580546116e09061462f565b80601f016020809104026020016040519081016040528092919081815260200182805461170c9061462f565b80156117595780601f1061172e57610100808354040283529160200191611759565b820191906000526020600020905b81548152906001019060200180831161173c57829003601f168201915b5050505050905090565b600081565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90614b37565b60405180910390fd5b6117de61110a565b61181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614ba3565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000014811115611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790614c0f565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002710816118aa610d8d565b6118b49190614c2f565b11156118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90614c0f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000148161192033611d25565b61192a9190614c2f565b111561196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614cd1565b60405180910390fd5b6119753382612524565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a73576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119f09291906146f2565b602060405180830381865afa158015611a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a319190614730565b611a7257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a699190613c79565b60405180910390fd5b5b611a7d8383612542565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b611aaa6121a8565b60405180604001604052808363ffffffff16815260200182815250600f60008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c3e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b7257611b6d8585858561289a565b611c4b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611bbb9291906146f2565b602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190614730565b611c3d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c349190613c79565b60405180910390fd5b5b611c4a8585858561289a565b5b5050505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6060611c7d82611fc0565b611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614d63565b60405180910390fd5b6000611cc66128f6565b90506000815111611ce65760405180602001604052806000815250611d11565b80611cf084612988565b604051602001611d01929190614e0b565b6040516020818303038152906040525b915050919050565b600e5481565b600c5481565b6000611d3082612ae8565b9050919050565b600073aba85cef4c2d276c2dd730748676874be0cac90473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d895760019050611e16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b92915050565b611e246121a8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90614eac565b60405180910390fd5b611e9c81612449565b50565b611ea76121a8565b60005b8251811015611f5157818181518110611ec657611ec5614ecc565b5b6020026020010151600b6000858481518110611ee557611ee4614ecc565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f499061481e565b915050611eaa565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b611fd6612bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a90614f47565b60405180910390fd5b600061204e8261137e565b90508073ffffffffffffffffffffffffffffffffffffffff1661206f612bd0565b73ffffffffffffffffffffffffffffffffffffffff16141580156120a1575061209f8161209a612bd0565b611d37565b155b156120d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360009054906101000a900460ff161580156121135750600a600083815260200190815260200160002060009054906101000a900460ff16155b15612187576121378373ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e90614fd9565b60405180910390fd5b612182838383612bfb565b612193565b612192838383612bfb565b5b505050565b6121a3838383612cad565b505050565b6121b0612bd0565b73ffffffffffffffffffffffffffffffffffffffff166121ce61166e565b73ffffffffffffffffffffffffffffffffffffffff1614612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b90615045565b60405180910390fd5b565b61224183838360405180602001604052806000815250611aff565b505050565b61224e6139f4565b61225782611fc0565b612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d906150d7565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000001483106122fa5760017f0000000000000000000000000000000000000000000000000000000000000014846122ed91906150f7565b6122f79190614c2f565b90505b60008390505b818110612408576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123f457809350505050612444565b5080806124009061512b565b915050612300565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b906151c6565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008261251a8584613264565b1490509392505050565b61253e8282604051806020016040528060008152506132ba565b5050565b61254a612bd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae90614f47565b60405180910390fd5b600360009054906101000a900460ff1615801561261e5750600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561278e576126428273ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990614fd9565b60405180910390fd5b806009600061268f612bd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661273c612bd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127819190613aff565b60405180910390a3612896565b806009600061279b612bd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612848612bd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161288d9190613aff565b60405180910390a35b5050565b6128a5848484612cad565b6128b184848484613799565b6128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790615258565b60405180910390fd5b50505050565b6060601180546129059061462f565b80601f01602080910402602001604051908101604052809291908181526020018280546129319061462f565b801561297e5780601f106129535761010080835404028352916020019161297e565b820191906000526020600020905b81548152906001019060200180831161296157829003601f168201915b5050505050905090565b6060600082036129cf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae3565b600082905060005b60008214612a015780806129ea9061481e565b915050600a826129fa91906152a7565b91506129d7565b60008167ffffffffffffffff811115612a1d57612a1c614214565b5b6040519080825280601f01601f191660200182016040528015612a4f5781602001600182028036833780820191505090505b5090505b60008514612adc57600182612a6891906150f7565b9150600a85612a7791906152d8565b6030612a839190614c2f565b60f81b818381518110612a9957612a98614ecc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad591906152a7565b9450612a53565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f9061537b565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612cb882612246565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612cdf612bd0565b73ffffffffffffffffffffffffffffffffffffffff161480612d3b5750612d04612bd0565b73ffffffffffffffffffffffffffffffffffffffff16612d2384610bfe565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d575750612d568260000151612d51612bd0565b611d37565b5b905080612d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d909061540d565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e029061549f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7190615531565b60405180910390fd5b612e878585856001613920565b612e976000848460000151612bfb565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612f05919061556d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612fa991906155a1565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846130af9190614c2f565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036131f45761312481611fc0565b156131f3576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325c8686866001613926565b505050505050565b60008082905060005b84518110156132af5761329a8286838151811061328d5761328c614ecc565b5b602002602001015161392c565b915080806132a79061481e565b91505061326d565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332790615659565b60405180910390fd5b61333981611fc0565b15613379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613370906156c5565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000148311156133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d390615757565b60405180910390fd5b6133e96000858386613920565b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516134e691906155a1565b6fffffffffffffffffffffffffffffffff16815260200185836020015161350d91906155a1565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561377c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461371c6000888488613799565b61375b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375290615258565b60405180910390fd5b81806137669061481e565b92505080806137749061481e565b9150506136ab565b50806001819055506137916000878588613926565b505050505050565b60006137ba8473ffffffffffffffffffffffffffffffffffffffff16612bd8565b15613913578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137e3612bd0565b8786866040518563ffffffff1660e01b815260040161380594939291906157cc565b6020604051808303816000875af192505050801561384157506040513d601f19601f8201168201806040525081019061383e919061582d565b60015b6138c3573d8060008114613871576040519150601f19603f3d011682016040523d82523d6000602084013e613876565b606091505b5060008151036138bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b290615258565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613918565b600190505b949350505050565b50505050565b50505050565b60008183106139445761393f8284613957565b61394f565b61394e8383613957565b5b905092915050565b600082600052816020526040600020905092915050565b82805461397a9061462f565b90600052602060002090601f01602090048101928261399c57600085556139e3565b82601f106139b557803560ff19168380011785556139e3565b828001600101855582156139e3579182015b828111156139e25782358255916020019190600101906139c7565b5b5090506139f09190613a2e565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613a47576000816000905550600101613a2f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a9481613a5f565b8114613a9f57600080fd5b50565b600081359050613ab181613a8b565b92915050565b600060208284031215613acd57613acc613a55565b5b6000613adb84828501613aa2565b91505092915050565b60008115159050919050565b613af981613ae4565b82525050565b6000602082019050613b146000830184613af0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b54578082015181840152602081019050613b39565b83811115613b63576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b8582613b1a565b613b8f8185613b25565b9350613b9f818560208601613b36565b613ba881613b69565b840191505092915050565b60006020820190508181036000830152613bcd8184613b7a565b905092915050565b6000819050919050565b613be881613bd5565b8114613bf357600080fd5b50565b600081359050613c0581613bdf565b92915050565b600060208284031215613c2157613c20613a55565b5b6000613c2f84828501613bf6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c6382613c38565b9050919050565b613c7381613c58565b82525050565b6000602082019050613c8e6000830184613c6a565b92915050565b613c9d81613c58565b8114613ca857600080fd5b50565b600081359050613cba81613c94565b92915050565b60008060408385031215613cd757613cd6613a55565b5b6000613ce585828601613cab565b9250506020613cf685828601613bf6565b9150509250929050565b613d0981613bd5565b82525050565b6000602082019050613d246000830184613d00565b92915050565b600080600060608486031215613d4357613d42613a55565b5b6000613d5186828701613cab565b9350506020613d6286828701613cab565b9250506040613d7386828701613bf6565b9150509250925092565b6000819050919050565b613d9081613d7d565b82525050565b6000602082019050613dab6000830184613d87565b92915050565b6000819050919050565b6000613dd6613dd1613dcc84613c38565b613db1565b613c38565b9050919050565b6000613de882613dbb565b9050919050565b6000613dfa82613ddd565b9050919050565b613e0a81613def565b82525050565b6000602082019050613e256000830184613e01565b92915050565b613e3481613ae4565b8114613e3f57600080fd5b50565b600081359050613e5181613e2b565b92915050565b60008060408385031215613e6e57613e6d613a55565b5b6000613e7c85828601613bf6565b9250506020613e8d85828601613e42565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613ebc57613ebb613e97565b5b8235905067ffffffffffffffff811115613ed957613ed8613e9c565b5b602083019150836001820283011115613ef557613ef4613ea1565b5b9250929050565b60008060208385031215613f1357613f12613a55565b5b600083013567ffffffffffffffff811115613f3157613f30613a5a565b5b613f3d85828601613ea6565b92509250509250929050565b613f5281613d7d565b8114613f5d57600080fd5b50565b600081359050613f6f81613f49565b92915050565b600060208284031215613f8b57613f8a613a55565b5b6000613f9984828501613f60565b91505092915050565b600063ffffffff82169050919050565b613fbb81613fa2565b8114613fc657600080fd5b50565b600081359050613fd881613fb2565b92915050565b600060208284031215613ff457613ff3613a55565b5b600061400284828501613fc9565b91505092915050565b60006020828403121561402157614020613a55565b5b600061402f84828501613cab565b91505092915050565b60008083601f84011261404e5761404d613e97565b5b8235905067ffffffffffffffff81111561406b5761406a613e9c565b5b60208301915083602082028301111561408757614086613ea1565b5b9250929050565b600080602083850312156140a5576140a4613a55565b5b600083013567ffffffffffffffff8111156140c3576140c2613a5a565b5b6140cf85828601614038565b92509250509250929050565b6140e481613fa2565b82525050565b60006040820190506140ff60008301856140db565b61410c6020830184613d00565b9392505050565b61411c81613c58565b82525050565b600067ffffffffffffffff82169050919050565b61413f81614122565b82525050565b60408201600082015161415b6000850182614113565b50602082015161416e6020850182614136565b50505050565b60006040820190506141896000830184614145565b92915050565b600080604083850312156141a6576141a5613a55565b5b60006141b485828601613cab565b92505060206141c585828601613e42565b9150509250929050565b600080604083850312156141e6576141e5613a55565b5b60006141f485828601613fc9565b925050602061420585828601613bf6565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61424c82613b69565b810181811067ffffffffffffffff8211171561426b5761426a614214565b5b80604052505050565b600061427e613a4b565b905061428a8282614243565b919050565b600067ffffffffffffffff8211156142aa576142a9614214565b5b6142b382613b69565b9050602081019050919050565b82818337600083830152505050565b60006142e26142dd8461428f565b614274565b9050828152602081018484840111156142fe576142fd61420f565b5b6143098482856142c0565b509392505050565b600082601f83011261432657614325613e97565b5b81356143368482602086016142cf565b91505092915050565b6000806000806080858703121561435957614358613a55565b5b600061436787828801613cab565b945050602061437887828801613cab565b935050604061438987828801613bf6565b925050606085013567ffffffffffffffff8111156143aa576143a9613a5a565b5b6143b687828801614311565b91505092959194509250565b600080604083850312156143d9576143d8613a55565b5b60006143e785828601613cab565b92505060206143f885828601613cab565b9150509250929050565b600067ffffffffffffffff82111561441d5761441c614214565b5b602082029050602081019050919050565b600061444161443c84614402565b614274565b9050808382526020820190506020840283018581111561446457614463613ea1565b5b835b8181101561448d57806144798882613cab565b845260208401935050602081019050614466565b5050509392505050565b600082601f8301126144ac576144ab613e97565b5b81356144bc84826020860161442e565b91505092915050565b600067ffffffffffffffff8211156144e0576144df614214565b5b602082029050602081019050919050565b60006145046144ff846144c5565b614274565b9050808382526020820190506020840283018581111561452757614526613ea1565b5b835b81811015614550578061453c8882613e42565b845260208401935050602081019050614529565b5050509392505050565b600082601f83011261456f5761456e613e97565b5b813561457f8482602086016144f1565b91505092915050565b6000806040838503121561459f5761459e613a55565b5b600083013567ffffffffffffffff8111156145bd576145bc613a5a565b5b6145c985828601614497565b925050602083013567ffffffffffffffff8111156145ea576145e9613a5a565b5b6145f68582860161455a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061464757607f821691505b60208210810361465a57614659614600565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006146bc602d83613b25565b91506146c782614660565b604082019050919050565b600060208201905081810360008301526146eb816146af565b9050919050565b60006040820190506147076000830185613c6a565b6147146020830184613c6a565b9392505050565b60008151905061472a81613e2b565b92915050565b60006020828403121561474657614745613a55565b5b60006147548482850161471b565b91505092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b9602283613b25565b91506147c48261475d565b604082019050919050565b600060208201905081810360008301526147e8816147ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061482982613bd5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361485b5761485a6147ef565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006148c2602e83613b25565b91506148cd82614866565b604082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614954602383613b25565b915061495f826148f8565b604082019050919050565b6000602082019050818103600083015261498381614947565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006149e6602b83613b25565b91506149f18261498a565b604082019050919050565b60006020820190508181036000830152614a15816149d9565b9050919050565b60008160601b9050919050565b6000614a3482614a1c565b9050919050565b6000614a4682614a29565b9050919050565b614a5e614a5982613c58565b614a3b565b82525050565b6000614a708284614a4d565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614ab5600e83613b25565b9150614ac082614a7f565b602082019050919050565b60006020820190508181036000830152614ae481614aa8565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614b21601e83613b25565b9150614b2c82614aeb565b602082019050919050565b60006020820190508181036000830152614b5081614b14565b9050919050565b7f73616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b6000614b8d601883613b25565b9150614b9882614b57565b602082019050919050565b60006020820190508181036000830152614bbc81614b80565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000614bf9601283613b25565b9150614c0482614bc3565b602082019050919050565b60006020820190508181036000830152614c2881614bec565b9050919050565b6000614c3a82613bd5565b9150614c4583613bd5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7a57614c796147ef565b5b828201905092915050565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b6000614cbb601683613b25565b9150614cc682614c85565b602082019050919050565b60006020820190508181036000830152614cea81614cae565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d4d602f83613b25565b9150614d5882614cf1565b604082019050919050565b60006020820190508181036000830152614d7c81614d40565b9050919050565b600081905092915050565b6000614d9982613b1a565b614da38185614d83565b9350614db3818560208601613b36565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614df5600583614d83565b9150614e0082614dbf565b600582019050919050565b6000614e178285614d8e565b9150614e238284614d8e565b9150614e2e82614de8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e96602683613b25565b9150614ea182614e3a565b604082019050919050565b60006020820190508181036000830152614ec581614e89565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614f31601a83613b25565b9150614f3c82614efb565b602082019050919050565b60006020820190508181036000830152614f6081614f24565b9050919050565b7f53616c65732077696c6c206265206f70656e6564206166746572206d696e742060008201527f697320636f6d706c6574652e0000000000000000000000000000000000000000602082015250565b6000614fc3602c83613b25565b9150614fce82614f67565b604082019050919050565b60006020820190508181036000830152614ff281614fb6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061502f602083613b25565b915061503a82614ff9565b602082019050919050565b6000602082019050818103600083015261505e81615022565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006150c1602a83613b25565b91506150cc82615065565b604082019050919050565b600060208201905081810360008301526150f0816150b4565b9050919050565b600061510282613bd5565b915061510d83613bd5565b9250828210156151205761511f6147ef565b5b828203905092915050565b600061513682613bd5565b915060008203615149576151486147ef565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006151b0602f83613b25565b91506151bb82615154565b604082019050919050565b600060208201905081810360008301526151df816151a3565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000615242603383613b25565b915061524d826151e6565b604082019050919050565b6000602082019050818103600083015261527181615235565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152b282613bd5565b91506152bd83613bd5565b9250826152cd576152cc615278565b5b828204905092915050565b60006152e382613bd5565b91506152ee83613bd5565b9250826152fe576152fd615278565b5b828206905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000615365603183613b25565b915061537082615309565b604082019050919050565b6000602082019050818103600083015261539481615358565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006153f7603283613b25565b91506154028261539b565b604082019050919050565b60006020820190508181036000830152615426816153ea565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615489602683613b25565b91506154948261542d565b604082019050919050565b600060208201905081810360008301526154b88161547c565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061551b602583613b25565b9150615526826154bf565b604082019050919050565b6000602082019050818103600083015261554a8161550e565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061557882615551565b915061558383615551565b925082821015615596576155956147ef565b5b828203905092915050565b60006155ac82615551565b91506155b783615551565b9250826fffffffffffffffffffffffffffffffff038211156155dc576155db6147ef565b5b828201905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615643602183613b25565b915061564e826155e7565b604082019050919050565b6000602082019050818103600083015261567281615636565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b60006156af601d83613b25565b91506156ba82615679565b602082019050919050565b600060208201905081810360008301526156de816156a2565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615741602283613b25565b915061574c826156e5565b604082019050919050565b6000602082019050818103600083015261577081615734565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061579e82615777565b6157a88185615782565b93506157b8818560208601613b36565b6157c181613b69565b840191505092915050565b60006080820190506157e16000830187613c6a565b6157ee6020830186613c6a565b6157fb6040830185613d00565b818103606083015261580d8184615793565b905095945050505050565b60008151905061582781613a8b565b92915050565b60006020828403121561584357615842613a55565b5b600061585184828501615818565b9150509291505056fea26469706673582212201ea1cb535ee8602ad0053f84de6c1c17b59d63bab17b89ea80d05e3dc9a57f2264736f6c634300080e0033

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

00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000002710

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 20
Arg [1] : collectionSize_ (uint256): 10000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710


Deployed Bytecode Sourcemap

60359:3213:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46086:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47812:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50712:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61151:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44647:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61316:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42603:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45278:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62995:87;;;;;;;;;;;;;:::i;:::-;;62451:163;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2922:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61487:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42805:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61900:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44810:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48975:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63202:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47635:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49368:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62842:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46512:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40745:103;;;;;;;;;;;;;:::i;:::-;;48861:106;;;;;;;;;;;;;:::i;:::-;;49506:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60451:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40097:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60616:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63421:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47967:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62620:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61987:458;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60967:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43818:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62666:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61666:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43668:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48128:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60504:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56944:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63308:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51759:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41003:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49123:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46086:370;46213:4;46258:25;46243:40;;;:11;:40;;;;:99;;;;46309:33;46294:48;;;:11;:48;;;;46243:99;:160;;;;46368:35;46353:50;;;:11;:50;;;;46243:160;:207;;;;46414:36;46438:11;46414:23;:36::i;:::-;46243:207;46229:221;;46086:370;;;:::o;47812:94::-;47866:13;47895:5;47888:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47812:94;:::o;50712:204::-;50780:7;50804:16;50812:7;50804;:16::i;:::-;50796:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50886:15;:24;50902:7;50886:24;;;;;;;;;;;;;;;;;;;;;50879:31;;50712:204;;;:::o;61151:157::-;61247:8;4964:1;3022:42;4916:45;;;:49;4912:225;;;3022:42;4987;;;5038:4;5045:8;4987:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4982:144;;5101:8;5082:28;;;;;;;;;;;:::i;:::-;;;;;;;;4982:144;4912:225;61268:32:::1;61282:8;61292:7;61268:13;:32::i;:::-;61151:157:::0;;;:::o;44647:94::-;44700:7;44723:12;;44716:19;;44647:94;:::o;61316:163::-;61417:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61434:37:::1;61453:4;61459:2;61463:7;61434:18;:37::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61434:37:::1;61453:4;61459:2;61463:7;61434:18;:37::i;:::-;61316:163:::0;;;;;:::o;42603:38::-;;;;:::o;45278:744::-;45387:7;45422:16;45432:5;45422:9;:16::i;:::-;45414:5;:24;45406:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45484:22;45509:13;:11;:13::i;:::-;45484:38;;45529:19;45559:25;45609:9;45604:350;45628:14;45624:1;:18;45604:350;;;45658:31;45692:11;:14;45704:1;45692:14;;;;;;;;;;;45658:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45745:1;45719:28;;:9;:14;;;:28;;;45715:89;;45780:9;:14;;;45760:34;;45715:89;45837:5;45816:26;;:17;:26;;;45812:135;;45874:5;45859:11;:20;45855:59;;45901:1;45894:8;;;;;;;;;45855:59;45924:13;;;;;:::i;:::-;;;;45812:135;45649:305;45644:3;;;;;:::i;:::-;;;;45604:350;;;;45960:56;;;;;;;;;;:::i;:::-;;;;;;;;45278:744;;;;;:::o;62995:87::-;39983:13;:11;:13::i;:::-;63064:10:::1;63043:33;;;62451:163:::0;62498:4;62553:1;62525:10;:24;;;;;;;;;;;;:29;;;;:83;;;;;62584:10;:24;;;;;;;;;;;;62565:43;;:15;:43;;62525:83;62511:97;;62451:163;:::o;2922:143::-;3022:42;2922:143;:::o;61487:171::-;61592:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61609:41:::1;61632:4;61638:2;61642:7;61609:22;:41::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61609:41:::1;61632:4;61638:2;61642:7;61609:22;:41::i;:::-;61487:171:::0;;;;;:::o;42805:37::-;;;;;;;;;;;;;:::o;61900:81::-;61944:7;61966:9;;61959:16;;61900:81;:::o;44810:177::-;44877:7;44909:13;:11;:13::i;:::-;44901:5;:21;44893:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44976:5;44969:12;;44810:177;;;:::o;48975:140::-;39983:13;:11;:13::i;:::-;49101:6:::1;49069:19;:29;49089:8;49069:29;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;48975:140:::0;;:::o;63202:100::-;39983:13;:11;:13::i;:::-;63289:7:::1;;63273:13;:23;;;;;;;:::i;:::-;;63202:100:::0;;:::o;47635:118::-;47699:7;47722:20;47734:7;47722:11;:20::i;:::-;:25;;;47715:32;;47635:118;;;:::o;49368:130::-;39983:13;:11;:13::i;:::-;49479:11:::1;49453:23;:37;;;;49368:130:::0;:::o;62842:112::-;39983:13;:11;:13::i;:::-;62939:9:::1;62912:10;:24;;;:36;;;;;;;;;;;;;;;;;;62842:112:::0;:::o;46512:211::-;46576:7;46617:1;46600:19;;:5;:19;;;46592:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;46689:12;:19;46702:5;46689:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;46681:36;;46674:43;;46512:211;;;:::o;40745:103::-;39983:13;:11;:13::i;:::-;40810:30:::1;40837:1;40810:18;:30::i;:::-;40745:103::o:0;48861:106::-;39983:13;:11;:13::i;:::-;48942:17:::1;;;;;;;;;;;48941:18;48921:17;;:38;;;;;;;;;;;;;;;;;;48861:106::o:0;49506:415::-;49586:4;49603:12;49645:10;49628:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49618:39;;;;;;49603:54;;49668:13;49711:9;49694:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49684:38;;;;;;49668:54;;49741:63;49760:12;;49741:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49774:23;;49799:4;49741:18;:63::i;:::-;:131;;;;49808:64;49827:12;;49808:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49841:23;;49866:5;49808:18;:64::i;:::-;49741:131;49733:158;;;;;;;;;;;;:::i;:::-;;;;;;;;;49909:4;49902:11;;;;49506:415;;;;:::o;60451:48::-;;;:::o;40097:87::-;40143:7;40170:6;;;;;;;;;;;40163:13;;40097:87;:::o;60616:28::-;;;;;;;;;;;;;;;;;;;;;;;:::o;63421:147::-;63502:21;;:::i;:::-;63542:20;63554:7;63542:11;:20::i;:::-;63535:27;;63421:147;;;:::o;47967:98::-;48023:13;48052:7;48045:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47967:98;:::o;62620:39::-;62652:7;62620:39;:::o;61987:458::-;60900:10;60887:23;;:9;:23;;;60879:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62074:16:::1;:14;:16::i;:::-;62066:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;62145:23;62133:8;:35;;62125:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62234:14;62222:8;62206:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;62198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62338:23;62326:8;62299:24;62312:10;62299:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;62283:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;62408:31;62418:10;62430:8;62408:9;:31::i;:::-;61987:458:::0;:::o;60967:176::-;61071:8;4964:1;3022:42;4916:45;;;:49;4912:225;;;3022:42;4987;;;5038:4;5045:8;4987:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4982:144;;5101:8;5082:28;;;;;;;;;;;:::i;:::-;;;;;;;;4982:144;4912:225;61092:43:::1;61116:8;61126;61092:23;:43::i;:::-;60967:176:::0;;;:::o;43818:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;62666:170::-;39983:13;:11;:13::i;:::-;62781:49:::1;;;;;;;;62798:13;62781:49;;;;;;62818:5;62781:49;;::::0;62768:10:::1;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62666:170:::0;;:::o;61666:228::-;61817:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61839:47:::1;61862:4;61868:2;61872:7;61881:4;61839:22;:47::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61839:47:::1;61862:4;61868:2;61872:7;61881:4;61839:22;:47::i;:::-;61666:228:::0;;;;;;:::o;43668:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;48128:401::-;48226:13;48267:16;48275:7;48267;:16::i;:::-;48251:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;48357:21;48381:10;:8;:10::i;:::-;48357:34;;48436:1;48418:7;48412:21;:25;:111;;;;;;;;;;;;;;;;;48473:7;48481:18;:7;:16;:18::i;:::-;48456:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48412:111;48398:125;;;48128:401;;;:::o;60504:28::-;;;;:::o;56944:43::-;;;;:::o;63308:107::-;63366:7;63389:20;63403:5;63389:13;:20::i;:::-;63382:27;;63308:107;;;:::o;51759:262::-;51881:4;51910:42;51900:52;;:8;:52;;;51897:70;;51961:4;51954:11;;;;51897:70;51980:18;:25;51999:5;51980:25;;;;;;;;;;;;;;;:35;52006:8;51980:35;;;;;;;;;;;;;;;;;;;;;;;;;51973:42;;51759:262;;;;;:::o;41003:201::-;39983:13;:11;:13::i;:::-;41112:1:::1;41092:22;;:8;:22;;::::0;41084:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41168:28;41187:8;41168:18;:28::i;:::-;41003:201:::0;:::o;49123:237::-;39983:13;:11;:13::i;:::-;49240:9:::1;49235:118;49259:8;:15;49255:1;:19;49235:118;;;49334:6;49341:1;49334:9;;;;;;;;:::i;:::-;;;;;;;;49292:26;:39;49319:8;49328:1;49319:11;;;;;;;;:::i;:::-;;;;;;;;49292:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;49276:3;;;;;:::i;:::-;;;;49235:118;;;;49123:237:::0;;:::o;17057:157::-;17142:4;17181:25;17166:40;;;:11;:40;;;;17159:47;;17057:157;;;:::o;53079:105::-;53136:4;53166:12;;53156:7;:22;53149:29;;53079:105;;;:::o;49977:677::-;50072:12;:10;:12::i;:::-;50066:18;;:2;:18;;;50058:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50126:13;50142:24;50158:7;50142:15;:24::i;:::-;50126:40;;50197:5;50181:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;50207:37;50224:5;50231:12;:10;:12::i;:::-;50207:16;:37::i;:::-;50206:38;50181:63;50177:138;;;50268:35;;;;;;;;;;;;;;50177:138;50329:17;;;;;;;;;;;50328:18;:51;;;;;50351:19;:28;50371:7;50351:28;;;;;;;;;;;;;;;;;;;;;50350:29;50328:51;50325:322;;;50399:15;:2;:13;;;:15::i;:::-;50395:180;;;50435:55;;;;;;;;;;:::i;:::-;;;;;;;;50395:180;50531:28;50540:2;50544:7;50553:5;50531:8;:28::i;:::-;50325:322;;;50607:28;50616:2;50620:7;50629:5;50607:8;:28::i;:::-;50325:322;50047:607;49977:677;;:::o;52080:150::-;52196:28;52206:4;52212:2;52216:7;52196:9;:28::i;:::-;52080:150;;;:::o;40262:132::-;40337:12;:10;:12::i;:::-;40326:23;;:7;:5;:7::i;:::-;:23;;;40318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40262:132::o;52293:165::-;52413:39;52430:4;52436:2;52440:7;52413:39;;;;;;;;;;;;:16;:39::i;:::-;52293:165;;;:::o;46975:606::-;47051:21;;:::i;:::-;47092:16;47100:7;47092;:16::i;:::-;47084:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47164:26;47212:12;47201:7;:23;47197:93;;47281:1;47266:12;47256:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;47235:47;;47197:93;47303:12;47318:7;47303:22;;47298:212;47335:18;47327:4;:26;47298:212;;47372:31;47406:11;:17;47418:4;47406:17;;;;;;;;;;;47372:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47462:1;47436:28;;:9;:14;;;:28;;;47432:71;;47484:9;47477:16;;;;;;;47432:71;47363:147;47355:6;;;;;:::i;:::-;;;;47298:212;;;;47518:57;;;;;;;;;;:::i;:::-;;;;;;;;46975:606;;;;:::o;41364:191::-;41438:16;41457:6;;;;;;;;;;;41438:25;;41483:8;41474:6;;:17;;;;;;;;;;;;;;;;;;41538:8;41507:40;;41528:8;41507:40;;;;;;;;;;;;41427:128;41364:191;:::o;25207:190::-;25332:4;25385;25356:25;25369:5;25376:4;25356:12;:25::i;:::-;:33;25349:40;;25207:190;;;;;:::o;53190:98::-;53255:27;53265:2;53269:8;53255:27;;;;;;;;;;;;:9;:27::i;:::-;53190:98;;:::o;50982:714::-;51097:12;:10;:12::i;:::-;51085:24;;:8;:24;;;51077:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51165:17;;;;;;;;;;;51164:18;:61;;;;;51187:26;:38;51214:10;51187:38;;;;;;;;;;;;;;;;;;;;;;;;;51186:39;51164:61;51161:528;;;51245:21;:8;:19;;;:21::i;:::-;51241:283;;;51287:55;;;;;;;;;;:::i;:::-;;;;;;;;51241:283;51428:8;51383:18;:32;51402:12;:10;:12::i;:::-;51383:32;;;;;;;;;;;;;;;:42;51416:8;51383:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51489:8;51460:48;;51475:12;:10;:12::i;:::-;51460:48;;;51499:8;51460:48;;;;;;:::i;:::-;;;;;;;;51161:528;;;51601:8;51556:18;:32;51575:12;:10;:12::i;:::-;51556:32;;;;;;;;;;;;;;;:42;51589:8;51556:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51658:8;51629:48;;51644:12;:10;:12::i;:::-;51629:48;;;51668:8;51629:48;;;;;;:::i;:::-;;;;;;;;51161:528;50982:714;;:::o;52521:319::-;52666:28;52676:4;52682:2;52686:7;52666:9;:28::i;:::-;52717:48;52740:4;52746:2;52750:7;52759:5;52717:22;:48::i;:::-;52701:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;52521:319;;;;:::o;63088:108::-;63148:13;63177;63170:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63088:108;:::o;33143:723::-;33199:13;33429:1;33420:5;:10;33416:53;;33447:10;;;;;;;;;;;;;;;;;;;;;33416:53;33479:12;33494:5;33479:20;;33510:14;33535:78;33550:1;33542:4;:9;33535:78;;33568:8;;;;;:::i;:::-;;;;33599:2;33591:10;;;;;:::i;:::-;;;33535:78;;;33623:19;33655:6;33645:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33623:39;;33673:154;33689:1;33680:5;:10;33673:154;;33717:1;33707:11;;;;;:::i;:::-;;;33784:2;33776:5;:10;;;;:::i;:::-;33763:2;:24;;;;:::i;:::-;33750:39;;33733:6;33740;33733:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;33813:2;33804:11;;;;;:::i;:::-;;;33673:154;;;33851:6;33837:21;;;;;33143:723;;;;:::o;46729:240::-;46790:7;46839:1;46822:19;;:5;:19;;;46806:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;46930:12;:19;46943:5;46930:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;46922:41;;46915:48;;46729:240;;;:::o;38648:98::-;38701:7;38728:10;38721:17;;38648:98;:::o;6901:326::-;6961:4;7218:1;7196:7;:19;;;:23;7189:30;;6901:326;;;:::o;56766:172::-;56890:2;56863:15;:24;56879:7;56863:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56924:7;56920:2;56904:28;;56913:5;56904:28;;;;;;;;;;;;56766:172;;;:::o;55131:1529::-;55228:35;55266:20;55278:7;55266:11;:20::i;:::-;55228:58;;55295:22;55337:13;:18;;;55321:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;55390:12;:10;:12::i;:::-;55366:36;;:20;55378:7;55366:11;:20::i;:::-;:36;;;55321:81;:142;;;;55413:50;55430:13;:18;;;55450:12;:10;:12::i;:::-;55413:16;:50::i;:::-;55321:142;55295:169;;55489:17;55473:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;55621:4;55599:26;;:13;:18;;;:26;;;55583:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;55710:1;55696:16;;:2;:16;;;55688:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55763:43;55785:4;55791:2;55795:7;55804:1;55763:21;:43::i;:::-;55863:49;55880:1;55884:7;55893:13;:18;;;55863:8;:49::i;:::-;55951:1;55921:12;:18;55934:4;55921:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55987:1;55959:12;:16;55972:2;55959:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56018:43;;;;;;;;56033:2;56018:43;;;;;;56044:15;56018:43;;;;;55995:11;:20;56007:7;55995:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56289:19;56321:1;56311:7;:11;;;;:::i;:::-;56289:33;;56374:1;56333:43;;:11;:24;56345:11;56333:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;56329:236;;56391:20;56399:11;56391:7;:20::i;:::-;56387:171;;;56451:97;;;;;;;;56478:13;:18;;;56451:97;;;;;;56509:13;:28;;;56451:97;;;;;56424:11;:24;56436:11;56424:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56387:171;56329:236;56597:7;56593:2;56578:27;;56587:4;56578:27;;;;;;;;;;;;56612:42;56633:4;56639:2;56643:7;56652:1;56612:20;:42::i;:::-;55221:1439;;;55131:1529;;;:::o;26074:296::-;26157:7;26177:20;26200:4;26177:27;;26220:9;26215:118;26239:5;:12;26235:1;:16;26215:118;;;26288:33;26298:12;26312:5;26318:1;26312:8;;;;;;;;:::i;:::-;;;;;;;;26288:9;:33::i;:::-;26273:48;;26253:3;;;;;:::i;:::-;;;;26215:118;;;;26350:12;26343:19;;;26074:296;;;;:::o;53627:1272::-;53732:20;53755:12;;53732:35;;53796:1;53782:16;;:2;:16;;;53774:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53973:21;53981:12;53973:7;:21::i;:::-;53972:22;53964:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54055:12;54043:8;:24;;54035:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54115:61;54145:1;54149:2;54153:12;54167:8;54115:21;:61::i;:::-;54185:30;54218:12;:16;54231:2;54218:16;;;;;;;;;;;;;;;54185:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54260:119;;;;;;;;54310:8;54280:11;:19;;;:39;;;;:::i;:::-;54260:119;;;;;;54363:8;54328:11;:24;;;:44;;;;:::i;:::-;54260:119;;;;;54241:12;:16;54254:2;54241:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54414:43;;;;;;;;54429:2;54414:43;;;;;;54440:15;54414:43;;;;;54386:11;:25;54398:12;54386:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54466:20;54489:12;54466:35;;54515:9;54510:281;54534:8;54530:1;:12;54510:281;;;54588:12;54584:2;54563:38;;54580:1;54563:38;;;;;;;;;;;;54628:59;54659:1;54663:2;54667:12;54681:5;54628:22;:59::i;:::-;54610:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;54769:14;;;;;:::i;:::-;;;;54544:3;;;;;:::i;:::-;;;;54510:281;;;;54814:12;54799;:27;;;;54833:60;54862:1;54866:2;54870:12;54884:8;54833:20;:60::i;:::-;53725:1174;;;53627:1272;;;:::o;58481:690::-;58618:4;58635:15;:2;:13;;;:15::i;:::-;58631:535;;;58690:2;58674:36;;;58711:12;:10;:12::i;:::-;58725:4;58731:7;58740:5;58674:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58661:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58922:1;58905:6;:13;:18;58901:215;;58938:61;;;;;;;;;;:::i;:::-;;;;;;;;58901:215;59084:6;59078:13;59069:6;59065:2;59061:15;59054:38;58661:464;58806:45;;;58796:55;;;:6;:55;;;;58789:62;;;;;58631:535;59154:4;59147:11;;58481:690;;;;;;;:::o;59633:141::-;;;;;:::o;60160:140::-;;;;;:::o;32281:149::-;32344:7;32375:1;32371;:5;:51;;32402:20;32417:1;32420;32402:14;:20::i;:::-;32371:51;;;32379:20;32394:1;32397;32379:14;:20::i;:::-;32371:51;32364:58;;32281:149;;;;:::o;32438:268::-;32506:13;32613:1;32607:4;32600:15;32642:1;32636:4;32629:15;32683:4;32677;32667:21;32658:30;;32438:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:60::-;6378:3;6399:5;6392:12;;6350:60;;;:::o;6416:142::-;6466:9;6499:53;6517:34;6526:24;6544:5;6526:24;:::i;:::-;6517:34;:::i;:::-;6499:53;:::i;:::-;6486:66;;6416:142;;;:::o;6564:126::-;6614:9;6647:37;6678:5;6647:37;:::i;:::-;6634:50;;6564:126;;;:::o;6696:157::-;6777:9;6810:37;6841:5;6810:37;:::i;:::-;6797:50;;6696:157;;;:::o;6859:193::-;6977:68;7039:5;6977:68;:::i;:::-;6972:3;6965:81;6859:193;;:::o;7058:284::-;7182:4;7220:2;7209:9;7205:18;7197:26;;7233:102;7332:1;7321:9;7317:17;7308:6;7233:102;:::i;:::-;7058:284;;;;:::o;7348:116::-;7418:21;7433:5;7418:21;:::i;:::-;7411:5;7408:32;7398:60;;7454:1;7451;7444:12;7398:60;7348:116;:::o;7470:133::-;7513:5;7551:6;7538:20;7529:29;;7567:30;7591:5;7567:30;:::i;:::-;7470:133;;;;:::o;7609:468::-;7674:6;7682;7731:2;7719:9;7710:7;7706:23;7702:32;7699:119;;;7737:79;;:::i;:::-;7699:119;7857:1;7882:53;7927:7;7918:6;7907:9;7903:22;7882:53;:::i;:::-;7872:63;;7828:117;7984:2;8010:50;8052:7;8043:6;8032:9;8028:22;8010:50;:::i;:::-;8000:60;;7955:115;7609:468;;;;;:::o;8083:117::-;8192:1;8189;8182:12;8206:117;8315:1;8312;8305:12;8329:117;8438:1;8435;8428:12;8466:553;8524:8;8534:6;8584:3;8577:4;8569:6;8565:17;8561:27;8551:122;;8592:79;;:::i;:::-;8551:122;8705:6;8692:20;8682:30;;8735:18;8727:6;8724:30;8721:117;;;8757:79;;:::i;:::-;8721:117;8871:4;8863:6;8859:17;8847:29;;8925:3;8917:4;8909:6;8905:17;8895:8;8891:32;8888:41;8885:128;;;8932:79;;:::i;:::-;8885:128;8466:553;;;;;:::o;9025:529::-;9096:6;9104;9153:2;9141:9;9132:7;9128:23;9124:32;9121:119;;;9159:79;;:::i;:::-;9121:119;9307:1;9296:9;9292:17;9279:31;9337:18;9329:6;9326:30;9323:117;;;9359:79;;:::i;:::-;9323:117;9472:65;9529:7;9520:6;9509:9;9505:22;9472:65;:::i;:::-;9454:83;;;;9250:297;9025:529;;;;;:::o;9560:122::-;9633:24;9651:5;9633:24;:::i;:::-;9626:5;9623:35;9613:63;;9672:1;9669;9662:12;9613:63;9560:122;:::o;9688:139::-;9734:5;9772:6;9759:20;9750:29;;9788:33;9815:5;9788:33;:::i;:::-;9688:139;;;;:::o;9833:329::-;9892:6;9941:2;9929:9;9920:7;9916:23;9912:32;9909:119;;;9947:79;;:::i;:::-;9909:119;10067:1;10092:53;10137:7;10128:6;10117:9;10113:22;10092:53;:::i;:::-;10082:63;;10038:117;9833:329;;;;:::o;10168:93::-;10204:7;10244:10;10237:5;10233:22;10222:33;;10168:93;;;:::o;10267:120::-;10339:23;10356:5;10339:23;:::i;:::-;10332:5;10329:34;10319:62;;10377:1;10374;10367:12;10319:62;10267:120;:::o;10393:137::-;10438:5;10476:6;10463:20;10454:29;;10492:32;10518:5;10492:32;:::i;:::-;10393:137;;;;:::o;10536:327::-;10594:6;10643:2;10631:9;10622:7;10618:23;10614:32;10611:119;;;10649:79;;:::i;:::-;10611:119;10769:1;10794:52;10838:7;10829:6;10818:9;10814:22;10794:52;:::i;:::-;10784:62;;10740:116;10536:327;;;;:::o;10869:329::-;10928:6;10977:2;10965:9;10956:7;10952:23;10948:32;10945:119;;;10983:79;;:::i;:::-;10945:119;11103:1;11128:53;11173:7;11164:6;11153:9;11149:22;11128:53;:::i;:::-;11118:63;;11074:117;10869:329;;;;:::o;11221:568::-;11294:8;11304:6;11354:3;11347:4;11339:6;11335:17;11331:27;11321:122;;11362:79;;:::i;:::-;11321:122;11475:6;11462:20;11452:30;;11505:18;11497:6;11494:30;11491:117;;;11527:79;;:::i;:::-;11491:117;11641:4;11633:6;11629:17;11617:29;;11695:3;11687:4;11679:6;11675:17;11665:8;11661:32;11658:41;11655:128;;;11702:79;;:::i;:::-;11655:128;11221:568;;;;;:::o;11795:559::-;11881:6;11889;11938:2;11926:9;11917:7;11913:23;11909:32;11906:119;;;11944:79;;:::i;:::-;11906:119;12092:1;12081:9;12077:17;12064:31;12122:18;12114:6;12111:30;12108:117;;;12144:79;;:::i;:::-;12108:117;12257:80;12329:7;12320:6;12309:9;12305:22;12257:80;:::i;:::-;12239:98;;;;12035:312;11795:559;;;;;:::o;12360:115::-;12445:23;12462:5;12445:23;:::i;:::-;12440:3;12433:36;12360:115;;:::o;12481:328::-;12600:4;12638:2;12627:9;12623:18;12615:26;;12651:69;12717:1;12706:9;12702:17;12693:6;12651:69;:::i;:::-;12730:72;12798:2;12787:9;12783:18;12774:6;12730:72;:::i;:::-;12481:328;;;;;:::o;12815:108::-;12892:24;12910:5;12892:24;:::i;:::-;12887:3;12880:37;12815:108;;:::o;12929:101::-;12965:7;13005:18;12998:5;12994:30;12983:41;;12929:101;;;:::o;13036:105::-;13111:23;13128:5;13111:23;:::i;:::-;13106:3;13099:36;13036:105;;:::o;13217:529::-;13378:4;13373:3;13369:14;13465:4;13458:5;13454:16;13448:23;13484:63;13541:4;13536:3;13532:14;13518:12;13484:63;:::i;:::-;13393:164;13649:4;13642:5;13638:16;13632:23;13668:61;13723:4;13718:3;13714:14;13700:12;13668:61;:::i;:::-;13567:172;13347:399;13217:529;;:::o;13752:350::-;13909:4;13947:2;13936:9;13932:18;13924:26;;13960:135;14092:1;14081:9;14077:17;14068:6;13960:135;:::i;:::-;13752:350;;;;:::o;14108:468::-;14173:6;14181;14230:2;14218:9;14209:7;14205:23;14201:32;14198:119;;;14236:79;;:::i;:::-;14198:119;14356:1;14381:53;14426:7;14417:6;14406:9;14402:22;14381:53;:::i;:::-;14371:63;;14327:117;14483:2;14509:50;14551:7;14542:6;14531:9;14527:22;14509:50;:::i;:::-;14499:60;;14454:115;14108:468;;;;;:::o;14582:472::-;14649:6;14657;14706:2;14694:9;14685:7;14681:23;14677:32;14674:119;;;14712:79;;:::i;:::-;14674:119;14832:1;14857:52;14901:7;14892:6;14881:9;14877:22;14857:52;:::i;:::-;14847:62;;14803:116;14958:2;14984:53;15029:7;15020:6;15009:9;15005:22;14984:53;:::i;:::-;14974:63;;14929:118;14582:472;;;;;:::o;15060:117::-;15169:1;15166;15159:12;15183:180;15231:77;15228:1;15221:88;15328:4;15325:1;15318:15;15352:4;15349:1;15342:15;15369:281;15452:27;15474:4;15452:27;:::i;:::-;15444:6;15440:40;15582:6;15570:10;15567:22;15546:18;15534:10;15531:34;15528:62;15525:88;;;15593:18;;:::i;:::-;15525:88;15633:10;15629:2;15622:22;15412:238;15369:281;;:::o;15656:129::-;15690:6;15717:20;;:::i;:::-;15707:30;;15746:33;15774:4;15766:6;15746:33;:::i;:::-;15656:129;;;:::o;15791:307::-;15852:4;15942:18;15934:6;15931:30;15928:56;;;15964:18;;:::i;:::-;15928:56;16002:29;16024:6;16002:29;:::i;:::-;15994:37;;16086:4;16080;16076:15;16068:23;;15791:307;;;:::o;16104:154::-;16188:6;16183:3;16178;16165:30;16250:1;16241:6;16236:3;16232:16;16225:27;16104:154;;;:::o;16264:410::-;16341:5;16366:65;16382:48;16423:6;16382:48;:::i;:::-;16366:65;:::i;:::-;16357:74;;16454:6;16447:5;16440:21;16492:4;16485:5;16481:16;16530:3;16521:6;16516:3;16512:16;16509:25;16506:112;;;16537:79;;:::i;:::-;16506:112;16627:41;16661:6;16656:3;16651;16627:41;:::i;:::-;16347:327;16264:410;;;;;:::o;16693:338::-;16748:5;16797:3;16790:4;16782:6;16778:17;16774:27;16764:122;;16805:79;;:::i;:::-;16764:122;16922:6;16909:20;16947:78;17021:3;17013:6;17006:4;16998:6;16994:17;16947:78;:::i;:::-;16938:87;;16754:277;16693:338;;;;:::o;17037:943::-;17132:6;17140;17148;17156;17205:3;17193:9;17184:7;17180:23;17176:33;17173:120;;;17212:79;;:::i;:::-;17173:120;17332:1;17357:53;17402:7;17393:6;17382:9;17378:22;17357:53;:::i;:::-;17347:63;;17303:117;17459:2;17485:53;17530:7;17521:6;17510:9;17506:22;17485:53;:::i;:::-;17475:63;;17430:118;17587:2;17613:53;17658:7;17649:6;17638:9;17634:22;17613:53;:::i;:::-;17603:63;;17558:118;17743:2;17732:9;17728:18;17715:32;17774:18;17766:6;17763:30;17760:117;;;17796:79;;:::i;:::-;17760:117;17901:62;17955:7;17946:6;17935:9;17931:22;17901:62;:::i;:::-;17891:72;;17686:287;17037:943;;;;;;;:::o;17986:474::-;18054:6;18062;18111:2;18099:9;18090:7;18086:23;18082:32;18079:119;;;18117:79;;:::i;:::-;18079:119;18237:1;18262:53;18307:7;18298:6;18287:9;18283:22;18262:53;:::i;:::-;18252:63;;18208:117;18364:2;18390:53;18435:7;18426:6;18415:9;18411:22;18390:53;:::i;:::-;18380:63;;18335:118;17986:474;;;;;:::o;18466:311::-;18543:4;18633:18;18625:6;18622:30;18619:56;;;18655:18;;:::i;:::-;18619:56;18705:4;18697:6;18693:17;18685:25;;18765:4;18759;18755:15;18747:23;;18466:311;;;:::o;18800:710::-;18896:5;18921:81;18937:64;18994:6;18937:64;:::i;:::-;18921:81;:::i;:::-;18912:90;;19022:5;19051:6;19044:5;19037:21;19085:4;19078:5;19074:16;19067:23;;19138:4;19130:6;19126:17;19118:6;19114:30;19167:3;19159:6;19156:15;19153:122;;;19186:79;;:::i;:::-;19153:122;19301:6;19284:220;19318:6;19313:3;19310:15;19284:220;;;19393:3;19422:37;19455:3;19443:10;19422:37;:::i;:::-;19417:3;19410:50;19489:4;19484:3;19480:14;19473:21;;19360:144;19344:4;19339:3;19335:14;19328:21;;19284:220;;;19288:21;18902:608;;18800:710;;;;;:::o;19533:370::-;19604:5;19653:3;19646:4;19638:6;19634:17;19630:27;19620:122;;19661:79;;:::i;:::-;19620:122;19778:6;19765:20;19803:94;19893:3;19885:6;19878:4;19870:6;19866:17;19803:94;:::i;:::-;19794:103;;19610:293;19533:370;;;;:::o;19909:308::-;19983:4;20073:18;20065:6;20062:30;20059:56;;;20095:18;;:::i;:::-;20059:56;20145:4;20137:6;20133:17;20125:25;;20205:4;20199;20195:15;20187:23;;19909:308;;;:::o;20237:701::-;20330:5;20355:78;20371:61;20425:6;20371:61;:::i;:::-;20355:78;:::i;:::-;20346:87;;20453:5;20482:6;20475:5;20468:21;20516:4;20509:5;20505:16;20498:23;;20569:4;20561:6;20557:17;20549:6;20545:30;20598:3;20590:6;20587:15;20584:122;;;20617:79;;:::i;:::-;20584:122;20732:6;20715:217;20749:6;20744:3;20741:15;20715:217;;;20824:3;20853:34;20883:3;20871:10;20853:34;:::i;:::-;20848:3;20841:47;20917:4;20912:3;20908:14;20901:21;;20791:141;20775:4;20770:3;20766:14;20759:21;;20715:217;;;20719:21;20336:602;;20237:701;;;;;:::o;20958:364::-;21026:5;21075:3;21068:4;21060:6;21056:17;21052:27;21042:122;;21083:79;;:::i;:::-;21042:122;21200:6;21187:20;21225:91;21312:3;21304:6;21297:4;21289:6;21285:17;21225:91;:::i;:::-;21216:100;;21032:290;20958:364;;;;:::o;21328:888::-;21443:6;21451;21500:2;21488:9;21479:7;21475:23;21471:32;21468:119;;;21506:79;;:::i;:::-;21468:119;21654:1;21643:9;21639:17;21626:31;21684:18;21676:6;21673:30;21670:117;;;21706:79;;:::i;:::-;21670:117;21811:78;21881:7;21872:6;21861:9;21857:22;21811:78;:::i;:::-;21801:88;;21597:302;21966:2;21955:9;21951:18;21938:32;21997:18;21989:6;21986:30;21983:117;;;22019:79;;:::i;:::-;21983:117;22124:75;22191:7;22182:6;22171:9;22167:22;22124:75;:::i;:::-;22114:85;;21909:300;21328:888;;;;;:::o;22222:180::-;22270:77;22267:1;22260:88;22367:4;22364:1;22357:15;22391:4;22388:1;22381:15;22408:320;22452:6;22489:1;22483:4;22479:12;22469:22;;22536:1;22530:4;22526:12;22557:18;22547:81;;22613:4;22605:6;22601:17;22591:27;;22547:81;22675:2;22667:6;22664:14;22644:18;22641:38;22638:84;;22694:18;;:::i;:::-;22638:84;22459:269;22408:320;;;:::o;22734:232::-;22874:34;22870:1;22862:6;22858:14;22851:58;22943:15;22938:2;22930:6;22926:15;22919:40;22734:232;:::o;22972:366::-;23114:3;23135:67;23199:2;23194:3;23135:67;:::i;:::-;23128:74;;23211:93;23300:3;23211:93;:::i;:::-;23329:2;23324:3;23320:12;23313:19;;22972:366;;;:::o;23344:419::-;23510:4;23548:2;23537:9;23533:18;23525:26;;23597:9;23591:4;23587:20;23583:1;23572:9;23568:17;23561:47;23625:131;23751:4;23625:131;:::i;:::-;23617:139;;23344:419;;;:::o;23769:332::-;23890:4;23928:2;23917:9;23913:18;23905:26;;23941:71;24009:1;23998:9;23994:17;23985:6;23941:71;:::i;:::-;24022:72;24090:2;24079:9;24075:18;24066:6;24022:72;:::i;:::-;23769:332;;;;;:::o;24107:137::-;24161:5;24192:6;24186:13;24177:22;;24208:30;24232:5;24208:30;:::i;:::-;24107:137;;;;:::o;24250:345::-;24317:6;24366:2;24354:9;24345:7;24341:23;24337:32;24334:119;;;24372:79;;:::i;:::-;24334:119;24492:1;24517:61;24570:7;24561:6;24550:9;24546:22;24517:61;:::i;:::-;24507:71;;24463:125;24250:345;;;;:::o;24601:221::-;24741:34;24737:1;24729:6;24725:14;24718:58;24810:4;24805:2;24797:6;24793:15;24786:29;24601:221;:::o;24828:366::-;24970:3;24991:67;25055:2;25050:3;24991:67;:::i;:::-;24984:74;;25067:93;25156:3;25067:93;:::i;:::-;25185:2;25180:3;25176:12;25169:19;;24828:366;;;:::o;25200:419::-;25366:4;25404:2;25393:9;25389:18;25381:26;;25453:9;25447:4;25443:20;25439:1;25428:9;25424:17;25417:47;25481:131;25607:4;25481:131;:::i;:::-;25473:139;;25200:419;;;:::o;25625:180::-;25673:77;25670:1;25663:88;25770:4;25767:1;25760:15;25794:4;25791:1;25784:15;25811:233;25850:3;25873:24;25891:5;25873:24;:::i;:::-;25864:33;;25919:66;25912:5;25909:77;25906:103;;25989:18;;:::i;:::-;25906:103;26036:1;26029:5;26025:13;26018:20;;25811:233;;;:::o;26050:::-;26190:34;26186:1;26178:6;26174:14;26167:58;26259:16;26254:2;26246:6;26242:15;26235:41;26050:233;:::o;26289:366::-;26431:3;26452:67;26516:2;26511:3;26452:67;:::i;:::-;26445:74;;26528:93;26617:3;26528:93;:::i;:::-;26646:2;26641:3;26637:12;26630:19;;26289:366;;;:::o;26661:419::-;26827:4;26865:2;26854:9;26850:18;26842:26;;26914:9;26908:4;26904:20;26900:1;26889:9;26885:17;26878:47;26942:131;27068:4;26942:131;:::i;:::-;26934:139;;26661:419;;;:::o;27086:222::-;27226:34;27222:1;27214:6;27210:14;27203:58;27295:5;27290:2;27282:6;27278:15;27271:30;27086:222;:::o;27314:366::-;27456:3;27477:67;27541:2;27536:3;27477:67;:::i;:::-;27470:74;;27553:93;27642:3;27553:93;:::i;:::-;27671:2;27666:3;27662:12;27655:19;;27314:366;;;:::o;27686:419::-;27852:4;27890:2;27879:9;27875:18;27867:26;;27939:9;27933:4;27929:20;27925:1;27914:9;27910:17;27903:47;27967:131;28093:4;27967:131;:::i;:::-;27959:139;;27686:419;;;:::o;28111:230::-;28251:34;28247:1;28239:6;28235:14;28228:58;28320:13;28315:2;28307:6;28303:15;28296:38;28111:230;:::o;28347:366::-;28489:3;28510:67;28574:2;28569:3;28510:67;:::i;:::-;28503:74;;28586:93;28675:3;28586:93;:::i;:::-;28704:2;28699:3;28695:12;28688:19;;28347:366;;;:::o;28719:419::-;28885:4;28923:2;28912:9;28908:18;28900:26;;28972:9;28966:4;28962:20;28958:1;28947:9;28943:17;28936:47;29000:131;29126:4;29000:131;:::i;:::-;28992:139;;28719:419;;;:::o;29144:94::-;29177:8;29225:5;29221:2;29217:14;29196:35;;29144:94;;;:::o;29244:::-;29283:7;29312:20;29326:5;29312:20;:::i;:::-;29301:31;;29244:94;;;:::o;29344:100::-;29383:7;29412:26;29432:5;29412:26;:::i;:::-;29401:37;;29344:100;;;:::o;29450:157::-;29555:45;29575:24;29593:5;29575:24;:::i;:::-;29555:45;:::i;:::-;29550:3;29543:58;29450:157;;:::o;29613:256::-;29725:3;29740:75;29811:3;29802:6;29740:75;:::i;:::-;29840:2;29835:3;29831:12;29824:19;;29860:3;29853:10;;29613:256;;;;:::o;29875:164::-;30015:16;30011:1;30003:6;29999:14;29992:40;29875:164;:::o;30045:366::-;30187:3;30208:67;30272:2;30267:3;30208:67;:::i;:::-;30201:74;;30284:93;30373:3;30284:93;:::i;:::-;30402:2;30397:3;30393:12;30386:19;;30045:366;;;:::o;30417:419::-;30583:4;30621:2;30610:9;30606:18;30598:26;;30670:9;30664:4;30660:20;30656:1;30645:9;30641:17;30634:47;30698:131;30824:4;30698:131;:::i;:::-;30690:139;;30417:419;;;:::o;30842:180::-;30982:32;30978:1;30970:6;30966:14;30959:56;30842:180;:::o;31028:366::-;31170:3;31191:67;31255:2;31250:3;31191:67;:::i;:::-;31184:74;;31267:93;31356:3;31267:93;:::i;:::-;31385:2;31380:3;31376:12;31369:19;;31028:366;;;:::o;31400:419::-;31566:4;31604:2;31593:9;31589:18;31581:26;;31653:9;31647:4;31643:20;31639:1;31628:9;31624:17;31617:47;31681:131;31807:4;31681:131;:::i;:::-;31673:139;;31400:419;;;:::o;31825:174::-;31965:26;31961:1;31953:6;31949:14;31942:50;31825:174;:::o;32005:366::-;32147:3;32168:67;32232:2;32227:3;32168:67;:::i;:::-;32161:74;;32244:93;32333:3;32244:93;:::i;:::-;32362:2;32357:3;32353:12;32346:19;;32005:366;;;:::o;32377:419::-;32543:4;32581:2;32570:9;32566:18;32558:26;;32630:9;32624:4;32620:20;32616:1;32605:9;32601:17;32594:47;32658:131;32784:4;32658:131;:::i;:::-;32650:139;;32377:419;;;:::o;32802:168::-;32942:20;32938:1;32930:6;32926:14;32919:44;32802:168;:::o;32976:366::-;33118:3;33139:67;33203:2;33198:3;33139:67;:::i;:::-;33132:74;;33215:93;33304:3;33215:93;:::i;:::-;33333:2;33328:3;33324:12;33317:19;;32976:366;;;:::o;33348:419::-;33514:4;33552:2;33541:9;33537:18;33529:26;;33601:9;33595:4;33591:20;33587:1;33576:9;33572:17;33565:47;33629:131;33755:4;33629:131;:::i;:::-;33621:139;;33348:419;;;:::o;33773:305::-;33813:3;33832:20;33850:1;33832:20;:::i;:::-;33827:25;;33866:20;33884:1;33866:20;:::i;:::-;33861:25;;34020:1;33952:66;33948:74;33945:1;33942:81;33939:107;;;34026:18;;:::i;:::-;33939:107;34070:1;34067;34063:9;34056:16;;33773:305;;;;:::o;34084:172::-;34224:24;34220:1;34212:6;34208:14;34201:48;34084:172;:::o;34262:366::-;34404:3;34425:67;34489:2;34484:3;34425:67;:::i;:::-;34418:74;;34501:93;34590:3;34501:93;:::i;:::-;34619:2;34614:3;34610:12;34603:19;;34262:366;;;:::o;34634:419::-;34800:4;34838:2;34827:9;34823:18;34815:26;;34887:9;34881:4;34877:20;34873:1;34862:9;34858:17;34851:47;34915:131;35041:4;34915:131;:::i;:::-;34907:139;;34634:419;;;:::o;35059:234::-;35199:34;35195:1;35187:6;35183:14;35176:58;35268:17;35263:2;35255:6;35251:15;35244:42;35059:234;:::o;35299:366::-;35441:3;35462:67;35526:2;35521:3;35462:67;:::i;:::-;35455:74;;35538:93;35627:3;35538:93;:::i;:::-;35656:2;35651:3;35647:12;35640:19;;35299:366;;;:::o;35671:419::-;35837:4;35875:2;35864:9;35860:18;35852:26;;35924:9;35918:4;35914:20;35910:1;35899:9;35895:17;35888:47;35952:131;36078:4;35952:131;:::i;:::-;35944:139;;35671:419;;;:::o;36096:148::-;36198:11;36235:3;36220:18;;36096:148;;;;:::o;36250:377::-;36356:3;36384:39;36417:5;36384:39;:::i;:::-;36439:89;36521:6;36516:3;36439:89;:::i;:::-;36432:96;;36537:52;36582:6;36577:3;36570:4;36563:5;36559:16;36537:52;:::i;:::-;36614:6;36609:3;36605:16;36598:23;;36360:267;36250:377;;;;:::o;36633:155::-;36773:7;36769:1;36761:6;36757:14;36750:31;36633:155;:::o;36794:400::-;36954:3;36975:84;37057:1;37052:3;36975:84;:::i;:::-;36968:91;;37068:93;37157:3;37068:93;:::i;:::-;37186:1;37181:3;37177:11;37170:18;;36794:400;;;:::o;37200:701::-;37481:3;37503:95;37594:3;37585:6;37503:95;:::i;:::-;37496:102;;37615:95;37706:3;37697:6;37615:95;:::i;:::-;37608:102;;37727:148;37871:3;37727:148;:::i;:::-;37720:155;;37892:3;37885:10;;37200:701;;;;;:::o;37907:225::-;38047:34;38043:1;38035:6;38031:14;38024:58;38116:8;38111:2;38103:6;38099:15;38092:33;37907:225;:::o;38138:366::-;38280:3;38301:67;38365:2;38360:3;38301:67;:::i;:::-;38294:74;;38377:93;38466:3;38377:93;:::i;:::-;38495:2;38490:3;38486:12;38479:19;;38138:366;;;:::o;38510:419::-;38676:4;38714:2;38703:9;38699:18;38691:26;;38763:9;38757:4;38753:20;38749:1;38738:9;38734:17;38727:47;38791:131;38917:4;38791:131;:::i;:::-;38783:139;;38510:419;;;:::o;38935:180::-;38983:77;38980:1;38973:88;39080:4;39077:1;39070:15;39104:4;39101:1;39094:15;39121:176;39261:28;39257:1;39249:6;39245:14;39238:52;39121:176;:::o;39303:366::-;39445:3;39466:67;39530:2;39525:3;39466:67;:::i;:::-;39459:74;;39542:93;39631:3;39542:93;:::i;:::-;39660:2;39655:3;39651:12;39644:19;;39303:366;;;:::o;39675:419::-;39841:4;39879:2;39868:9;39864:18;39856:26;;39928:9;39922:4;39918:20;39914:1;39903:9;39899:17;39892:47;39956:131;40082:4;39956:131;:::i;:::-;39948:139;;39675:419;;;:::o;40100:231::-;40240:34;40236:1;40228:6;40224:14;40217:58;40309:14;40304:2;40296:6;40292:15;40285:39;40100:231;:::o;40337:366::-;40479:3;40500:67;40564:2;40559:3;40500:67;:::i;:::-;40493:74;;40576:93;40665:3;40576:93;:::i;:::-;40694:2;40689:3;40685:12;40678:19;;40337:366;;;:::o;40709:419::-;40875:4;40913:2;40902:9;40898:18;40890:26;;40962:9;40956:4;40952:20;40948:1;40937:9;40933:17;40926:47;40990:131;41116:4;40990:131;:::i;:::-;40982:139;;40709:419;;;:::o;41134:182::-;41274:34;41270:1;41262:6;41258:14;41251:58;41134:182;:::o;41322:366::-;41464:3;41485:67;41549:2;41544:3;41485:67;:::i;:::-;41478:74;;41561:93;41650:3;41561:93;:::i;:::-;41679:2;41674:3;41670:12;41663:19;;41322:366;;;:::o;41694:419::-;41860:4;41898:2;41887:9;41883:18;41875:26;;41947:9;41941:4;41937:20;41933:1;41922:9;41918:17;41911:47;41975:131;42101:4;41975:131;:::i;:::-;41967:139;;41694:419;;;:::o;42119:229::-;42259:34;42255:1;42247:6;42243:14;42236:58;42328:12;42323:2;42315:6;42311:15;42304:37;42119:229;:::o;42354:366::-;42496:3;42517:67;42581:2;42576:3;42517:67;:::i;:::-;42510:74;;42593:93;42682:3;42593:93;:::i;:::-;42711:2;42706:3;42702:12;42695:19;;42354:366;;;:::o;42726:419::-;42892:4;42930:2;42919:9;42915:18;42907:26;;42979:9;42973:4;42969:20;42965:1;42954:9;42950:17;42943:47;43007:131;43133:4;43007:131;:::i;:::-;42999:139;;42726:419;;;:::o;43151:191::-;43191:4;43211:20;43229:1;43211:20;:::i;:::-;43206:25;;43245:20;43263:1;43245:20;:::i;:::-;43240:25;;43284:1;43281;43278:8;43275:34;;;43289:18;;:::i;:::-;43275:34;43334:1;43331;43327:9;43319:17;;43151:191;;;;:::o;43348:171::-;43387:3;43410:24;43428:5;43410:24;:::i;:::-;43401:33;;43456:4;43449:5;43446:15;43443:41;;43464:18;;:::i;:::-;43443:41;43511:1;43504:5;43500:13;43493:20;;43348:171;;;:::o;43525:234::-;43665:34;43661:1;43653:6;43649:14;43642:58;43734:17;43729:2;43721:6;43717:15;43710:42;43525:234;:::o;43765:366::-;43907:3;43928:67;43992:2;43987:3;43928:67;:::i;:::-;43921:74;;44004:93;44093:3;44004:93;:::i;:::-;44122:2;44117:3;44113:12;44106:19;;43765:366;;;:::o;44137:419::-;44303:4;44341:2;44330:9;44326:18;44318:26;;44390:9;44384:4;44380:20;44376:1;44365:9;44361:17;44354:47;44418:131;44544:4;44418:131;:::i;:::-;44410:139;;44137:419;;;:::o;44562:238::-;44702:34;44698:1;44690:6;44686:14;44679:58;44771:21;44766:2;44758:6;44754:15;44747:46;44562:238;:::o;44806:366::-;44948:3;44969:67;45033:2;45028:3;44969:67;:::i;:::-;44962:74;;45045:93;45134:3;45045:93;:::i;:::-;45163:2;45158:3;45154:12;45147:19;;44806:366;;;:::o;45178:419::-;45344:4;45382:2;45371:9;45367:18;45359:26;;45431:9;45425:4;45421:20;45417:1;45406:9;45402:17;45395:47;45459:131;45585:4;45459:131;:::i;:::-;45451:139;;45178:419;;;:::o;45603:180::-;45651:77;45648:1;45641:88;45748:4;45745:1;45738:15;45772:4;45769:1;45762:15;45789:185;45829:1;45846:20;45864:1;45846:20;:::i;:::-;45841:25;;45880:20;45898:1;45880:20;:::i;:::-;45875:25;;45919:1;45909:35;;45924:18;;:::i;:::-;45909:35;45966:1;45963;45959:9;45954:14;;45789:185;;;;:::o;45980:176::-;46012:1;46029:20;46047:1;46029:20;:::i;:::-;46024:25;;46063:20;46081:1;46063:20;:::i;:::-;46058:25;;46102:1;46092:35;;46107:18;;:::i;:::-;46092:35;46148:1;46145;46141:9;46136:14;;45980:176;;;;:::o;46162:236::-;46302:34;46298:1;46290:6;46286:14;46279:58;46371:19;46366:2;46358:6;46354:15;46347:44;46162:236;:::o;46404:366::-;46546:3;46567:67;46631:2;46626:3;46567:67;:::i;:::-;46560:74;;46643:93;46732:3;46643:93;:::i;:::-;46761:2;46756:3;46752:12;46745:19;;46404:366;;;:::o;46776:419::-;46942:4;46980:2;46969:9;46965:18;46957:26;;47029:9;47023:4;47019:20;47015:1;47004:9;47000:17;46993:47;47057:131;47183:4;47057:131;:::i;:::-;47049:139;;46776:419;;;:::o;47201:237::-;47341:34;47337:1;47329:6;47325:14;47318:58;47410:20;47405:2;47397:6;47393:15;47386:45;47201:237;:::o;47444:366::-;47586:3;47607:67;47671:2;47666:3;47607:67;:::i;:::-;47600:74;;47683:93;47772:3;47683:93;:::i;:::-;47801:2;47796:3;47792:12;47785:19;;47444:366;;;:::o;47816:419::-;47982:4;48020:2;48009:9;48005:18;47997:26;;48069:9;48063:4;48059:20;48055:1;48044:9;48040:17;48033:47;48097:131;48223:4;48097:131;:::i;:::-;48089:139;;47816:419;;;:::o;48241:225::-;48381:34;48377:1;48369:6;48365:14;48358:58;48450:8;48445:2;48437:6;48433:15;48426:33;48241:225;:::o;48472:366::-;48614:3;48635:67;48699:2;48694:3;48635:67;:::i;:::-;48628:74;;48711:93;48800:3;48711:93;:::i;:::-;48829:2;48824:3;48820:12;48813:19;;48472:366;;;:::o;48844:419::-;49010:4;49048:2;49037:9;49033:18;49025:26;;49097:9;49091:4;49087:20;49083:1;49072:9;49068:17;49061:47;49125:131;49251:4;49125:131;:::i;:::-;49117:139;;48844:419;;;:::o;49269:224::-;49409:34;49405:1;49397:6;49393:14;49386:58;49478:7;49473:2;49465:6;49461:15;49454:32;49269:224;:::o;49499:366::-;49641:3;49662:67;49726:2;49721:3;49662:67;:::i;:::-;49655:74;;49738:93;49827:3;49738:93;:::i;:::-;49856:2;49851:3;49847:12;49840:19;;49499:366;;;:::o;49871:419::-;50037:4;50075:2;50064:9;50060:18;50052:26;;50124:9;50118:4;50114:20;50110:1;50099:9;50095:17;50088:47;50152:131;50278:4;50152:131;:::i;:::-;50144:139;;49871:419;;;:::o;50296:118::-;50333:7;50373:34;50366:5;50362:46;50351:57;;50296:118;;;:::o;50420:191::-;50460:4;50480:20;50498:1;50480:20;:::i;:::-;50475:25;;50514:20;50532:1;50514:20;:::i;:::-;50509:25;;50553:1;50550;50547:8;50544:34;;;50558:18;;:::i;:::-;50544:34;50603:1;50600;50596:9;50588:17;;50420:191;;;;:::o;50617:273::-;50657:3;50676:20;50694:1;50676:20;:::i;:::-;50671:25;;50710:20;50728:1;50710:20;:::i;:::-;50705:25;;50832:1;50796:34;50792:42;50789:1;50786:49;50783:75;;;50838:18;;:::i;:::-;50783:75;50882:1;50879;50875:9;50868:16;;50617:273;;;;:::o;50896:220::-;51036:34;51032:1;51024:6;51020:14;51013:58;51105:3;51100:2;51092:6;51088:15;51081:28;50896:220;:::o;51122:366::-;51264:3;51285:67;51349:2;51344:3;51285:67;:::i;:::-;51278:74;;51361:93;51450:3;51361:93;:::i;:::-;51479:2;51474:3;51470:12;51463:19;;51122:366;;;:::o;51494:419::-;51660:4;51698:2;51687:9;51683:18;51675:26;;51747:9;51741:4;51737:20;51733:1;51722:9;51718:17;51711:47;51775:131;51901:4;51775:131;:::i;:::-;51767:139;;51494:419;;;:::o;51919:179::-;52059:31;52055:1;52047:6;52043:14;52036:55;51919:179;:::o;52104:366::-;52246:3;52267:67;52331:2;52326:3;52267:67;:::i;:::-;52260:74;;52343:93;52432:3;52343:93;:::i;:::-;52461:2;52456:3;52452:12;52445:19;;52104:366;;;:::o;52476:419::-;52642:4;52680:2;52669:9;52665:18;52657:26;;52729:9;52723:4;52719:20;52715:1;52704:9;52700:17;52693:47;52757:131;52883:4;52757:131;:::i;:::-;52749:139;;52476:419;;;:::o;52901:221::-;53041:34;53037:1;53029:6;53025:14;53018:58;53110:4;53105:2;53097:6;53093:15;53086:29;52901:221;:::o;53128:366::-;53270:3;53291:67;53355:2;53350:3;53291:67;:::i;:::-;53284:74;;53367:93;53456:3;53367:93;:::i;:::-;53485:2;53480:3;53476:12;53469:19;;53128:366;;;:::o;53500:419::-;53666:4;53704:2;53693:9;53689:18;53681:26;;53753:9;53747:4;53743:20;53739:1;53728:9;53724:17;53717:47;53781:131;53907:4;53781:131;:::i;:::-;53773:139;;53500:419;;;:::o;53925:98::-;53976:6;54010:5;54004:12;53994:22;;53925:98;;;:::o;54029:168::-;54112:11;54146:6;54141:3;54134:19;54186:4;54181:3;54177:14;54162:29;;54029:168;;;;:::o;54203:360::-;54289:3;54317:38;54349:5;54317:38;:::i;:::-;54371:70;54434:6;54429:3;54371:70;:::i;:::-;54364:77;;54450:52;54495:6;54490:3;54483:4;54476:5;54472:16;54450:52;:::i;:::-;54527:29;54549:6;54527:29;:::i;:::-;54522:3;54518:39;54511:46;;54293:270;54203:360;;;;:::o;54569:640::-;54764:4;54802:3;54791:9;54787:19;54779:27;;54816:71;54884:1;54873:9;54869:17;54860:6;54816:71;:::i;:::-;54897:72;54965:2;54954:9;54950:18;54941:6;54897:72;:::i;:::-;54979;55047:2;55036:9;55032:18;55023:6;54979:72;:::i;:::-;55098:9;55092:4;55088:20;55083:2;55072:9;55068:18;55061:48;55126:76;55197:4;55188:6;55126:76;:::i;:::-;55118:84;;54569:640;;;;;;;:::o;55215:141::-;55271:5;55302:6;55296:13;55287:22;;55318:32;55344:5;55318:32;:::i;:::-;55215:141;;;;:::o;55362:349::-;55431:6;55480:2;55468:9;55459:7;55455:23;55451:32;55448:119;;;55486:79;;:::i;:::-;55448:119;55606:1;55631:63;55686:7;55677:6;55666:9;55662:22;55631:63;:::i;:::-;55621:73;;55577:127;55362:349;;;;:::o

Swarm Source

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