Token Primapes - Base Babies

 

Overview [ERC-721]

Max Total Supply:
2,000 BASEBABY

Holders:
778
Contract:
0x72c3205acf3eb2b37b0082240bf0b909a46c09930x72C3205ACF3eB2B37B0082240bF0B909a46C0993

Social Profiles:
Not Available, Update ?

 
Balance
1 BASEBABY
0xdfef9f0b0d55bb46c5c1e61c56105efb88ec19e2
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BabyPrimapes

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2023-09-03
*/

pragma solidity ^0.8.9;


// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}

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

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)
/**
 * @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 tokenId);

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
 * @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);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol)
/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

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

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

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

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    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));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // 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) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

// Creator: Chiru Labs
/**
 * @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..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

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

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

    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    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;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; 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');
    }

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

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

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

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

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    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())) : '';
    }

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

    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = 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].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }
	function decode(string memory _data) internal pure returns (bytes memory) {
	    bytes memory data = bytes(_data);

	    if (data.length == 0) return new bytes(0);
	    require(data.length % 4 == 0, "invalid base64 decoder input");

	    // load the table into memory
	    bytes memory table = TABLE_DECODE;

	    // every 4 characters represent 3 bytes
	    uint256 decodedLen = (data.length / 4) * 3;

	    // add some extra buffer at the end required for the writing
	    bytes memory result = new bytes(decodedLen + 32);

	    assembly {
	        // padding with '='
	        let lastBytes := mload(add(data, mload(data)))
	        if eq(and(lastBytes, 0xFF), 0x3d) {
	            decodedLen := sub(decodedLen, 1)
	            if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
	                decodedLen := sub(decodedLen, 1)
	            }
	        }

	        // set the actual output length
	        mstore(result, decodedLen)

	        // prepare the lookup table
	        let tablePtr := add(table, 1)

	        // input ptr
	        let dataPtr := data
	        let endPtr := add(dataPtr, mload(data))

	        // result ptr, jump over length
	        let resultPtr := add(result, 32)

	        // run over the input, 4 characters at a time
	        for {} lt(dataPtr, endPtr) {}
	        {
	           // read 4 characters
	           dataPtr := add(dataPtr, 4)
	           let input := mload(dataPtr)

	           // write 3 bytes
	           let output := add(
	               add(
	                   shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
	                   shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
	               add(
	                   shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
	                           and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
	                )
	            )
	            mstore(resultPtr, shl(232, output))
	            resultPtr := add(resultPtr, 3)
	        }
	    }

	    return result;
	}
}

contract BabyPrimapes is ERC721A, Ownable, DefaultOperatorFilterer {
    using Strings for uint256;
    uint256 public constant maxSupply = 5000;

    uint256 public priceWL = 0.015 ether;
    uint256 public price = 0.02 ether;
    uint256 public customizePrice = 0.69 ether;

    bool public bWL = false;
    bool public bOpen = false;
    bool public bPaused = false;
    bool public bCustomOpen = false;

    uint256 public mintedOGAmt = 0;
    uint256 public mintedWLAmt = 0;
    uint256 public mintedAmt = 0;

    uint256 public maxPerMint = 10;
    uint256 public maxPerWLMint = 10;
    uint256 public maxPerWallet = 50;

    mapping(address => uint256) public minted;
    mapping(address => uint256) public mintedWL;
    mapping(address => uint256) public mintedAPE;
    mapping(address => uint256) public mintedKEY;

    mapping(uint256 => string) private traitNames;
    mapping(uint256 => mapping(uint256=>mapping(uint256=>string))) private traitMap;

    mapping(uint256=>uint256[]) private customizedToks;

    string private provenance;

    bytes32 public merkleRootWL;
    bytes32 public merkleRootAPE;
    bytes32 public merkleRootKEY;

    string private _bURIExt = "";
    string private tokenDesc = "";

    constructor() ERC721A("Primapes - Base Babies", "BASEBABY") {

        traitNames[1] = "Background";
        traitNames[2] = "Fur";
        traitNames[3] = "Body";
        traitNames[4] = "Face Fur";
        traitNames[5] = "Eyes";
        traitNames[6] = "Mouth";
        traitNames[7] = "Head";
        traitNames[8] = "Accessory";
        
        provenance = '';
        mintedAmt += 1;
        minted[0x7f1156aa350982560653fed03ef0e285ef878B75] += 1;
        _safeMint(0x7f1156aa350982560653fed03ef0e285ef878B75, 1);
        
    }

    function loadTokenDesc(string calldata data) external onlyOwner {
        tokenDesc = data;
    }

    function loadProvenance(string calldata data, bool reset ) external onlyOwner {
        if(reset) {
            provenance = data;
        }
        else {
            provenance = string(abi.encodePacked(provenance,data));
        }
    }

    function loadTraitData(uint256 level, uint256[] calldata keys, string[] calldata values, string[] calldata images ) external onlyOwner {
        uint length = keys.length;
        require(keys.length == length && values.length == length && images.length == length, "Invalid Lengths");
        for (uint256 i = 0; i < length; i++) {
            traitMap[level][1][keys[i]] = values[i];
            traitMap[level][2][keys[i]] = images[i];
        }
    }

    function setPaused(bool b) external onlyOwner {
        bPaused = b;
    }

    function setPublic(bool b) external onlyOwner {
        bOpen = b;
    }

    function setCustomOpen(bool b) external onlyOwner {
        bCustomOpen = b;
    }

    function setWL(bool b) external onlyOwner {
        bWL = b;
    }

    function stringToUint(string memory s) private pure returns (uint) {
        bytes memory b = bytes(s);
        uint result = 0;
        for (uint256 i = 0; i < b.length; i++) {
            uint256 c = uint256(uint8(b[i]));
            if (c >= 48 && c <= 57) {
                result = result * 10 + (c - 48);
            }
        }
        return result;
    }

    function getTokenTraitMap(uint256 token) public view returns (uint256[8] memory) {        
        require((bytes(provenance).length >= 16 * token), "nonexistent token provenance");
        uint startIndex = 16 * (token - 1);
        bytes memory inputBytes = bytes(provenance);
        
        uint256[8] memory resultArray;
        
        for (uint i = 0; i < 8; i++) {
            bytes memory a = new bytes(2);
            a[0] = inputBytes[startIndex + (i*2)];
            a[1] = inputBytes[startIndex + ((i*2)+1)];
            resultArray[i] = stringToUint(string(a));
        }
        
        return resultArray;
    }

    function getTokenMeta(uint256 token) public view returns (string memory) {
        
        uint256[8] memory meta;
        if(customizedToks[token].length > 0) {
            for (uint i = 0; i < 8; i++) {
                meta[i] = customizedToks[token][i];
            }
        }
        else {
            meta = getTokenTraitMap((token+1));
        }

        string memory svg = "<svg width='720' height='720' viewBox='0 0 720 720' fill='none' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>";
        string memory attrs = '';
        for (uint i = 0; i < 8; i++) {
            if(meta[i] > 0) {
                svg = string(abi.encodePacked(svg,"<image x='0' y='0' width='720' height='720' href='",traitMap[(i+1)][2][meta[i]],"' />"));
                if(bytes(attrs).length != 0) {
                    attrs = string(abi.encodePacked(attrs,','));
                }
                attrs = string(abi.encodePacked(attrs,'{"trait_type": "', traitNames[(i+1)], '", "value": "',traitMap[(i+1)][1][meta[i]],'"}'));
            }
        }
        if(customizedToks[token].length > 0) {
            attrs = string(abi.encodePacked(attrs,',{"trait_type": "Customized", "value": "Yes"}'));
        }

        svg = string(abi.encodePacked(svg,"</svg>"));

        string memory json = string(abi.encodePacked('{"name": "Primapes - Base Babies #', Strings.toString(token + 1), '", "external_url": "https://primapes.gg/basebabies", ', '"description": "',tokenDesc,'", "attributes":[',attrs,'], "image_data": "', svg, '"}'));
        
        return string(abi.encodePacked('data:application/json;base64,', Base64.encode(bytes(json))));
    }

	function tokenURI(uint256 token) public view virtual override returns (string memory) {
	    require(token >= 0 && token <= totalSupply(),"nonexistent token");
        return getTokenMeta(token);
	}

    function setPrice(uint256 a) external onlyOwner {
        price = a;
    }

    function setWLPrice(uint256 a) external onlyOwner {
        priceWL = a;
    }

    function setCustomizePrice(uint256 a) external onlyOwner {
        customizePrice = a;
    }

    function setMaxPerMint(uint256 a) external onlyOwner {
        maxPerMint = a;
    }

    function setMaxPerWLMint(uint256 a) external onlyOwner {
        maxPerWLMint = a;
    }

    function setMaxPerWallet(uint256 a) external onlyOwner {
        maxPerWallet = a;
    }

    function setBaseURI(string memory u) external onlyOwner {
        _bURIExt = u;
    }

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

    function setmerkleRootWL(bytes32 data) external onlyOwner {
        merkleRootWL = data;
    }

    function setmerkleRootAPE(bytes32 data) external onlyOwner {
        merkleRootAPE = data;
    }

    function setmerkleRootKEY(bytes32 data) external onlyOwner {
        merkleRootKEY = data;
    }

    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function claimFreeAPE(uint256 amount, bytes32[] calldata merkleProof) external {
        require(!bPaused, "Contract paused");
        require(mintedAPE[msg.sender] < 1, "Primape free mints already claimed!");
        require((amount + minted[msg.sender]) <= maxPerWallet, "Exceeded max mint per wallet");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, amount));
        require(MerkleProof.verify(merkleProof, merkleRootAPE, leaf), "Invalid APE proof");

        uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt;
        require(avail > 0, "Sold out!"); 

        uint256 mAmt = Math.min(amount, avail);

        mintedOGAmt += mAmt;
        mintedAPE[msg.sender] += mAmt;
        minted[msg.sender] += mAmt;

        _safeMint(msg.sender, mAmt);
    }

    function claimFreeKEY(uint256 amount, bytes32[] calldata merkleProof) external {
        require(!bPaused, "Contract paused");
        require(mintedKEY[msg.sender] < 1, "Keynana free mints already claimed!");
        require((amount + minted[msg.sender]) <= maxPerWallet, "Exceeded max mint per wallet");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, amount));
        require(MerkleProof.verify(merkleProof, merkleRootKEY, leaf), "Invalid KEY proof");

        uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt;
        require(avail > 0, "Sold out!"); 

        uint256 mAmt = Math.min(amount, avail);

        mintedOGAmt += mAmt;
        mintedKEY[msg.sender] += mAmt;
        minted[msg.sender] += mAmt;

        _safeMint(msg.sender, mAmt);
    }

    function mintApeWL(uint256 amount, bytes32[] calldata merkleProof) external payable {
        require(!bPaused, "Contract paused.");
        require(bWL, "WL mint is closed.");
        require(amount <= maxPerWLMint, "Exceeded max mint per tx");
        require((amount + minted[msg.sender]) <= maxPerWallet, "Exceeded max mint per wallet");
        
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(merkleProof, merkleRootWL, leaf), "Invalid WL proof");

        uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt;
        require(avail > 0, "Sold out!");

        uint256 mAmt = Math.min(amount, avail);
        require(mAmt > 0, "Sold out!");
        uint256 tCost = mAmt * priceWL;
        require(msg.value >= tCost, "Not enough ETH sent"); 

        mintedWLAmt += mAmt;
        mintedWL[msg.sender] += mAmt;
        minted[msg.sender] += mAmt;

        _safeMint(msg.sender, mAmt);

        uint256 d = msg.value - tCost;
        if (d != 0) {
            Address.sendValue(payable(msg.sender), d);
        }
    }
    
    function mintApe(uint256 amount) external payable {
        require(!bPaused, "Contract paused.");
        require(bOpen, "Public mint is closed.");
        require(amount <= maxPerMint, "Exceeded max mint per tx");
        require((amount + minted[msg.sender]) <= maxPerWallet, "Exceeded max mint per wallet");

        uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt;
        require(avail > 0, "Sold out!");

        uint256 mAmt = Math.min(amount, avail);
        require(mAmt > 0, "Sold out!");
        uint256 tCost = mAmt * price;
        require(msg.value >= tCost, "Not enough ETH sent"); 

        mintedAmt += mAmt;
        minted[msg.sender] += mAmt;

        _safeMint(msg.sender, mAmt);

        uint256 d = msg.value - tCost;
        if (d != 0) {
            Address.sendValue(payable(msg.sender), d);
        }
    }

    function devMint(uint256 amount, address toAddr) external onlyOwner {
        require(!bPaused, "Contract paused");

        uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt;
        require(avail > 0, "Sold out!");

        uint256 mAmt = Math.min(amount, avail);
        require(mAmt > 0, "Sold out!");

        mintedAmt += mAmt;
        minted[toAddr] += mAmt;
        _safeMint(toAddr, mAmt);
    }

    function customizeApe(uint256 token, uint256[] calldata tmap) external payable {
        require(!bPaused, "Contract paused.");
        require(bCustomOpen, "Ape customizing is closed.");
        address owner = ERC721A.ownerOf(token);
        require(msg.sender == owner, "Can't update a not owned token.");
        require(tmap.length == 8, "Invalid trait map sent");
        require(msg.value >= customizePrice, "Not enough ETH sent"); 

        customizedToks[token] = tmap;
    }

    function withdraw(address toAddr) external onlyOwner {
        (bool success, ) = toAddr.call{
            value: address(this).balance
        } ("");
        require(success);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bCustomOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimFreeAPE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimFreeKEY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256[]","name":"tmap","type":"uint256[]"}],"name":"customizeApe","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"customizePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"toAddr","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"getTokenMeta","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"getTokenTraitMap","outputs":[{"internalType":"uint256[8]","name":"","type":"uint256[8]"}],"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":"string","name":"data","type":"string"},{"internalType":"bool","name":"reset","type":"bool"}],"name":"loadProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"data","type":"string"}],"name":"loadTokenDesc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256[]","name":"keys","type":"uint256[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"string[]","name":"images","type":"string[]"}],"name":"loadTraitData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWLMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","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":"merkleRootAPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootWL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintApe","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintApeWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedAPE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedKEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedOGAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedWLAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"u","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setCustomOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setCustomizePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setMaxPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setMaxPerWLMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setWLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"setmerkleRootAPE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"setmerkleRootKEY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"setmerkleRootWL","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":"token","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"toAddr","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

66354a6ba7a1800060085566470de4df8200006009556709935f581f050000600a908155600b805463ffffffff191690556000600c819055600d819055600e819055600f829055601091909155603260115560a06040526080908152601d906200006a908262000ab2565b50604080516020810190915260008152601e9062000089908262000ab2565b503480156200009757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601681526020017f5072696d61706573202d2042617365204261626965730000000000000000000081525060405180604001604052806008815260200167424153454241425960c01b815250816001908162000117919062000ab2565b50600262000126828262000ab2565b505050620001436200013d6200060a60201b60201c565b6200060e565b6daaeb6d7670e522a718067333cd4e3b1562000288578015620001d657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001b757600080fd5b505af1158015620001cc573d6000803e3d6000fd5b5050505062000288565b6001600160a01b03821615620002275760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200019c565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026e57600080fd5b505af115801562000283573d6000803e3d6000fd5b505050505b505060408051808201909152600a815269109858dad9dc9bdd5b9960b21b6020808301919091526001600052601690527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf4990620002e6908262000ab2565b50604080518082019091526003815262233ab960e91b6020808301919091526002600052601690527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648906200033c908262000ab2565b50604080518082019091526004815263426f647960e01b6020808301919091526003600052601690527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae9062000393908262000ab2565b506040805180820190915260088152672330b1b290233ab960c11b6020808301919091526004600052601690527fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a5990620003ee908262000ab2565b506040805180820190915260048152634579657360e01b6020808301919091526005600052601690527f5696377e725b42a372ecc45f0fbdab5e9555865aef54619ad9381892f667bbf09062000445908262000ab2565b5060408051808201909152600581526409adeeae8d60db1b6020808301919091526006600052601690527fc6a239f207aea309a1b4879cb5411b8facfc2bc1e4cc4717ff2598676c399b5f906200049d908262000ab2565b506040805180820190915260048152631219585960e21b6020808301919091526007600052601690527f5c9294642c77fdf0ce4b0f45159c977165b1ec2ef3bb94ee3e2a496634c781e890620004f4908262000ab2565b506040805180820190915260098152684163636573736f727960b81b6020808301919091526008600052601690527f5d722ae86c7aff0f95f426cf86f75793e8cd1a526603df14563c190f75fd2ef39062000550908262000ab2565b506040805160208101909152600081526019906200056f908262000ab2565b506001600e600082825462000585919062000b7e565b9091555050737f1156aa350982560653fed03ef0e285ef878b75600090815260126020527fb6fbaa6ce5d689fddb4de2f2cd57bc7688f80cc6a381c4d4235eb91342c4f28a805460019290620005dd90849062000b7e565b90915550620006049050737f1156aa350982560653fed03ef0e285ef878b75600162000660565b62000c4c565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620006828282604051806020016040528060008152506200068660201b60201c565b5050565b6200069583838360016200069a565b505050565b6000546001600160a01b038516620007035760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b83600003620007665760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401620006fa565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b85811015620008a05760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831562000893576200083a6000888488620008ab565b620008935760405162461bcd60e51b815260206004820152603360248201526000805160206200535283398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b6064820152608401620006fa565b60019182019101620007e3565b506000555050505050565b6000620008cc846001600160a01b031662000a0860201b62002b7b1760201c565b15620009fc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200090690339089908890889060040162000ba6565b6020604051808303816000875af192505050801562000944575060408051601f3d908101601f19168201909252620009419181019062000c19565b60015b620009e1573d80801562000975576040519150601f19603f3d011682016040523d82523d6000602084013e6200097a565b606091505b508051600003620009d95760405162461bcd60e51b815260206004820152603360248201526000805160206200535283398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b6064820152608401620006fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000a00565b5060015b949350505050565b3b151590565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a3957607f821691505b60208210810362000a5a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200069557600081815260208120601f850160051c8101602086101562000a895750805b601f850160051c820191505b8181101562000aaa5782815560010162000a95565b505050505050565b81516001600160401b0381111562000ace5762000ace62000a0e565b62000ae68162000adf845462000a24565b8462000a60565b602080601f83116001811462000b1e576000841562000b055750858301515b600019600386901b1c1916600185901b17855562000aaa565b600085815260208120601f198616915b8281101562000b4f5788860151825594840194600190910190840162000b2e565b508582101562000b6e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111562000ba057634e487b7160e01b600052601160045260246000fd5b92915050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b8281101562000bf55785810182015185820160a00152810162000bd7565b5050600060a0828501015260a0601f19601f83011684010191505095945050505050565b60006020828403121562000c2c57600080fd5b81516001600160e01b03198116811462000c4557600080fd5b9392505050565b6146f68062000c5c6000396000f3fe6080604052600436106103ef5760003560e01c806391b7f5ed11610208578063d6492d8111610118578063e985e9c5116100ab578063f6a5b8e61161007a578063f6a5b8e614610bb9578063fa29be8b14610bd9578063ff260b5914610bf3578063ff4bd12414610c20578063ff91b28f14610c4057600080fd5b8063e985e9c514610b1a578063ef873ed214610b63578063f25b644c14610b79578063f2fde38b14610b9957600080fd5b8063dfc5f930116100e7578063dfc5f93014610aad578063e268e4d314610ac3578063e4880c9914610ae3578063e7f9f46014610af957600080fd5b8063d6492d8114610a44578063d7844da614610a5a578063db6242c314610a6d578063debb8c5714610a8d57600080fd5b8063b2b76d4d1161019b578063bd986a2c1161016a578063bd986a2c146109ae578063bec7fc10146109ce578063c87b56dd146109ee578063cfb5c12414610a0e578063d5abeb0114610a2e57600080fd5b8063b2b76d4d1461093b578063b40e55701461094e578063b88d4fde1461096e578063bd4702501461098e57600080fd5b8063a22cb465116101d7578063a22cb465146108dc578063a723533e146108fc578063a899578d1461090f578063ad055c581461092557600080fd5b806391b7f5ed1461087257806395d89b41146108925780639aa5d57f146108a7578063a035b1fe146108c657600080fd5b806342842e0e1161030357806360d1fd0911610296578063715018a611610265578063715018a6146107cf5780638062c244146107e45780638462151c1461081157806389cfa3641461083e5780638da5cb5b1461085457600080fd5b806360d1fd09146107425780636352211e14610762578063696eb16f1461078257806370a08231146107af57600080fd5b806351cff8d9116102d257806351cff8d9146106b557806355f804b3146106d55780635cbcec4e146106f55780635df8ae691461071557600080fd5b806342842e0e14610649578063453c2310146106695780634f6ccce71461067f578063507e094f1461069f57600080fd5b8063164bd2b3116103865780631e7269c5116103555780631e7269c51461059a57806323b872dd146105c75780632d1a12f6146105e75780632f745c591461060757806341f434341461062757600080fd5b8063164bd2b31461052557806316c38b3c1461054557806318160ddd146105655780631adb068a1461058457600080fd5b8063081812fc116103c2578063081812fc1461048d578063095ea7b3146104c55780630d5a41de146104e557806311319b1e1461050557600080fd5b806301ec2701146103f457806301ffc9a71461041657806305e326a61461044b57806306fdde031461046b575b600080fd5b34801561040057600080fd5b5061041461040f366004613827565b610c56565b005b34801561042257600080fd5b50610436610431366004613888565b610eb8565b60405190151581526020015b60405180910390f35b34801561045757600080fd5b506104146104663660046138a5565b610f25565b34801561047757600080fd5b50610480610f54565b604051610442919061390e565b34801561049957600080fd5b506104ad6104a83660046138a5565b610fe6565b6040516001600160a01b039091168152602001610442565b3480156104d157600080fd5b506104146104e036600461393d565b611071565b3480156104f157600080fd5b506104146105003660046139a8565b611188565b34801561051157600080fd5b50600b546104369062010000900460ff1681565b34801561053157600080fd5b506104146105403660046139f9565b6111bf565b34801561055157600080fd5b50610414610560366004613a4c565b611235565b34801561057157600080fd5b506000545b604051908152602001610442565b34801561059057600080fd5b50610576600e5481565b3480156105a657600080fd5b506105766105b5366004613a67565b60126020526000908152604090205481565b3480156105d357600080fd5b506104146105e2366004613a82565b61127b565b3480156105f357600080fd5b50610414610602366004613abe565b611286565b34801561061357600080fd5b5061057661062236600461393d565b6113a4565b34801561063357600080fd5b506104ad6daaeb6d7670e522a718067333cd4e81565b34801561065557600080fd5b50610414610664366004613a82565b6114fe565b34801561067557600080fd5b5061057660115481565b34801561068b57600080fd5b5061057661069a3660046138a5565b611519565b3480156106ab57600080fd5b50610576600f5481565b3480156106c157600080fd5b506104146106d0366004613a67565b61157b565b3480156106e157600080fd5b506104146106f0366004613b75565b611609565b34801561070157600080fd5b50610414610710366004613a4c565b61163f565b34801561072157600080fd5b50610576610730366004613a67565b60146020526000908152604090205481565b34801561074e57600080fd5b5061041461075d366004613a4c565b611683565b34801561076e57600080fd5b506104ad61077d3660046138a5565b6116cb565b34801561078e57600080fd5b506107a261079d3660046138a5565b6116dd565b6040516104429190613bbd565b3480156107bb57600080fd5b506105766107ca366004613a67565b611928565b3480156107db57600080fd5b506104146119b9565b3480156107f057600080fd5b506105766107ff366004613a67565b60156020526000908152604090205481565b34801561081d57600080fd5b5061083161082c366004613a67565b6119ef565b6040516104429190613bef565b34801561084a57600080fd5b50610576600d5481565b34801561086057600080fd5b506007546001600160a01b03166104ad565b34801561087e57600080fd5b5061041461088d3660046138a5565b611ab0565b34801561089e57600080fd5b50610480611adf565b3480156108b357600080fd5b50600b5461043690610100900460ff1681565b3480156108d257600080fd5b5061057660095481565b3480156108e857600080fd5b506104146108f7366004613c33565b611aee565b61041461090a3660046138a5565b611bb2565b34801561091b57600080fd5b50610576600a5481565b34801561093157600080fd5b5061057660105481565b610414610949366004613827565b611dcc565b34801561095a57600080fd5b506104806109693660046138a5565b611f37565b34801561097a57600080fd5b50610414610989366004613c5d565b612240565b34801561099a57600080fd5b506104146109a93660046138a5565b612273565b3480156109ba57600080fd5b506104146109c9366004613a4c565b6122a2565b3480156109da57600080fd5b506104146109e9366004613cd8565b6122df565b3480156109fa57600080fd5b50610480610a093660046138a5565b612466565b348015610a1a57600080fd5b50610414610a293660046138a5565b6124bd565b348015610a3a57600080fd5b5061057661138881565b348015610a5057600080fd5b50610576601a5481565b610414610a68366004613827565b6124ec565b348015610a7957600080fd5b50610414610a883660046138a5565b6127d8565b348015610a9957600080fd5b50610414610aa83660046138a5565b612807565b348015610ab957600080fd5b5061057660085481565b348015610acf57600080fd5b50610414610ade3660046138a5565b612836565b348015610aef57600080fd5b50610576601b5481565b348015610b0557600080fd5b50600b54610436906301000000900460ff1681565b348015610b2657600080fd5b50610436610b35366004613d7b565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610b6f57600080fd5b50610576601c5481565b348015610b8557600080fd5b50610414610b94366004613827565b612865565b348015610ba557600080fd5b50610414610bb4366004613a67565b612a82565b348015610bc557600080fd5b50610414610bd43660046138a5565b612b1d565b348015610be557600080fd5b50600b546104369060ff1681565b348015610bff57600080fd5b50610576610c0e366004613a67565b60136020526000908152604090205481565b348015610c2c57600080fd5b50610414610c3b3660046138a5565b612b4c565b348015610c4c57600080fd5b50610576600c5481565b600b5462010000900460ff1615610c885760405162461bcd60e51b8152600401610c7f90613da5565b60405180910390fd5b33600090815260156020526040902054600111610cf35760405162461bcd60e51b815260206004820152602360248201527f4b65796e616e612066726565206d696e747320616c726561647920636c61696d60448201526265642160e81b6064820152608401610c7f565b60115433600090815260126020526040902054610d109085613de4565b1115610d2e5760405162461bcd60e51b8152600401610c7f90613df7565b6040516001600160601b03193360601b16602082015260348101849052600090605401604051602081830303815290604052805190602001209050610daa83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601c549150849050612b81565b610dea5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21025a2ac90383937b7b360791b6044820152606401610c7f565b6000600e54600d54600c54611388610e029190613e2e565b610e0c9190613e2e565b610e169190613e2e565b905060008111610e385760405162461bcd60e51b8152600401610c7f90613e41565b6000610e448683612b97565b905080600c6000828254610e589190613de4565b90915550503360009081526015602052604081208054839290610e7c908490613de4565b90915550503360009081526012602052604081208054839290610ea0908490613de4565b90915550610eb090503382612baf565b505050505050565b60006001600160e01b031982166380ac58cd60e01b1480610ee957506001600160e01b03198216635b5e139f60e01b145b80610f0457506001600160e01b0319821663780e9d6360e01b145b80610f1f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b03163314610f4f5760405162461bcd60e51b8152600401610c7f90613e64565b600a55565b606060018054610f6390613e99565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8f90613e99565b8015610fdc5780601f10610fb157610100808354040283529160200191610fdc565b820191906000526020600020905b815481529060010190602001808311610fbf57829003601f168201915b5050505050905090565b6000610ff3826000541190565b6110555760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610c7f565b506000908152600560205260409020546001600160a01b031690565b600061107c826116cb565b9050806001600160a01b0316836001600160a01b0316036110ea5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610c7f565b336001600160a01b038216148061110657506111068133610b35565b6111785760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610c7f565b611183838383612bc9565b505050565b6007546001600160a01b031633146111b25760405162461bcd60e51b8152600401610c7f90613e64565b601e611183828483613f13565b6007546001600160a01b031633146111e95760405162461bcd60e51b8152600401610c7f90613e64565b80156112025760196111fc838583613f13565b50505050565b6019838360405160200161121893929190614045565b604051602081830303815290604052601990816111fc9190614065565b6007546001600160a01b0316331461125f5760405162461bcd60e51b8152600401610c7f90613e64565b600b8054911515620100000262ff000019909216919091179055565b611183838383612c25565b6007546001600160a01b031633146112b05760405162461bcd60e51b8152600401610c7f90613e64565b600b5462010000900460ff16156112d95760405162461bcd60e51b8152600401610c7f90613da5565b6000600e54600d54600c546113886112f19190613e2e565b6112fb9190613e2e565b6113059190613e2e565b9050600081116113275760405162461bcd60e51b8152600401610c7f90613e41565b60006113338483612b97565b9050600081116113555760405162461bcd60e51b8152600401610c7f90613e41565b80600e60008282546113679190613de4565b90915550506001600160a01b03831660009081526012602052604081208054839290611394908490613de4565b909155506111fc90508382612baf565b60006113af83611928565b82106114085760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610c7f565b600080549080805b8381101561149e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561146257805192505b876001600160a01b0316836001600160a01b0316036114955786840361148e57509350610f1f92505050565b6001909301925b50600101611410565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610c7f565b61118383838360405180602001604052806000815250612240565b6000805482106115775760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610c7f565b5090565b6007546001600160a01b031633146115a55760405162461bcd60e51b8152600401610c7f90613e64565b6000816001600160a01b03164760405160006040518083038185875af1925050503d80600081146115f2576040519150601f19603f3d011682016040523d82523d6000602084013e6115f7565b606091505b505090508061160557600080fd5b5050565b6007546001600160a01b031633146116335760405162461bcd60e51b8152600401610c7f90613e64565b601d6116058282614065565b6007546001600160a01b031633146116695760405162461bcd60e51b8152600401610c7f90613e64565b600b80549115156101000261ff0019909216919091179055565b6007546001600160a01b031633146116ad5760405162461bcd60e51b8152600401610c7f90613e64565b600b805491151563010000000263ff00000019909216919091179055565b60006116d682612f05565b5192915050565b6116e5613766565b6116f0826010614124565b601980546116fd90613e99565b9050101561174d5760405162461bcd60e51b815260206004820152601c60248201527f6e6f6e6578697374656e7420746f6b656e2070726f76656e616e6365000000006044820152606401610c7f565b600061175a600184613e2e565b611765906010614124565b905060006019805461177690613e99565b80601f01602080910402602001604051908101604052809291908181526020018280546117a290613e99565b80156117ef5780601f106117c4576101008083540402835291602001916117ef565b820191906000526020600020905b8154815290600101906020018083116117d257829003601f168201915b505050505090506117fe613766565b60005b600881101561191f5760408051600280825281830190925260009160208201818036833701905050905083611837836002614124565b6118419087613de4565b815181106118515761185161413b565b602001015160f81c60f81b8160008151811061186f5761186f61413b565b60200101906001600160f81b031916908160001a90535083611892836002614124565b61189d906001613de4565b6118a79087613de4565b815181106118b7576118b761413b565b602001015160f81c60f81b816001815181106118d5576118d561413b565b60200101906001600160f81b031916908160001a9053506118f581612fdb565b8383600881106119075761190761413b565b6020020152508061191781614151565b915050611801565b50949350505050565b60006001600160a01b0382166119945760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610c7f565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146119e35760405162461bcd60e51b8152600401610c7f90613e64565b6119ed6000613055565b565b606060006119fc83611928565b905080600003611a205760408051600080825260208201909252905b509392505050565b6000816001600160401b03811115611a3a57611a3a613aea565b604051908082528060200260200182016040528015611a63578160200160208202803683370190505b50905060005b82811015611a1857611a7b85826113a4565b828281518110611a8d57611a8d61413b565b602090810291909101015280611aa281614151565b915050611a69565b50919050565b6007546001600160a01b03163314611ada5760405162461bcd60e51b8152600401610c7f90613e64565b600955565b606060028054610f6390613e99565b336001600160a01b03831603611b465760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610c7f565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b5462010000900460ff1615611bdb5760405162461bcd60e51b8152600401610c7f9061416a565b600b54610100900460ff16611c2b5760405162461bcd60e51b8152602060048201526016602482015275283ab13634b19036b4b73a1034b99031b637b9b2b21760511b6044820152606401610c7f565b600f54811115611c785760405162461bcd60e51b815260206004820152601860248201527708af0c6cacac8cac840dac2f040dad2dce840e0cae440e8f60431b6044820152606401610c7f565b60115433600090815260126020526040902054611c959083613de4565b1115611cb35760405162461bcd60e51b8152600401610c7f90613df7565b6000600e54600d54600c54611388611ccb9190613e2e565b611cd59190613e2e565b611cdf9190613e2e565b905060008111611d015760405162461bcd60e51b8152600401610c7f90613e41565b6000611d0d8383612b97565b905060008111611d2f5760405162461bcd60e51b8152600401610c7f90613e41565b600060095482611d3f9190614124565b905080341015611d615760405162461bcd60e51b8152600401610c7f90614194565b81600e6000828254611d739190613de4565b90915550503360009081526012602052604081208054849290611d97908490613de4565b90915550611da790503383612baf565b6000611db38234613e2e565b90508015611dc557611dc533826130a7565b5050505050565b600b5462010000900460ff1615611df55760405162461bcd60e51b8152600401610c7f9061416a565b600b546301000000900460ff16611e4e5760405162461bcd60e51b815260206004820152601a60248201527f41706520637573746f6d697a696e6720697320636c6f7365642e0000000000006044820152606401610c7f565b6000611e59846116cb565b9050336001600160a01b03821614611eb35760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207570646174652061206e6f74206f776e656420746f6b656e2e006044820152606401610c7f565b60088214611efc5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d1c985a5d081b585c081cd95b9d60521b6044820152606401610c7f565b600a54341015611f1e5760405162461bcd60e51b8152600401610c7f90614194565b6000848152601860205260409020611dc5908484613785565b6060611f41613766565b60008381526018602052604090205415611fbb5760005b6008811015611fb5576000848152601860205260409020805482908110611f8157611f8161413b565b9060005260206000200154828260088110611f9e57611f9e61413b565b602002015280611fad81614151565b915050611f58565b50611fcc565b611fc961079d846001613de4565b90505b60006040518060c00160405280608e8152602001614633608e913960408051602081019091526000808252919250905b60088110156121755760008482600881106120195761201961413b565b60200201511115612163578260176000612034846001613de4565b815260200190815260200160002060006002815260200190815260200160002060008684600881106120685761206861413b565b6020020151815260200190815260200160002060405160200161208c9291906141c1565b604051602081830303815290604052925081516000146120c957816040516020016120b79190614238565b60405160208183030381529060405291505b81601660006120d9846001613de4565b8152602001908152602001600020601760008460016120f89190613de4565b8152602001908152602001600020600060018152602001908152602001600020600087856008811061212c5761212c61413b565b602002015181526020019081526020016000206040516020016121519392919061425d565b60405160208183030381529060405291505b8061216d81614151565b915050611ffc565b50600085815260186020526040902054156121ad578060405160200161219b91906142cd565b60405160208183030381529060405290505b816040516020016121be9190614324565b60408051601f19818403018152919052915060006121e56121e0876001613de4565b6131c0565b601e83856040516020016121fc949392919061434e565b6040516020818303038152906040529050612216816132c8565b604051602001612226919061447c565b604051602081830303815290604052945050505050919050565b61224b848484612c25565b6122578484848461342c565b6111fc5760405162461bcd60e51b8152600401610c7f906144c1565b6007546001600160a01b0316331461229d5760405162461bcd60e51b8152600401610c7f90613e64565b601c55565b6007546001600160a01b031633146122cc5760405162461bcd60e51b8152600401610c7f90613e64565b600b805460ff1916911515919091179055565b6007546001600160a01b031633146123095760405162461bcd60e51b8152600401610c7f90613e64565b84838114801561231857508181145b6123565760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204c656e6774687360881b6044820152606401610c7f565b60005b8181101561245b578585828181106123735761237361413b565b90506020028101906123859190614514565b60008b8152601760209081526040808320600184529091528120908b8b868181106123b2576123b261413b565b90506020020135815260200190815260200160002091826123d4929190613f13565b508383828181106123e7576123e761413b565b90506020028101906123f99190614514565b60008b8152601760209081526040808320600284529091528120908b8b868181106124265761242661413b565b9050602002013581526020019081526020016000209182612448929190613f13565b508061245381614151565b915050612359565b505050505050505050565b606061247160005490565b8211156124b45760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c7f565b610f1f82611f37565b6007546001600160a01b031633146124e75760405162461bcd60e51b8152600401610c7f90613e64565b601055565b600b5462010000900460ff16156125155760405162461bcd60e51b8152600401610c7f9061416a565b600b5460ff1661255c5760405162461bcd60e51b81526020600482015260126024820152712ba61036b4b73a1034b99031b637b9b2b21760711b6044820152606401610c7f565b6010548311156125a95760405162461bcd60e51b815260206004820152601860248201527708af0c6cacac8cac840dac2f040dad2dce840e0cae440e8f60431b6044820152606401610c7f565b601154336000908152601260205260409020546125c69085613de4565b11156125e45760405162461bcd60e51b8152600401610c7f90613df7565b6040516001600160601b03193360601b16602082015260009060340160405160208183030381529060405280519060200120905061265983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601a549150849050612b81565b6126985760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102ba610383937b7b360811b6044820152606401610c7f565b6000600e54600d54600c546113886126b09190613e2e565b6126ba9190613e2e565b6126c49190613e2e565b9050600081116126e65760405162461bcd60e51b8152600401610c7f90613e41565b60006126f28683612b97565b9050600081116127145760405162461bcd60e51b8152600401610c7f90613e41565b6000600854826127249190614124565b9050803410156127465760405162461bcd60e51b8152600401610c7f90614194565b81600d60008282546127589190613de4565b9091555050336000908152601360205260408120805484929061277c908490613de4565b909155505033600090815260126020526040812080548492906127a0908490613de4565b909155506127b090503383612baf565b60006127bc8234613e2e565b905080156127ce576127ce33826130a7565b5050505050505050565b6007546001600160a01b031633146128025760405162461bcd60e51b8152600401610c7f90613e64565b600f55565b6007546001600160a01b031633146128315760405162461bcd60e51b8152600401610c7f90613e64565b601b55565b6007546001600160a01b031633146128605760405162461bcd60e51b8152600401610c7f90613e64565b601155565b600b5462010000900460ff161561288e5760405162461bcd60e51b8152600401610c7f90613da5565b336000908152601460205260409020546001116128f95760405162461bcd60e51b815260206004820152602360248201527f5072696d6170652066726565206d696e747320616c726561647920636c61696d60448201526265642160e81b6064820152608401610c7f565b601154336000908152601260205260409020546129169085613de4565b11156129345760405162461bcd60e51b8152600401610c7f90613df7565b6040516001600160601b03193360601b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506129b083838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601b549150849050612b81565b6129f05760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21020a82290383937b7b360791b6044820152606401610c7f565b6000600e54600d54600c54611388612a089190613e2e565b612a129190613e2e565b612a1c9190613e2e565b905060008111612a3e5760405162461bcd60e51b8152600401610c7f90613e41565b6000612a4a8683612b97565b905080600c6000828254612a5e9190613de4565b90915550503360009081526014602052604081208054839290610e7c908490613de4565b6007546001600160a01b03163314612aac5760405162461bcd60e51b8152600401610c7f90613e64565b6001600160a01b038116612b115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c7f565b612b1a81613055565b50565b6007546001600160a01b03163314612b475760405162461bcd60e51b8152600401610c7f90613e64565b600855565b6007546001600160a01b03163314612b765760405162461bcd60e51b8152600401610c7f90613e64565b601a55565b3b151590565b600082612b8e858461352d565b14949350505050565b6000818310612ba65781612ba8565b825b9392505050565b611605828260405180602001604052806000815250613599565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612c3082612f05565b80519091506000906001600160a01b0316336001600160a01b03161480612c67575033612c5c84610fe6565b6001600160a01b0316145b80612c7957508151612c799033610b35565b905080612ce35760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610c7f565b846001600160a01b031682600001516001600160a01b031614612d575760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610c7f565b6001600160a01b038416612dbb5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610c7f565b612dcb6000848460000151612bc9565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b031602179055908601808352912054909116612ebe57612e72816000541190565b15612ebe57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dc5565b6040805180820190915260008082526020820152612f24826000541190565b612f835760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610c7f565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215612fd1579392505050565b5060001901612f85565b60008181805b8251811015611a18576000838281518110612ffe57612ffe61413b565b016020015160f81c90506030811080159061301a575060398111155b156130425761302a603082613e2e565b61303584600a614124565b61303f9190613de4565b92505b508061304d81614151565b915050612fe1565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b804710156130f75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c7f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613144576040519150601f19603f3d011682016040523d82523d6000602084013e613149565b606091505b50509050806111835760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c7f565b6060816000036131e75750506040805180820190915260018152600360fc1b602082015290565b8160005b811561321157806131fb81614151565b915061320a9050600a83614570565b91506131eb565b6000816001600160401b0381111561322b5761322b613aea565b6040519080825280601f01601f191660200182016040528015613255576020820181803683370190505b5090505b84156132c05761326a600183613e2e565b9150613277600a86614584565b613282906030613de4565b60f81b8183815181106132975761329761413b565b60200101906001600160f81b031916908160001a9053506132b9600a86614570565b9450613259565b949350505050565b606081516000036132e757505060408051602081019091526000815290565b60006040518060600160405280604081526020016145f360409139905060006003845160026133169190613de4565b6133209190614570565b61332b906004614124565b9050600061333a826020613de4565b6001600160401b0381111561335157613351613aea565b6040519080825280601f01601f19166020018201604052801561337b576020820181803683370190505b509050818152600183018586518101602084015b818310156133e7576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161338f565b60038951066001811461340157600281146134125761341e565b613d3d60f01b60011983015261341e565b603d60f81b6000198301525b509398975050505050505050565b60006001600160a01b0384163b1561352257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613470903390899088908890600401614598565b6020604051808303816000875af19250505080156134ab575060408051601f3d908101601f191682019092526134a8918101906145d5565b60015b613508573d8080156134d9576040519150601f19603f3d011682016040523d82523d6000602084013e6134de565b606091505b5080516000036135005760405162461bcd60e51b8152600401610c7f906144c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506132c0565b506001949350505050565b600081815b8451811015611a1857600085828151811061354f5761354f61413b565b602002602001015190508083116135755760008381526020829052604090209250613586565b600081815260208490526040902092505b508061359181614151565b915050613532565b61118383838360016000546001600160a01b0385166136045760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610c7f565b836000036136655760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610c7f565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b8581101561375d5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831561375157613735600088848861342c565b6137515760405162461bcd60e51b8152600401610c7f906144c1565b600191820191016136e2565b50600055611dc5565b6040518061010001604052806008906020820280368337509192915050565b8280548282559060005260206000209081019282156137c0579160200282015b828111156137c05782358255916020019190600101906137a5565b506115779291505b8082111561157757600081556001016137c8565b60008083601f8401126137ee57600080fd5b5081356001600160401b0381111561380557600080fd5b6020830191508360208260051b850101111561382057600080fd5b9250929050565b60008060006040848603121561383c57600080fd5b8335925060208401356001600160401b0381111561385957600080fd5b613865868287016137dc565b9497909650939450505050565b6001600160e01b031981168114612b1a57600080fd5b60006020828403121561389a57600080fd5b8135612ba881613872565b6000602082840312156138b757600080fd5b5035919050565b60005b838110156138d95781810151838201526020016138c1565b50506000910152565b600081518084526138fa8160208601602086016138be565b601f01601f19169290920160200192915050565b602081526000612ba860208301846138e2565b80356001600160a01b038116811461393857600080fd5b919050565b6000806040838503121561395057600080fd5b61395983613921565b946020939093013593505050565b60008083601f84011261397957600080fd5b5081356001600160401b0381111561399057600080fd5b60208301915083602082850101111561382057600080fd5b600080602083850312156139bb57600080fd5b82356001600160401b038111156139d157600080fd5b6139dd85828601613967565b90969095509350505050565b8035801515811461393857600080fd5b600080600060408486031215613a0e57600080fd5b83356001600160401b03811115613a2457600080fd5b613a3086828701613967565b9094509250613a439050602085016139e9565b90509250925092565b600060208284031215613a5e57600080fd5b612ba8826139e9565b600060208284031215613a7957600080fd5b612ba882613921565b600080600060608486031215613a9757600080fd5b613aa084613921565b9250613aae60208501613921565b9150604084013590509250925092565b60008060408385031215613ad157600080fd5b82359150613ae160208401613921565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115613b1a57613b1a613aea565b604051601f8501601f19908116603f01168101908282118183101715613b4257613b42613aea565b81604052809350858152868686011115613b5b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613b8757600080fd5b81356001600160401b03811115613b9d57600080fd5b8201601f81018413613bae57600080fd5b6132c084823560208401613b00565b6101008101818360005b6008811015613be6578151835260209283019290910190600101613bc7565b50505092915050565b6020808252825182820181905260009190848201906040850190845b81811015613c2757835183529284019291840191600101613c0b565b50909695505050505050565b60008060408385031215613c4657600080fd5b613c4f83613921565b9150613ae1602084016139e9565b60008060008060808587031215613c7357600080fd5b613c7c85613921565b9350613c8a60208601613921565b92506040850135915060608501356001600160401b03811115613cac57600080fd5b8501601f81018713613cbd57600080fd5b613ccc87823560208401613b00565b91505092959194509250565b60008060008060008060006080888a031215613cf357600080fd5b8735965060208801356001600160401b0380821115613d1157600080fd5b613d1d8b838c016137dc565b909850965060408a0135915080821115613d3657600080fd5b613d428b838c016137dc565b909650945060608a0135915080821115613d5b57600080fd5b50613d688a828b016137dc565b989b979a50959850939692959293505050565b60008060408385031215613d8e57600080fd5b613d9783613921565b9150613ae160208401613921565b6020808252600f908201526e10dbdb9d1c9858dd081c185d5cd959608a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f1f57610f1f613dce565b6020808252601c908201527f4578636565646564206d6178206d696e74207065722077616c6c657400000000604082015260600190565b81810381811115610f1f57610f1f613dce565b602080825260099082015268536f6c64206f75742160b81b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613ead57607f821691505b602082108103611aaa57634e487b7160e01b600052602260045260246000fd5b601f82111561118357600081815260208120601f850160051c81016020861015613ef45750805b601f850160051c820191505b81811015610eb057828155600101613f00565b6001600160401b03831115613f2a57613f2a613aea565b613f3e83613f388354613e99565b83613ecd565b6000601f841160018114613f725760008515613f5a5750838201355b600019600387901b1c1916600186901b178355611dc5565b600083815260209020601f19861690835b82811015613fa35786850135825560209485019460019092019101613f83565b5086821015613fc05760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154613fdf81613e99565b60018281168015613ff7576001811461400c5761403b565b60ff198416875282151583028701945061403b565b8560005260208060002060005b858110156140325781548a820152908401908201614019565b50505082870194505b5050505092915050565b60006140518286613fd2565b838582376000930192835250909392505050565b81516001600160401b0381111561407e5761407e613aea565b6140928161408c8454613e99565b84613ecd565b602080601f8311600181146140c757600084156140af5750858301515b600019600386901b1c1916600185901b178555610eb0565b600085815260208120601f198616915b828110156140f6578886015182559484019460019091019084016140d7565b50858210156141145787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610f1f57610f1f613dce565b634e487b7160e01b600052603260045260246000fd5b60006001820161416357614163613dce565b5060010190565b60208082526010908201526f21b7b73a3930b1ba103830bab9b2b21760811b604082015260600190565b602080825260139082015272139bdd08195b9bdd59da08115512081cd95b9d606a1b604082015260600190565b600083516141d38184602088016138be565b7f3c696d61676520783d27302720793d2730272077696474683d273732302720689083019081527165696768743d273732302720687265663d2760701b60208201526142226032820185613fd2565b631390179f60e11b815260040195945050505050565b6000825161424a8184602087016138be565b600b60fa1b920191825250600101919050565b6000845161426f8184602089016138be565b6f3d913a3930b4ba2fba3cb832911d101160811b9083019081526142966010820186613fd2565b6c111610113b30b63ab2911d101160991b815290506142b8600d820185613fd2565b61227d60f01b81526002019695505050505050565b600082516142df8184602087016138be565b7f2c7b2274726169745f74797065223a2022437573746f6d697a6564222c2022769201918252506c616c7565223a2022596573227d60981b6020820152602d01919050565b600082516143368184602087016138be565b651e17b9bb339f60d11b920191825250600601919050565b7f7b226e616d65223a20225072696d61706573202d204261736520426162696573815261202360f01b602082015260008551614391816022850160208a016138be565b7f222c202265787465726e616c5f75726c223a202268747470733a2f2f7072696d60229184019182015274030b832b99733b397b130b9b2b130b134b2b991161605d1b60428201526f113232b9b1b934b83a34b7b7111d101160811b60578201526143ff6067820187613fd2565b70222c202261747472696275746573223a5b60781b8152855190915061442c8160118401602089016138be565b712e96101134b6b0b3b2afb230ba30911d101160711b60119290910191820152835161445f8160238401602088016138be565b61227d60f01b602392909101918201526025019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516144b481601d8501602087016138be565b91909101601d0192915050565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000808335601e1984360301811261452b57600080fd5b8301803591506001600160401b0382111561454557600080fd5b60200191503681900382131561382057600080fd5b634e487b7160e01b600052601260045260246000fd5b60008261457f5761457f61455a565b500490565b6000826145935761459361455a565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906145cb908301846138e2565b9695505050505050565b6000602082840312156145e757600080fd5b8151612ba88161387256fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7376672077696474683d2737323027206865696768743d27373230272076696577426f783d273020302037323020373230272066696c6c3d276e6f6e652720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b273ea2646970667358221220326f11280f6eb5f835014dde6063a0b8ff661e12eef0dda760febdf3f70b52fd64736f6c63430008120033455243373231413a207472616e7366657220746f206e6f6e2045524337323152

Deployed Bytecode

0x6080604052600436106103ef5760003560e01c806391b7f5ed11610208578063d6492d8111610118578063e985e9c5116100ab578063f6a5b8e61161007a578063f6a5b8e614610bb9578063fa29be8b14610bd9578063ff260b5914610bf3578063ff4bd12414610c20578063ff91b28f14610c4057600080fd5b8063e985e9c514610b1a578063ef873ed214610b63578063f25b644c14610b79578063f2fde38b14610b9957600080fd5b8063dfc5f930116100e7578063dfc5f93014610aad578063e268e4d314610ac3578063e4880c9914610ae3578063e7f9f46014610af957600080fd5b8063d6492d8114610a44578063d7844da614610a5a578063db6242c314610a6d578063debb8c5714610a8d57600080fd5b8063b2b76d4d1161019b578063bd986a2c1161016a578063bd986a2c146109ae578063bec7fc10146109ce578063c87b56dd146109ee578063cfb5c12414610a0e578063d5abeb0114610a2e57600080fd5b8063b2b76d4d1461093b578063b40e55701461094e578063b88d4fde1461096e578063bd4702501461098e57600080fd5b8063a22cb465116101d7578063a22cb465146108dc578063a723533e146108fc578063a899578d1461090f578063ad055c581461092557600080fd5b806391b7f5ed1461087257806395d89b41146108925780639aa5d57f146108a7578063a035b1fe146108c657600080fd5b806342842e0e1161030357806360d1fd0911610296578063715018a611610265578063715018a6146107cf5780638062c244146107e45780638462151c1461081157806389cfa3641461083e5780638da5cb5b1461085457600080fd5b806360d1fd09146107425780636352211e14610762578063696eb16f1461078257806370a08231146107af57600080fd5b806351cff8d9116102d257806351cff8d9146106b557806355f804b3146106d55780635cbcec4e146106f55780635df8ae691461071557600080fd5b806342842e0e14610649578063453c2310146106695780634f6ccce71461067f578063507e094f1461069f57600080fd5b8063164bd2b3116103865780631e7269c5116103555780631e7269c51461059a57806323b872dd146105c75780632d1a12f6146105e75780632f745c591461060757806341f434341461062757600080fd5b8063164bd2b31461052557806316c38b3c1461054557806318160ddd146105655780631adb068a1461058457600080fd5b8063081812fc116103c2578063081812fc1461048d578063095ea7b3146104c55780630d5a41de146104e557806311319b1e1461050557600080fd5b806301ec2701146103f457806301ffc9a71461041657806305e326a61461044b57806306fdde031461046b575b600080fd5b34801561040057600080fd5b5061041461040f366004613827565b610c56565b005b34801561042257600080fd5b50610436610431366004613888565b610eb8565b60405190151581526020015b60405180910390f35b34801561045757600080fd5b506104146104663660046138a5565b610f25565b34801561047757600080fd5b50610480610f54565b604051610442919061390e565b34801561049957600080fd5b506104ad6104a83660046138a5565b610fe6565b6040516001600160a01b039091168152602001610442565b3480156104d157600080fd5b506104146104e036600461393d565b611071565b3480156104f157600080fd5b506104146105003660046139a8565b611188565b34801561051157600080fd5b50600b546104369062010000900460ff1681565b34801561053157600080fd5b506104146105403660046139f9565b6111bf565b34801561055157600080fd5b50610414610560366004613a4c565b611235565b34801561057157600080fd5b506000545b604051908152602001610442565b34801561059057600080fd5b50610576600e5481565b3480156105a657600080fd5b506105766105b5366004613a67565b60126020526000908152604090205481565b3480156105d357600080fd5b506104146105e2366004613a82565b61127b565b3480156105f357600080fd5b50610414610602366004613abe565b611286565b34801561061357600080fd5b5061057661062236600461393d565b6113a4565b34801561063357600080fd5b506104ad6daaeb6d7670e522a718067333cd4e81565b34801561065557600080fd5b50610414610664366004613a82565b6114fe565b34801561067557600080fd5b5061057660115481565b34801561068b57600080fd5b5061057661069a3660046138a5565b611519565b3480156106ab57600080fd5b50610576600f5481565b3480156106c157600080fd5b506104146106d0366004613a67565b61157b565b3480156106e157600080fd5b506104146106f0366004613b75565b611609565b34801561070157600080fd5b50610414610710366004613a4c565b61163f565b34801561072157600080fd5b50610576610730366004613a67565b60146020526000908152604090205481565b34801561074e57600080fd5b5061041461075d366004613a4c565b611683565b34801561076e57600080fd5b506104ad61077d3660046138a5565b6116cb565b34801561078e57600080fd5b506107a261079d3660046138a5565b6116dd565b6040516104429190613bbd565b3480156107bb57600080fd5b506105766107ca366004613a67565b611928565b3480156107db57600080fd5b506104146119b9565b3480156107f057600080fd5b506105766107ff366004613a67565b60156020526000908152604090205481565b34801561081d57600080fd5b5061083161082c366004613a67565b6119ef565b6040516104429190613bef565b34801561084a57600080fd5b50610576600d5481565b34801561086057600080fd5b506007546001600160a01b03166104ad565b34801561087e57600080fd5b5061041461088d3660046138a5565b611ab0565b34801561089e57600080fd5b50610480611adf565b3480156108b357600080fd5b50600b5461043690610100900460ff1681565b3480156108d257600080fd5b5061057660095481565b3480156108e857600080fd5b506104146108f7366004613c33565b611aee565b61041461090a3660046138a5565b611bb2565b34801561091b57600080fd5b50610576600a5481565b34801561093157600080fd5b5061057660105481565b610414610949366004613827565b611dcc565b34801561095a57600080fd5b506104806109693660046138a5565b611f37565b34801561097a57600080fd5b50610414610989366004613c5d565b612240565b34801561099a57600080fd5b506104146109a93660046138a5565b612273565b3480156109ba57600080fd5b506104146109c9366004613a4c565b6122a2565b3480156109da57600080fd5b506104146109e9366004613cd8565b6122df565b3480156109fa57600080fd5b50610480610a093660046138a5565b612466565b348015610a1a57600080fd5b50610414610a293660046138a5565b6124bd565b348015610a3a57600080fd5b5061057661138881565b348015610a5057600080fd5b50610576601a5481565b610414610a68366004613827565b6124ec565b348015610a7957600080fd5b50610414610a883660046138a5565b6127d8565b348015610a9957600080fd5b50610414610aa83660046138a5565b612807565b348015610ab957600080fd5b5061057660085481565b348015610acf57600080fd5b50610414610ade3660046138a5565b612836565b348015610aef57600080fd5b50610576601b5481565b348015610b0557600080fd5b50600b54610436906301000000900460ff1681565b348015610b2657600080fd5b50610436610b35366004613d7b565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610b6f57600080fd5b50610576601c5481565b348015610b8557600080fd5b50610414610b94366004613827565b612865565b348015610ba557600080fd5b50610414610bb4366004613a67565b612a82565b348015610bc557600080fd5b50610414610bd43660046138a5565b612b1d565b348015610be557600080fd5b50600b546104369060ff1681565b348015610bff57600080fd5b50610576610c0e366004613a67565b60136020526000908152604090205481565b348015610c2c57600080fd5b50610414610c3b3660046138a5565b612b4c565b348015610c4c57600080fd5b50610576600c5481565b600b5462010000900460ff1615610c885760405162461bcd60e51b8152600401610c7f90613da5565b60405180910390fd5b33600090815260156020526040902054600111610cf35760405162461bcd60e51b815260206004820152602360248201527f4b65796e616e612066726565206d696e747320616c726561647920636c61696d60448201526265642160e81b6064820152608401610c7f565b60115433600090815260126020526040902054610d109085613de4565b1115610d2e5760405162461bcd60e51b8152600401610c7f90613df7565b6040516001600160601b03193360601b16602082015260348101849052600090605401604051602081830303815290604052805190602001209050610daa83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601c549150849050612b81565b610dea5760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21025a2ac90383937b7b360791b6044820152606401610c7f565b6000600e54600d54600c54611388610e029190613e2e565b610e0c9190613e2e565b610e169190613e2e565b905060008111610e385760405162461bcd60e51b8152600401610c7f90613e41565b6000610e448683612b97565b905080600c6000828254610e589190613de4565b90915550503360009081526015602052604081208054839290610e7c908490613de4565b90915550503360009081526012602052604081208054839290610ea0908490613de4565b90915550610eb090503382612baf565b505050505050565b60006001600160e01b031982166380ac58cd60e01b1480610ee957506001600160e01b03198216635b5e139f60e01b145b80610f0457506001600160e01b0319821663780e9d6360e01b145b80610f1f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b03163314610f4f5760405162461bcd60e51b8152600401610c7f90613e64565b600a55565b606060018054610f6390613e99565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8f90613e99565b8015610fdc5780601f10610fb157610100808354040283529160200191610fdc565b820191906000526020600020905b815481529060010190602001808311610fbf57829003601f168201915b5050505050905090565b6000610ff3826000541190565b6110555760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610c7f565b506000908152600560205260409020546001600160a01b031690565b600061107c826116cb565b9050806001600160a01b0316836001600160a01b0316036110ea5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610c7f565b336001600160a01b038216148061110657506111068133610b35565b6111785760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610c7f565b611183838383612bc9565b505050565b6007546001600160a01b031633146111b25760405162461bcd60e51b8152600401610c7f90613e64565b601e611183828483613f13565b6007546001600160a01b031633146111e95760405162461bcd60e51b8152600401610c7f90613e64565b80156112025760196111fc838583613f13565b50505050565b6019838360405160200161121893929190614045565b604051602081830303815290604052601990816111fc9190614065565b6007546001600160a01b0316331461125f5760405162461bcd60e51b8152600401610c7f90613e64565b600b8054911515620100000262ff000019909216919091179055565b611183838383612c25565b6007546001600160a01b031633146112b05760405162461bcd60e51b8152600401610c7f90613e64565b600b5462010000900460ff16156112d95760405162461bcd60e51b8152600401610c7f90613da5565b6000600e54600d54600c546113886112f19190613e2e565b6112fb9190613e2e565b6113059190613e2e565b9050600081116113275760405162461bcd60e51b8152600401610c7f90613e41565b60006113338483612b97565b9050600081116113555760405162461bcd60e51b8152600401610c7f90613e41565b80600e60008282546113679190613de4565b90915550506001600160a01b03831660009081526012602052604081208054839290611394908490613de4565b909155506111fc90508382612baf565b60006113af83611928565b82106114085760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610c7f565b600080549080805b8381101561149e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561146257805192505b876001600160a01b0316836001600160a01b0316036114955786840361148e57509350610f1f92505050565b6001909301925b50600101611410565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610c7f565b61118383838360405180602001604052806000815250612240565b6000805482106115775760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610c7f565b5090565b6007546001600160a01b031633146115a55760405162461bcd60e51b8152600401610c7f90613e64565b6000816001600160a01b03164760405160006040518083038185875af1925050503d80600081146115f2576040519150601f19603f3d011682016040523d82523d6000602084013e6115f7565b606091505b505090508061160557600080fd5b5050565b6007546001600160a01b031633146116335760405162461bcd60e51b8152600401610c7f90613e64565b601d6116058282614065565b6007546001600160a01b031633146116695760405162461bcd60e51b8152600401610c7f90613e64565b600b80549115156101000261ff0019909216919091179055565b6007546001600160a01b031633146116ad5760405162461bcd60e51b8152600401610c7f90613e64565b600b805491151563010000000263ff00000019909216919091179055565b60006116d682612f05565b5192915050565b6116e5613766565b6116f0826010614124565b601980546116fd90613e99565b9050101561174d5760405162461bcd60e51b815260206004820152601c60248201527f6e6f6e6578697374656e7420746f6b656e2070726f76656e616e6365000000006044820152606401610c7f565b600061175a600184613e2e565b611765906010614124565b905060006019805461177690613e99565b80601f01602080910402602001604051908101604052809291908181526020018280546117a290613e99565b80156117ef5780601f106117c4576101008083540402835291602001916117ef565b820191906000526020600020905b8154815290600101906020018083116117d257829003601f168201915b505050505090506117fe613766565b60005b600881101561191f5760408051600280825281830190925260009160208201818036833701905050905083611837836002614124565b6118419087613de4565b815181106118515761185161413b565b602001015160f81c60f81b8160008151811061186f5761186f61413b565b60200101906001600160f81b031916908160001a90535083611892836002614124565b61189d906001613de4565b6118a79087613de4565b815181106118b7576118b761413b565b602001015160f81c60f81b816001815181106118d5576118d561413b565b60200101906001600160f81b031916908160001a9053506118f581612fdb565b8383600881106119075761190761413b565b6020020152508061191781614151565b915050611801565b50949350505050565b60006001600160a01b0382166119945760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610c7f565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146119e35760405162461bcd60e51b8152600401610c7f90613e64565b6119ed6000613055565b565b606060006119fc83611928565b905080600003611a205760408051600080825260208201909252905b509392505050565b6000816001600160401b03811115611a3a57611a3a613aea565b604051908082528060200260200182016040528015611a63578160200160208202803683370190505b50905060005b82811015611a1857611a7b85826113a4565b828281518110611a8d57611a8d61413b565b602090810291909101015280611aa281614151565b915050611a69565b50919050565b6007546001600160a01b03163314611ada5760405162461bcd60e51b8152600401610c7f90613e64565b600955565b606060028054610f6390613e99565b336001600160a01b03831603611b465760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610c7f565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b5462010000900460ff1615611bdb5760405162461bcd60e51b8152600401610c7f9061416a565b600b54610100900460ff16611c2b5760405162461bcd60e51b8152602060048201526016602482015275283ab13634b19036b4b73a1034b99031b637b9b2b21760511b6044820152606401610c7f565b600f54811115611c785760405162461bcd60e51b815260206004820152601860248201527708af0c6cacac8cac840dac2f040dad2dce840e0cae440e8f60431b6044820152606401610c7f565b60115433600090815260126020526040902054611c959083613de4565b1115611cb35760405162461bcd60e51b8152600401610c7f90613df7565b6000600e54600d54600c54611388611ccb9190613e2e565b611cd59190613e2e565b611cdf9190613e2e565b905060008111611d015760405162461bcd60e51b8152600401610c7f90613e41565b6000611d0d8383612b97565b905060008111611d2f5760405162461bcd60e51b8152600401610c7f90613e41565b600060095482611d3f9190614124565b905080341015611d615760405162461bcd60e51b8152600401610c7f90614194565b81600e6000828254611d739190613de4565b90915550503360009081526012602052604081208054849290611d97908490613de4565b90915550611da790503383612baf565b6000611db38234613e2e565b90508015611dc557611dc533826130a7565b5050505050565b600b5462010000900460ff1615611df55760405162461bcd60e51b8152600401610c7f9061416a565b600b546301000000900460ff16611e4e5760405162461bcd60e51b815260206004820152601a60248201527f41706520637573746f6d697a696e6720697320636c6f7365642e0000000000006044820152606401610c7f565b6000611e59846116cb565b9050336001600160a01b03821614611eb35760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207570646174652061206e6f74206f776e656420746f6b656e2e006044820152606401610c7f565b60088214611efc5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d1c985a5d081b585c081cd95b9d60521b6044820152606401610c7f565b600a54341015611f1e5760405162461bcd60e51b8152600401610c7f90614194565b6000848152601860205260409020611dc5908484613785565b6060611f41613766565b60008381526018602052604090205415611fbb5760005b6008811015611fb5576000848152601860205260409020805482908110611f8157611f8161413b565b9060005260206000200154828260088110611f9e57611f9e61413b565b602002015280611fad81614151565b915050611f58565b50611fcc565b611fc961079d846001613de4565b90505b60006040518060c00160405280608e8152602001614633608e913960408051602081019091526000808252919250905b60088110156121755760008482600881106120195761201961413b565b60200201511115612163578260176000612034846001613de4565b815260200190815260200160002060006002815260200190815260200160002060008684600881106120685761206861413b565b6020020151815260200190815260200160002060405160200161208c9291906141c1565b604051602081830303815290604052925081516000146120c957816040516020016120b79190614238565b60405160208183030381529060405291505b81601660006120d9846001613de4565b8152602001908152602001600020601760008460016120f89190613de4565b8152602001908152602001600020600060018152602001908152602001600020600087856008811061212c5761212c61413b565b602002015181526020019081526020016000206040516020016121519392919061425d565b60405160208183030381529060405291505b8061216d81614151565b915050611ffc565b50600085815260186020526040902054156121ad578060405160200161219b91906142cd565b60405160208183030381529060405290505b816040516020016121be9190614324565b60408051601f19818403018152919052915060006121e56121e0876001613de4565b6131c0565b601e83856040516020016121fc949392919061434e565b6040516020818303038152906040529050612216816132c8565b604051602001612226919061447c565b604051602081830303815290604052945050505050919050565b61224b848484612c25565b6122578484848461342c565b6111fc5760405162461bcd60e51b8152600401610c7f906144c1565b6007546001600160a01b0316331461229d5760405162461bcd60e51b8152600401610c7f90613e64565b601c55565b6007546001600160a01b031633146122cc5760405162461bcd60e51b8152600401610c7f90613e64565b600b805460ff1916911515919091179055565b6007546001600160a01b031633146123095760405162461bcd60e51b8152600401610c7f90613e64565b84838114801561231857508181145b6123565760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204c656e6774687360881b6044820152606401610c7f565b60005b8181101561245b578585828181106123735761237361413b565b90506020028101906123859190614514565b60008b8152601760209081526040808320600184529091528120908b8b868181106123b2576123b261413b565b90506020020135815260200190815260200160002091826123d4929190613f13565b508383828181106123e7576123e761413b565b90506020028101906123f99190614514565b60008b8152601760209081526040808320600284529091528120908b8b868181106124265761242661413b565b9050602002013581526020019081526020016000209182612448929190613f13565b508061245381614151565b915050612359565b505050505050505050565b606061247160005490565b8211156124b45760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c7f565b610f1f82611f37565b6007546001600160a01b031633146124e75760405162461bcd60e51b8152600401610c7f90613e64565b601055565b600b5462010000900460ff16156125155760405162461bcd60e51b8152600401610c7f9061416a565b600b5460ff1661255c5760405162461bcd60e51b81526020600482015260126024820152712ba61036b4b73a1034b99031b637b9b2b21760711b6044820152606401610c7f565b6010548311156125a95760405162461bcd60e51b815260206004820152601860248201527708af0c6cacac8cac840dac2f040dad2dce840e0cae440e8f60431b6044820152606401610c7f565b601154336000908152601260205260409020546125c69085613de4565b11156125e45760405162461bcd60e51b8152600401610c7f90613df7565b6040516001600160601b03193360601b16602082015260009060340160405160208183030381529060405280519060200120905061265983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601a549150849050612b81565b6126985760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102ba610383937b7b360811b6044820152606401610c7f565b6000600e54600d54600c546113886126b09190613e2e565b6126ba9190613e2e565b6126c49190613e2e565b9050600081116126e65760405162461bcd60e51b8152600401610c7f90613e41565b60006126f28683612b97565b9050600081116127145760405162461bcd60e51b8152600401610c7f90613e41565b6000600854826127249190614124565b9050803410156127465760405162461bcd60e51b8152600401610c7f90614194565b81600d60008282546127589190613de4565b9091555050336000908152601360205260408120805484929061277c908490613de4565b909155505033600090815260126020526040812080548492906127a0908490613de4565b909155506127b090503383612baf565b60006127bc8234613e2e565b905080156127ce576127ce33826130a7565b5050505050505050565b6007546001600160a01b031633146128025760405162461bcd60e51b8152600401610c7f90613e64565b600f55565b6007546001600160a01b031633146128315760405162461bcd60e51b8152600401610c7f90613e64565b601b55565b6007546001600160a01b031633146128605760405162461bcd60e51b8152600401610c7f90613e64565b601155565b600b5462010000900460ff161561288e5760405162461bcd60e51b8152600401610c7f90613da5565b336000908152601460205260409020546001116128f95760405162461bcd60e51b815260206004820152602360248201527f5072696d6170652066726565206d696e747320616c726561647920636c61696d60448201526265642160e81b6064820152608401610c7f565b601154336000908152601260205260409020546129169085613de4565b11156129345760405162461bcd60e51b8152600401610c7f90613df7565b6040516001600160601b03193360601b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506129b083838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601b549150849050612b81565b6129f05760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21020a82290383937b7b360791b6044820152606401610c7f565b6000600e54600d54600c54611388612a089190613e2e565b612a129190613e2e565b612a1c9190613e2e565b905060008111612a3e5760405162461bcd60e51b8152600401610c7f90613e41565b6000612a4a8683612b97565b905080600c6000828254612a5e9190613de4565b90915550503360009081526014602052604081208054839290610e7c908490613de4565b6007546001600160a01b03163314612aac5760405162461bcd60e51b8152600401610c7f90613e64565b6001600160a01b038116612b115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c7f565b612b1a81613055565b50565b6007546001600160a01b03163314612b475760405162461bcd60e51b8152600401610c7f90613e64565b600855565b6007546001600160a01b03163314612b765760405162461bcd60e51b8152600401610c7f90613e64565b601a55565b3b151590565b600082612b8e858461352d565b14949350505050565b6000818310612ba65781612ba8565b825b9392505050565b611605828260405180602001604052806000815250613599565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612c3082612f05565b80519091506000906001600160a01b0316336001600160a01b03161480612c67575033612c5c84610fe6565b6001600160a01b0316145b80612c7957508151612c799033610b35565b905080612ce35760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610c7f565b846001600160a01b031682600001516001600160a01b031614612d575760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610c7f565b6001600160a01b038416612dbb5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610c7f565b612dcb6000848460000151612bc9565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b031602179055908601808352912054909116612ebe57612e72816000541190565b15612ebe57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611dc5565b6040805180820190915260008082526020820152612f24826000541190565b612f835760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610c7f565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215612fd1579392505050565b5060001901612f85565b60008181805b8251811015611a18576000838281518110612ffe57612ffe61413b565b016020015160f81c90506030811080159061301a575060398111155b156130425761302a603082613e2e565b61303584600a614124565b61303f9190613de4565b92505b508061304d81614151565b915050612fe1565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b804710156130f75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c7f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613144576040519150601f19603f3d011682016040523d82523d6000602084013e613149565b606091505b50509050806111835760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c7f565b6060816000036131e75750506040805180820190915260018152600360fc1b602082015290565b8160005b811561321157806131fb81614151565b915061320a9050600a83614570565b91506131eb565b6000816001600160401b0381111561322b5761322b613aea565b6040519080825280601f01601f191660200182016040528015613255576020820181803683370190505b5090505b84156132c05761326a600183613e2e565b9150613277600a86614584565b613282906030613de4565b60f81b8183815181106132975761329761413b565b60200101906001600160f81b031916908160001a9053506132b9600a86614570565b9450613259565b949350505050565b606081516000036132e757505060408051602081019091526000815290565b60006040518060600160405280604081526020016145f360409139905060006003845160026133169190613de4565b6133209190614570565b61332b906004614124565b9050600061333a826020613de4565b6001600160401b0381111561335157613351613aea565b6040519080825280601f01601f19166020018201604052801561337b576020820181803683370190505b509050818152600183018586518101602084015b818310156133e7576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161338f565b60038951066001811461340157600281146134125761341e565b613d3d60f01b60011983015261341e565b603d60f81b6000198301525b509398975050505050505050565b60006001600160a01b0384163b1561352257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613470903390899088908890600401614598565b6020604051808303816000875af19250505080156134ab575060408051601f3d908101601f191682019092526134a8918101906145d5565b60015b613508573d8080156134d9576040519150601f19603f3d011682016040523d82523d6000602084013e6134de565b606091505b5080516000036135005760405162461bcd60e51b8152600401610c7f906144c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506132c0565b506001949350505050565b600081815b8451811015611a1857600085828151811061354f5761354f61413b565b602002602001015190508083116135755760008381526020829052604090209250613586565b600081815260208490526040902092505b508061359181614151565b915050613532565b61118383838360016000546001600160a01b0385166136045760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610c7f565b836000036136655760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610c7f565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b8581101561375d5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831561375157613735600088848861342c565b6137515760405162461bcd60e51b8152600401610c7f906144c1565b600191820191016136e2565b50600055611dc5565b6040518061010001604052806008906020820280368337509192915050565b8280548282559060005260206000209081019282156137c0579160200282015b828111156137c05782358255916020019190600101906137a5565b506115779291505b8082111561157757600081556001016137c8565b60008083601f8401126137ee57600080fd5b5081356001600160401b0381111561380557600080fd5b6020830191508360208260051b850101111561382057600080fd5b9250929050565b60008060006040848603121561383c57600080fd5b8335925060208401356001600160401b0381111561385957600080fd5b613865868287016137dc565b9497909650939450505050565b6001600160e01b031981168114612b1a57600080fd5b60006020828403121561389a57600080fd5b8135612ba881613872565b6000602082840312156138b757600080fd5b5035919050565b60005b838110156138d95781810151838201526020016138c1565b50506000910152565b600081518084526138fa8160208601602086016138be565b601f01601f19169290920160200192915050565b602081526000612ba860208301846138e2565b80356001600160a01b038116811461393857600080fd5b919050565b6000806040838503121561395057600080fd5b61395983613921565b946020939093013593505050565b60008083601f84011261397957600080fd5b5081356001600160401b0381111561399057600080fd5b60208301915083602082850101111561382057600080fd5b600080602083850312156139bb57600080fd5b82356001600160401b038111156139d157600080fd5b6139dd85828601613967565b90969095509350505050565b8035801515811461393857600080fd5b600080600060408486031215613a0e57600080fd5b83356001600160401b03811115613a2457600080fd5b613a3086828701613967565b9094509250613a439050602085016139e9565b90509250925092565b600060208284031215613a5e57600080fd5b612ba8826139e9565b600060208284031215613a7957600080fd5b612ba882613921565b600080600060608486031215613a9757600080fd5b613aa084613921565b9250613aae60208501613921565b9150604084013590509250925092565b60008060408385031215613ad157600080fd5b82359150613ae160208401613921565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115613b1a57613b1a613aea565b604051601f8501601f19908116603f01168101908282118183101715613b4257613b42613aea565b81604052809350858152868686011115613b5b57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613b8757600080fd5b81356001600160401b03811115613b9d57600080fd5b8201601f81018413613bae57600080fd5b6132c084823560208401613b00565b6101008101818360005b6008811015613be6578151835260209283019290910190600101613bc7565b50505092915050565b6020808252825182820181905260009190848201906040850190845b81811015613c2757835183529284019291840191600101613c0b565b50909695505050505050565b60008060408385031215613c4657600080fd5b613c4f83613921565b9150613ae1602084016139e9565b60008060008060808587031215613c7357600080fd5b613c7c85613921565b9350613c8a60208601613921565b92506040850135915060608501356001600160401b03811115613cac57600080fd5b8501601f81018713613cbd57600080fd5b613ccc87823560208401613b00565b91505092959194509250565b60008060008060008060006080888a031215613cf357600080fd5b8735965060208801356001600160401b0380821115613d1157600080fd5b613d1d8b838c016137dc565b909850965060408a0135915080821115613d3657600080fd5b613d428b838c016137dc565b909650945060608a0135915080821115613d5b57600080fd5b50613d688a828b016137dc565b989b979a50959850939692959293505050565b60008060408385031215613d8e57600080fd5b613d9783613921565b9150613ae160208401613921565b6020808252600f908201526e10dbdb9d1c9858dd081c185d5cd959608a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f1f57610f1f613dce565b6020808252601c908201527f4578636565646564206d6178206d696e74207065722077616c6c657400000000604082015260600190565b81810381811115610f1f57610f1f613dce565b602080825260099082015268536f6c64206f75742160b81b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613ead57607f821691505b602082108103611aaa57634e487b7160e01b600052602260045260246000fd5b601f82111561118357600081815260208120601f850160051c81016020861015613ef45750805b601f850160051c820191505b81811015610eb057828155600101613f00565b6001600160401b03831115613f2a57613f2a613aea565b613f3e83613f388354613e99565b83613ecd565b6000601f841160018114613f725760008515613f5a5750838201355b600019600387901b1c1916600186901b178355611dc5565b600083815260209020601f19861690835b82811015613fa35786850135825560209485019460019092019101613f83565b5086821015613fc05760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154613fdf81613e99565b60018281168015613ff7576001811461400c5761403b565b60ff198416875282151583028701945061403b565b8560005260208060002060005b858110156140325781548a820152908401908201614019565b50505082870194505b5050505092915050565b60006140518286613fd2565b838582376000930192835250909392505050565b81516001600160401b0381111561407e5761407e613aea565b6140928161408c8454613e99565b84613ecd565b602080601f8311600181146140c757600084156140af5750858301515b600019600386901b1c1916600185901b178555610eb0565b600085815260208120601f198616915b828110156140f6578886015182559484019460019091019084016140d7565b50858210156141145787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610f1f57610f1f613dce565b634e487b7160e01b600052603260045260246000fd5b60006001820161416357614163613dce565b5060010190565b60208082526010908201526f21b7b73a3930b1ba103830bab9b2b21760811b604082015260600190565b602080825260139082015272139bdd08195b9bdd59da08115512081cd95b9d606a1b604082015260600190565b600083516141d38184602088016138be565b7f3c696d61676520783d27302720793d2730272077696474683d273732302720689083019081527165696768743d273732302720687265663d2760701b60208201526142226032820185613fd2565b631390179f60e11b815260040195945050505050565b6000825161424a8184602087016138be565b600b60fa1b920191825250600101919050565b6000845161426f8184602089016138be565b6f3d913a3930b4ba2fba3cb832911d101160811b9083019081526142966010820186613fd2565b6c111610113b30b63ab2911d101160991b815290506142b8600d820185613fd2565b61227d60f01b81526002019695505050505050565b600082516142df8184602087016138be565b7f2c7b2274726169745f74797065223a2022437573746f6d697a6564222c2022769201918252506c616c7565223a2022596573227d60981b6020820152602d01919050565b600082516143368184602087016138be565b651e17b9bb339f60d11b920191825250600601919050565b7f7b226e616d65223a20225072696d61706573202d204261736520426162696573815261202360f01b602082015260008551614391816022850160208a016138be565b7f222c202265787465726e616c5f75726c223a202268747470733a2f2f7072696d60229184019182015274030b832b99733b397b130b9b2b130b134b2b991161605d1b60428201526f113232b9b1b934b83a34b7b7111d101160811b60578201526143ff6067820187613fd2565b70222c202261747472696275746573223a5b60781b8152855190915061442c8160118401602089016138be565b712e96101134b6b0b3b2afb230ba30911d101160711b60119290910191820152835161445f8160238401602088016138be565b61227d60f01b602392909101918201526025019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516144b481601d8501602087016138be565b91909101601d0192915050565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000808335601e1984360301811261452b57600080fd5b8301803591506001600160401b0382111561454557600080fd5b60200191503681900382131561382057600080fd5b634e487b7160e01b600052601260045260246000fd5b60008261457f5761457f61455a565b500490565b6000826145935761459361455a565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906145cb908301846138e2565b9695505050505050565b6000602082840312156145e757600080fd5b8151612ba88161387256fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7376672077696474683d2737323027206865696768743d27373230272076696577426f783d273020302037323020373230272066696c6c3d276e6f6e652720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b273ea2646970667358221220326f11280f6eb5f835014dde6063a0b8ff661e12eef0dda760febdf3f70b52fd64736f6c63430008120033

Deployed ByteCode Sourcemap

47079:12306:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55434:804;;;;;;;;;;-1:-1:-1;55434:804:0;;;;;:::i;:::-;;:::i;:::-;;31078:372;;;;;;;;;;-1:-1:-1;31078:372:0;;;;;:::i;:::-;;:::i;:::-;;;1447:14:1;;1440:22;1422:41;;1410:2;1395:18;31078:372:0;;;;;;;;53192:94;;;;;;;;;;-1:-1:-1;53192:94:0;;;;;:::i;:::-;;:::i;32601:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33687:214::-;;;;;;;;;;-1:-1:-1;33687:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2579:32:1;;;2561:51;;2549:2;2534:18;33687:214:0;2415:203:1;33266:413:0;;;;;;;;;;-1:-1:-1;33266:413:0;;;;;:::i;:::-;;:::i;48907:99::-;;;;;;;;;;-1:-1:-1;48907:99:0;;;;;:::i;:::-;;:::i;47430:27::-;;;;;;;;;;-1:-1:-1;47430:27:0;;;;;;;;;;;49014:246;;;;;;;;;;-1:-1:-1;49014:246:0;;;;;:::i;:::-;;:::i;49736:76::-;;;;;;;;;;-1:-1:-1;49736:76:0;;;;;:::i;:::-;;:::i;29760:100::-;;;;;;;;;;-1:-1:-1;29813:7:0;29840:12;29760:100;;;4809:25:1;;;4797:2;4782:18;29760:100:0;4663:177:1;47578:28:0;;;;;;;;;;;;;;;;47732:41;;;;;;;;;;-1:-1:-1;47732:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;34377:162;;;;;;;;;;-1:-1:-1;34377:162:0;;;;;:::i;:::-;;:::i;58253:432::-;;;;;;;;;;-1:-1:-1;58253:432:0;;;;;:::i;:::-;;:::i;30063:1007::-;;;;;;;;;;-1:-1:-1;30063:1007:0;;;;;:::i;:::-;;:::i;25282:143::-;;;;;;;;;;;;22879:42;25282:143;;34547:177;;;;;;;;;;-1:-1:-1;34547:177:0;;;;;:::i;:::-;;:::i;47691:32::-;;;;;;;;;;;;;;;;29868:187;;;;;;;;;;-1:-1:-1;29868:187:0;;;;;:::i;:::-;;:::i;47615:30::-;;;;;;;;;;;;;;;;59194:188;;;;;;;;;;-1:-1:-1;59194:188:0;;;;;:::i;:::-;;:::i;53584:87::-;;;;;;;;;;-1:-1:-1;53584:87:0;;;;;:::i;:::-;;:::i;49820:74::-;;;;;;;;;;-1:-1:-1;49820:74:0;;;;;:::i;:::-;;:::i;47830:44::-;;;;;;;;;;-1:-1:-1;47830:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;49902:84;;;;;;;;;;-1:-1:-1;49902:84:0;;;;;:::i;:::-;;:::i;32469:124::-;;;;;;;;;;-1:-1:-1;32469:124:0;;;;;:::i;:::-;;:::i;50451:645::-;;;;;;;;;;-1:-1:-1;50451:645:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31458:221::-;;;;;;;;;;-1:-1:-1;31458:221:0;;;;;:::i;:::-;;:::i;22299:103::-;;;;;;;;;;;;;:::i;47881:44::-;;;;;;;;;;-1:-1:-1;47881:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;54112:502;;;;;;;;;;-1:-1:-1;54112:502:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47541:30::-;;;;;;;;;;;;;;;;22076:87;;;;;;;;;;-1:-1:-1;22149:6:0;;-1:-1:-1;;;;;22149:6:0;22076:87;;53020:76;;;;;;;;;;-1:-1:-1;53020:76:0;;;;;:::i;:::-;;:::i;32709:104::-;;;;;;;;;;;;;:::i;47398:25::-;;;;;;;;;;-1:-1:-1;47398:25:0;;;;;;;;;;;47277:33;;;;;;;;;;;;;;;;33909:288;;;;;;;;;;-1:-1:-1;33909:288:0;;;;;:::i;:::-;;:::i;57371:874::-;;;;;;:::i;:::-;;:::i;47317:42::-;;;;;;;;;;;;;;;;47652:32;;;;;;;;;;;;;;;;58693:493;;;;;;:::i;:::-;;:::i;51104:1702::-;;;;;;;;;;-1:-1:-1;51104:1702:0;;;;;:::i;:::-;;:::i;34732:355::-;;;;;;;;;;-1:-1:-1;34732:355:0;;;;;:::i;:::-;;:::i;54006:98::-;;;;;;;;;;-1:-1:-1;54006:98:0;;;;;:::i;:::-;;:::i;49994:68::-;;;;;;;;;;-1:-1:-1;49994:68:0;;;;;:::i;:::-;;:::i;49268:460::-;;;;;;;;;;-1:-1:-1;49268:460:0;;;;;:::i;:::-;;:::i;52811:201::-;;;;;;;;;;-1:-1:-1;52811:201:0;;;;;:::i;:::-;;:::i;53388:90::-;;;;;;;;;;-1:-1:-1;53388:90:0;;;;;:::i;:::-;;:::i;47185:40::-;;;;;;;;;;;;47221:4;47185:40;;48167:27;;;;;;;;;;;;;;;;56246:1113;;;;;;:::i;:::-;;:::i;53294:86::-;;;;;;;;;;-1:-1:-1;53294:86:0;;;;;:::i;:::-;;:::i;53900:98::-;;;;;;;;;;-1:-1:-1;53900:98:0;;;;;:::i;:::-;;:::i;47234:36::-;;;;;;;;;;;;;;;;53486:90;;;;;;;;;;-1:-1:-1;53486:90:0;;;;;:::i;:::-;;:::i;48201:28::-;;;;;;;;;;;;;;;;47464:31;;;;;;;;;;-1:-1:-1;47464:31:0;;;;;;;;;;;34205:164;;;;;;;;;;-1:-1:-1;34205:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34326:25:0;;;34302:4;34326:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34205:164;48236:28;;;;;;;;;;;;;;;;54622:804;;;;;;;;;;-1:-1:-1;54622:804:0;;;;;:::i;:::-;;:::i;22410:201::-;;;;;;;;;;-1:-1:-1;22410:201:0;;;;;:::i;:::-;;:::i;53104:80::-;;;;;;;;;;-1:-1:-1;53104:80:0;;;;;:::i;:::-;;:::i;47368:23::-;;;;;;;;;;-1:-1:-1;47368:23:0;;;;;;;;47780:43;;;;;;;;;;-1:-1:-1;47780:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;53796:96;;;;;;;;;;-1:-1:-1;53796:96:0;;;;;:::i;:::-;;:::i;47504:30::-;;;;;;;;;;;;;;;;55434:804;55533:7;;;;;;;55532:8;55524:36;;;;-1:-1:-1;;;55524:36:0;;;;;;;:::i;:::-;;;;;;;;;55589:10;55579:21;;;;:9;:21;;;;;;55603:1;-1:-1:-1;55571:73:0;;;;-1:-1:-1;;;55571:73:0;;12035:2:1;55571:73:0;;;12017:21:1;12074:2;12054:18;;;12047:30;12113:34;12093:18;;;12086:62;-1:-1:-1;;;12164:18:1;;;12157:33;12207:19;;55571:73:0;11833:399:1;55571:73:0;55696:12;;55680:10;55673:18;;;;:6;:18;;;;;;55664:27;;:6;:27;:::i;:::-;55663:45;;55655:86;;;;-1:-1:-1;;;55655:86:0;;;;;;;:::i;:::-;55779:36;;-1:-1:-1;;;;;;55796:10:0;13033:2:1;13029:15;13025:53;55779:36:0;;;13013:66:1;13095:12;;;13088:28;;;55754:12:0;;13132::1;;55779:36:0;;;;;;;;;;;;55769:47;;;;;;55754:62;;55835:52;55854:11;;55835:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55867:13:0;;;-1:-1:-1;55882:4:0;;-1:-1:-1;55835:18:0;:52::i;:::-;55827:82;;;;-1:-1:-1;;;55827:82:0;;13357:2:1;55827:82:0;;;13339:21:1;13396:2;13376:18;;;13369:30;-1:-1:-1;;;13415:18:1;;;13408:47;13472:18;;55827:82:0;13155:341:1;55827:82:0;55922:13;55978:9;;55964:11;;55950;;47221:4;55938:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;55922:65;;56014:1;56006:5;:9;55998:31;;;;-1:-1:-1;;;55998:31:0;;;;;;;:::i;:::-;56043:12;56058:23;56067:6;56075:5;56058:8;:23::i;:::-;56043:38;;56109:4;56094:11;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;56134:10:0;56124:21;;;;:9;:21;;;;;:29;;56149:4;;56124:21;:29;;56149:4;;56124:29;:::i;:::-;;;;-1:-1:-1;;56171:10:0;56164:18;;;;:6;:18;;;;;:26;;56186:4;;56164:18;:26;;56186:4;;56164:26;:::i;:::-;;;;-1:-1:-1;56203:27:0;;-1:-1:-1;56213:10:0;56225:4;56203:9;:27::i;:::-;55513:725;;;55434:804;;;:::o;31078:372::-;31180:4;-1:-1:-1;;;;;;31217:40:0;;-1:-1:-1;;;31217:40:0;;:105;;-1:-1:-1;;;;;;;31274:48:0;;-1:-1:-1;;;31274:48:0;31217:105;:172;;;-1:-1:-1;;;;;;;31339:50:0;;-1:-1:-1;;;31339:50:0;31217:172;:225;;;-1:-1:-1;;;;;;;;;;1754:40:0;;;31406:36;31197:245;31078:372;-1:-1:-1;;31078:372:0:o;53192:94::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53260:14:::1;:18:::0;53192:94::o;32601:100::-;32655:13;32688:5;32681:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32601:100;:::o;33687:214::-;33755:7;33783:16;33791:7;35152:4;35186:12;-1:-1:-1;35176:22:0;35095:111;33783:16;33775:74;;;;-1:-1:-1;;;33775:74:0;;14919:2:1;33775:74:0;;;14901:21:1;14958:2;14938:18;;;14931:30;14997:34;14977:18;;;14970:62;-1:-1:-1;;;15048:18:1;;;15041:43;15101:19;;33775:74:0;14717:409:1;33775:74:0;-1:-1:-1;33869:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33869:24:0;;33687:214::o;33266:413::-;33339:13;33355:24;33371:7;33355:15;:24::i;:::-;33339:40;;33404:5;-1:-1:-1;;;;;33398:11:0;:2;-1:-1:-1;;;;;33398:11:0;;33390:58;;;;-1:-1:-1;;;33390:58:0;;15333:2:1;33390:58:0;;;15315:21:1;15372:2;15352:18;;;15345:30;15411:34;15391:18;;;15384:62;-1:-1:-1;;;15462:18:1;;;15455:32;15504:19;;33390:58:0;15131:398:1;33390:58:0;4522:10;-1:-1:-1;;;;;33483:21:0;;;;:62;;-1:-1:-1;33508:37:0;33525:5;4522:10;34205:164;:::i;33508:37::-;33461:169;;;;-1:-1:-1;;;33461:169:0;;15736:2:1;33461:169:0;;;15718:21:1;15775:2;15755:18;;;15748:30;15814:34;15794:18;;;15787:62;15885:27;15865:18;;;15858:55;15930:19;;33461:169:0;15534:421:1;33461:169:0;33643:28;33652:2;33656:7;33665:5;33643:8;:28::i;:::-;33328:351;33266:413;;:::o;48907:99::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;48982:9:::1;:16;48994:4:::0;;48982:9;:16:::1;:::i;49014:246::-:0;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;49106:5:::1;49103:150;;;49128:10;:17;49141:4:::0;;49128:10;:17:::1;:::i;:::-;;33328:351:::0;33266:413;;:::o;49103:150::-:1;49224:10;49235:4;;49207:33;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49187:10;:54;;;;;;:::i;49736:76::-:0;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;49793:7:::1;:11:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;49793:11:0;;::::1;::::0;;;::::1;::::0;;49736:76::o;34377:162::-;34503:28;34513:4;34519:2;34523:7;34503:9;:28::i;58253:432::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;58341:7:::1;::::0;;;::::1;;;58340:8;58332:36;;;;-1:-1:-1::0;;;58332:36:0::1;;;;;;;:::i;:::-;58381:13;58437:9;;58423:11;;58409;;47221:4;58397:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;58381:65;;58473:1;58465:5;:9;58457:31;;;;-1:-1:-1::0;;;58457:31:0::1;;;;;;;:::i;:::-;58501:12;58516:23;58525:6;58533:5;58516:8;:23::i;:::-;58501:38;;58565:1;58558:4;:8;58550:30;;;;-1:-1:-1::0;;;58550:30:0::1;;;;;;;:::i;:::-;58606:4;58593:9;;:17;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;58621:14:0;::::1;;::::0;;;:6:::1;:14;::::0;;;;:22;;58639:4;;58621:14;:22:::1;::::0;58639:4;;58621:22:::1;:::i;:::-;::::0;;;-1:-1:-1;58654:23:0::1;::::0;-1:-1:-1;58664:6:0;58672:4;58654:9:::1;:23::i;30063:1007::-:0;30152:7;30188:16;30198:5;30188:9;:16::i;:::-;30180:5;:24;30172:71;;;;-1:-1:-1;;;30172:71:0;;20682:2:1;30172:71:0;;;20664:21:1;20721:2;20701:18;;;20694:30;20760:34;20740:18;;;20733:62;-1:-1:-1;;;20811:18:1;;;20804:32;20853:19;;30172:71:0;20480:398:1;30172:71:0;30254:22;29840:12;;;30254:22;;30517:466;30537:14;30533:1;:18;30517:466;;;30577:31;30611:14;;;:11;:14;;;;;;;;;30577:48;;;;;;;;;-1:-1:-1;;;;;30577:48:0;;;;;-1:-1:-1;;;30577:48:0;;;-1:-1:-1;;;;;30577:48:0;;;;;;;;30648:28;30644:111;;30721:14;;;-1:-1:-1;30644:111:0;30798:5;-1:-1:-1;;;;;30777:26:0;:17;-1:-1:-1;;;;;30777:26:0;;30773:195;;30847:5;30832:11;:20;30828:85;;-1:-1:-1;30888:1:0;-1:-1:-1;30881:8:0;;-1:-1:-1;;;30881:8:0;30828:85;30935:13;;;;;30773:195;-1:-1:-1;30553:3:0;;30517:466;;;-1:-1:-1;31006:56:0;;-1:-1:-1;;;31006:56:0;;21085:2:1;31006:56:0;;;21067:21:1;21124:2;21104:18;;;21097:30;21163:34;21143:18;;;21136:62;-1:-1:-1;;;21214:18:1;;;21207:44;21268:19;;31006:56:0;20883:410:1;34547:177:0;34677:39;34694:4;34700:2;34704:7;34677:39;;;;;;;;;;;;:16;:39::i;29868:187::-;29935:7;29840:12;;29963:5;:21;29955:69;;;;-1:-1:-1;;;29955:69:0;;21500:2:1;29955:69:0;;;21482:21:1;21539:2;21519:18;;;21512:30;21578:34;21558:18;;;21551:62;-1:-1:-1;;;21629:18:1;;;21622:33;21672:19;;29955:69:0;21298:399:1;29955:69:0;-1:-1:-1;30042:5:0;29868:187::o;59194:188::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;59259:12:::1;59277:6;-1:-1:-1::0;;;;;59277:11:0::1;59310:21;59277:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59258:89;;;59366:7;59358:16;;;::::0;::::1;;59247:135;59194:188:::0;:::o;53584:87::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53651:8:::1;:12;53662:1:::0;53651:8;:12:::1;:::i;49820:74::-:0;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;49877:5:::1;:9:::0;;;::::1;;;;-1:-1:-1::0;;49877:9:0;;::::1;::::0;;;::::1;::::0;;49820:74::o;49902:84::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;49963:11:::1;:15:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;49963:15:0;;::::1;::::0;;;::::1;::::0;;49902:84::o;32469:124::-;32533:7;32560:20;32572:7;32560:11;:20::i;:::-;:25;;32469:124;-1:-1:-1;;32469:124:0:o;50451:645::-;50513:17;;:::i;:::-;50588:10;50593:5;50588:2;:10;:::i;:::-;50566;50560:24;;;;;:::i;:::-;;;:38;;50551:81;;;;-1:-1:-1;;;50551:81:0;;22287:2:1;50551:81:0;;;22269:21:1;22326:2;22306:18;;;22299:30;22365;22345:18;;;22338:58;22413:18;;50551:81:0;22085:352:1;50551:81:0;50643:15;50667:9;50675:1;50667:5;:9;:::i;:::-;50661:16;;:2;:16;:::i;:::-;50643:34;;50688:23;50720:10;50688:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50752:29;;:::i;:::-;50807:6;50802:248;50823:1;50819;:5;50802:248;;;50863:12;;;50873:1;50863:12;;;;;;;;;50846:14;;50863:12;;;;;;;;;;-1:-1:-1;;50846:29:0;-1:-1:-1;50897:10:0;50922:3;:1;50924;50922:3;:::i;:::-;50908:18;;:10;:18;:::i;:::-;50897:30;;;;;;;;:::i;:::-;;;;;;;;;50890:1;50892;50890:4;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;50890:37:0;;;;;;;;-1:-1:-1;50949:10:0;50975:3;:1;50977;50975:3;:::i;:::-;50974:7;;50980:1;50974:7;:::i;:::-;50960:22;;:10;:22;:::i;:::-;50949:34;;;;;;;;:::i;:::-;;;;;;;;;50942:1;50944;50942:4;;;;;;;;:::i;:::-;;;;:41;-1:-1:-1;;;;;50942:41:0;;;;;;;;;51015:23;51035:1;51015:12;:23::i;:::-;50998:11;51010:1;50998:14;;;;;;;:::i;:::-;;;;:40;-1:-1:-1;50826:3:0;;;;:::i;:::-;;;;50802:248;;;-1:-1:-1;51077:11:0;50451:645;-1:-1:-1;;;;50451:645:0:o;31458:221::-;31522:7;-1:-1:-1;;;;;31550:19:0;;31542:75;;;;-1:-1:-1;;;31542:75:0;;22916:2:1;31542:75:0;;;22898:21:1;22955:2;22935:18;;;22928:30;22994:34;22974:18;;;22967:62;-1:-1:-1;;;23045:18:1;;;23038:41;23096:19;;31542:75:0;22714:407:1;31542:75:0;-1:-1:-1;;;;;;31643:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;31643:27:0;;31458:221::o;22299:103::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;22364:30:::1;22391:1;22364:18;:30::i;:::-;22299:103::o:0;54112:502::-;54174:16;54203:18;54224:17;54234:6;54224:9;:17::i;:::-;54203:38;;54256:10;54270:1;54256:15;54252:355;;54295:16;;;54309:1;54295:16;;;;;;;;;;;-1:-1:-1;54288:23:0;54112:502;-1:-1:-1;;;54112:502:0:o;54252:355::-;54344:23;54384:10;-1:-1:-1;;;;;54370:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54370:25:0;;54344:51;;54410:13;54438:130;54462:10;54454:5;:18;54438:130;;;54518:34;54538:6;54546:5;54518:19;:34::i;:::-;54502:6;54509:5;54502:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;54474:7;;;;:::i;:::-;;;;54438:130;;54252:355;54192:422;54112:502;;;:::o;53020:76::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53079:5:::1;:9:::0;53020:76::o;32709:104::-;32765:13;32798:7;32791:14;;;;;:::i;33909:288::-;4522:10;-1:-1:-1;;;;;34004:24:0;;;33996:63;;;;-1:-1:-1;;;33996:63:0;;23328:2:1;33996:63:0;;;23310:21:1;23367:2;23347:18;;;23340:30;23406:28;23386:18;;;23379:56;23452:18;;33996:63:0;23126:350:1;33996:63:0;4522:10;34072:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34072:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34072:53:0;;;;;;;;;;34141:48;;1422:41:1;;;34072:42:0;;4522:10;34141:48;;1395:18:1;34141:48:0;;;;;;;33909:288;;:::o;57371:874::-;57441:7;;;;;;;57440:8;57432:37;;;;-1:-1:-1;;;57432:37:0;;;;;;;:::i;:::-;57488:5;;;;;;;57480:40;;;;-1:-1:-1;;;57480:40:0;;24028:2:1;57480:40:0;;;24010:21:1;24067:2;24047:18;;;24040:30;-1:-1:-1;;;24086:18:1;;;24079:52;24148:18;;57480:40:0;23826:346:1;57480:40:0;57549:10;;57539:6;:20;;57531:57;;;;-1:-1:-1;;;57531:57:0;;24379:2:1;57531:57:0;;;24361:21:1;24418:2;24398:18;;;24391:30;-1:-1:-1;;;24437:18:1;;;24430:54;24501:18;;57531:57:0;24177:348:1;57531:57:0;57640:12;;57624:10;57617:18;;;;:6;:18;;;;;;57608:27;;:6;:27;:::i;:::-;57607:45;;57599:86;;;;-1:-1:-1;;;57599:86:0;;;;;;;:::i;:::-;57698:13;57754:9;;57740:11;;57726;;47221:4;57714:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;57698:65;;57790:1;57782:5;:9;57774:31;;;;-1:-1:-1;;;57774:31:0;;;;;;;:::i;:::-;57818:12;57833:23;57842:6;57850:5;57833:8;:23::i;:::-;57818:38;;57882:1;57875:4;:8;57867:30;;;;-1:-1:-1;;;57867:30:0;;;;;;;:::i;:::-;57908:13;57931:5;;57924:4;:12;;;;:::i;:::-;57908:28;;57968:5;57955:9;:18;;57947:50;;;;-1:-1:-1;;;57947:50:0;;;;;;;:::i;:::-;58024:4;58011:9;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;58046:10:0;58039:18;;;;:6;:18;;;;;:26;;58061:4;;58039:18;:26;;58061:4;;58039:26;:::i;:::-;;;;-1:-1:-1;58078:27:0;;-1:-1:-1;58088:10:0;58100:4;58078:9;:27::i;:::-;58118:9;58130:17;58142:5;58130:9;:17;:::i;:::-;58118:29;-1:-1:-1;58162:6:0;;58158:80;;58185:41;58211:10;58224:1;58185:17;:41::i;:::-;57421:824;;;;57371:874;:::o;58693:493::-;58792:7;;;;;;;58791:8;58783:37;;;;-1:-1:-1;;;58783:37:0;;;;;;;:::i;:::-;58839:11;;;;;;;58831:50;;;;-1:-1:-1;;;58831:50:0;;25080:2:1;58831:50:0;;;25062:21:1;25119:2;25099:18;;;25092:30;25158:28;25138:18;;;25131:56;25204:18;;58831:50:0;24878:350:1;58831:50:0;58892:13;58908:22;58924:5;58908:15;:22::i;:::-;58892:38;-1:-1:-1;58949:10:0;-1:-1:-1;;;;;58949:19:0;;;58941:63;;;;-1:-1:-1;;;58941:63:0;;25435:2:1;58941:63:0;;;25417:21:1;25474:2;25454:18;;;25447:30;25513:33;25493:18;;;25486:61;25564:18;;58941:63:0;25233:355:1;58941:63:0;59038:1;59023:16;;59015:51;;;;-1:-1:-1;;;59015:51:0;;25795:2:1;59015:51:0;;;25777:21:1;25834:2;25814:18;;;25807:30;-1:-1:-1;;;25853:18:1;;;25846:52;25915:18;;59015:51:0;25593:346:1;59015:51:0;59098:14;;59085:9;:27;;59077:59;;;;-1:-1:-1;;;59077:59:0;;;;;;;:::i;:::-;59150:21;;;;:14;:21;;;;;:28;;59174:4;;59150:28;:::i;51104:1702::-;51162:13;51198:22;;:::i;:::-;51265:1;51234:21;;;:14;:21;;;;;:28;:32;51231:237;;51288:6;51283:98;51304:1;51300;:5;51283:98;;;51341:21;;;;:14;:21;;;;;:24;;51363:1;;51341:24;;;;;;:::i;:::-;;;;;;;;;51331:4;51336:1;51331:7;;;;;;;:::i;:::-;;;;:34;51307:3;;;;:::i;:::-;;;;51283:98;;;;51231:237;;;51429:27;51447:7;:5;51453:1;51447:7;:::i;51429:27::-;51422:34;;51231:237;51480:17;:164;;;;;;;;;;;;;;;;;51655:24;;;;;;;;;:19;:24;;;51480:164;;-1:-1:-1;51655:24:0;51690:508;51711:1;51707;:5;51690:508;;;51747:1;51737:4;51742:1;51737:7;;;;;;;:::i;:::-;;;;;:11;51734:453;;;51799:3;51856:8;:15;51866:3;:1;51868;51866:3;:::i;:::-;51856:15;;;;;;;;;;;:18;51872:1;51856:18;;;;;;;;;;;:27;51875:4;51880:1;51875:7;;;;;;;:::i;:::-;;;;;51856:27;;;;;;;;;;;51782:109;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51769:123;;51920:5;51914:19;51937:1;51914:24;51911:115;;51995:5;51978:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;51963:43;;51911:115;52076:5;52102:10;:17;52114:3;:1;52116;52114:3;:::i;:::-;52102:17;;;;;;;;;;;52137:8;:15;52147:1;52149;52147:3;;;;:::i;:::-;52137:15;;;;;;;;;;;:18;52153:1;52137:18;;;;;;;;;;;:27;52156:4;52161:1;52156:7;;;;;;;:::i;:::-;;;;;52137:27;;;;;;;;;;;52059:111;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52044:127;;51734:453;51714:3;;;;:::i;:::-;;;;51690:508;;;-1:-1:-1;52242:1:0;52211:21;;;:14;:21;;;;;:28;:32;52208:151;;52292:5;52275:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;52260:87;;52208:151;52401:3;52384:30;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52384:30:0;;;;;;;;;;-1:-1:-1;52428:18:0;52511:27;52528:9;:5;52536:1;52528:9;:::i;:::-;52511:16;:27::i;:::-;52616:9;52646:5;52674:3;52456:228;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52428:257;;52770:26;52790:4;52770:13;:26::i;:::-;52720:77;;;;;;;;:::i;:::-;;;;;;;;;;;;;52706:92;;;;;;51104:1702;;;:::o;34732:355::-;34891:28;34901:4;34907:2;34911:7;34891:9;:28::i;:::-;34952:48;34975:4;34981:2;34985:7;34994:5;34952:22;:48::i;:::-;34930:149;;;;-1:-1:-1;;;34930:149:0;;;;;;;:::i;54006:98::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;54076:13:::1;:20:::0;54006:98::o;49994:68::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;50047:3:::1;:7:::0;;-1:-1:-1;;50047:7:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49994:68::o;49268:460::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;49428:4;49483:23;;::::1;49458:75;;;;-1:-1:-1::0;49510:23:0;;::::1;49458:75;49450:103;;;::::0;-1:-1:-1;;;49450:103:0;;32363:2:1;49450:103:0::1;::::0;::::1;32345:21:1::0;32402:2;32382:18;;;32375:30;-1:-1:-1;;;32421:18:1;;;32414:45;32476:18;;49450:103:0::1;32161:339:1::0;49450:103:0::1;49569:9;49564:157;49588:6;49584:1;:10;49564:157;;;49646:6;;49653:1;49646:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;49616:15;::::0;;;:8:::1;:15;::::0;;;;;;;49632:1:::1;49616:18:::0;;;;;;;;49635:4;;49640:1;49635:7;;::::1;;;;;:::i;:::-;;;;;;;49616:27;;;;;;;;;;;:39;;;;;;;:::i;:::-;;49700:6;;49707:1;49700:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;49670:15;::::0;;;:8:::1;:15;::::0;;;;;;;49686:1:::1;49670:18:::0;;;;;;;;49689:4;;49694:1;49689:7;;::::1;;;;;:::i;:::-;;;;;;;49670:27;;;;;;;;;;;:39;;;;;;;:::i;:::-;-1:-1:-1::0;49596:3:0;::::1;::::0;::::1;:::i;:::-;;;;49564:157;;;;49403:325;49268:460:::0;;;;;;;:::o;52811:201::-;52882:13;52936;29813:7;29840:12;;29760:100;52936:13;52927:5;:22;;52905:65;;;;-1:-1:-1;;;52905:65:0;;33234:2:1;52905:65:0;;;33216:21:1;33273:2;33253:18;;;33246:30;-1:-1:-1;;;33292:18:1;;;33285:47;33349:18;;52905:65:0;33032:341:1;52905:65:0;52988:19;53001:5;52988:12;:19::i;53388:90::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53454:12:::1;:16:::0;53388:90::o;56246:1113::-;56350:7;;;;;;;56349:8;56341:37;;;;-1:-1:-1;;;56341:37:0;;;;;;;:::i;:::-;56397:3;;;;56389:34;;;;-1:-1:-1;;;56389:34:0;;33580:2:1;56389:34:0;;;33562:21:1;33619:2;33599:18;;;33592:30;-1:-1:-1;;;33638:18:1;;;33631:48;33696:18;;56389:34:0;33378:342:1;56389:34:0;56452:12;;56442:6;:22;;56434:59;;;;-1:-1:-1;;;56434:59:0;;24379:2:1;56434:59:0;;;24361:21:1;24418:2;24398:18;;;24391:30;-1:-1:-1;;;24437:18:1;;;24430:54;24501:18;;56434:59:0;24177:348:1;56434:59:0;56545:12;;56529:10;56522:18;;;;:6;:18;;;;;;56513:27;;:6;:27;:::i;:::-;56512:45;;56504:86;;;;-1:-1:-1;;;56504:86:0;;;;;;;:::i;:::-;56636:28;;-1:-1:-1;;;;;;56653:10:0;33874:2:1;33870:15;33866:53;56636:28:0;;;33854:66:1;56611:12:0;;33936::1;;56636:28:0;;;;;;;;;;;;56626:39;;;;;;56611:54;;56684:51;56703:11;;56684:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56716:12:0;;;-1:-1:-1;56730:4:0;;-1:-1:-1;56684:18:0;:51::i;:::-;56676:80;;;;-1:-1:-1;;;56676:80:0;;34161:2:1;56676:80:0;;;34143:21:1;34200:2;34180:18;;;34173:30;-1:-1:-1;;;34219:18:1;;;34212:46;34275:18;;56676:80:0;33959:340:1;56676:80:0;56769:13;56825:9;;56811:11;;56797;;47221:4;56785:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;56769:65;;56861:1;56853:5;:9;56845:31;;;;-1:-1:-1;;;56845:31:0;;;;;;;:::i;:::-;56889:12;56904:23;56913:6;56921:5;56904:8;:23::i;:::-;56889:38;;56953:1;56946:4;:8;56938:30;;;;-1:-1:-1;;;56938:30:0;;;;;;;:::i;:::-;56979:13;57002:7;;56995:4;:14;;;;:::i;:::-;56979:30;;57041:5;57028:9;:18;;57020:50;;;;-1:-1:-1;;;57020:50:0;;;;;;;:::i;:::-;57099:4;57084:11;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;57123:10:0;57114:20;;;;:8;:20;;;;;:28;;57138:4;;57114:20;:28;;57138:4;;57114:28;:::i;:::-;;;;-1:-1:-1;;57160:10:0;57153:18;;;;:6;:18;;;;;:26;;57175:4;;57153:18;:26;;57175:4;;57153:26;:::i;:::-;;;;-1:-1:-1;57192:27:0;;-1:-1:-1;57202:10:0;57214:4;57192:9;:27::i;:::-;57232:9;57244:17;57256:5;57244:9;:17;:::i;:::-;57232:29;-1:-1:-1;57276:6:0;;57272:80;;57299:41;57325:10;57338:1;57299:17;:41::i;:::-;56330:1029;;;;;56246:1113;;;:::o;53294:86::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53358:10:::1;:14:::0;53294:86::o;53900:98::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53970:13:::1;:20:::0;53900:98::o;53486:90::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53552:12:::1;:16:::0;53486:90::o;54622:804::-;54721:7;;;;;;;54720:8;54712:36;;;;-1:-1:-1;;;54712:36:0;;;;;;;:::i;:::-;54777:10;54767:21;;;;:9;:21;;;;;;54791:1;-1:-1:-1;54759:73:0;;;;-1:-1:-1;;;54759:73:0;;34506:2:1;54759:73:0;;;34488:21:1;34545:2;34525:18;;;34518:30;34584:34;34564:18;;;34557:62;-1:-1:-1;;;34635:18:1;;;34628:33;34678:19;;54759:73:0;34304:399:1;54759:73:0;54884:12;;54868:10;54861:18;;;;:6;:18;;;;;;54852:27;;:6;:27;:::i;:::-;54851:45;;54843:86;;;;-1:-1:-1;;;54843:86:0;;;;;;;:::i;:::-;54967:36;;-1:-1:-1;;;;;;54984:10:0;13033:2:1;13029:15;13025:53;54967:36:0;;;13013:66:1;13095:12;;;13088:28;;;54942:12:0;;13132::1;;54967:36:0;;;;;;;;;;;;54957:47;;;;;;54942:62;;55023:52;55042:11;;55023:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55055:13:0;;;-1:-1:-1;55070:4:0;;-1:-1:-1;55023:18:0;:52::i;:::-;55015:82;;;;-1:-1:-1;;;55015:82:0;;34910:2:1;55015:82:0;;;34892:21:1;34949:2;34929:18;;;34922:30;-1:-1:-1;;;34968:18:1;;;34961:47;35025:18;;55015:82:0;34708:341:1;55015:82:0;55110:13;55166:9;;55152:11;;55138;;47221:4;55126:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;55110:65;;55202:1;55194:5;:9;55186:31;;;;-1:-1:-1;;;55186:31:0;;;;;;;:::i;:::-;55231:12;55246:23;55255:6;55263:5;55246:8;:23::i;:::-;55231:38;;55297:4;55282:11;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;55322:10:0;55312:21;;;;:9;:21;;;;;:29;;55337:4;;55312:21;:29;;55337:4;;55312:29;:::i;22410:201::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22499:22:0;::::1;22491:73;;;::::0;-1:-1:-1;;;22491:73:0;;35256:2:1;22491:73:0::1;::::0;::::1;35238:21:1::0;35295:2;35275:18;;;35268:30;35334:34;35314:18;;;35307:62;-1:-1:-1;;;35385:18:1;;;35378:36;35431:19;;22491:73:0::1;35054:402:1::0;22491:73:0::1;22575:28;22594:8;22575:18;:28::i;:::-;22410:201:::0;:::o;53104:80::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53165:7:::1;:11:::0;53104:80::o;53796:96::-;22149:6;;-1:-1:-1;;;;;22149:6:0;4522:10;22211:23;22203:68;;;;-1:-1:-1;;;22203:68:0;;;;;;;:::i;:::-;53865:12:::1;:19:::0;53796:96::o;5391:387::-;5714:20;5762:8;;;5391:387::o;40848:190::-;40973:4;41026;40997:25;41010:5;41017:4;40997:12;:25::i;:::-;:33;;40848:190;-1:-1:-1;;;;40848:190:0:o;20482:106::-;20540:7;20571:1;20567;:5;:13;;20579:1;20567:13;;;20575:1;20567:13;20560:20;20482:106;-1:-1:-1;;;20482:106:0:o;35214:104::-;35283:27;35293:2;35297:8;35283:27;;;;;;;;;;;;:9;:27::i;39053:196::-;39168:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39168:29:0;-1:-1:-1;;;;;39168:29:0;;;;;;;;;39213:28;;39168:24;;39213:28;;;;;;;39053:196;;;:::o;37043:2002::-;37158:35;37196:20;37208:7;37196:11;:20::i;:::-;37271:18;;37158:58;;-1:-1:-1;37229:22:0;;-1:-1:-1;;;;;37255:34:0;4522:10;-1:-1:-1;;;;;37255:34:0;;:87;;;-1:-1:-1;4522:10:0;37306:20;37318:7;37306:11;:20::i;:::-;-1:-1:-1;;;;;37306:36:0;;37255:87;:154;;;-1:-1:-1;37376:18:0;;37359:50;;4522:10;34205:164;:::i;37359:50::-;37229:181;;37431:17;37423:80;;;;-1:-1:-1;;;37423:80:0;;35663:2:1;37423:80:0;;;35645:21:1;35702:2;35682:18;;;35675:30;35741:34;35721:18;;;35714:62;-1:-1:-1;;;35792:18:1;;;35785:48;35850:19;;37423:80:0;35461:414:1;37423:80:0;37546:4;-1:-1:-1;;;;;37524:26:0;:13;:18;;;-1:-1:-1;;;;;37524:26:0;;37516:77;;;;-1:-1:-1;;;37516:77:0;;36082:2:1;37516:77:0;;;36064:21:1;36121:2;36101:18;;;36094:30;36160:34;36140:18;;;36133:62;-1:-1:-1;;;36211:18:1;;;36204:36;36257:19;;37516:77:0;35880:402:1;37516:77:0;-1:-1:-1;;;;;37612:16:0;;37604:66;;;;-1:-1:-1;;;37604:66:0;;36489:2:1;37604:66:0;;;36471:21:1;36528:2;36508:18;;;36501:30;36567:34;36547:18;;;36540:62;-1:-1:-1;;;36618:18:1;;;36611:35;36663:19;;37604:66:0;36287:401:1;37604:66:0;37791:49;37808:1;37812:7;37821:13;:18;;;37791:8;:49::i;:::-;-1:-1:-1;;;;;38136:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;38136:31:0;;;-1:-1:-1;;;;;38136:31:0;;;-1:-1:-1;;38136:31:0;;;;;;;38182:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;38182:29:0;;;;;;;;;;;;;38228:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;38273:61:0;;;;-1:-1:-1;;;38318:15:0;-1:-1:-1;;;;;38273:61:0;;;;;38608:11;;;38638:24;;;;;:29;38608:11;;38638:29;38634:295;;38706:20;38714:11;35152:4;35186:12;-1:-1:-1;35176:22:0;35095:111;38706:20;38702:212;;;38783:18;;;38751:24;;;:11;:24;;;;;;;;:50;;38866:28;;;;-1:-1:-1;;;;;38824:70:0;-1:-1:-1;;;38824:70:0;-1:-1:-1;;;;;;38824:70:0;;;-1:-1:-1;;;;;38751:50:0;;;38824:70;;;;;;;38702:212;38111:829;38976:7;38972:2;-1:-1:-1;;;;;38957:27:0;38966:4;-1:-1:-1;;;;;38957:27:0;;;;;;;;;;;38995:42;33266:413;31924:537;-1:-1:-1;;;;;;;;;;;;;;;;;32027:16:0;32035:7;35152:4;35186:12;-1:-1:-1;35176:22:0;35095:111;32027:16;32019:71;;;;-1:-1:-1;;;32019:71:0;;36895:2:1;32019:71:0;;;36877:21:1;36934:2;36914:18;;;36907:30;36973:34;36953:18;;;36946:62;-1:-1:-1;;;37024:18:1;;;37017:40;37074:19;;32019:71:0;36693:406:1;32019:71:0;32148:7;32128:245;32195:31;32229:17;;;:11;:17;;;;;;;;;32195:51;;;;;;;;;-1:-1:-1;;;;;32195:51:0;;;;;-1:-1:-1;;;32195:51:0;;;-1:-1:-1;;;;;32195:51:0;;;;;;;;32269:28;32265:93;;32329:9;31924:537;-1:-1:-1;;;31924:537:0:o;32265:93::-;-1:-1:-1;;;32168:6:0;32128:245;;50070:373;50131:4;50171:1;50131:4;;50210:202;50234:1;:8;50230:1;:12;50210:202;;;50264:9;50290:1;50292;50290:4;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;50320:2:0;50315:7;;;;;:18;;;50331:2;50326:1;:7;;50315:18;50311:90;;;50378:6;50382:2;50378:1;:6;:::i;:::-;50363:11;:6;50372:2;50363:11;:::i;:::-;:22;;;;:::i;:::-;50354:31;;50311:90;-1:-1:-1;50244:3:0;;;;:::i;:::-;;;;50210:202;;22619:191;22712:6;;;-1:-1:-1;;;;;22729:17:0;;;-1:-1:-1;;;;;;22729:17:0;;;;;;;22762:40;;22712:6;;;22729:17;22712:6;;22762:40;;22693:16;;22762:40;22682:128;22619:191;:::o;6713:317::-;6828:6;6803:21;:31;;6795:73;;;;-1:-1:-1;;;6795:73:0;;37722:2:1;6795:73:0;;;37704:21:1;37761:2;37741:18;;;37734:30;37800:31;37780:18;;;37773:59;37849:18;;6795:73:0;37520:353:1;6795:73:0;6882:12;6900:9;-1:-1:-1;;;;;6900:14:0;6922:6;6900:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6881:52;;;6952:7;6944:78;;;;-1:-1:-1;;;6944:78:0;;38080:2:1;6944:78:0;;;38062:21:1;38119:2;38099:18;;;38092:30;38158:34;38138:18;;;38131:62;38229:28;38209:18;;;38202:56;38275:19;;6944:78:0;37878:422:1;2089:723:0;2145:13;2366:5;2375:1;2366:10;2362:53;;-1:-1:-1;;2393:10:0;;;;;;;;;;;;-1:-1:-1;;;2393:10:0;;;;;2089:723::o;2362:53::-;2440:5;2425:12;2481:78;2488:9;;2481:78;;2514:8;;;;:::i;:::-;;-1:-1:-1;2537:10:0;;-1:-1:-1;2545:2:0;2537:10;;:::i;:::-;;;2481:78;;;2569:19;2601:6;-1:-1:-1;;;;;2591:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2591:17:0;;2569:39;;2619:154;2626:10;;2619:154;;2653:11;2663:1;2653:11;;:::i;:::-;;-1:-1:-1;2722:10:0;2730:2;2722:5;:10;:::i;:::-;2709:24;;:2;:24;:::i;:::-;2696:39;;2679:6;2686;2679:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2679:56:0;;;;;;;;-1:-1:-1;2750:11:0;2759:2;2750:11;;:::i;:::-;;;2619:154;;;2797:6;2089:723;-1:-1:-1;;;;2089:723:0:o;43065:1912::-;43123:13;43153:4;:11;43168:1;43153:16;43149:31;;-1:-1:-1;;43171:9:0;;;;;;;;;-1:-1:-1;43171:9:0;;;43065:1912::o;43149:31::-;43232:19;43254:12;;;;;;;;;;;;;;;;;43232:34;;43318:18;43364:1;43345:4;:11;43359:1;43345:15;;;;:::i;:::-;43344:21;;;;:::i;:::-;43339:27;;:1;:27;:::i;:::-;43318:48;-1:-1:-1;43449:20:0;43483:15;43318:48;43496:2;43483:15;:::i;:::-;-1:-1:-1;;;;;43472:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43472:27:0;;43449:50;;43596:10;43588:6;43581:26;43691:1;43684:5;43680:13;43750:4;43801;43795:11;43786:7;43782:25;43897:2;43889:6;43885:15;43970:754;43989:6;43980:7;43977:19;43970:754;;;44089:1;44080:7;44076:15;44065:26;;44128:7;44122:14;44254:4;44246:5;44242:2;44238:14;44234:25;44224:8;44220:40;44214:47;44203:9;44195:67;44308:1;44297:9;44293:17;44280:30;;44387:4;44379:5;44375:2;44371:14;44367:25;44357:8;44353:40;44347:47;44336:9;44328:67;44441:1;44430:9;44426:17;44413:30;;44520:4;44512:5;44509:1;44504:14;44500:25;44490:8;44486:40;44480:47;44469:9;44461:67;44574:1;44563:9;44559:17;44546:30;;44653:4;44645:5;44633:25;44623:8;44619:40;44613:47;44602:9;44594:67;-1:-1:-1;44707:1:0;44692:17;43970:754;;;44797:1;44790:4;44784:11;44780:19;44818:1;44813:54;;;;44886:1;44881:52;;;;44773:160;;44813:54;-1:-1:-1;;;;;44829:17:0;;44822:43;44813:54;;44881:52;-1:-1:-1;;;;;44897:17:0;;44890:41;44773:160;-1:-1:-1;44963:6:0;;43065:1912;-1:-1:-1;;;;;;;;43065:1912:0:o;39257:804::-;39412:4;-1:-1:-1;;;;;39433:13:0;;5714:20;5762:8;39429:625;;39469:72;;-1:-1:-1;;;39469:72:0;;-1:-1:-1;;;;;39469:36:0;;;;;:72;;4522:10;;39520:4;;39526:7;;39535:5;;39469:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39469:72:0;;;;;;;;-1:-1:-1;;39469:72:0;;;;;;;;;;;;:::i;:::-;;;39465:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39715:6;:13;39732:1;39715:18;39711:273;;39758:61;;-1:-1:-1;;;39758:61:0;;;;;;;:::i;39711:273::-;39934:6;39928:13;39919:6;39915:2;39911:15;39904:38;39465:534;-1:-1:-1;;;;;;39592:55:0;-1:-1:-1;;;39592:55:0;;-1:-1:-1;39585:62:0;;39429:625;-1:-1:-1;40038:4:0;39257:804;;;;;;:::o;41400:675::-;41483:7;41526:4;41483:7;41541:497;41565:5;:12;41561:1;:16;41541:497;;;41599:20;41622:5;41628:1;41622:8;;;;;;;;:::i;:::-;;;;;;;41599:31;;41665:12;41649;:28;41645:382;;42151:13;42201:15;;;42237:4;42230:15;;;42284:4;42268:21;;41777:57;;41645:382;;;42151:13;42201:15;;;42237:4;42230:15;;;42284:4;42268:21;;41954:57;;41645:382;-1:-1:-1;41579:3:0;;;;:::i;:::-;;;;41541:497;;35326:163;35449:32;35455:2;35459:8;35469:5;35476:4;35636:20;35659:12;-1:-1:-1;;;;;35690:16:0;;35682:62;;;;-1:-1:-1;;;35682:62:0;;39629:2:1;35682:62:0;;;39611:21:1;39668:2;39648:18;;;39641:30;39707:34;39687:18;;;39680:62;-1:-1:-1;;;39758:18:1;;;39751:31;39799:19;;35682:62:0;39427:397:1;35682:62:0;35763:8;35775:1;35763:13;35755:66;;;;-1:-1:-1;;;35755:66:0;;40031:2:1;35755:66:0;;;40013:21:1;40070:2;40050:18;;;40043:30;40109:34;40089:18;;;40082:62;-1:-1:-1;;;40160:18:1;;;40153:38;40208:19;;35755:66:0;39829:404:1;35755:66:0;-1:-1:-1;;;;;36173:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;36173:45:0;;-1:-1:-1;;;;;36173:45:0;;;;;;;;;;36233:50;;;;;;;;;;;;;;36300:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;36350:66:0;;;;-1:-1:-1;;;36400:15:0;-1:-1:-1;;;;;36350:66:0;;;;;;36300:25;;36485:415;36505:8;36501:1;:12;36485:415;;;36544:38;;36569:12;;-1:-1:-1;;;;;36544:38:0;;;36561:1;;36544:38;;36561:1;;36544:38;36605:4;36601:249;;;36668:59;36699:1;36703:2;36707:12;36721:5;36668:22;:59::i;:::-;36634:196;;;;-1:-1:-1;;;36634:196:0;;;;;;;:::i;:::-;36870:14;;;;;36515:3;36485:415;;;-1:-1:-1;36916:12:0;:27;36967:60;33266:413;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:367:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;-1:-1:-1;;;;;214:30:1;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:505::-;481:6;489;497;550:2;538:9;529:7;525:23;521:32;518:52;;;566:1;563;556:12;518:52;602:9;589:23;579:33;;663:2;652:9;648:18;635:32;-1:-1:-1;;;;;682:6:1;679:30;676:50;;;722:1;719;712:12;676:50;761:70;823:7;814:6;803:9;799:22;761:70;:::i;:::-;386:505;;850:8;;-1:-1:-1;735:96:1;;-1:-1:-1;;;;386:505:1:o;896:131::-;-1:-1:-1;;;;;;970:32:1;;960:43;;950:71;;1017:1;1014;1007:12;1032:245;1090:6;1143:2;1131:9;1122:7;1118:23;1114:32;1111:52;;;1159:1;1156;1149:12;1111:52;1198:9;1185:23;1217:30;1241:5;1217:30;:::i;1474:180::-;1533:6;1586:2;1574:9;1565:7;1561:23;1557:32;1554:52;;;1602:1;1599;1592:12;1554:52;-1:-1:-1;1625:23:1;;1474:180;-1:-1:-1;1474:180:1:o;1659:250::-;1744:1;1754:113;1768:6;1765:1;1762:13;1754:113;;;1844:11;;;1838:18;1825:11;;;1818:39;1790:2;1783:10;1754:113;;;-1:-1:-1;;1901:1:1;1883:16;;1876:27;1659:250::o;1914:271::-;1956:3;1994:5;1988:12;2021:6;2016:3;2009:19;2037:76;2106:6;2099:4;2094:3;2090:14;2083:4;2076:5;2072:16;2037:76;:::i;:::-;2167:2;2146:15;-1:-1:-1;;2142:29:1;2133:39;;;;2174:4;2129:50;;1914:271;-1:-1:-1;;1914:271:1:o;2190:220::-;2339:2;2328:9;2321:21;2302:4;2359:45;2400:2;2389:9;2385:18;2377:6;2359:45;:::i;2623:173::-;2691:20;;-1:-1:-1;;;;;2740:31:1;;2730:42;;2720:70;;2786:1;2783;2776:12;2720:70;2623:173;;;:::o;2801:254::-;2869:6;2877;2930:2;2918:9;2909:7;2905:23;2901:32;2898:52;;;2946:1;2943;2936:12;2898:52;2969:29;2988:9;2969:29;:::i;:::-;2959:39;3045:2;3030:18;;;;3017:32;;-1:-1:-1;;;2801:254:1:o;3060:348::-;3112:8;3122:6;3176:3;3169:4;3161:6;3157:17;3153:27;3143:55;;3194:1;3191;3184:12;3143:55;-1:-1:-1;3217:20:1;;-1:-1:-1;;;;;3249:30:1;;3246:50;;;3292:1;3289;3282:12;3246:50;3329:4;3321:6;3317:17;3305:29;;3381:3;3374:4;3365:6;3357;3353:19;3349:30;3346:39;3343:59;;;3398:1;3395;3388:12;3413:411;3484:6;3492;3545:2;3533:9;3524:7;3520:23;3516:32;3513:52;;;3561:1;3558;3551:12;3513:52;3601:9;3588:23;-1:-1:-1;;;;;3626:6:1;3623:30;3620:50;;;3666:1;3663;3656:12;3620:50;3705:59;3756:7;3747:6;3736:9;3732:22;3705:59;:::i;:::-;3783:8;;3679:85;;-1:-1:-1;3413:411:1;-1:-1:-1;;;;3413:411:1:o;3829:160::-;3894:20;;3950:13;;3943:21;3933:32;;3923:60;;3979:1;3976;3969:12;3994:479;4071:6;4079;4087;4140:2;4128:9;4119:7;4115:23;4111:32;4108:52;;;4156:1;4153;4146:12;4108:52;4196:9;4183:23;-1:-1:-1;;;;;4221:6:1;4218:30;4215:50;;;4261:1;4258;4251:12;4215:50;4300:59;4351:7;4342:6;4331:9;4327:22;4300:59;:::i;:::-;4378:8;;-1:-1:-1;4274:85:1;-1:-1:-1;4432:35:1;;-1:-1:-1;4463:2:1;4448:18;;4432:35;:::i;:::-;4422:45;;3994:479;;;;;:::o;4478:180::-;4534:6;4587:2;4575:9;4566:7;4562:23;4558:32;4555:52;;;4603:1;4600;4593:12;4555:52;4626:26;4642:9;4626:26;:::i;4845:186::-;4904:6;4957:2;4945:9;4936:7;4932:23;4928:32;4925:52;;;4973:1;4970;4963:12;4925:52;4996:29;5015:9;4996:29;:::i;5036:328::-;5113:6;5121;5129;5182:2;5170:9;5161:7;5157:23;5153:32;5150:52;;;5198:1;5195;5188:12;5150:52;5221:29;5240:9;5221:29;:::i;:::-;5211:39;;5269:38;5303:2;5292:9;5288:18;5269:38;:::i;:::-;5259:48;;5354:2;5343:9;5339:18;5326:32;5316:42;;5036:328;;;;;:::o;5369:254::-;5437:6;5445;5498:2;5486:9;5477:7;5473:23;5469:32;5466:52;;;5514:1;5511;5504:12;5466:52;5550:9;5537:23;5527:33;;5579:38;5613:2;5602:9;5598:18;5579:38;:::i;:::-;5569:48;;5369:254;;;;;:::o;5868:127::-;5929:10;5924:3;5920:20;5917:1;5910:31;5960:4;5957:1;5950:15;5984:4;5981:1;5974:15;6000:632;6065:5;-1:-1:-1;;;;;6136:2:1;6128:6;6125:14;6122:40;;;6142:18;;:::i;:::-;6217:2;6211:9;6185:2;6271:15;;-1:-1:-1;;6267:24:1;;;6293:2;6263:33;6259:42;6247:55;;;6317:18;;;6337:22;;;6314:46;6311:72;;;6363:18;;:::i;:::-;6403:10;6399:2;6392:22;6432:6;6423:15;;6462:6;6454;6447:22;6502:3;6493:6;6488:3;6484:16;6481:25;6478:45;;;6519:1;6516;6509:12;6478:45;6569:6;6564:3;6557:4;6549:6;6545:17;6532:44;6624:1;6617:4;6608:6;6600;6596:19;6592:30;6585:41;;;;6000:632;;;;;:::o;6637:451::-;6706:6;6759:2;6747:9;6738:7;6734:23;6730:32;6727:52;;;6775:1;6772;6765:12;6727:52;6815:9;6802:23;-1:-1:-1;;;;;6840:6:1;6837:30;6834:50;;;6880:1;6877;6870:12;6834:50;6903:22;;6956:4;6948:13;;6944:27;-1:-1:-1;6934:55:1;;6985:1;6982;6975:12;6934:55;7008:74;7074:7;7069:2;7056:16;7051:2;7047;7043:11;7008:74;:::i;7093:495::-;7273:3;7258:19;;7262:9;7354:6;7231:4;7388:194;7402:4;7399:1;7396:11;7388:194;;;7461:13;;7449:26;;7498:4;7522:12;;;;7557:15;;;;7422:1;7415:9;7388:194;;;7392:3;;;7093:495;;;;:::o;7593:632::-;7764:2;7816:21;;;7886:13;;7789:18;;;7908:22;;;7735:4;;7764:2;7987:15;;;;7961:2;7946:18;;;7735:4;8030:169;8044:6;8041:1;8038:13;8030:169;;;8105:13;;8093:26;;8174:15;;;;8139:12;;;;8066:1;8059:9;8030:169;;;-1:-1:-1;8216:3:1;;7593:632;-1:-1:-1;;;;;;7593:632:1:o;8230:254::-;8295:6;8303;8356:2;8344:9;8335:7;8331:23;8327:32;8324:52;;;8372:1;8369;8362:12;8324:52;8395:29;8414:9;8395:29;:::i;:::-;8385:39;;8443:35;8474:2;8463:9;8459:18;8443:35;:::i;8999:667::-;9094:6;9102;9110;9118;9171:3;9159:9;9150:7;9146:23;9142:33;9139:53;;;9188:1;9185;9178:12;9139:53;9211:29;9230:9;9211:29;:::i;:::-;9201:39;;9259:38;9293:2;9282:9;9278:18;9259:38;:::i;:::-;9249:48;;9344:2;9333:9;9329:18;9316:32;9306:42;;9399:2;9388:9;9384:18;9371:32;-1:-1:-1;;;;;9418:6:1;9415:30;9412:50;;;9458:1;9455;9448:12;9412:50;9481:22;;9534:4;9526:13;;9522:27;-1:-1:-1;9512:55:1;;9563:1;9560;9553:12;9512:55;9586:74;9652:7;9647:2;9634:16;9629:2;9625;9621:11;9586:74;:::i;:::-;9576:84;;;8999:667;;;;;;;:::o;9856:1181::-;10047:6;10055;10063;10071;10079;10087;10095;10148:3;10136:9;10127:7;10123:23;10119:33;10116:53;;;10165:1;10162;10155:12;10116:53;10201:9;10188:23;10178:33;;10262:2;10251:9;10247:18;10234:32;-1:-1:-1;;;;;10326:2:1;10318:6;10315:14;10312:34;;;10342:1;10339;10332:12;10312:34;10381:70;10443:7;10434:6;10423:9;10419:22;10381:70;:::i;:::-;10470:8;;-1:-1:-1;10355:96:1;-1:-1:-1;10558:2:1;10543:18;;10530:32;;-1:-1:-1;10574:16:1;;;10571:36;;;10603:1;10600;10593:12;10571:36;10642:72;10706:7;10695:8;10684:9;10680:24;10642:72;:::i;:::-;10733:8;;-1:-1:-1;10616:98:1;-1:-1:-1;10821:2:1;10806:18;;10793:32;;-1:-1:-1;10837:16:1;;;10834:36;;;10866:1;10863;10856:12;10834:36;;10905:72;10969:7;10958:8;10947:9;10943:24;10905:72;:::i;:::-;9856:1181;;;;-1:-1:-1;9856:1181:1;;-1:-1:-1;9856:1181:1;;;;10879:98;;-1:-1:-1;;;9856:1181:1:o;11224:260::-;11292:6;11300;11353:2;11341:9;11332:7;11328:23;11324:32;11321:52;;;11369:1;11366;11359:12;11321:52;11392:29;11411:9;11392:29;:::i;:::-;11382:39;;11440:38;11474:2;11463:9;11459:18;11440:38;:::i;11489:339::-;11691:2;11673:21;;;11730:2;11710:18;;;11703:30;-1:-1:-1;;;11764:2:1;11749:18;;11742:45;11819:2;11804:18;;11489:339::o;12237:127::-;12298:10;12293:3;12289:20;12286:1;12279:31;12329:4;12326:1;12319:15;12353:4;12350:1;12343:15;12369:125;12434:9;;;12455:10;;;12452:36;;;12468:18;;:::i;12499:352::-;12701:2;12683:21;;;12740:2;12720:18;;;12713:30;12779;12774:2;12759:18;;12752:58;12842:2;12827:18;;12499:352::o;13501:128::-;13568:9;;;13589:11;;;13586:37;;;13603:18;;:::i;13634:332::-;13836:2;13818:21;;;13875:1;13855:18;;;13848:29;-1:-1:-1;;;13908:2:1;13893:18;;13886:39;13957:2;13942:18;;13634:332::o;13971:356::-;14173:2;14155:21;;;14192:18;;;14185:30;14251:34;14246:2;14231:18;;14224:62;14318:2;14303:18;;13971:356::o;14332:380::-;14411:1;14407:12;;;;14454;;;14475:61;;14529:4;14521:6;14517:17;14507:27;;14475:61;14582:2;14574:6;14571:14;14551:18;14548:38;14545:161;;14628:10;14623:3;14619:20;14616:1;14609:31;14663:4;14660:1;14653:15;14691:4;14688:1;14681:15;16086:545;16188:2;16183:3;16180:11;16177:448;;;16224:1;16249:5;16245:2;16238:17;16294:4;16290:2;16280:19;16364:2;16352:10;16348:19;16345:1;16341:27;16335:4;16331:38;16400:4;16388:10;16385:20;16382:47;;;-1:-1:-1;16423:4:1;16382:47;16478:2;16473:3;16469:12;16466:1;16462:20;16456:4;16452:31;16442:41;;16533:82;16551:2;16544:5;16541:13;16533:82;;;16596:17;;;16577:1;16566:13;16533:82;;16807:1206;-1:-1:-1;;;;;16926:3:1;16923:27;16920:53;;;16953:18;;:::i;:::-;16982:94;17072:3;17032:38;17064:4;17058:11;17032:38;:::i;:::-;17026:4;16982:94;:::i;:::-;17102:1;17127:2;17122:3;17119:11;17144:1;17139:616;;;;17799:1;17816:3;17813:93;;;-1:-1:-1;17872:19:1;;;17859:33;17813:93;-1:-1:-1;;16764:1:1;16760:11;;;16756:24;16752:29;16742:40;16788:1;16784:11;;;16739:57;17919:78;;17112:895;;17139:616;16033:1;16026:14;;;16070:4;16057:18;;-1:-1:-1;;17175:17:1;;;17276:9;17298:229;17312:7;17309:1;17306:14;17298:229;;;17401:19;;;17388:33;17373:49;;17508:4;17493:20;;;;17461:1;17449:14;;;;17328:12;17298:229;;;17302:3;17555;17546:7;17543:16;17540:159;;;17679:1;17675:6;17669:3;17663;17660:1;17656:11;17652:21;17648:34;17644:39;17631:9;17626:3;17622:19;17609:33;17605:79;17597:6;17590:95;17540:159;;;17742:1;17736:3;17733:1;17729:11;17725:19;17719:4;17712:33;17112:895;;16807:1206;;;:::o;18018:722::-;18068:3;18109:5;18103:12;18138:36;18164:9;18138:36;:::i;:::-;18193:1;18210:18;;;18237:133;;;;18384:1;18379:355;;;;18203:531;;18237:133;-1:-1:-1;;18270:24:1;;18258:37;;18343:14;;18336:22;18324:35;;18315:45;;;-1:-1:-1;18237:133:1;;18379:355;18410:5;18407:1;18400:16;18439:4;18484:2;18481:1;18471:16;18509:1;18523:165;18537:6;18534:1;18531:13;18523:165;;;18615:14;;18602:11;;;18595:35;18658:16;;;;18552:10;;18523:165;;;18527:3;;;18717:6;18712:3;18708:16;18701:23;;18203:531;;;;;18018:722;;;;:::o;18745:373::-;18931:3;18959:38;18993:3;18985:6;18959:38;:::i;:::-;19031:6;19023;19019:2;19006:32;19092:1;19057:15;;19081:13;;;-1:-1:-1;19057:15:1;;18745:373;-1:-1:-1;;;18745:373:1:o;19123:1352::-;19249:3;19243:10;-1:-1:-1;;;;;19268:6:1;19265:30;19262:56;;;19298:18;;:::i;:::-;19327:97;19417:6;19377:38;19409:4;19403:11;19377:38;:::i;:::-;19371:4;19327:97;:::i;:::-;19479:4;;19543:2;19532:14;;19560:1;19555:663;;;;20262:1;20279:6;20276:89;;;-1:-1:-1;20331:19:1;;;20325:26;20276:89;-1:-1:-1;;16764:1:1;16760:11;;;16756:24;16752:29;16742:40;16788:1;16784:11;;;16739:57;20378:81;;19525:944;;19555:663;16033:1;16026:14;;;16070:4;16057:18;;-1:-1:-1;;19591:20:1;;;19709:236;19723:7;19720:1;19717:14;19709:236;;;19812:19;;;19806:26;19791:42;;19904:27;;;;19872:1;19860:14;;;;19739:19;;19709:236;;;19713:3;19973:6;19964:7;19961:19;19958:201;;;20034:19;;;20028:26;-1:-1:-1;;20117:1:1;20113:14;;;20129:3;20109:24;20105:37;20101:42;20086:58;20071:74;;19958:201;-1:-1:-1;;;;;20205:1:1;20189:14;;;20185:22;20172:36;;-1:-1:-1;19123:1352:1:o;21912:168::-;21985:9;;;22016;;22033:15;;;22027:22;;22013:37;22003:71;;22054:18;;:::i;22442:127::-;22503:10;22498:3;22494:20;22491:1;22484:31;22534:4;22531:1;22524:15;22558:4;22555:1;22548:15;22574:135;22613:3;22634:17;;;22631:43;;22654:18;;:::i;:::-;-1:-1:-1;22701:1:1;22690:13;;22574:135::o;23481:340::-;23683:2;23665:21;;;23722:2;23702:18;;;23695:30;-1:-1:-1;;;23756:2:1;23741:18;;23734:46;23812:2;23797:18;;23481:340::o;24530:343::-;24732:2;24714:21;;;24771:2;24751:18;;;24744:30;-1:-1:-1;;;24805:2:1;24790:18;;24783:49;24864:2;24849:18;;24530:343::o;25944:776::-;26322:3;26360:6;26354:13;26376:66;26435:6;26430:3;26423:4;26415:6;26411:17;26376:66;:::i;:::-;26503:34;26464:16;;;26489:49;;;-1:-1:-1;;;26565:4:1;26554:16;;26547:46;26612:49;26657:2;26646:14;;26638:6;26612:49;:::i;:::-;-1:-1:-1;;;26670:18:1;;26712:1;26704:10;;25944:776;-1:-1:-1;;;;;25944:776:1:o;26725:452::-;26957:3;26995:6;26989:13;27011:66;27070:6;27065:3;27058:4;27050:6;27046:17;27011:66;:::i;:::-;-1:-1:-1;;;27099:16:1;;27124:18;;;-1:-1:-1;27169:1:1;27158:13;;26725:452;-1:-1:-1;26725:452:1:o;27182:1009::-;27706:3;27744:6;27738:13;27760:66;27819:6;27814:3;27807:4;27799:6;27795:17;27760:66;:::i;:::-;-1:-1:-1;;;27848:16:1;;;27873:59;;;27951:49;27996:2;27985:14;;27977:6;27951:49;:::i;:::-;-1:-1:-1;;;28009:50:1;;27941:59;-1:-1:-1;28078:46:1;28120:2;28112:11;;28104:6;28078:46;:::i;:::-;-1:-1:-1;;;28133:26:1;;28183:1;28175:10;;27182:1009;-1:-1:-1;;;;;;27182:1009:1:o;28196:589::-;28428:3;28466:6;28460:13;28482:66;28541:6;28536:3;28529:4;28521:6;28517:17;28482:66;:::i;:::-;28609;28570:16;;28595:81;;;-1:-1:-1;;;;28703:4:1;28692:16;;28685:64;28776:2;28765:14;;28196:589;-1:-1:-1;28196:589:1:o;28790:457::-;29022:3;29060:6;29054:13;29076:66;29135:6;29130:3;29123:4;29115:6;29111:17;29076:66;:::i;:::-;-1:-1:-1;;;29164:16:1;;29189:23;;;-1:-1:-1;29239:1:1;29228:13;;28790:457;-1:-1:-1;28790:457:1:o;29252:2018::-;30160:66;30155:3;30148:79;-1:-1:-1;;;30252:2:1;30247:3;30243:12;30236:26;30130:3;30291:6;30285:13;30307:73;30373:6;30368:2;30363:3;30359:12;30354:2;30346:6;30342:15;30307:73;:::i;:::-;30444:66;30439:2;30399:16;;;30431:11;;;30424:87;-1:-1:-1;;;30535:2:1;30527:11;;30520:74;-1:-1:-1;;;30618:2:1;30610:11;;30603:65;30687:47;30729:3;30721:12;;30713:6;30687:47;:::i;:::-;-1:-1:-1;;;30743:58:1;;30826:13;;30677:57;;-1:-1:-1;30848:74:1;30826:13;30908:2;30900:11;;30895:2;30883:15;;30848:74;:::i;:::-;-1:-1:-1;;;30982:2:1;30941:17;;;;30974:11;;;30967:69;31061:13;;31083:74;31061:13;31143:2;31135:11;;31130:2;31118:15;;31083:74;:::i;:::-;-1:-1:-1;;;31217:2:1;31176:17;;;;31209:11;;;31202:35;31261:2;31253:11;;29252:2018;-1:-1:-1;;;;;;29252:2018:1:o;31275:461::-;31537:31;31532:3;31525:44;31507:3;31598:6;31592:13;31614:75;31682:6;31677:2;31672:3;31668:12;31661:4;31653:6;31649:17;31614:75;:::i;:::-;31709:16;;;;31727:2;31705:25;;31275:461;-1:-1:-1;;31275:461:1:o;31741:415::-;31943:2;31925:21;;;31982:2;31962:18;;;31955:30;32021:34;32016:2;32001:18;;31994:62;-1:-1:-1;;;32087:2:1;32072:18;;32065:49;32146:3;32131:19;;31741:415::o;32505:522::-;32583:4;32589:6;32649:11;32636:25;32743:2;32739:7;32728:8;32712:14;32708:29;32704:43;32684:18;32680:68;32670:96;;32762:1;32759;32752:12;32670:96;32789:33;;32841:20;;;-1:-1:-1;;;;;;32873:30:1;;32870:50;;;32916:1;32913;32906:12;32870:50;32949:4;32937:17;;-1:-1:-1;32980:14:1;32976:27;;;32966:38;;32963:58;;;33017:1;33014;33007:12;38305:127;38366:10;38361:3;38357:20;38354:1;38347:31;38397:4;38394:1;38387:15;38421:4;38418:1;38411:15;38437:120;38477:1;38503;38493:35;;38508:18;;:::i;:::-;-1:-1:-1;38542:9:1;;38437:120::o;38562:112::-;38594:1;38620;38610:35;;38625:18;;:::i;:::-;-1:-1:-1;38659:9:1;;38562:112::o;38679:489::-;-1:-1:-1;;;;;38948:15:1;;;38930:34;;39000:15;;38995:2;38980:18;;38973:43;39047:2;39032:18;;39025:34;;;39095:3;39090:2;39075:18;;39068:31;;;38873:4;;39116:46;;39142:19;;39134:6;39116:46;:::i;:::-;39108:54;38679:489;-1:-1:-1;;;;;;38679:489:1:o;39173:249::-;39242:6;39295:2;39283:9;39274:7;39270:23;39266:32;39263:52;;;39311:1;39308;39301:12;39263:52;39343:9;39337:16;39362:30;39386:5;39362:30;:::i

Swarm Source

ipfs://326f11280f6eb5f835014dde6063a0b8ff661e12eef0dda760febdf3f70b52fd
Loading