ETH Price: $2,526.48 (+3.12%)

Token

1969 Bulls (69BLS)
 

Overview

Max Total Supply

177 69BLS

Holders

177

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 69BLS
0x28ade02a769f27a2bfca78a186be75ed0b9b9f13
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Bulls

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-01
*/

// SPDX-License-Identifier: MIT


/*
    Developed by @Sayem98
    Github: https://github.com/Sayem98
    LinkedIn: https://www.linkedin.com/in/sayem-abedin/
    Fiverr: https://www.fiverr.com/sayem_abedin

*/

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @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 == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


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

pragma solidity ^0.8.0;


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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @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.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _ownerOf(tokenId) != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId, 1);

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

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

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// File: contracts/Woolsters.sol



// First mint free and remaining is paid per wallet, low gas contract


pragma solidity >=0.7.0 <0.9.0;




contract Bulls is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "ipfs://bafybeibsty4l4bljmm7dad3dnxx2drqzdixkcsn5ulirykthzaizziz2nm/";
  string public uriSuffix = ".json";

  
  uint256 public cost =  0.0055 ether;

  uint256 public maxSupply = 555;
  uint public freeSupply = 177;
  uint public freeMinted = 0;

  uint256 public maxMintAmountPerTx = 7;
  uint public maxMintPreWallet = 7;

    mapping(address=>bool) public hasFreeMinted;


  address[] public airDropAddress;

  // hidden image URI
  string public hiddenImageURI = "ipfs://bafybeic3tmjyb7gfmykaa2gwiemxue2gjdvap5bhxiud4m4ceymdnualei/hidden.json";
  bool public Revealed = false;

  // whitelist mint period.
  address public receiver = owner();

  constructor() ERC721("1969 Bulls", "69BLS") { 
   
  }

  /*
  Mint any amount of NFTs and one is free for each wallet.
  * @dev Mint NFTs
  * @param _mintAmount The number of NFTs to mint
   */

  function mint(uint256 _mintAmount) public payable {
    
    require(_mintAmount <= maxMintAmountPerTx, "Invalid transaction");
    require(walletOfOwner(msg.sender).length + _mintAmount <= maxMintPreWallet, "Invalid transaction");
    // Check that the total supply of NFTs will not exceed the maximum supply after this minting
    uint256 currentSupply = totalSupply();
    require(currentSupply + _mintAmount <= maxSupply, "Max supply reached");

    if(hasFreeMinted[msg.sender]){
        require(msg.value >= cost * _mintAmount, "invalid cost");

    }else{
        require(freeMinted+_mintAmount<=freeSupply, "All free NFT is minted");
        require(msg.value >= cost *(_mintAmount-1), "invalid cost -2");
        hasFreeMinted[msg.sender] = true;
        freeMinted += 1;

    }

    // Mint the NFTs
    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(msg.sender, currentSupply + i);
      supply.increment();
    }
  }


  function adminMint(uint256 _mintAmount) public onlyOwner {

    uint256 currentSupply = totalSupply();
    require(currentSupply + _mintAmount <= maxSupply, "Max supply reached");

    // Mint the NFTs
    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(msg.sender, currentSupply + i);
      supply.increment();
    }

  }


  function airdrop() public onlyOwner{
      for(uint i=0;i<airDropAddress.length;i++){
          if(airDropAddress[i] != address(0)){
            uint currentSupply = totalSupply();
            _safeMint(airDropAddress[i], currentSupply + i+1);
            supply.increment();
            delete airDropAddress[i];
          }
          
      }
  }


                                      /* Setter functions */




  
  /*
    -> For setting any address as white listed or not.
    @params _address: address to be white listed, _value: true/false

   */


  /*
    -> For setting multiple address as white listed or not.
    @params _addresses: array of address to be white listed, _value: true/false

   */



  /*
    -> For setting any address as airdrop address.
    @params _address: address to be airdrop address
    @dev only owner can call this function.
  
   */

  function setAirdropAddress(address _address) public onlyOwner{
      airDropAddress.push(_address);
  }

  /*
    -> For removing address as airdrop address.
    @params _address : address to be removed from airdrop address
    @dev only owner can call this function.
  
   */

  function removeAirdropAddress(address _address) public onlyOwner{
      for(uint i=0;i<airDropAddress.length;i++){
          if(airDropAddress[i] == _address){
              delete airDropAddress[i];
          }
      }
  }

  /*
    ->setting max mint amount per wallet.
    @params _value: max mint amount per wallet
    @dev only owner can call this function.

   */

  function setMaxMintPerWallet(uint _value) public onlyOwner{
      maxMintPreWallet = _value;
  }

  /*
    -> setting white listed minting cost.
    @params _cost: cost of minting for white listed address
    @dev only owner can call this function.
  
   */




  
  /*
    -> setting cost of minting.
    @params _cost: cost of minting
    @dev only owner can call this function.
   */
   
  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
    
  }

  /*
    -> setting max mint amount per transaction.
    @params _maxMintAmountPerTx: max mint amount per transaction
    @dev only owner can call this function.
  
   */

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  /*
    ->s setting URI prefix.
    @params _uriPrefix: URI prefix
    @dev only owner can call this function.
  
   */

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  /*
    -> setting URI suffix.
    @params _uriSuffix: URI suffix
    @dev only owner can call this function.
   */

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  /*
    -> setting state of contract.
    @params _state: true/false
    @dev only owner can call this function.
   */


  function setReveal(bool _state) public onlyOwner{
      Revealed = _state;
  }

  function withdraw() public onlyOwner {
    
    // This will transfer the remaining contract balance to the owner.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(receiver).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }

  function setReceiver(address _add) public onlyOwner{
      receiver = _add;
  }

                    /* -> Getter functions */

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }


  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

    
    if(!Revealed){
        return hiddenImageURI;
    }else{
      string memory currentBaseURI = _baseURI();
      return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : "";
    }
    
  }


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

  function setHiddenURI(string memory _uri) public onlyOwner{
      hiddenImageURI = _uri;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"Revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"airDropAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasFreeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenImageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPreWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAirdropAddress","outputs":[],"stateMutability":"nonpayable","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":"_address","type":"address"}],"name":"setAirdropAddress","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"setReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180608001604052806043815260200162004cd260439139600890816200002e919062000566565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506009908162000075919062000566565b5066138a388a43c000600a5561022b600b5560b1600c556000600d556007600e556007600f556040518060800160405280604e815260200162004d15604e913960129081620000c5919062000566565b506000601360006101000a81548160ff021916908315150217905550620000f1620001fc60201b60201c565b601360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200013e57600080fd5b506040518060400160405280600a81526020017f313936392042756c6c73000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f3639424c530000000000000000000000000000000000000000000000000000008152508160009081620001bc919062000566565b508060019081620001ce919062000566565b505050620001f673a1426107292737fe690e2a96c9cab83755f5ff656200022660201b60201c565b6200064d565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036e57607f821691505b60208210810362000384576200038362000326565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003ee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003af565b620003fa8683620003af565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000447620004416200043b8462000412565b6200041c565b62000412565b9050919050565b6000819050919050565b620004638362000426565b6200047b62000472826200044e565b848454620003bc565b825550505050565b600090565b6200049262000483565b6200049f81848462000458565b505050565b5b81811015620004c757620004bb60008262000488565b600181019050620004a5565b5050565b601f8211156200051657620004e0816200038a565b620004eb846200039f565b81016020851015620004fb578190505b620005136200050a856200039f565b830182620004a4565b50505b505050565b600082821c905092915050565b60006200053b600019846008026200051b565b1980831691505092915050565b600062000556838362000528565b9150826002028217905092915050565b6200057182620002ec565b67ffffffffffffffff8111156200058d576200058c620002f7565b5b62000599825462000355565b620005a6828285620004cb565b600060209050601f831160018114620005de5760008415620005c9578287015190505b620005d5858262000548565b86555062000645565b601f198416620005ee866200038a565b60005b828110156200061857848901518255600182019150602085019450602081019050620005f1565b8683101562000638578489015162000634601f89168262000528565b8355505b6001600288020188555050505b505050505050565b614675806200065d6000396000f3fe6080604052600436106102725760003560e01c8063718da7ee1161014f578063b88d4fde116100c1578063d88a10861161007a578063d88a108614610917578063e2a7169c14610942578063e985e9c51461096d578063ef6187a4146109aa578063f2fde38b146109e7578063f7260d3e14610a1057610272565b8063b88d4fde14610809578063bbaac02f14610832578063c1f261231461085b578063c87b56dd14610884578063d10a1a2b146108c1578063d5abeb01146108ec57610272565b806396d4710d1161011357806396d4710d14610720578063a0712d6814610749578063a22cb46514610765578063ab0eda9e1461078e578063afdf6134146107b7578063b071401b146107e057610272565b8063718da7ee1461064d5780637ec4a659146106765780638da5cb5b1461069f57806394354fd0146106ca57806395d89b41146106f557610272565b80633884d635116101e85780635503a0e8116101ac5780635503a0e814610529578063599d86c21461055457806362b99ad4146105915780636352211e146105bc57806370a08231146105f9578063715018a61461063657610272565b80633884d6351461046c5780633ccfd60b1461048357806342842e0e1461049a578063438b6300146104c357806344a0d68a1461050057610272565b806316ba10e01161023a57806316ba10e01461037057806318160ddd1461039957806323b872dd146103c457806324a6ab0c146103ed5780632a3f300c14610418578063382fad8e1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806313faede614610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190612f2a565b610a3b565b6040516102ab9190612f72565b60405180910390f35b3480156102c057600080fd5b506102c9610b1d565b6040516102d6919061301d565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613075565b610baf565b60405161031391906130e3565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061312a565b610bf5565b005b34801561035157600080fd5b5061035a610d0c565b6040516103679190613179565b60405180910390f35b34801561037c57600080fd5b50610397600480360381019061039291906132c9565b610d12565b005b3480156103a557600080fd5b506103ae610d2d565b6040516103bb9190613179565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613312565b610d3e565b005b3480156103f957600080fd5b50610402610d9e565b60405161040f9190613179565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613391565b610da4565b005b34801561044d57600080fd5b50610456610dc9565b6040516104639190613179565b60405180910390f35b34801561047857600080fd5b50610481610dcf565b005b34801561048f57600080fd5b50610498610f27565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190613312565b610fca565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906133be565b610fea565b6040516104f791906134a9565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613075565b6110f4565b005b34801561053557600080fd5b5061053e611106565b60405161054b919061301d565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190613075565b611194565b60405161058891906130e3565b60405180910390f35b34801561059d57600080fd5b506105a66111d3565b6040516105b3919061301d565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de9190613075565b611261565b6040516105f091906130e3565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b91906133be565b6112e7565b60405161062d9190613179565b60405180910390f35b34801561064257600080fd5b5061064b61139e565b005b34801561065957600080fd5b50610674600480360381019061066f91906133be565b6113b2565b005b34801561068257600080fd5b5061069d600480360381019061069891906132c9565b6113fe565b005b3480156106ab57600080fd5b506106b4611419565b6040516106c191906130e3565b60405180910390f35b3480156106d657600080fd5b506106df611443565b6040516106ec9190613179565b60405180910390f35b34801561070157600080fd5b5061070a611449565b604051610717919061301d565b60405180910390f35b34801561072c57600080fd5b50610747600480360381019061074291906133be565b6114db565b005b610763600480360381019061075e9190613075565b6115bd565b005b34801561077157600080fd5b5061078c600480360381019061078791906134cb565b6118c4565b005b34801561079a57600080fd5b506107b560048036038101906107b091906133be565b6118da565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613075565b611948565b005b3480156107ec57600080fd5b5061080760048036038101906108029190613075565b61195a565b005b34801561081557600080fd5b50610830600480360381019061082b91906135ac565b61196c565b005b34801561083e57600080fd5b50610859600480360381019061085491906132c9565b6119ce565b005b34801561086757600080fd5b50610882600480360381019061087d9190613075565b6119e9565b005b34801561089057600080fd5b506108ab60048036038101906108a69190613075565b611a92565b6040516108b8919061301d565b60405180910390f35b3480156108cd57600080fd5b506108d6611be3565b6040516108e39190613179565b60405180910390f35b3480156108f857600080fd5b50610901611be9565b60405161090e9190613179565b60405180910390f35b34801561092357600080fd5b5061092c611bef565b604051610939919061301d565b60405180910390f35b34801561094e57600080fd5b50610957611c7d565b6040516109649190612f72565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f919061362f565b611c90565b6040516109a19190612f72565b60405180910390f35b3480156109b657600080fd5b506109d160048036038101906109cc91906133be565b611d24565b6040516109de9190612f72565b60405180910390f35b3480156109f357600080fd5b50610a0e6004803603810190610a0991906133be565b611d44565b005b348015610a1c57600080fd5b50610a25611dc7565b604051610a3291906130e3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b165750610b1582611ded565b5b9050919050565b606060008054610b2c9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b589061369e565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b6000610bba82611e57565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0082611261565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790613741565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c8f611ea2565b73ffffffffffffffffffffffffffffffffffffffff161480610cbe5750610cbd81610cb8611ea2565b611c90565b5b610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906137d3565b60405180910390fd5b610d078383611eaa565b505050565b600a5481565b610d1a611f63565b8060099081610d29919061399f565b5050565b6000610d396007611fe1565b905090565b610d4f610d49611ea2565b82611fef565b610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613ae3565b60405180910390fd5b610d99838383612084565b505050565b600c5481565b610dac611f63565b80601360006101000a81548160ff02191690831515021790555050565b600f5481565b610dd7611f63565b60005b601180549050811015610f2457600073ffffffffffffffffffffffffffffffffffffffff1660118281548110610e1357610e12613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f11576000610e63610d2d565b9050610ec460118381548110610e7c57610e7b613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018484610eb59190613b61565b610ebf9190613b61565b61237d565b610ece600761239b565b60118281548110610ee257610ee1613b03565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055505b8080610f1c90613b95565b915050610dda565b50565b610f2f611f63565b6000601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610f7790613c0e565b60006040518083038185875af1925050503d8060008114610fb4576040519150601f19603f3d011682016040523d82523d6000602084013e610fb9565b606091505b5050905080610fc757600080fd5b50565b610fe58383836040518060200160405280600081525061196c565b505050565b60606000610ff7836112e7565b905060008167ffffffffffffffff8111156110155761101461319e565b5b6040519080825280602002602001820160405280156110435781602001602082028036833780820191505090505b50905060006001905060005b83811080156110605750600b548211155b156110e857600061107083611261565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d457828483815181106110b9576110b8613b03565b5b60200260200101818152505081806110d090613b95565b9250505b82806110df90613b95565b9350505061104f565b82945050505050919050565b6110fc611f63565b80600a8190555050565b600980546111139061369e565b80601f016020809104026020016040519081016040528092919081815260200182805461113f9061369e565b801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b505050505081565b601181815481106111a457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600880546111e09061369e565b80601f016020809104026020016040519081016040528092919081815260200182805461120c9061369e565b80156112595780601f1061122e57610100808354040283529160200191611259565b820191906000526020600020905b81548152906001019060200180831161123c57829003601f168201915b505050505081565b60008061126d836123b1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590613c6f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90613d01565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113a6611f63565b6113b060006123ee565b565b6113ba611f63565b80601360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611406611f63565b8060089081611415919061399f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546114589061369e565b80601f01602080910402602001604051908101604052809291908181526020018280546114849061369e565b80156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b5050505050905090565b6114e3611f63565b60005b6011805490508110156115b9578173ffffffffffffffffffffffffffffffffffffffff166011828154811061151e5761151d613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036115a6576011818154811061157857611577613b03565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b80806115b190613b95565b9150506114e6565b5050565b600e54811115611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990613d6d565b60405180910390fd5b600f548161160f33610fea565b5161161a9190613b61565b111561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290613d6d565b60405180910390fd5b6000611665610d2d565b9050600b5482826116769190613b61565b11156116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90613dd9565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561175e5781600a546117179190613df9565b341015611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090613e87565b60405180910390fd5b61187f565b600c5482600d5461176f9190613b61565b11156117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790613ef3565b60405180910390fd5b6001826117bd9190613f13565b600a546117ca9190613df9565b34101561180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390613f93565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60008282546118779190613b61565b925050819055505b6000600190505b8281116118bf576118a233828461189d9190613b61565b61237d565b6118ac600761239b565b80806118b790613b95565b915050611886565b505050565b6118d66118cf611ea2565b83836124b4565b5050565b6118e2611f63565b6011819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611950611f63565b80600f8190555050565b611962611f63565b80600e8190555050565b61197d611977611ea2565b83611fef565b6119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613ae3565b60405180910390fd5b6119c884848484612620565b50505050565b6119d6611f63565b80601290816119e5919061399f565b5050565b6119f1611f63565b60006119fb610d2d565b9050600b548282611a0c9190613b61565b1115611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490613dd9565b60405180910390fd5b6000600190505b828111611a8d57611a70338284611a6b9190613b61565b61237d565b611a7a600761239b565b8080611a8590613b95565b915050611a54565b505050565b6060611a9d8261267c565b611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad390614025565b60405180910390fd5b601360009054906101000a900460ff16611b825760128054611afd9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b299061369e565b8015611b765780601f10611b4b57610100808354040283529160200191611b76565b820191906000526020600020905b815481529060010190602001808311611b5957829003601f168201915b50505050509050611bde565b6000611b8c6126bd565b90506000815111611bac5760405180602001604052806000815250611bda565b80611bb68461274f565b6009604051602001611bca93929190614104565b6040516020818303038152906040525b9150505b919050565b600d5481565b600b5481565b60128054611bfc9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c289061369e565b8015611c755780601f10611c4a57610100808354040283529160200191611c75565b820191906000526020600020905b815481529060010190602001808311611c5857829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b611d4c611f63565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db2906141a7565b60405180910390fd5b611dc4816123ee565b50565b601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e608161267c565b611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690613c6f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f1d83611261565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f6b611ea2565b73ffffffffffffffffffffffffffffffffffffffff16611f89611419565b73ffffffffffffffffffffffffffffffffffffffff1614611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd690614213565b60405180910390fd5b565b600081600001549050919050565b600080611ffb83611261565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061203d575061203c8185611c90565b5b8061207b57508373ffffffffffffffffffffffffffffffffffffffff1661206384610baf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120a482611261565b73ffffffffffffffffffffffffffffffffffffffff16146120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f1906142a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216090614337565b60405180910390fd5b612176838383600161281d565b8273ffffffffffffffffffffffffffffffffffffffff1661219682611261565b73ffffffffffffffffffffffffffffffffffffffff16146121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e3906142a5565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123788383836001612943565b505050565b612397828260405180602001604052806000815250612949565b5050565b6001816000016000828254019250508190555050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906143a3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126139190612f72565b60405180910390a3505050565b61262b848484612084565b612637848484846129a4565b612676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266d90614435565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661269e836123b1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600880546126cc9061369e565b80601f01602080910402602001604051908101604052809291908181526020018280546126f89061369e565b80156127455780601f1061271a57610100808354040283529160200191612745565b820191906000526020600020905b81548152906001019060200180831161272857829003601f168201915b5050505050905090565b60606000600161275e84612b2b565b01905060008167ffffffffffffffff81111561277d5761277c61319e565b5b6040519080825280601f01601f1916602001820160405280156127af5781602001600182028036833780820191505090505b509050600082602001820190505b600115612812578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161280657612805614455565b5b049450600085036127bd575b819350505050919050565b600181111561293d57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146128b15780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a99190613f13565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461293c5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129349190613b61565b925050819055505b5b50505050565b50505050565b6129538383612c7e565b61296060008484846129a4565b61299f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299690614435565b60405180910390fd5b505050565b60006129c58473ffffffffffffffffffffffffffffffffffffffff16612e9b565b15612b1e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129ee611ea2565b8786866040518563ffffffff1660e01b8152600401612a1094939291906144d9565b6020604051808303816000875af1925050508015612a4c57506040513d601f19601f82011682018060405250810190612a49919061453a565b60015b612ace573d8060008114612a7c576040519150601f19603f3d011682016040523d82523d6000602084013e612a81565b606091505b506000815103612ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abd90614435565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b23565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b89577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b7f57612b7e614455565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612bc6576d04ee2d6d415b85acef81000000008381612bbc57612bbb614455565b5b0492506020810190505b662386f26fc100008310612bf557662386f26fc100008381612beb57612bea614455565b5b0492506010810190505b6305f5e1008310612c1e576305f5e1008381612c1457612c13614455565b5b0492506008810190505b6127108310612c43576127108381612c3957612c38614455565b5b0492506004810190505b60648310612c665760648381612c5c57612c5b614455565b5b0492506002810190505b600a8310612c75576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce4906145b3565b60405180910390fd5b612cf68161267c565b15612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d9061461f565b60405180910390fd5b612d4460008383600161281d565b612d4d8161267c565b15612d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d849061461f565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e97600083836001612943565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f0781612ed2565b8114612f1257600080fd5b50565b600081359050612f2481612efe565b92915050565b600060208284031215612f4057612f3f612ec8565b5b6000612f4e84828501612f15565b91505092915050565b60008115159050919050565b612f6c81612f57565b82525050565b6000602082019050612f876000830184612f63565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fc7578082015181840152602081019050612fac565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fef82612f8d565b612ff98185612f98565b9350613009818560208601612fa9565b61301281612fd3565b840191505092915050565b600060208201905081810360008301526130378184612fe4565b905092915050565b6000819050919050565b6130528161303f565b811461305d57600080fd5b50565b60008135905061306f81613049565b92915050565b60006020828403121561308b5761308a612ec8565b5b600061309984828501613060565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130cd826130a2565b9050919050565b6130dd816130c2565b82525050565b60006020820190506130f860008301846130d4565b92915050565b613107816130c2565b811461311257600080fd5b50565b600081359050613124816130fe565b92915050565b6000806040838503121561314157613140612ec8565b5b600061314f85828601613115565b925050602061316085828601613060565b9150509250929050565b6131738161303f565b82525050565b600060208201905061318e600083018461316a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131d682612fd3565b810181811067ffffffffffffffff821117156131f5576131f461319e565b5b80604052505050565b6000613208612ebe565b905061321482826131cd565b919050565b600067ffffffffffffffff8211156132345761323361319e565b5b61323d82612fd3565b9050602081019050919050565b82818337600083830152505050565b600061326c61326784613219565b6131fe565b90508281526020810184848401111561328857613287613199565b5b61329384828561324a565b509392505050565b600082601f8301126132b0576132af613194565b5b81356132c0848260208601613259565b91505092915050565b6000602082840312156132df576132de612ec8565b5b600082013567ffffffffffffffff8111156132fd576132fc612ecd565b5b6133098482850161329b565b91505092915050565b60008060006060848603121561332b5761332a612ec8565b5b600061333986828701613115565b935050602061334a86828701613115565b925050604061335b86828701613060565b9150509250925092565b61336e81612f57565b811461337957600080fd5b50565b60008135905061338b81613365565b92915050565b6000602082840312156133a7576133a6612ec8565b5b60006133b58482850161337c565b91505092915050565b6000602082840312156133d4576133d3612ec8565b5b60006133e284828501613115565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134208161303f565b82525050565b60006134328383613417565b60208301905092915050565b6000602082019050919050565b6000613456826133eb565b61346081856133f6565b935061346b83613407565b8060005b8381101561349c5781516134838882613426565b975061348e8361343e565b92505060018101905061346f565b5085935050505092915050565b600060208201905081810360008301526134c3818461344b565b905092915050565b600080604083850312156134e2576134e1612ec8565b5b60006134f085828601613115565b92505060206135018582860161337c565b9150509250929050565b600067ffffffffffffffff8211156135265761352561319e565b5b61352f82612fd3565b9050602081019050919050565b600061354f61354a8461350b565b6131fe565b90508281526020810184848401111561356b5761356a613199565b5b61357684828561324a565b509392505050565b600082601f83011261359357613592613194565b5b81356135a384826020860161353c565b91505092915050565b600080600080608085870312156135c6576135c5612ec8565b5b60006135d487828801613115565b94505060206135e587828801613115565b93505060406135f687828801613060565b925050606085013567ffffffffffffffff81111561361757613616612ecd565b5b6136238782880161357e565b91505092959194509250565b6000806040838503121561364657613645612ec8565b5b600061365485828601613115565b925050602061366585828601613115565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136b657607f821691505b6020821081036136c9576136c861366f565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061372b602183612f98565b9150613736826136cf565b604082019050919050565b6000602082019050818103600083015261375a8161371e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006137bd603d83612f98565b91506137c882613761565b604082019050919050565b600060208201905081810360008301526137ec816137b0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613818565b61385f8683613818565b95508019841693508086168417925050509392505050565b6000819050919050565b600061389c6138976138928461303f565b613877565b61303f565b9050919050565b6000819050919050565b6138b683613881565b6138ca6138c2826138a3565b848454613825565b825550505050565b600090565b6138df6138d2565b6138ea8184846138ad565b505050565b5b8181101561390e576139036000826138d7565b6001810190506138f0565b5050565b601f82111561395357613924816137f3565b61392d84613808565b8101602085101561393c578190505b61395061394885613808565b8301826138ef565b50505b505050565b600082821c905092915050565b600061397660001984600802613958565b1980831691505092915050565b600061398f8383613965565b9150826002028217905092915050565b6139a882612f8d565b67ffffffffffffffff8111156139c1576139c061319e565b5b6139cb825461369e565b6139d6828285613912565b600060209050601f831160018114613a0957600084156139f7578287015190505b613a018582613983565b865550613a69565b601f198416613a17866137f3565b60005b82811015613a3f57848901518255600182019150602085019450602081019050613a1a565b86831015613a5c5784890151613a58601f891682613965565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613acd602d83612f98565b9150613ad882613a71565b604082019050919050565b60006020820190508181036000830152613afc81613ac0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b6c8261303f565b9150613b778361303f565b9250828201905080821115613b8f57613b8e613b32565b5b92915050565b6000613ba08261303f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bd257613bd1613b32565b5b600182019050919050565b600081905092915050565b50565b6000613bf8600083613bdd565b9150613c0382613be8565b600082019050919050565b6000613c1982613beb565b9150819050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613c59601883612f98565b9150613c6482613c23565b602082019050919050565b60006020820190508181036000830152613c8881613c4c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613ceb602983612f98565b9150613cf682613c8f565b604082019050919050565b60006020820190508181036000830152613d1a81613cde565b9050919050565b7f496e76616c6964207472616e73616374696f6e00000000000000000000000000600082015250565b6000613d57601383612f98565b9150613d6282613d21565b602082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613dc3601283612f98565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b6000613e048261303f565b9150613e0f8361303f565b9250828202613e1d8161303f565b91508282048414831517613e3457613e33613b32565b5b5092915050565b7f696e76616c696420636f73740000000000000000000000000000000000000000600082015250565b6000613e71600c83612f98565b9150613e7c82613e3b565b602082019050919050565b60006020820190508181036000830152613ea081613e64565b9050919050565b7f416c6c2066726565204e4654206973206d696e74656400000000000000000000600082015250565b6000613edd601683612f98565b9150613ee882613ea7565b602082019050919050565b60006020820190508181036000830152613f0c81613ed0565b9050919050565b6000613f1e8261303f565b9150613f298361303f565b9250828203905081811115613f4157613f40613b32565b5b92915050565b7f696e76616c696420636f7374202d320000000000000000000000000000000000600082015250565b6000613f7d600f83612f98565b9150613f8882613f47565b602082019050919050565b60006020820190508181036000830152613fac81613f70565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061400f602f83612f98565b915061401a82613fb3565b604082019050919050565b6000602082019050818103600083015261403e81614002565b9050919050565b600081905092915050565b600061405b82612f8d565b6140658185614045565b9350614075818560208601612fa9565b80840191505092915050565b6000815461408e8161369e565b6140988186614045565b945060018216600081146140b357600181146140c8576140fb565b60ff19831686528115158202860193506140fb565b6140d1856137f3565b60005b838110156140f3578154818901526001820191506020810190506140d4565b838801955050505b50505092915050565b60006141108286614050565b915061411c8285614050565b91506141288284614081565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614191602683612f98565b915061419c82614135565b604082019050919050565b600060208201905081810360008301526141c081614184565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141fd602083612f98565b9150614208826141c7565b602082019050919050565b6000602082019050818103600083015261422c816141f0565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061428f602583612f98565b915061429a82614233565b604082019050919050565b600060208201905081810360008301526142be81614282565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614321602483612f98565b915061432c826142c5565b604082019050919050565b6000602082019050818103600083015261435081614314565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061438d601983612f98565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061441f603283612f98565b915061442a826143c3565b604082019050919050565b6000602082019050818103600083015261444e81614412565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006144ab82614484565b6144b5818561448f565b93506144c5818560208601612fa9565b6144ce81612fd3565b840191505092915050565b60006080820190506144ee60008301876130d4565b6144fb60208301866130d4565b614508604083018561316a565b818103606083015261451a81846144a0565b905095945050505050565b60008151905061453481612efe565b92915050565b6000602082840312156145505761454f612ec8565b5b600061455e84828501614525565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061459d602083612f98565b91506145a882614567565b602082019050919050565b600060208201905081810360008301526145cc81614590565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614609601c83612f98565b9150614614826145d3565b602082019050919050565b60006020820190508181036000830152614638816145fc565b905091905056fea2646970667358221220e336e456d930da825734a6b0fcce1818fcd9b781adb55cde0e14c2cba07183d664736f6c63430008120033697066733a2f2f6261667962656962737479346c34626c6a6d6d3764616433646e7878326472717a6469786b63736e35756c6972796b74687a61697a7a697a326e6d2f697066733a2f2f626166796265696333746d6a79623767666d796b616132677769656d78756532676a6476617035626878697564346d346365796d646e75616c65692f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102725760003560e01c8063718da7ee1161014f578063b88d4fde116100c1578063d88a10861161007a578063d88a108614610917578063e2a7169c14610942578063e985e9c51461096d578063ef6187a4146109aa578063f2fde38b146109e7578063f7260d3e14610a1057610272565b8063b88d4fde14610809578063bbaac02f14610832578063c1f261231461085b578063c87b56dd14610884578063d10a1a2b146108c1578063d5abeb01146108ec57610272565b806396d4710d1161011357806396d4710d14610720578063a0712d6814610749578063a22cb46514610765578063ab0eda9e1461078e578063afdf6134146107b7578063b071401b146107e057610272565b8063718da7ee1461064d5780637ec4a659146106765780638da5cb5b1461069f57806394354fd0146106ca57806395d89b41146106f557610272565b80633884d635116101e85780635503a0e8116101ac5780635503a0e814610529578063599d86c21461055457806362b99ad4146105915780636352211e146105bc57806370a08231146105f9578063715018a61461063657610272565b80633884d6351461046c5780633ccfd60b1461048357806342842e0e1461049a578063438b6300146104c357806344a0d68a1461050057610272565b806316ba10e01161023a57806316ba10e01461037057806318160ddd1461039957806323b872dd146103c457806324a6ab0c146103ed5780632a3f300c14610418578063382fad8e1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c57806313faede614610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190612f2a565b610a3b565b6040516102ab9190612f72565b60405180910390f35b3480156102c057600080fd5b506102c9610b1d565b6040516102d6919061301d565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613075565b610baf565b60405161031391906130e3565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061312a565b610bf5565b005b34801561035157600080fd5b5061035a610d0c565b6040516103679190613179565b60405180910390f35b34801561037c57600080fd5b50610397600480360381019061039291906132c9565b610d12565b005b3480156103a557600080fd5b506103ae610d2d565b6040516103bb9190613179565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613312565b610d3e565b005b3480156103f957600080fd5b50610402610d9e565b60405161040f9190613179565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613391565b610da4565b005b34801561044d57600080fd5b50610456610dc9565b6040516104639190613179565b60405180910390f35b34801561047857600080fd5b50610481610dcf565b005b34801561048f57600080fd5b50610498610f27565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190613312565b610fca565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906133be565b610fea565b6040516104f791906134a9565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613075565b6110f4565b005b34801561053557600080fd5b5061053e611106565b60405161054b919061301d565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190613075565b611194565b60405161058891906130e3565b60405180910390f35b34801561059d57600080fd5b506105a66111d3565b6040516105b3919061301d565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de9190613075565b611261565b6040516105f091906130e3565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b91906133be565b6112e7565b60405161062d9190613179565b60405180910390f35b34801561064257600080fd5b5061064b61139e565b005b34801561065957600080fd5b50610674600480360381019061066f91906133be565b6113b2565b005b34801561068257600080fd5b5061069d600480360381019061069891906132c9565b6113fe565b005b3480156106ab57600080fd5b506106b4611419565b6040516106c191906130e3565b60405180910390f35b3480156106d657600080fd5b506106df611443565b6040516106ec9190613179565b60405180910390f35b34801561070157600080fd5b5061070a611449565b604051610717919061301d565b60405180910390f35b34801561072c57600080fd5b50610747600480360381019061074291906133be565b6114db565b005b610763600480360381019061075e9190613075565b6115bd565b005b34801561077157600080fd5b5061078c600480360381019061078791906134cb565b6118c4565b005b34801561079a57600080fd5b506107b560048036038101906107b091906133be565b6118da565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613075565b611948565b005b3480156107ec57600080fd5b5061080760048036038101906108029190613075565b61195a565b005b34801561081557600080fd5b50610830600480360381019061082b91906135ac565b61196c565b005b34801561083e57600080fd5b50610859600480360381019061085491906132c9565b6119ce565b005b34801561086757600080fd5b50610882600480360381019061087d9190613075565b6119e9565b005b34801561089057600080fd5b506108ab60048036038101906108a69190613075565b611a92565b6040516108b8919061301d565b60405180910390f35b3480156108cd57600080fd5b506108d6611be3565b6040516108e39190613179565b60405180910390f35b3480156108f857600080fd5b50610901611be9565b60405161090e9190613179565b60405180910390f35b34801561092357600080fd5b5061092c611bef565b604051610939919061301d565b60405180910390f35b34801561094e57600080fd5b50610957611c7d565b6040516109649190612f72565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f919061362f565b611c90565b6040516109a19190612f72565b60405180910390f35b3480156109b657600080fd5b506109d160048036038101906109cc91906133be565b611d24565b6040516109de9190612f72565b60405180910390f35b3480156109f357600080fd5b50610a0e6004803603810190610a0991906133be565b611d44565b005b348015610a1c57600080fd5b50610a25611dc7565b604051610a3291906130e3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b165750610b1582611ded565b5b9050919050565b606060008054610b2c9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b589061369e565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b6000610bba82611e57565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0082611261565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790613741565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c8f611ea2565b73ffffffffffffffffffffffffffffffffffffffff161480610cbe5750610cbd81610cb8611ea2565b611c90565b5b610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906137d3565b60405180910390fd5b610d078383611eaa565b505050565b600a5481565b610d1a611f63565b8060099081610d29919061399f565b5050565b6000610d396007611fe1565b905090565b610d4f610d49611ea2565b82611fef565b610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613ae3565b60405180910390fd5b610d99838383612084565b505050565b600c5481565b610dac611f63565b80601360006101000a81548160ff02191690831515021790555050565b600f5481565b610dd7611f63565b60005b601180549050811015610f2457600073ffffffffffffffffffffffffffffffffffffffff1660118281548110610e1357610e12613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f11576000610e63610d2d565b9050610ec460118381548110610e7c57610e7b613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660018484610eb59190613b61565b610ebf9190613b61565b61237d565b610ece600761239b565b60118281548110610ee257610ee1613b03565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055505b8080610f1c90613b95565b915050610dda565b50565b610f2f611f63565b6000601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610f7790613c0e565b60006040518083038185875af1925050503d8060008114610fb4576040519150601f19603f3d011682016040523d82523d6000602084013e610fb9565b606091505b5050905080610fc757600080fd5b50565b610fe58383836040518060200160405280600081525061196c565b505050565b60606000610ff7836112e7565b905060008167ffffffffffffffff8111156110155761101461319e565b5b6040519080825280602002602001820160405280156110435781602001602082028036833780820191505090505b50905060006001905060005b83811080156110605750600b548211155b156110e857600061107083611261565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d457828483815181106110b9576110b8613b03565b5b60200260200101818152505081806110d090613b95565b9250505b82806110df90613b95565b9350505061104f565b82945050505050919050565b6110fc611f63565b80600a8190555050565b600980546111139061369e565b80601f016020809104026020016040519081016040528092919081815260200182805461113f9061369e565b801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b505050505081565b601181815481106111a457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600880546111e09061369e565b80601f016020809104026020016040519081016040528092919081815260200182805461120c9061369e565b80156112595780601f1061122e57610100808354040283529160200191611259565b820191906000526020600020905b81548152906001019060200180831161123c57829003601f168201915b505050505081565b60008061126d836123b1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590613c6f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90613d01565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113a6611f63565b6113b060006123ee565b565b6113ba611f63565b80601360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611406611f63565b8060089081611415919061399f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546114589061369e565b80601f01602080910402602001604051908101604052809291908181526020018280546114849061369e565b80156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b5050505050905090565b6114e3611f63565b60005b6011805490508110156115b9578173ffffffffffffffffffffffffffffffffffffffff166011828154811061151e5761151d613b03565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036115a6576011818154811061157857611577613b03565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b80806115b190613b95565b9150506114e6565b5050565b600e54811115611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990613d6d565b60405180910390fd5b600f548161160f33610fea565b5161161a9190613b61565b111561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290613d6d565b60405180910390fd5b6000611665610d2d565b9050600b5482826116769190613b61565b11156116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90613dd9565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561175e5781600a546117179190613df9565b341015611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090613e87565b60405180910390fd5b61187f565b600c5482600d5461176f9190613b61565b11156117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790613ef3565b60405180910390fd5b6001826117bd9190613f13565b600a546117ca9190613df9565b34101561180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390613f93565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60008282546118779190613b61565b925050819055505b6000600190505b8281116118bf576118a233828461189d9190613b61565b61237d565b6118ac600761239b565b80806118b790613b95565b915050611886565b505050565b6118d66118cf611ea2565b83836124b4565b5050565b6118e2611f63565b6011819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611950611f63565b80600f8190555050565b611962611f63565b80600e8190555050565b61197d611977611ea2565b83611fef565b6119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613ae3565b60405180910390fd5b6119c884848484612620565b50505050565b6119d6611f63565b80601290816119e5919061399f565b5050565b6119f1611f63565b60006119fb610d2d565b9050600b548282611a0c9190613b61565b1115611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490613dd9565b60405180910390fd5b6000600190505b828111611a8d57611a70338284611a6b9190613b61565b61237d565b611a7a600761239b565b8080611a8590613b95565b915050611a54565b505050565b6060611a9d8261267c565b611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad390614025565b60405180910390fd5b601360009054906101000a900460ff16611b825760128054611afd9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b299061369e565b8015611b765780601f10611b4b57610100808354040283529160200191611b76565b820191906000526020600020905b815481529060010190602001808311611b5957829003601f168201915b50505050509050611bde565b6000611b8c6126bd565b90506000815111611bac5760405180602001604052806000815250611bda565b80611bb68461274f565b6009604051602001611bca93929190614104565b6040516020818303038152906040525b9150505b919050565b600d5481565b600b5481565b60128054611bfc9061369e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c289061369e565b8015611c755780601f10611c4a57610100808354040283529160200191611c75565b820191906000526020600020905b815481529060010190602001808311611c5857829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b611d4c611f63565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db2906141a7565b60405180910390fd5b611dc4816123ee565b50565b601360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e608161267c565b611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690613c6f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f1d83611261565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f6b611ea2565b73ffffffffffffffffffffffffffffffffffffffff16611f89611419565b73ffffffffffffffffffffffffffffffffffffffff1614611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd690614213565b60405180910390fd5b565b600081600001549050919050565b600080611ffb83611261565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061203d575061203c8185611c90565b5b8061207b57508373ffffffffffffffffffffffffffffffffffffffff1661206384610baf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120a482611261565b73ffffffffffffffffffffffffffffffffffffffff16146120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f1906142a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216090614337565b60405180910390fd5b612176838383600161281d565b8273ffffffffffffffffffffffffffffffffffffffff1661219682611261565b73ffffffffffffffffffffffffffffffffffffffff16146121ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e3906142a5565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123788383836001612943565b505050565b612397828260405180602001604052806000815250612949565b5050565b6001816000016000828254019250508190555050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906143a3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126139190612f72565b60405180910390a3505050565b61262b848484612084565b612637848484846129a4565b612676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266d90614435565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661269e836123b1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600880546126cc9061369e565b80601f01602080910402602001604051908101604052809291908181526020018280546126f89061369e565b80156127455780601f1061271a57610100808354040283529160200191612745565b820191906000526020600020905b81548152906001019060200180831161272857829003601f168201915b5050505050905090565b60606000600161275e84612b2b565b01905060008167ffffffffffffffff81111561277d5761277c61319e565b5b6040519080825280601f01601f1916602001820160405280156127af5781602001600182028036833780820191505090505b509050600082602001820190505b600115612812578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161280657612805614455565b5b049450600085036127bd575b819350505050919050565b600181111561293d57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146128b15780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a99190613f13565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461293c5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129349190613b61565b925050819055505b5b50505050565b50505050565b6129538383612c7e565b61296060008484846129a4565b61299f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299690614435565b60405180910390fd5b505050565b60006129c58473ffffffffffffffffffffffffffffffffffffffff16612e9b565b15612b1e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129ee611ea2565b8786866040518563ffffffff1660e01b8152600401612a1094939291906144d9565b6020604051808303816000875af1925050508015612a4c57506040513d601f19601f82011682018060405250810190612a49919061453a565b60015b612ace573d8060008114612a7c576040519150601f19603f3d011682016040523d82523d6000602084013e612a81565b606091505b506000815103612ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abd90614435565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b23565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b89577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b7f57612b7e614455565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612bc6576d04ee2d6d415b85acef81000000008381612bbc57612bbb614455565b5b0492506020810190505b662386f26fc100008310612bf557662386f26fc100008381612beb57612bea614455565b5b0492506010810190505b6305f5e1008310612c1e576305f5e1008381612c1457612c13614455565b5b0492506008810190505b6127108310612c43576127108381612c3957612c38614455565b5b0492506004810190505b60648310612c665760648381612c5c57612c5b614455565b5b0492506002810190505b600a8310612c75576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce4906145b3565b60405180910390fd5b612cf68161267c565b15612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d9061461f565b60405180910390fd5b612d4460008383600161281d565b612d4d8161267c565b15612d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d849061461f565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e97600083836001612943565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f0781612ed2565b8114612f1257600080fd5b50565b600081359050612f2481612efe565b92915050565b600060208284031215612f4057612f3f612ec8565b5b6000612f4e84828501612f15565b91505092915050565b60008115159050919050565b612f6c81612f57565b82525050565b6000602082019050612f876000830184612f63565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fc7578082015181840152602081019050612fac565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fef82612f8d565b612ff98185612f98565b9350613009818560208601612fa9565b61301281612fd3565b840191505092915050565b600060208201905081810360008301526130378184612fe4565b905092915050565b6000819050919050565b6130528161303f565b811461305d57600080fd5b50565b60008135905061306f81613049565b92915050565b60006020828403121561308b5761308a612ec8565b5b600061309984828501613060565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130cd826130a2565b9050919050565b6130dd816130c2565b82525050565b60006020820190506130f860008301846130d4565b92915050565b613107816130c2565b811461311257600080fd5b50565b600081359050613124816130fe565b92915050565b6000806040838503121561314157613140612ec8565b5b600061314f85828601613115565b925050602061316085828601613060565b9150509250929050565b6131738161303f565b82525050565b600060208201905061318e600083018461316a565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131d682612fd3565b810181811067ffffffffffffffff821117156131f5576131f461319e565b5b80604052505050565b6000613208612ebe565b905061321482826131cd565b919050565b600067ffffffffffffffff8211156132345761323361319e565b5b61323d82612fd3565b9050602081019050919050565b82818337600083830152505050565b600061326c61326784613219565b6131fe565b90508281526020810184848401111561328857613287613199565b5b61329384828561324a565b509392505050565b600082601f8301126132b0576132af613194565b5b81356132c0848260208601613259565b91505092915050565b6000602082840312156132df576132de612ec8565b5b600082013567ffffffffffffffff8111156132fd576132fc612ecd565b5b6133098482850161329b565b91505092915050565b60008060006060848603121561332b5761332a612ec8565b5b600061333986828701613115565b935050602061334a86828701613115565b925050604061335b86828701613060565b9150509250925092565b61336e81612f57565b811461337957600080fd5b50565b60008135905061338b81613365565b92915050565b6000602082840312156133a7576133a6612ec8565b5b60006133b58482850161337c565b91505092915050565b6000602082840312156133d4576133d3612ec8565b5b60006133e284828501613115565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134208161303f565b82525050565b60006134328383613417565b60208301905092915050565b6000602082019050919050565b6000613456826133eb565b61346081856133f6565b935061346b83613407565b8060005b8381101561349c5781516134838882613426565b975061348e8361343e565b92505060018101905061346f565b5085935050505092915050565b600060208201905081810360008301526134c3818461344b565b905092915050565b600080604083850312156134e2576134e1612ec8565b5b60006134f085828601613115565b92505060206135018582860161337c565b9150509250929050565b600067ffffffffffffffff8211156135265761352561319e565b5b61352f82612fd3565b9050602081019050919050565b600061354f61354a8461350b565b6131fe565b90508281526020810184848401111561356b5761356a613199565b5b61357684828561324a565b509392505050565b600082601f83011261359357613592613194565b5b81356135a384826020860161353c565b91505092915050565b600080600080608085870312156135c6576135c5612ec8565b5b60006135d487828801613115565b94505060206135e587828801613115565b93505060406135f687828801613060565b925050606085013567ffffffffffffffff81111561361757613616612ecd565b5b6136238782880161357e565b91505092959194509250565b6000806040838503121561364657613645612ec8565b5b600061365485828601613115565b925050602061366585828601613115565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136b657607f821691505b6020821081036136c9576136c861366f565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061372b602183612f98565b9150613736826136cf565b604082019050919050565b6000602082019050818103600083015261375a8161371e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006137bd603d83612f98565b91506137c882613761565b604082019050919050565b600060208201905081810360008301526137ec816137b0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613818565b61385f8683613818565b95508019841693508086168417925050509392505050565b6000819050919050565b600061389c6138976138928461303f565b613877565b61303f565b9050919050565b6000819050919050565b6138b683613881565b6138ca6138c2826138a3565b848454613825565b825550505050565b600090565b6138df6138d2565b6138ea8184846138ad565b505050565b5b8181101561390e576139036000826138d7565b6001810190506138f0565b5050565b601f82111561395357613924816137f3565b61392d84613808565b8101602085101561393c578190505b61395061394885613808565b8301826138ef565b50505b505050565b600082821c905092915050565b600061397660001984600802613958565b1980831691505092915050565b600061398f8383613965565b9150826002028217905092915050565b6139a882612f8d565b67ffffffffffffffff8111156139c1576139c061319e565b5b6139cb825461369e565b6139d6828285613912565b600060209050601f831160018114613a0957600084156139f7578287015190505b613a018582613983565b865550613a69565b601f198416613a17866137f3565b60005b82811015613a3f57848901518255600182019150602085019450602081019050613a1a565b86831015613a5c5784890151613a58601f891682613965565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613acd602d83612f98565b9150613ad882613a71565b604082019050919050565b60006020820190508181036000830152613afc81613ac0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b6c8261303f565b9150613b778361303f565b9250828201905080821115613b8f57613b8e613b32565b5b92915050565b6000613ba08261303f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bd257613bd1613b32565b5b600182019050919050565b600081905092915050565b50565b6000613bf8600083613bdd565b9150613c0382613be8565b600082019050919050565b6000613c1982613beb565b9150819050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613c59601883612f98565b9150613c6482613c23565b602082019050919050565b60006020820190508181036000830152613c8881613c4c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613ceb602983612f98565b9150613cf682613c8f565b604082019050919050565b60006020820190508181036000830152613d1a81613cde565b9050919050565b7f496e76616c6964207472616e73616374696f6e00000000000000000000000000600082015250565b6000613d57601383612f98565b9150613d6282613d21565b602082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613dc3601283612f98565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b6000613e048261303f565b9150613e0f8361303f565b9250828202613e1d8161303f565b91508282048414831517613e3457613e33613b32565b5b5092915050565b7f696e76616c696420636f73740000000000000000000000000000000000000000600082015250565b6000613e71600c83612f98565b9150613e7c82613e3b565b602082019050919050565b60006020820190508181036000830152613ea081613e64565b9050919050565b7f416c6c2066726565204e4654206973206d696e74656400000000000000000000600082015250565b6000613edd601683612f98565b9150613ee882613ea7565b602082019050919050565b60006020820190508181036000830152613f0c81613ed0565b9050919050565b6000613f1e8261303f565b9150613f298361303f565b9250828203905081811115613f4157613f40613b32565b5b92915050565b7f696e76616c696420636f7374202d320000000000000000000000000000000000600082015250565b6000613f7d600f83612f98565b9150613f8882613f47565b602082019050919050565b60006020820190508181036000830152613fac81613f70565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061400f602f83612f98565b915061401a82613fb3565b604082019050919050565b6000602082019050818103600083015261403e81614002565b9050919050565b600081905092915050565b600061405b82612f8d565b6140658185614045565b9350614075818560208601612fa9565b80840191505092915050565b6000815461408e8161369e565b6140988186614045565b945060018216600081146140b357600181146140c8576140fb565b60ff19831686528115158202860193506140fb565b6140d1856137f3565b60005b838110156140f3578154818901526001820191506020810190506140d4565b838801955050505b50505092915050565b60006141108286614050565b915061411c8285614050565b91506141288284614081565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614191602683612f98565b915061419c82614135565b604082019050919050565b600060208201905081810360008301526141c081614184565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141fd602083612f98565b9150614208826141c7565b602082019050919050565b6000602082019050818103600083015261422c816141f0565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061428f602583612f98565b915061429a82614233565b604082019050919050565b600060208201905081810360008301526142be81614282565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614321602483612f98565b915061432c826142c5565b604082019050919050565b6000602082019050818103600083015261435081614314565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061438d601983612f98565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061441f603283612f98565b915061442a826143c3565b604082019050919050565b6000602082019050818103600083015261444e81614412565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006144ab82614484565b6144b5818561448f565b93506144c5818560208601612fa9565b6144ce81612fd3565b840191505092915050565b60006080820190506144ee60008301876130d4565b6144fb60208301866130d4565b614508604083018561316a565b818103606083015261451a81846144a0565b905095945050505050565b60008151905061453481612efe565b92915050565b6000602082840312156145505761454f612ec8565b5b600061455e84828501614525565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061459d602083612f98565b91506145a882614567565b602082019050919050565b600060208201905081810360008301526145cc81614590565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614609601c83612f98565b9150614614826145d3565b602082019050919050565b60006020820190508181036000830152614638816145fc565b905091905056fea2646970667358221220e336e456d930da825734a6b0fcce1818fcd9b781adb55cde0e14c2cba07183d664736f6c63430008120033

Deployed Bytecode Sourcemap

56250:7552:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40254:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41182:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42694:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42212:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56543:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61408:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62340:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43394:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56620:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61643:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56728:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58638:358;;;;;;;;;;;;;:::i;:::-;;61729:469;;;;;;;;;;;;;:::i;:::-;;43800:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62437:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60648:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56499:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56821:31;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56399:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40892:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40623:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19685:103;;;;;;;;;;;;;:::i;:::-;;62204:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61178:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19044:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56686:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41351:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59846:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57310:966;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42937:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59555:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60234:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60913:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44056:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63705:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58284:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63078:509;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56653:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56585:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56882:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56998:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43163:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56769:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19943:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57062:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40254:305;40356:4;40408:25;40393:40;;;:11;:40;;;;:105;;;;40465:33;40450:48;;;:11;:48;;;;40393:105;:158;;;;40515:36;40539:11;40515:23;:36::i;:::-;40393:158;40373:178;;40254:305;;;:::o;41182:100::-;41236:13;41269:5;41262:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41182:100;:::o;42694:171::-;42770:7;42790:23;42805:7;42790:14;:23::i;:::-;42833:15;:24;42849:7;42833:24;;;;;;;;;;;;;;;;;;;;;42826:31;;42694:171;;;:::o;42212:416::-;42293:13;42309:23;42324:7;42309:14;:23::i;:::-;42293:39;;42357:5;42351:11;;:2;:11;;;42343:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42451:5;42435:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42460:37;42477:5;42484:12;:10;:12::i;:::-;42460:16;:37::i;:::-;42435:62;42413:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;42599:21;42608:2;42612:7;42599:8;:21::i;:::-;42282:346;42212:416;;:::o;56543:35::-;;;;:::o;61408:100::-;18930:13;:11;:13::i;:::-;61492:10:::1;61480:9;:22;;;;;;:::i;:::-;;61408:100:::0;:::o;62340:89::-;62384:7;62407:16;:6;:14;:16::i;:::-;62400:23;;62340:89;:::o;43394:335::-;43589:41;43608:12;:10;:12::i;:::-;43622:7;43589:18;:41::i;:::-;43581:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43693:28;43703:4;43709:2;43713:7;43693:9;:28::i;:::-;43394:335;;;:::o;56620:28::-;;;;:::o;61643:80::-;18930:13;:11;:13::i;:::-;61711:6:::1;61700:8;;:17;;;;;;;;;;;;;;;;;;61643:80:::0;:::o;56728:32::-;;;;:::o;58638:358::-;18930:13;:11;:13::i;:::-;58686:6:::1;58682:309;58697:14;:21;;;;58695:1;:23;58682:309;;;58768:1;58739:31;;:14;58754:1;58739:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:31;;;58736:234;;58786:18;58807:13;:11;:13::i;:::-;58786:34;;58835:49;58845:14;58860:1;58845:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58882:1;58880;58864:13;:17;;;;:::i;:::-;:19;;;;:::i;:::-;58835:9;:49::i;:::-;58899:18;:6;:16;:18::i;:::-;58939:14;58954:1;58939:17;;;;;;;;:::i;:::-;;;;;;;;;;58932:24;;;;;;;;;;;58771:199;58736:234;58719:3;;;;;:::i;:::-;;;;58682:309;;;;58638:358::o:0;61729:469::-;18930:13;:11;:13::i;:::-;62019:7:::1;62040:8;;;;;;;;;;;62032:22;;62062:21;62032:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62018:70;;;62103:2;62095:11;;;::::0;::::1;;61766:432;61729:469::o:0;43800:185::-;43938:39;43955:4;43961:2;43965:7;43938:39;;;;;;;;;;;;:16;:39::i;:::-;43800:185;;;:::o;62437:635::-;62512:16;62540:23;62566:17;62576:6;62566:9;:17::i;:::-;62540:43;;62590:30;62637:15;62623:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62590:63;;62660:22;62685:1;62660:26;;62693:23;62729:309;62754:15;62736;:33;:64;;;;;62791:9;;62773:14;:27;;62736:64;62729:309;;;62811:25;62839:23;62847:14;62839:7;:23::i;:::-;62811:51;;62898:6;62877:27;;:17;:27;;;62873:131;;62950:14;62917:13;62931:15;62917:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;62977:17;;;;;:::i;:::-;;;;62873:131;63014:16;;;;;:::i;:::-;;;;62802:236;62729:309;;;63053:13;63046:20;;;;;;62437:635;;;:::o;60648:80::-;18930:13;:11;:13::i;:::-;60711:5:::1;60704:4;:12;;;;60648:80:::0;:::o;56499:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56821:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56399:95::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40892:223::-;40964:7;40984:13;41000:17;41009:7;41000:8;:17::i;:::-;40984:33;;41053:1;41036:19;;:5;:19;;;41028:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41102:5;41095:12;;;40892:223;;;:::o;40623:207::-;40695:7;40740:1;40723:19;;:5;:19;;;40715:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40806:9;:16;40816:5;40806:16;;;;;;;;;;;;;;;;40799:23;;40623:207;;;:::o;19685:103::-;18930:13;:11;:13::i;:::-;19750:30:::1;19777:1;19750:18;:30::i;:::-;19685:103::o:0;62204:81::-;18930:13;:11;:13::i;:::-;62275:4:::1;62264:8;;:15;;;;;;;;;;;;;;;;;;62204:81:::0;:::o;61178:100::-;18930:13;:11;:13::i;:::-;61262:10:::1;61250:9;:22;;;;;;:::i;:::-;;61178:100:::0;:::o;19044:87::-;19090:7;19117:6;;;;;;;;;;;19110:13;;19044:87;:::o;56686:37::-;;;;:::o;41351:104::-;41407:13;41440:7;41433:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41351:104;:::o;59846:229::-;18930:13;:11;:13::i;:::-;59923:6:::1;59919:151;59934:14;:21;;;;59932:1;:23;59919:151;;;59997:8;59976:29;;:14;59991:1;59976:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;::::0;59973:88:::1;;60030:14;60045:1;60030:17;;;;;;;;:::i;:::-;;;;;;;;;;60023:24;;;;;;;;;;;59973:88;59956:3;;;;;:::i;:::-;;;;59919:151;;;;59846:229:::0;:::o;57310:966::-;57396:18;;57381:11;:33;;57373:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57503:16;;57488:11;57453:25;57467:10;57453:13;:25::i;:::-;:32;:46;;;;:::i;:::-;:66;;57445:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;57648:21;57672:13;:11;:13::i;:::-;57648:37;;57731:9;;57716:11;57700:13;:27;;;;:::i;:::-;:40;;57692:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57775:13;:25;57789:10;57775:25;;;;;;;;;;;;;;;;;;;;;;;;;57772:342;;;57840:11;57833:4;;:18;;;;:::i;:::-;57820:9;:31;;57812:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57772:342;;;57925:10;;57912:11;57901:10;;:22;;;;:::i;:::-;:34;;57893:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;58013:1;58001:11;:13;;;;:::i;:::-;57994:4;;:21;;;;:::i;:::-;57981:9;:34;;57973:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58074:4;58046:13;:25;58060:10;58046:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;58103:1;58089:10;;:15;;;;;;;:::i;:::-;;;;;;;;57772:342;58149:9;58161:1;58149:13;;58144:127;58169:11;58164:1;:16;58144:127;;58196:40;58206:10;58234:1;58218:13;:17;;;;:::i;:::-;58196:9;:40::i;:::-;58245:18;:6;:16;:18::i;:::-;58182:3;;;;;:::i;:::-;;;;58144:127;;;;57360:916;57310:966;:::o;42937:155::-;43032:52;43051:12;:10;:12::i;:::-;43065:8;43075;43032:18;:52::i;:::-;42937:155;;:::o;59555:105::-;18930:13;:11;:13::i;:::-;59625:14:::1;59645:8;59625:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59555:105:::0;:::o;60234:98::-;18930:13;:11;:13::i;:::-;60320:6:::1;60301:16;:25;;;;60234:98:::0;:::o;60913:130::-;18930:13;:11;:13::i;:::-;61018:19:::1;60997:18;:40;;;;60913:130:::0;:::o;44056:322::-;44230:41;44249:12;:10;:12::i;:::-;44263:7;44230:18;:41::i;:::-;44222:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44332:38;44346:4;44352:2;44356:7;44365:4;44332:13;:38::i;:::-;44056:322;;;;:::o;63705:94::-;18930:13;:11;:13::i;:::-;63789:4:::1;63772:14;:21;;;;;;:::i;:::-;;63705:94:::0;:::o;58284:346::-;18930:13;:11;:13::i;:::-;58350:21:::1;58374:13;:11;:13::i;:::-;58350:37;;58433:9;;58418:11;58402:13;:27;;;;:::i;:::-;:40;;58394:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;58501:9;58513:1;58501:13;;58496:127;58521:11;58516:1;:16;58496:127;;58548:40;58558:10;58586:1;58570:13;:17;;;;:::i;:::-;58548:9;:40::i;:::-;58597:18;:6;:16;:18::i;:::-;58534:3;;;;;:::i;:::-;;;;58496:127;;;;58341:289;58284:346:::0;:::o;63078:509::-;63177:13;63218:17;63226:8;63218:7;:17::i;:::-;63202:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;63319:8;;;;;;;;;;;63315:261;;63346:14;63339:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63315:261;63381:28;63412:10;:8;:10::i;:::-;63381:41;;63469:1;63444:14;63438:28;:32;:130;;;;;;;;;;;;;;;;;63506:14;63522:19;:8;:17;:19::i;:::-;63543:9;63489:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63438:130;63431:137;;;63078:509;;;;:::o;56653:26::-;;;;:::o;56585:30::-;;;;:::o;56882:111::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56998:28::-;;;;;;;;;;;;;:::o;43163:164::-;43260:4;43284:18;:25;43303:5;43284:25;;;;;;;;;;;;;;;:35;43310:8;43284:35;;;;;;;;;;;;;;;;;;;;;;;;;43277:42;;43163:164;;;;:::o;56769:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;19943:201::-;18930:13;:11;:13::i;:::-;20052:1:::1;20032:22;;:8;:22;;::::0;20024:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;20108:28;20127:8;20108:18;:28::i;:::-;19943:201:::0;:::o;57062:33::-;;;;;;;;;;;;;:::o;32766:157::-;32851:4;32890:25;32875:40;;;:11;:40;;;;32868:47;;32766:157;;;:::o;52513:135::-;52595:16;52603:7;52595;:16::i;:::-;52587:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52513:135;:::o;17565:98::-;17618:7;17645:10;17638:17;;17565:98;:::o;51792:174::-;51894:2;51867:15;:24;51883:7;51867:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51950:7;51946:2;51912:46;;51921:23;51936:7;51921:14;:23::i;:::-;51912:46;;;;;;;;;;;;51792:174;;:::o;19209:132::-;19284:12;:10;:12::i;:::-;19273:23;;:7;:5;:7::i;:::-;:23;;;19265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19209:132::o;1094:114::-;1159:7;1186;:14;;;1179:21;;1094:114;;;:::o;46411:264::-;46504:4;46521:13;46537:23;46552:7;46537:14;:23::i;:::-;46521:39;;46590:5;46579:16;;:7;:16;;;:52;;;;46599:32;46616:5;46623:7;46599:16;:32::i;:::-;46579:52;:87;;;;46659:7;46635:31;;:20;46647:7;46635:11;:20::i;:::-;:31;;;46579:87;46571:96;;;46411:264;;;;:::o;50410:1263::-;50569:4;50542:31;;:23;50557:7;50542:14;:23::i;:::-;:31;;;50534:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50648:1;50634:16;;:2;:16;;;50626:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50704:42;50725:4;50731:2;50735:7;50744:1;50704:20;:42::i;:::-;50876:4;50849:31;;:23;50864:7;50849:14;:23::i;:::-;:31;;;50841:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50994:15;:24;51010:7;50994:24;;;;;;;;;;;;50987:31;;;;;;;;;;;51489:1;51470:9;:15;51480:4;51470:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;51522:1;51505:9;:13;51515:2;51505:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51564:2;51545:7;:16;51553:7;51545:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51603:7;51599:2;51584:27;;51593:4;51584:27;;;;;;;;;;;;51624:41;51644:4;51650:2;51654:7;51663:1;51624:19;:41::i;:::-;50410:1263;;;:::o;47017:110::-;47093:26;47103:2;47107:7;47093:26;;;;;;;;;;;;:9;:26::i;:::-;47017:110;;:::o;1216:127::-;1323:1;1305:7;:14;;;:19;;;;;;;;;;;1216:127;:::o;45686:117::-;45752:7;45779;:16;45787:7;45779:16;;;;;;;;;;;;;;;;;;;;;45772:23;;45686:117;;;:::o;20304:191::-;20378:16;20397:6;;;;;;;;;;;20378:25;;20423:8;20414:6;;:17;;;;;;;;;;;;;;;;;;20478:8;20447:40;;20468:8;20447:40;;;;;;;;;;;;20367:128;20304:191;:::o;52109:315::-;52264:8;52255:17;;:5;:17;;;52247:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52351:8;52313:18;:25;52332:5;52313:25;;;;;;;;;;;;;;;:35;52339:8;52313:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52397:8;52375:41;;52390:5;52375:41;;;52407:8;52375:41;;;;;;:::i;:::-;;;;;;;;52109:315;;;:::o;45259:313::-;45415:28;45425:4;45431:2;45435:7;45415:9;:28::i;:::-;45462:47;45485:4;45491:2;45495:7;45504:4;45462:22;:47::i;:::-;45454:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45259:313;;;;:::o;46116:128::-;46181:4;46234:1;46205:31;;:17;46214:7;46205:8;:17::i;:::-;:31;;;;46198:38;;46116:128;;;:::o;63595:104::-;63655:13;63684:9;63677:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63595:104;:::o;14992:716::-;15048:13;15099:14;15136:1;15116:17;15127:5;15116:10;:17::i;:::-;:21;15099:38;;15152:20;15186:6;15175:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15152:41;;15208:11;15337:6;15333:2;15329:15;15321:6;15317:28;15310:35;;15374:288;15381:4;15374:288;;;15406:5;;;;;;;;15548:8;15543:2;15536:5;15532:14;15527:30;15522:3;15514:44;15604:2;15595:11;;;;;;:::i;:::-;;;;;15638:1;15629:5;:10;15374:288;15625:21;15374:288;15683:6;15676:13;;;;;14992:716;;;:::o;54797:410::-;54987:1;54975:9;:13;54971:229;;;55025:1;55009:18;;:4;:18;;;55005:87;;55067:9;55048;:15;55058:4;55048:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;55005:87;55124:1;55110:16;;:2;:16;;;55106:83;;55164:9;55147;:13;55157:2;55147:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;55106:83;54971:229;54797:410;;;;:::o;55929:158::-;;;;;:::o;47354:319::-;47483:18;47489:2;47493:7;47483:5;:18::i;:::-;47534:53;47565:1;47569:2;47573:7;47582:4;47534:22;:53::i;:::-;47512:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;47354:319;;;:::o;53212:853::-;53366:4;53387:15;:2;:13;;;:15::i;:::-;53383:675;;;53439:2;53423:36;;;53460:12;:10;:12::i;:::-;53474:4;53480:7;53489:4;53423:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53419:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53681:1;53664:6;:13;:18;53660:328;;53707:60;;;;;;;;;;:::i;:::-;;;;;;;;53660:328;53938:6;53932:13;53923:6;53919:2;53915:15;53908:38;53419:584;53555:41;;;53545:51;;;:6;:51;;;;53538:58;;;;;53383:675;54042:4;54035:11;;53212:853;;;;;;;:::o;11858:922::-;11911:7;11931:14;11948:1;11931:18;;11998:6;11989:5;:15;11985:102;;12034:6;12025:15;;;;;;:::i;:::-;;;;;12069:2;12059:12;;;;11985:102;12114:6;12105:5;:15;12101:102;;12150:6;12141:15;;;;;;:::i;:::-;;;;;12185:2;12175:12;;;;12101:102;12230:6;12221:5;:15;12217:102;;12266:6;12257:15;;;;;;:::i;:::-;;;;;12301:2;12291:12;;;;12217:102;12346:5;12337;:14;12333:99;;12381:5;12372:14;;;;;;:::i;:::-;;;;;12415:1;12405:11;;;;12333:99;12459:5;12450;:14;12446:99;;12494:5;12485:14;;;;;;:::i;:::-;;;;;12528:1;12518:11;;;;12446:99;12572:5;12563;:14;12559:99;;12607:5;12598:14;;;;;;:::i;:::-;;;;;12641:1;12631:11;;;;12559:99;12685:5;12676;:14;12672:66;;12721:1;12711:11;;;;12672:66;12766:6;12759:13;;;11858:922;;;:::o;48009:942::-;48103:1;48089:16;;:2;:16;;;48081:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48162:16;48170:7;48162;:16::i;:::-;48161:17;48153:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48224:48;48253:1;48257:2;48261:7;48270:1;48224:20;:48::i;:::-;48371:16;48379:7;48371;:16::i;:::-;48370:17;48362:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48786:1;48769:9;:13;48779:2;48769:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48830:2;48811:7;:16;48819:7;48811:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48875:7;48871:2;48850:33;;48867:1;48850:33;;;;;;;;;;;;48896:47;48924:1;48928:2;48932:7;48941:1;48896:19;:47::i;:::-;48009:942;;:::o;21735:326::-;21795:4;22052:1;22030:7;:19;;;:23;22023:30;;21735:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:180;5536:77;5533:1;5526:88;5633:4;5630:1;5623:15;5657:4;5654:1;5647:15;5674:281;5757:27;5779:4;5757:27;:::i;:::-;5749:6;5745:40;5887:6;5875:10;5872:22;5851:18;5839:10;5836:34;5833:62;5830:88;;;5898:18;;:::i;:::-;5830:88;5938:10;5934:2;5927:22;5717:238;5674:281;;:::o;5961:129::-;5995:6;6022:20;;:::i;:::-;6012:30;;6051:33;6079:4;6071:6;6051:33;:::i;:::-;5961:129;;;:::o;6096:308::-;6158:4;6248:18;6240:6;6237:30;6234:56;;;6270:18;;:::i;:::-;6234:56;6308:29;6330:6;6308:29;:::i;:::-;6300:37;;6392:4;6386;6382:15;6374:23;;6096:308;;;:::o;6410:146::-;6507:6;6502:3;6497;6484:30;6548:1;6539:6;6534:3;6530:16;6523:27;6410:146;;;:::o;6562:425::-;6640:5;6665:66;6681:49;6723:6;6681:49;:::i;:::-;6665:66;:::i;:::-;6656:75;;6754:6;6747:5;6740:21;6792:4;6785:5;6781:16;6830:3;6821:6;6816:3;6812:16;6809:25;6806:112;;;6837:79;;:::i;:::-;6806:112;6927:54;6974:6;6969:3;6964;6927:54;:::i;:::-;6646:341;6562:425;;;;;:::o;7007:340::-;7063:5;7112:3;7105:4;7097:6;7093:17;7089:27;7079:122;;7120:79;;:::i;:::-;7079:122;7237:6;7224:20;7262:79;7337:3;7329:6;7322:4;7314:6;7310:17;7262:79;:::i;:::-;7253:88;;7069:278;7007:340;;;;:::o;7353:509::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7625:1;7614:9;7610:17;7597:31;7655:18;7647:6;7644:30;7641:117;;;7677:79;;:::i;:::-;7641:117;7782:63;7837:7;7828:6;7817:9;7813:22;7782:63;:::i;:::-;7772:73;;7568:287;7353:509;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:116::-;8563:21;8578:5;8563:21;:::i;:::-;8556:5;8553:32;8543:60;;8599:1;8596;8589:12;8543:60;8493:116;:::o;8615:133::-;8658:5;8696:6;8683:20;8674:29;;8712:30;8736:5;8712:30;:::i;:::-;8615:133;;;;:::o;8754:323::-;8810:6;8859:2;8847:9;8838:7;8834:23;8830:32;8827:119;;;8865:79;;:::i;:::-;8827:119;8985:1;9010:50;9052:7;9043:6;9032:9;9028:22;9010:50;:::i;:::-;9000:60;;8956:114;8754:323;;;;:::o;9083:329::-;9142:6;9191:2;9179:9;9170:7;9166:23;9162:32;9159:119;;;9197:79;;:::i;:::-;9159:119;9317:1;9342:53;9387:7;9378:6;9367:9;9363:22;9342:53;:::i;:::-;9332:63;;9288:117;9083:329;;;;:::o;9418:114::-;9485:6;9519:5;9513:12;9503:22;;9418:114;;;:::o;9538:184::-;9637:11;9671:6;9666:3;9659:19;9711:4;9706:3;9702:14;9687:29;;9538:184;;;;:::o;9728:132::-;9795:4;9818:3;9810:11;;9848:4;9843:3;9839:14;9831:22;;9728:132;;;:::o;9866:108::-;9943:24;9961:5;9943:24;:::i;:::-;9938:3;9931:37;9866:108;;:::o;9980:179::-;10049:10;10070:46;10112:3;10104:6;10070:46;:::i;:::-;10148:4;10143:3;10139:14;10125:28;;9980:179;;;;:::o;10165:113::-;10235:4;10267;10262:3;10258:14;10250:22;;10165:113;;;:::o;10314:732::-;10433:3;10462:54;10510:5;10462:54;:::i;:::-;10532:86;10611:6;10606:3;10532:86;:::i;:::-;10525:93;;10642:56;10692:5;10642:56;:::i;:::-;10721:7;10752:1;10737:284;10762:6;10759:1;10756:13;10737:284;;;10838:6;10832:13;10865:63;10924:3;10909:13;10865:63;:::i;:::-;10858:70;;10951:60;11004:6;10951:60;:::i;:::-;10941:70;;10797:224;10784:1;10781;10777:9;10772:14;;10737:284;;;10741:14;11037:3;11030:10;;10438:608;;;10314:732;;;;:::o;11052:373::-;11195:4;11233:2;11222:9;11218:18;11210:26;;11282:9;11276:4;11272:20;11268:1;11257:9;11253:17;11246:47;11310:108;11413:4;11404:6;11310:108;:::i;:::-;11302:116;;11052:373;;;;:::o;11431:468::-;11496:6;11504;11553:2;11541:9;11532:7;11528:23;11524:32;11521:119;;;11559:79;;:::i;:::-;11521:119;11679:1;11704:53;11749:7;11740:6;11729:9;11725:22;11704:53;:::i;:::-;11694:63;;11650:117;11806:2;11832:50;11874:7;11865:6;11854:9;11850:22;11832:50;:::i;:::-;11822:60;;11777:115;11431:468;;;;;:::o;11905:307::-;11966:4;12056:18;12048:6;12045:30;12042:56;;;12078:18;;:::i;:::-;12042:56;12116:29;12138:6;12116:29;:::i;:::-;12108:37;;12200:4;12194;12190:15;12182:23;;11905:307;;;:::o;12218:423::-;12295:5;12320:65;12336:48;12377:6;12336:48;:::i;:::-;12320:65;:::i;:::-;12311:74;;12408:6;12401:5;12394:21;12446:4;12439:5;12435:16;12484:3;12475:6;12470:3;12466:16;12463:25;12460:112;;;12491:79;;:::i;:::-;12460:112;12581:54;12628:6;12623:3;12618;12581:54;:::i;:::-;12301:340;12218:423;;;;;:::o;12660:338::-;12715:5;12764:3;12757:4;12749:6;12745:17;12741:27;12731:122;;12772:79;;:::i;:::-;12731:122;12889:6;12876:20;12914:78;12988:3;12980:6;12973:4;12965:6;12961:17;12914:78;:::i;:::-;12905:87;;12721:277;12660:338;;;;:::o;13004:943::-;13099:6;13107;13115;13123;13172:3;13160:9;13151:7;13147:23;13143:33;13140:120;;;13179:79;;:::i;:::-;13140:120;13299:1;13324:53;13369:7;13360:6;13349:9;13345:22;13324:53;:::i;:::-;13314:63;;13270:117;13426:2;13452:53;13497:7;13488:6;13477:9;13473:22;13452:53;:::i;:::-;13442:63;;13397:118;13554:2;13580:53;13625:7;13616:6;13605:9;13601:22;13580:53;:::i;:::-;13570:63;;13525:118;13710:2;13699:9;13695:18;13682:32;13741:18;13733:6;13730:30;13727:117;;;13763:79;;:::i;:::-;13727:117;13868:62;13922:7;13913:6;13902:9;13898:22;13868:62;:::i;:::-;13858:72;;13653:287;13004:943;;;;;;;:::o;13953:474::-;14021:6;14029;14078:2;14066:9;14057:7;14053:23;14049:32;14046:119;;;14084:79;;:::i;:::-;14046:119;14204:1;14229:53;14274:7;14265:6;14254:9;14250:22;14229:53;:::i;:::-;14219:63;;14175:117;14331:2;14357:53;14402:7;14393:6;14382:9;14378:22;14357:53;:::i;:::-;14347:63;;14302:118;13953:474;;;;;:::o;14433:180::-;14481:77;14478:1;14471:88;14578:4;14575:1;14568:15;14602:4;14599:1;14592:15;14619:320;14663:6;14700:1;14694:4;14690:12;14680:22;;14747:1;14741:4;14737:12;14768:18;14758:81;;14824:4;14816:6;14812:17;14802:27;;14758:81;14886:2;14878:6;14875:14;14855:18;14852:38;14849:84;;14905:18;;:::i;:::-;14849:84;14670:269;14619:320;;;:::o;14945:220::-;15085:34;15081:1;15073:6;15069:14;15062:58;15154:3;15149:2;15141:6;15137:15;15130:28;14945:220;:::o;15171:366::-;15313:3;15334:67;15398:2;15393:3;15334:67;:::i;:::-;15327:74;;15410:93;15499:3;15410:93;:::i;:::-;15528:2;15523:3;15519:12;15512:19;;15171:366;;;:::o;15543:419::-;15709:4;15747:2;15736:9;15732:18;15724:26;;15796:9;15790:4;15786:20;15782:1;15771:9;15767:17;15760:47;15824:131;15950:4;15824:131;:::i;:::-;15816:139;;15543:419;;;:::o;15968:248::-;16108:34;16104:1;16096:6;16092:14;16085:58;16177:31;16172:2;16164:6;16160:15;16153:56;15968:248;:::o;16222:366::-;16364:3;16385:67;16449:2;16444:3;16385:67;:::i;:::-;16378:74;;16461:93;16550:3;16461:93;:::i;:::-;16579:2;16574:3;16570:12;16563:19;;16222:366;;;:::o;16594:419::-;16760:4;16798:2;16787:9;16783:18;16775:26;;16847:9;16841:4;16837:20;16833:1;16822:9;16818:17;16811:47;16875:131;17001:4;16875:131;:::i;:::-;16867:139;;16594:419;;;:::o;17019:141::-;17068:4;17091:3;17083:11;;17114:3;17111:1;17104:14;17148:4;17145:1;17135:18;17127:26;;17019:141;;;:::o;17166:93::-;17203:6;17250:2;17245;17238:5;17234:14;17230:23;17220:33;;17166:93;;;:::o;17265:107::-;17309:8;17359:5;17353:4;17349:16;17328:37;;17265:107;;;;:::o;17378:393::-;17447:6;17497:1;17485:10;17481:18;17520:97;17550:66;17539:9;17520:97;:::i;:::-;17638:39;17668:8;17657:9;17638:39;:::i;:::-;17626:51;;17710:4;17706:9;17699:5;17695:21;17686:30;;17759:4;17749:8;17745:19;17738:5;17735:30;17725:40;;17454:317;;17378:393;;;;;:::o;17777:60::-;17805:3;17826:5;17819:12;;17777:60;;;:::o;17843:142::-;17893:9;17926:53;17944:34;17953:24;17971:5;17953:24;:::i;:::-;17944:34;:::i;:::-;17926:53;:::i;:::-;17913:66;;17843:142;;;:::o;17991:75::-;18034:3;18055:5;18048:12;;17991:75;;;:::o;18072:269::-;18182:39;18213:7;18182:39;:::i;:::-;18243:91;18292:41;18316:16;18292:41;:::i;:::-;18284:6;18277:4;18271:11;18243:91;:::i;:::-;18237:4;18230:105;18148:193;18072:269;;;:::o;18347:73::-;18392:3;18347:73;:::o;18426:189::-;18503:32;;:::i;:::-;18544:65;18602:6;18594;18588:4;18544:65;:::i;:::-;18479:136;18426:189;;:::o;18621:186::-;18681:120;18698:3;18691:5;18688:14;18681:120;;;18752:39;18789:1;18782:5;18752:39;:::i;:::-;18725:1;18718:5;18714:13;18705:22;;18681:120;;;18621:186;;:::o;18813:543::-;18914:2;18909:3;18906:11;18903:446;;;18948:38;18980:5;18948:38;:::i;:::-;19032:29;19050:10;19032:29;:::i;:::-;19022:8;19018:44;19215:2;19203:10;19200:18;19197:49;;;19236:8;19221:23;;19197:49;19259:80;19315:22;19333:3;19315:22;:::i;:::-;19305:8;19301:37;19288:11;19259:80;:::i;:::-;18918:431;;18903:446;18813:543;;;:::o;19362:117::-;19416:8;19466:5;19460:4;19456:16;19435:37;;19362:117;;;;:::o;19485:169::-;19529:6;19562:51;19610:1;19606:6;19598:5;19595:1;19591:13;19562:51;:::i;:::-;19558:56;19643:4;19637;19633:15;19623:25;;19536:118;19485:169;;;;:::o;19659:295::-;19735:4;19881:29;19906:3;19900:4;19881:29;:::i;:::-;19873:37;;19943:3;19940:1;19936:11;19930:4;19927:21;19919:29;;19659:295;;;;:::o;19959:1395::-;20076:37;20109:3;20076:37;:::i;:::-;20178:18;20170:6;20167:30;20164:56;;;20200:18;;:::i;:::-;20164:56;20244:38;20276:4;20270:11;20244:38;:::i;:::-;20329:67;20389:6;20381;20375:4;20329:67;:::i;:::-;20423:1;20447:4;20434:17;;20479:2;20471:6;20468:14;20496:1;20491:618;;;;21153:1;21170:6;21167:77;;;21219:9;21214:3;21210:19;21204:26;21195:35;;21167:77;21270:67;21330:6;21323:5;21270:67;:::i;:::-;21264:4;21257:81;21126:222;20461:887;;20491:618;20543:4;20539:9;20531:6;20527:22;20577:37;20609:4;20577:37;:::i;:::-;20636:1;20650:208;20664:7;20661:1;20658:14;20650:208;;;20743:9;20738:3;20734:19;20728:26;20720:6;20713:42;20794:1;20786:6;20782:14;20772:24;;20841:2;20830:9;20826:18;20813:31;;20687:4;20684:1;20680:12;20675:17;;20650:208;;;20886:6;20877:7;20874:19;20871:179;;;20944:9;20939:3;20935:19;20929:26;20987:48;21029:4;21021:6;21017:17;21006:9;20987:48;:::i;:::-;20979:6;20972:64;20894:156;20871:179;21096:1;21092;21084:6;21080:14;21076:22;21070:4;21063:36;20498:611;;;20461:887;;20051:1303;;;19959:1395;;:::o;21360:232::-;21500:34;21496:1;21488:6;21484:14;21477:58;21569:15;21564:2;21556:6;21552:15;21545:40;21360:232;:::o;21598:366::-;21740:3;21761:67;21825:2;21820:3;21761:67;:::i;:::-;21754:74;;21837:93;21926:3;21837:93;:::i;:::-;21955:2;21950:3;21946:12;21939:19;;21598:366;;;:::o;21970:419::-;22136:4;22174:2;22163:9;22159:18;22151:26;;22223:9;22217:4;22213:20;22209:1;22198:9;22194:17;22187:47;22251:131;22377:4;22251:131;:::i;:::-;22243:139;;21970:419;;;:::o;22395:180::-;22443:77;22440:1;22433:88;22540:4;22537:1;22530:15;22564:4;22561:1;22554:15;22581:180;22629:77;22626:1;22619:88;22726:4;22723:1;22716:15;22750:4;22747:1;22740:15;22767:191;22807:3;22826:20;22844:1;22826:20;:::i;:::-;22821:25;;22860:20;22878:1;22860:20;:::i;:::-;22855:25;;22903:1;22900;22896:9;22889:16;;22924:3;22921:1;22918:10;22915:36;;;22931:18;;:::i;:::-;22915:36;22767:191;;;;:::o;22964:233::-;23003:3;23026:24;23044:5;23026:24;:::i;:::-;23017:33;;23072:66;23065:5;23062:77;23059:103;;23142:18;;:::i;:::-;23059:103;23189:1;23182:5;23178:13;23171:20;;22964:233;;;:::o;23203:147::-;23304:11;23341:3;23326:18;;23203:147;;;;:::o;23356:114::-;;:::o;23476:398::-;23635:3;23656:83;23737:1;23732:3;23656:83;:::i;:::-;23649:90;;23748:93;23837:3;23748:93;:::i;:::-;23866:1;23861:3;23857:11;23850:18;;23476:398;;;:::o;23880:379::-;24064:3;24086:147;24229:3;24086:147;:::i;:::-;24079:154;;24250:3;24243:10;;23880:379;;;:::o;24265:174::-;24405:26;24401:1;24393:6;24389:14;24382:50;24265:174;:::o;24445:366::-;24587:3;24608:67;24672:2;24667:3;24608:67;:::i;:::-;24601:74;;24684:93;24773:3;24684:93;:::i;:::-;24802:2;24797:3;24793:12;24786:19;;24445:366;;;:::o;24817:419::-;24983:4;25021:2;25010:9;25006:18;24998:26;;25070:9;25064:4;25060:20;25056:1;25045:9;25041:17;25034:47;25098:131;25224:4;25098:131;:::i;:::-;25090:139;;24817:419;;;:::o;25242:228::-;25382:34;25378:1;25370:6;25366:14;25359:58;25451:11;25446:2;25438:6;25434:15;25427:36;25242:228;:::o;25476:366::-;25618:3;25639:67;25703:2;25698:3;25639:67;:::i;:::-;25632:74;;25715:93;25804:3;25715:93;:::i;:::-;25833:2;25828:3;25824:12;25817:19;;25476:366;;;:::o;25848:419::-;26014:4;26052:2;26041:9;26037:18;26029:26;;26101:9;26095:4;26091:20;26087:1;26076:9;26072:17;26065:47;26129:131;26255:4;26129:131;:::i;:::-;26121:139;;25848:419;;;:::o;26273:169::-;26413:21;26409:1;26401:6;26397:14;26390:45;26273:169;:::o;26448:366::-;26590:3;26611:67;26675:2;26670:3;26611:67;:::i;:::-;26604:74;;26687:93;26776:3;26687:93;:::i;:::-;26805:2;26800:3;26796:12;26789:19;;26448:366;;;:::o;26820:419::-;26986:4;27024:2;27013:9;27009:18;27001:26;;27073:9;27067:4;27063:20;27059:1;27048:9;27044:17;27037:47;27101:131;27227:4;27101:131;:::i;:::-;27093:139;;26820:419;;;:::o;27245:168::-;27385:20;27381:1;27373:6;27369:14;27362:44;27245:168;:::o;27419:366::-;27561:3;27582:67;27646:2;27641:3;27582:67;:::i;:::-;27575:74;;27658:93;27747:3;27658:93;:::i;:::-;27776:2;27771:3;27767:12;27760:19;;27419:366;;;:::o;27791:419::-;27957:4;27995:2;27984:9;27980:18;27972:26;;28044:9;28038:4;28034:20;28030:1;28019:9;28015:17;28008:47;28072:131;28198:4;28072:131;:::i;:::-;28064:139;;27791:419;;;:::o;28216:410::-;28256:7;28279:20;28297:1;28279:20;:::i;:::-;28274:25;;28313:20;28331:1;28313:20;:::i;:::-;28308:25;;28368:1;28365;28361:9;28390:30;28408:11;28390:30;:::i;:::-;28379:41;;28569:1;28560:7;28556:15;28553:1;28550:22;28530:1;28523:9;28503:83;28480:139;;28599:18;;:::i;:::-;28480:139;28264:362;28216:410;;;;:::o;28632:162::-;28772:14;28768:1;28760:6;28756:14;28749:38;28632:162;:::o;28800:366::-;28942:3;28963:67;29027:2;29022:3;28963:67;:::i;:::-;28956:74;;29039:93;29128:3;29039:93;:::i;:::-;29157:2;29152:3;29148:12;29141:19;;28800:366;;;:::o;29172:419::-;29338:4;29376:2;29365:9;29361:18;29353:26;;29425:9;29419:4;29415:20;29411:1;29400:9;29396:17;29389:47;29453:131;29579:4;29453:131;:::i;:::-;29445:139;;29172:419;;;:::o;29597:172::-;29737:24;29733:1;29725:6;29721:14;29714:48;29597:172;:::o;29775:366::-;29917:3;29938:67;30002:2;29997:3;29938:67;:::i;:::-;29931:74;;30014:93;30103:3;30014:93;:::i;:::-;30132:2;30127:3;30123:12;30116:19;;29775:366;;;:::o;30147:419::-;30313:4;30351:2;30340:9;30336:18;30328:26;;30400:9;30394:4;30390:20;30386:1;30375:9;30371:17;30364:47;30428:131;30554:4;30428:131;:::i;:::-;30420:139;;30147:419;;;:::o;30572:194::-;30612:4;30632:20;30650:1;30632:20;:::i;:::-;30627:25;;30666:20;30684:1;30666:20;:::i;:::-;30661:25;;30710:1;30707;30703:9;30695:17;;30734:1;30728:4;30725:11;30722:37;;;30739:18;;:::i;:::-;30722:37;30572:194;;;;:::o;30772:165::-;30912:17;30908:1;30900:6;30896:14;30889:41;30772:165;:::o;30943:366::-;31085:3;31106:67;31170:2;31165:3;31106:67;:::i;:::-;31099:74;;31182:93;31271:3;31182:93;:::i;:::-;31300:2;31295:3;31291:12;31284:19;;30943:366;;;:::o;31315:419::-;31481:4;31519:2;31508:9;31504:18;31496:26;;31568:9;31562:4;31558:20;31554:1;31543:9;31539:17;31532:47;31596:131;31722:4;31596:131;:::i;:::-;31588:139;;31315:419;;;:::o;31740:234::-;31880:34;31876:1;31868:6;31864:14;31857:58;31949:17;31944:2;31936:6;31932:15;31925:42;31740:234;:::o;31980:366::-;32122:3;32143:67;32207:2;32202:3;32143:67;:::i;:::-;32136:74;;32219:93;32308:3;32219:93;:::i;:::-;32337:2;32332:3;32328:12;32321:19;;31980:366;;;:::o;32352:419::-;32518:4;32556:2;32545:9;32541:18;32533:26;;32605:9;32599:4;32595:20;32591:1;32580:9;32576:17;32569:47;32633:131;32759:4;32633:131;:::i;:::-;32625:139;;32352:419;;;:::o;32777:148::-;32879:11;32916:3;32901:18;;32777:148;;;;:::o;32931:390::-;33037:3;33065:39;33098:5;33065:39;:::i;:::-;33120:89;33202:6;33197:3;33120:89;:::i;:::-;33113:96;;33218:65;33276:6;33271:3;33264:4;33257:5;33253:16;33218:65;:::i;:::-;33308:6;33303:3;33299:16;33292:23;;33041:280;32931:390;;;;:::o;33351:874::-;33454:3;33491:5;33485:12;33520:36;33546:9;33520:36;:::i;:::-;33572:89;33654:6;33649:3;33572:89;:::i;:::-;33565:96;;33692:1;33681:9;33677:17;33708:1;33703:166;;;;33883:1;33878:341;;;;33670:549;;33703:166;33787:4;33783:9;33772;33768:25;33763:3;33756:38;33849:6;33842:14;33835:22;33827:6;33823:35;33818:3;33814:45;33807:52;;33703:166;;33878:341;33945:38;33977:5;33945:38;:::i;:::-;34005:1;34019:154;34033:6;34030:1;34027:13;34019:154;;;34107:7;34101:14;34097:1;34092:3;34088:11;34081:35;34157:1;34148:7;34144:15;34133:26;;34055:4;34052:1;34048:12;34043:17;;34019:154;;;34202:6;34197:3;34193:16;34186:23;;33885:334;;33670:549;;33458:767;;33351:874;;;;:::o;34231:589::-;34456:3;34478:95;34569:3;34560:6;34478:95;:::i;:::-;34471:102;;34590:95;34681:3;34672:6;34590:95;:::i;:::-;34583:102;;34702:92;34790:3;34781:6;34702:92;:::i;:::-;34695:99;;34811:3;34804:10;;34231:589;;;;;;:::o;34826:225::-;34966:34;34962:1;34954:6;34950:14;34943:58;35035:8;35030:2;35022:6;35018:15;35011:33;34826:225;:::o;35057:366::-;35199:3;35220:67;35284:2;35279:3;35220:67;:::i;:::-;35213:74;;35296:93;35385:3;35296:93;:::i;:::-;35414:2;35409:3;35405:12;35398:19;;35057:366;;;:::o;35429:419::-;35595:4;35633:2;35622:9;35618:18;35610:26;;35682:9;35676:4;35672:20;35668:1;35657:9;35653:17;35646:47;35710:131;35836:4;35710:131;:::i;:::-;35702:139;;35429:419;;;:::o;35854:182::-;35994:34;35990:1;35982:6;35978:14;35971:58;35854:182;:::o;36042:366::-;36184:3;36205:67;36269:2;36264:3;36205:67;:::i;:::-;36198:74;;36281:93;36370:3;36281:93;:::i;:::-;36399:2;36394:3;36390:12;36383:19;;36042:366;;;:::o;36414:419::-;36580:4;36618:2;36607:9;36603:18;36595:26;;36667:9;36661:4;36657:20;36653:1;36642:9;36638:17;36631:47;36695:131;36821:4;36695:131;:::i;:::-;36687:139;;36414:419;;;:::o;36839:224::-;36979:34;36975:1;36967:6;36963:14;36956:58;37048:7;37043:2;37035:6;37031:15;37024:32;36839:224;:::o;37069:366::-;37211:3;37232:67;37296:2;37291:3;37232:67;:::i;:::-;37225:74;;37308:93;37397:3;37308:93;:::i;:::-;37426:2;37421:3;37417:12;37410:19;;37069:366;;;:::o;37441:419::-;37607:4;37645:2;37634:9;37630:18;37622:26;;37694:9;37688:4;37684:20;37680:1;37669:9;37665:17;37658:47;37722:131;37848:4;37722:131;:::i;:::-;37714:139;;37441:419;;;:::o;37866:223::-;38006:34;38002:1;37994:6;37990:14;37983:58;38075:6;38070:2;38062:6;38058:15;38051:31;37866:223;:::o;38095:366::-;38237:3;38258:67;38322:2;38317:3;38258:67;:::i;:::-;38251:74;;38334:93;38423:3;38334:93;:::i;:::-;38452:2;38447:3;38443:12;38436:19;;38095:366;;;:::o;38467:419::-;38633:4;38671:2;38660:9;38656:18;38648:26;;38720:9;38714:4;38710:20;38706:1;38695:9;38691:17;38684:47;38748:131;38874:4;38748:131;:::i;:::-;38740:139;;38467:419;;;:::o;38892:175::-;39032:27;39028:1;39020:6;39016:14;39009:51;38892:175;:::o;39073:366::-;39215:3;39236:67;39300:2;39295:3;39236:67;:::i;:::-;39229:74;;39312:93;39401:3;39312:93;:::i;:::-;39430:2;39425:3;39421:12;39414:19;;39073:366;;;:::o;39445:419::-;39611:4;39649:2;39638:9;39634:18;39626:26;;39698:9;39692:4;39688:20;39684:1;39673:9;39669:17;39662:47;39726:131;39852:4;39726:131;:::i;:::-;39718:139;;39445:419;;;:::o;39870:237::-;40010:34;40006:1;39998:6;39994:14;39987:58;40079:20;40074:2;40066:6;40062:15;40055:45;39870:237;:::o;40113:366::-;40255:3;40276:67;40340:2;40335:3;40276:67;:::i;:::-;40269:74;;40352:93;40441:3;40352:93;:::i;:::-;40470:2;40465:3;40461:12;40454:19;;40113:366;;;:::o;40485:419::-;40651:4;40689:2;40678:9;40674:18;40666:26;;40738:9;40732:4;40728:20;40724:1;40713:9;40709:17;40702:47;40766:131;40892:4;40766:131;:::i;:::-;40758:139;;40485:419;;;:::o;40910:180::-;40958:77;40955:1;40948:88;41055:4;41052:1;41045:15;41079:4;41076:1;41069:15;41096:98;41147:6;41181:5;41175:12;41165:22;;41096:98;;;:::o;41200:168::-;41283:11;41317:6;41312:3;41305:19;41357:4;41352:3;41348:14;41333:29;;41200:168;;;;:::o;41374:373::-;41460:3;41488:38;41520:5;41488:38;:::i;:::-;41542:70;41605:6;41600:3;41542:70;:::i;:::-;41535:77;;41621:65;41679:6;41674:3;41667:4;41660:5;41656:16;41621:65;:::i;:::-;41711:29;41733:6;41711:29;:::i;:::-;41706:3;41702:39;41695:46;;41464:283;41374:373;;;;:::o;41753:640::-;41948:4;41986:3;41975:9;41971:19;41963:27;;42000:71;42068:1;42057:9;42053:17;42044:6;42000:71;:::i;:::-;42081:72;42149:2;42138:9;42134:18;42125:6;42081:72;:::i;:::-;42163;42231:2;42220:9;42216:18;42207:6;42163:72;:::i;:::-;42282:9;42276:4;42272:20;42267:2;42256:9;42252:18;42245:48;42310:76;42381:4;42372:6;42310:76;:::i;:::-;42302:84;;41753:640;;;;;;;:::o;42399:141::-;42455:5;42486:6;42480:13;42471:22;;42502:32;42528:5;42502:32;:::i;:::-;42399:141;;;;:::o;42546:349::-;42615:6;42664:2;42652:9;42643:7;42639:23;42635:32;42632:119;;;42670:79;;:::i;:::-;42632:119;42790:1;42815:63;42870:7;42861:6;42850:9;42846:22;42815:63;:::i;:::-;42805:73;;42761:127;42546:349;;;;:::o;42901:182::-;43041:34;43037:1;43029:6;43025:14;43018:58;42901:182;:::o;43089:366::-;43231:3;43252:67;43316:2;43311:3;43252:67;:::i;:::-;43245:74;;43328:93;43417:3;43328:93;:::i;:::-;43446:2;43441:3;43437:12;43430:19;;43089:366;;;:::o;43461:419::-;43627:4;43665:2;43654:9;43650:18;43642:26;;43714:9;43708:4;43704:20;43700:1;43689:9;43685:17;43678:47;43742:131;43868:4;43742:131;:::i;:::-;43734:139;;43461:419;;;:::o;43886:178::-;44026:30;44022:1;44014:6;44010:14;44003:54;43886:178;:::o;44070:366::-;44212:3;44233:67;44297:2;44292:3;44233:67;:::i;:::-;44226:74;;44309:93;44398:3;44309:93;:::i;:::-;44427:2;44422:3;44418:12;44411:19;;44070:366;;;:::o;44442:419::-;44608:4;44646:2;44635:9;44631:18;44623:26;;44695:9;44689:4;44685:20;44681:1;44670:9;44666:17;44659:47;44723:131;44849:4;44723:131;:::i;:::-;44715:139;;44442:419;;;:::o

Swarm Source

ipfs://e336e456d930da825734a6b0fcce1818fcd9b781adb55cde0e14c2cba07183d6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.