ETH Price: $3,097.35 (+0.45%)
Gas: 6 Gwei

Token

Sombrero Donkeys (SD)
 

Overview

Max Total Supply

2,999 SD

Holders

578

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SD
0x1f1df9a5b9c07e4433f9a8a17a6041e2738938a2
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:
SombreroDonkeys

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-18
*/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


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

pragma solidity ^0.8.0;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (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: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 overriden 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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        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: transfer caller is not owner nor 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: transfer caller is not owner nor 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 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 _owners[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) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

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

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {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 a {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 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 {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: SombreroDonkeys/SombreroDonkeys.sol



pragma solidity 0.8.7;




contract SombreroDonkeys is ERC721, Ownable, PaymentSplitter {

    address[] private _team = [
        0xa24c32eAB894F8B35D65c6E0D08CC8cC6eD47d94, 
        0x98Ec77e2E8F663Bc93FDdB58a4B157e64B6D3c42,
        0x7f56b8062a743A7D09acE0126Bf4158890B01dBa,
        0x261d087bAb4F55Ed72D50e6253aee783690213e4,
        0xb13556dcAD8081A105c703f5B82E37ae19838Cf8
        ];
    
    uint256[] private _teamShares = [
        10,
        43,
        7,
        33,
        7
        ];
    
    uint public mintPrice;
    uint256 public maxSupply = 2700;
    uint public maxPerTransaction = 10;
    uint public tokenCount = 0;
    mapping(address => uint256) public Whitelist;
    bool public saleActive;
    bool public whitelistActive;
    bool public revealed;
    
    string public baseURI;
    
    constructor(uint _mintPrice) ERC721("Sombrero Donkeys", "SD") PaymentSplitter(_team, _teamShares) {
        //SET MINT PRICE
        mintPrice = _mintPrice;
        //50000000000000000
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        
        string memory base = _baseURI();
        if(!revealed){
            return bytes(base).length > 0 ? string(abi.encodePacked(base)) : "";
        }
        return bytes(base).length > 0 ? string(abi.encodePacked(base, uint2str(tokenId))) : "";
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
    
    function _setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
    function flipRevealed() public onlyOwner {
        revealed = !revealed;
    }
    
  	function setTotalSupply(uint _totalSupply) public onlyOwner{
  	    maxSupply = _totalSupply;
  	}
    
    function Mint(uint _count) public payable {
        
        require(saleActive == true || (whitelistActive == true && Whitelist[msg.sender] >= _count), "Normal Sale Not Active");
        require(_count <= maxPerTransaction, "Over maxPerTransaction");
        require(msg.value == mintPrice * _count, "Insuffcient Amount Sent");
        
        require(tokenCount + _count < maxSupply, "At Max Supply");
        
        
        for(uint i = 0; i < _count; i++){
            require(!super._exists(tokenCount), "Token ID Exists");
            _safeMint(msg.sender, tokenCount);
            tokenCount++;
        }
        if(Whitelist[msg.sender] > 0){
            Whitelist[msg.sender] = 0;
        }
    }
    function ownerMint(uint _count, address _to)public onlyOwner {
        require(tokenCount + _count < maxSupply, "At Max Supply");
        for(uint i = 0; i < _count; i++){
            require(!super._exists(tokenCount), "Token ID Exists");
            _safeMint(_to,tokenCount);
            tokenCount++;
        }
    }
    function addToWhitelist(address[] memory _address)public onlyOwner {
        for(uint i  = 0; i < _address.length; i++){
            Whitelist[_address[i]] = 1;
        }
    }
    function totalSupply() external view returns (uint256) {
        return tokenCount;
    }
    
    function flipWhitelist() public onlyOwner {
        whitelistActive = !whitelistActive;
    }

    function flipRegularSale() public onlyOwner {
        saleActive = !saleActive;
    }
    
    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }
    
    function withdrawAll() external onlyOwner {
        for (uint256 i = 0; i < _team.length; i++) {
            address payable wallet = payable(_team[i]);
            release(wallet);
        }
    }
    
    function uint2str(uint _i) private pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"_setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipRegularSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalSupply","type":"uint256"}],"name":"setTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060a0016040528073a24c32eab894f8b35d65c6e0d08cc8cc6ed47d9473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017398ec77e2e8f663bc93fddb58a4b157e64b6d3c4273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737f56b8062a743a7d09ace0126bf4158890b01dba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173261d087bab4f55ed72d50e6253aee783690213e473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b13556dcad8081a105c703f5b82e37ae19838cf873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250600e9060056200017d929190620007c1565b506040518060a00160405280600a60ff168152602001602b60ff168152602001600760ff168152602001602160ff168152602001600760ff16815250600f906005620001cb92919062000850565b50610a8c601155600a6012556000601355348015620001e957600080fd5b50604051620063003803806200630083398181016040528101906200020f91906200096e565b600e8054806020026020016040519081016040528092919081815260200182805480156200029357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000248575b5050505050600f805480602002602001604051908101604052809291908181526020018280548015620002e657602002820191906000526020600020905b815481526020019060010190808311620002d1575b50505050506040518060400160405280601081526020017f536f6d627265726f20446f6e6b657973000000000000000000000000000000008152506040518060400160405280600281526020017f534400000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200036f929190620008a7565b50806001908051906020019062000388929190620008a7565b505050620003ab6200039f620004b960201b60201c565b620004c160201b60201c565b8051825114620003f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e99062000ad4565b60405180910390fd5b600082511162000439576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004309062000b18565b60405180910390fd5b60005b8251811015620004a8576200049283828151811062000460576200045f62000cea565b5b60200260200101518383815181106200047e576200047d62000cea565b5b60200260200101516200058760201b60201c565b80806200049f9062000c3e565b9150506200043c565b505050806010819055505062000e77565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f19062000ab2565b60405180910390fd5b6000811162000640576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006379062000b3a565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620006c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006bc9062000af6565b60405180910390fd5b600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007546200077c919062000b6d565b6007819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620007b592919062000a85565b60405180910390a15050565b8280548282559060005260206000209081019282156200083d579160200282015b828111156200083c5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620007e2565b5b5090506200084c919062000938565b5090565b82805482825590600052602060002090810192821562000894579160200282015b8281111562000893578251829060ff1690559160200191906001019062000871565b5b509050620008a3919062000938565b5090565b828054620008b59062000c08565b90600052602060002090601f016020900481019282620008d9576000855562000925565b82601f10620008f457805160ff191683800117855562000925565b8280016001018555821562000925579182015b828111156200092457825182559160200191906001019062000907565b5b50905062000934919062000938565b5090565b5b808211156200095357600081600090555060010162000939565b5090565b600081519050620009688162000e5d565b92915050565b60006020828403121562000987576200098662000d19565b5b6000620009978482850162000957565b91505092915050565b620009ab8162000bca565b82525050565b6000620009c0602c8362000b5c565b9150620009cd8262000d1e565b604082019050919050565b6000620009e760328362000b5c565b9150620009f48262000d6d565b604082019050919050565b600062000a0e602b8362000b5c565b915062000a1b8262000dbc565b604082019050919050565b600062000a35601a8362000b5c565b915062000a428262000e0b565b602082019050919050565b600062000a5c601d8362000b5c565b915062000a698262000e34565b602082019050919050565b62000a7f8162000bfe565b82525050565b600060408201905062000a9c6000830185620009a0565b62000aab602083018462000a74565b9392505050565b6000602082019050818103600083015262000acd81620009b1565b9050919050565b6000602082019050818103600083015262000aef81620009d8565b9050919050565b6000602082019050818103600083015262000b1181620009ff565b9050919050565b6000602082019050818103600083015262000b338162000a26565b9050919050565b6000602082019050818103600083015262000b558162000a4d565b9050919050565b600082825260208201905092915050565b600062000b7a8262000bfe565b915062000b878362000bfe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000bbf5762000bbe62000c8c565b5b828201905092915050565b600062000bd78262000bde565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000c2157607f821691505b6020821081141562000c385762000c3762000cbb565b5b50919050565b600062000c4b8262000bfe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c815762000c8062000c8c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000e688162000bfe565b811462000e7457600080fd5b50565b6154798062000e876000396000f3fe6080604052600436106102765760003560e01c806370a082311161014f578063b88d4fde116100c1578063e33b7de31161007a578063e33b7de31461097c578063e985e9c5146109a7578063eb73900b146109e4578063f2fde38b14610a21578063f4a0a52814610a4a578063f7ea7a3d14610a73576102bd565b8063b88d4fde14610848578063c87b56dd14610871578063ce7c2ac2146108ae578063d52c57e0146108eb578063d5abeb0114610914578063d79779b21461093f576102bd565b80638da5cb5b116101135780638da5cb5b1461074a57806395d89b41146107755780639852595c146107a05780639f181b5e146107dd578063a040006614610808578063a22cb4651461081f576102bd565b806370a0823114610679578063715018a6146106b65780637f649783146106cd578063853828b6146106f65780638b83209b1461070d576102bd565b80633b2c3fb6116101e85780634b980d67116101ac5780634b980d671461056557806351830227146105905780636352211e146105bb5780636817c76c146105f857806368428a1b146106235780636c0360eb1461064e576102bd565b80633b2c3fb6146104a85780634041b35e146104bf578063406072a9146104d657806342842e0e1461051357806348b750441461053c576102bd565b8063095ea7b31161023a578063095ea7b3146103ae57806318160ddd146103d7578063191655871461040257806323b872dd1461042b57806331b5b907146104545780633a98ef391461047d576102bd565b806301ffc9a7146102c257806302ce5813146102ff57806306fdde031461032a5780630788370314610355578063081812fc14610371576102bd565b366102bd577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a4610a9c565b346040516102b3929190614388565b60405180910390a1005b600080fd5b3480156102ce57600080fd5b506102e960048036038101906102e49190613be0565b610aa4565b6040516102f691906143b1565b60405180910390f35b34801561030b57600080fd5b50610314610b86565b60405161032191906143b1565b60405180910390f35b34801561033657600080fd5b5061033f610b99565b60405161034c91906143cc565b60405180910390f35b61036f600480360381019061036a9190613cf0565b610c2b565b005b34801561037d57600080fd5b5061039860048036038101906103939190613cf0565b610eee565b6040516103a591906142f8565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613b2a565b610f73565b005b3480156103e357600080fd5b506103ec61108b565b6040516103f9919061476e565b60405180910390f35b34801561040e57600080fd5b50610429600480360381019061042491906139a7565b611095565b005b34801561043757600080fd5b50610452600480360381019061044d9190613a14565b611240565b005b34801561046057600080fd5b5061047b60048036038101906104769190613ca7565b6112a0565b005b34801561048957600080fd5b50610492611336565b60405161049f919061476e565b60405180910390f35b3480156104b457600080fd5b506104bd611340565b005b3480156104cb57600080fd5b506104d46113e8565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613c67565b611490565b60405161050a919061476e565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613a14565b611517565b005b34801561054857600080fd5b50610563600480360381019061055e9190613c67565b611537565b005b34801561057157600080fd5b5061057a6117ff565b604051610587919061476e565b60405180910390f35b34801561059c57600080fd5b506105a5611805565b6040516105b291906143b1565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190613cf0565b611818565b6040516105ef91906142f8565b60405180910390f35b34801561060457600080fd5b5061060d6118ca565b60405161061a919061476e565b60405180910390f35b34801561062f57600080fd5b506106386118d0565b60405161064591906143b1565b60405180910390f35b34801561065a57600080fd5b506106636118e3565b60405161067091906143cc565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b919061397a565b611971565b6040516106ad919061476e565b60405180910390f35b3480156106c257600080fd5b506106cb611a29565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190613b6a565b611ab1565b005b34801561070257600080fd5b5061070b611baf565b005b34801561071957600080fd5b50610734600480360381019061072f9190613cf0565b611c9e565b60405161074191906142f8565b60405180910390f35b34801561075657600080fd5b5061075f611ce6565b60405161076c91906142f8565b60405180910390f35b34801561078157600080fd5b5061078a611d10565b60405161079791906143cc565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c2919061397a565b611da2565b6040516107d4919061476e565b60405180910390f35b3480156107e957600080fd5b506107f2611deb565b6040516107ff919061476e565b60405180910390f35b34801561081457600080fd5b5061081d611df1565b005b34801561082b57600080fd5b5061084660048036038101906108419190613aea565b611e99565b005b34801561085457600080fd5b5061086f600480360381019061086a9190613a67565b611eaf565b005b34801561087d57600080fd5b5061089860048036038101906108939190613cf0565b611f11565b6040516108a591906143cc565b60405180910390f35b3480156108ba57600080fd5b506108d560048036038101906108d0919061397a565b612014565b6040516108e2919061476e565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d9190613d4a565b61205d565b005b34801561092057600080fd5b506109296121bc565b604051610936919061476e565b60405180910390f35b34801561094b57600080fd5b5061096660048036038101906109619190613c3a565b6121c2565b604051610973919061476e565b60405180910390f35b34801561098857600080fd5b5061099161220b565b60405161099e919061476e565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c991906139d4565b612215565b6040516109db91906143b1565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a06919061397a565b6122a9565b604051610a18919061476e565b60405180910390f35b348015610a2d57600080fd5b50610a486004803603810190610a43919061397a565b6122c1565b005b348015610a5657600080fd5b50610a716004803603810190610a6c9190613cf0565b6123b9565b005b348015610a7f57600080fd5b50610a9a6004803603810190610a959190613cf0565b61243f565b005b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b7f5750610b7e826124c5565b5b9050919050565b601560019054906101000a900460ff1681565b606060008054610ba890614af3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd490614af3565b8015610c215780601f10610bf657610100808354040283529160200191610c21565b820191906000526020600020905b815481529060010190602001808311610c0457829003601f168201915b5050505050905090565b60011515601560009054906101000a900460ff1615151480610cab575060011515601560019054906101000a900460ff161515148015610caa575080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b5b610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce1906146ae565b60405180910390fd5b601254811115610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d269061466e565b60405180910390fd5b80601054610d3d9190614948565b3414610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d759061472e565b60405180910390fd5b60115481601354610d8f919061488a565b10610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061470e565b60405180910390fd5b60005b81811015610e5c57610de560135461252f565b15610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c9061462e565b60405180910390fd5b610e313360135461259b565b60136000815480929190610e4490614b56565b91905055508080610e5490614b56565b915050610dd2565b506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610eeb576000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50565b6000610ef98261252f565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f906145ee565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611818565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe69061468e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100e610a9c565b73ffffffffffffffffffffffffffffffffffffffff16148061103d575061103c81611037610a9c565b612215565b5b61107c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110739061456e565b60405180910390fd5b61108683836125b9565b505050565b6000601354905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e9061446e565b60405180910390fd5b600061112161220b565b4761112c919061488a565b90506000611143838361113e86611da2565b612672565b90506000811415611189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111809061454e565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111d8919061488a565b9250508190555080600860008282546111f1919061488a565b9250508190555061120283826126e0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051611233929190614313565b60405180910390a1505050565b61125161124b610a9c565b826127d4565b611290576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611287906146ce565b60405180910390fd5b61129b8383836128b2565b505050565b6112a8610a9c565b73ffffffffffffffffffffffffffffffffffffffff166112c6611ce6565b73ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113139061460e565b60405180910390fd5b806016908051906020019061133292919061369c565b5050565b6000600754905090565b611348610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611366611ce6565b73ffffffffffffffffffffffffffffffffffffffff16146113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b39061460e565b60405180910390fd5b601560029054906101000a900460ff1615601560026101000a81548160ff021916908315150217905550565b6113f0610a9c565b73ffffffffffffffffffffffffffffffffffffffff1661140e611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b9061460e565b60405180910390fd5b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61153283838360405180602001604052806000815250611eaf565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b09061446e565b60405180910390fd5b60006115c4836121c2565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115fd91906142f8565b60206040518083038186803b15801561161557600080fd5b505afa158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613d1d565b611657919061488a565b9050600061166f838361166a8787611490565b612672565b905060008114156116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac9061454e565b60405180910390fd5b80600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611741919061488a565b9250508190555080600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611797919061488a565b925050819055506117a9848483612b19565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516117f1929190614388565b60405180910390a250505050565b60125481565b601560029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b8906145ae565b60405180910390fd5b80915050919050565b60105481565b601560009054906101000a900460ff1681565b601680546118f090614af3565b80601f016020809104026020016040519081016040528092919081815260200182805461191c90614af3565b80156119695780601f1061193e57610100808354040283529160200191611969565b820191906000526020600020905b81548152906001019060200180831161194c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d99061458e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a31610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611a4f611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c9061460e565b60405180910390fd5b611aaf6000612b9f565b565b611ab9610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611ad7611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b249061460e565b60405180910390fd5b60005b8151811015611bab57600160146000848481518110611b5257611b51614c2c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611ba390614b56565b915050611b30565b5050565b611bb7610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611bd5611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c229061460e565b60405180910390fd5b60005b600e80549050811015611c9b576000600e8281548110611c5157611c50614c2c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611c8781611095565b508080611c9390614b56565b915050611c2e565b50565b6000600b8281548110611cb457611cb3614c2c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611d1f90614af3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4b90614af3565b8015611d985780601f10611d6d57610100808354040283529160200191611d98565b820191906000526020600020905b815481529060010190602001808311611d7b57829003601f168201915b5050505050905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60135481565b611df9610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611e17611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e649061460e565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b611eab611ea4610a9c565b8383612c65565b5050565b611ec0611eba610a9c565b836127d4565b611eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef6906146ce565b60405180910390fd5b611f0b84848484612dd2565b50505050565b6060611f1c8261252f565b611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f529061464e565b60405180910390fd5b6000611f65612e2e565b9050601560029054906101000a900460ff16611fc2576000815111611f995760405180602001604052806000815250611fba565b80604051602001611faa91906142a8565b6040516020818303038152906040525b91505061200f565b6000815111611fe0576040518060200160405280600081525061200b565b80611fea84612ec0565b604051602001611ffb9291906142bf565b6040516020818303038152906040525b9150505b919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612065610a9c565b73ffffffffffffffffffffffffffffffffffffffff16612083611ce6565b73ffffffffffffffffffffffffffffffffffffffff16146120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d09061460e565b60405180910390fd5b601154826013546120ea919061488a565b1061212a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121219061470e565b60405180910390fd5b60005b828110156121b75761214060135461252f565b15612180576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121779061462e565b60405180910390fd5b61218c8260135461259b565b6013600081548092919061219f90614b56565b919050555080806121af90614b56565b91505061212d565b505050565b60115481565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600854905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60146020528060005260406000206000915090505481565b6122c9610a9c565b73ffffffffffffffffffffffffffffffffffffffff166122e7611ce6565b73ffffffffffffffffffffffffffffffffffffffff161461233d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123349061460e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a49061440e565b60405180910390fd5b6123b681612b9f565b50565b6123c1610a9c565b73ffffffffffffffffffffffffffffffffffffffff166123df611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614612435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c9061460e565b60405180910390fd5b8060108190555050565b612447610a9c565b73ffffffffffffffffffffffffffffffffffffffff16612465611ce6565b73ffffffffffffffffffffffffffffffffffffffff16146124bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b29061460e565b60405180910390fd5b8060118190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6125b5828260405180602001604052806000815250613049565b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661262c83611818565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600754600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856126c39190614948565b6126cd9190614917565b6126d791906149a2565b90509392505050565b80471015612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a906144ee565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612749906142e3565b60006040518083038185875af1925050503d8060008114612786576040519150601f19603f3d011682016040523d82523d6000602084013e61278b565b606091505b50509050806127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c6906144ce565b60405180910390fd5b505050565b60006127df8261252f565b61281e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128159061452e565b60405180910390fd5b600061282983611818565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061289857508373ffffffffffffffffffffffffffffffffffffffff1661288084610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b806128a957506128a88185612215565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128d282611818565b73ffffffffffffffffffffffffffffffffffffffff1614612928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291f9061442e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f9061448e565b60405180910390fd5b6129a38383836130a4565b6129ae6000826125b9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129fe91906149a2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a55919061488a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b148383836130a9565b505050565b612b9a8363a9059cbb60e01b8484604051602401612b38929190614388565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130ae565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccb906144ae565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612dc591906143b1565b60405180910390a3505050565b612ddd8484846128b2565b612de984848484613175565b612e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1f906143ee565b60405180910390fd5b50505050565b606060168054612e3d90614af3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6990614af3565b8015612eb65780601f10612e8b57610100808354040283529160200191612eb6565b820191906000526020600020905b815481529060010190602001808311612e9957829003601f168201915b5050505050905090565b60606000821415612f08576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613044565b600082905060005b60008214612f3a578080612f2390614b56565b915050600a82612f339190614917565b9150612f10565b60008167ffffffffffffffff811115612f5657612f55614c5b565b5b6040519080825280601f01601f191660200182016040528015612f885781602001600182028036833780820191505090505b50905060008290505b6000861461303c57600181612fa691906149a2565b90506000600a8088612fb89190614917565b612fc29190614948565b87612fcd91906149a2565b6030612fd991906148e0565b905060008160f81b905080848481518110612ff757612ff6614c2c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886130339190614917565b97505050612f91565b819450505050505b919050565b613053838361330c565b6130606000848484613175565b61309f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613096906143ee565b60405180910390fd5b505050565b505050565b505050565b6000613110826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134e69092919063ffffffff16565b905060008151111561317057808060200190518101906131309190613bb3565b61316f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131669061474e565b60405180910390fd5b5b505050565b60006131968473ffffffffffffffffffffffffffffffffffffffff166134fe565b156132ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131bf610a9c565b8786866040518563ffffffff1660e01b81526004016131e1949392919061433c565b602060405180830381600087803b1580156131fb57600080fd5b505af192505050801561322c57506040513d601f19601f820116820180604052508101906132299190613c0d565b60015b6132af573d806000811461325c576040519150601f19603f3d011682016040523d82523d6000602084013e613261565b606091505b506000815114156132a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329e906143ee565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613304565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561337c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613373906145ce565b60405180910390fd5b6133858161252f565b156133c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bc9061444e565b60405180910390fd5b6133d1600083836130a4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613421919061488a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134e2600083836130a9565b5050565b60606134f58484600085613521565b90509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606082471015613566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355d9061450e565b60405180910390fd5b61356f856134fe565b6135ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a5906146ee565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135d79190614291565b60006040518083038185875af1925050503d8060008114613614576040519150601f19603f3d011682016040523d82523d6000602084013e613619565b606091505b5091509150613629828286613635565b92505050949350505050565b6060831561364557829050613695565b6000835111156136585782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368c91906143cc565b60405180910390fd5b9392505050565b8280546136a890614af3565b90600052602060002090601f0160209004810192826136ca5760008555613711565b82601f106136e357805160ff1916838001178555613711565b82800160010185558215613711579182015b828111156137105782518255916020019190600101906136f5565b5b50905061371e9190613722565b5090565b5b8082111561373b576000816000905550600101613723565b5090565b600061375261374d846147ae565b614789565b9050808382526020820190508285602086028201111561377557613774614c8f565b5b60005b858110156137a5578161378b8882613833565b845260208401935060208301925050600181019050613778565b5050509392505050565b60006137c26137bd846147da565b614789565b9050828152602081018484840111156137de576137dd614c94565b5b6137e9848285614ab1565b509392505050565b60006138046137ff8461480b565b614789565b9050828152602081018484840111156138205761381f614c94565b5b61382b848285614ab1565b509392505050565b600081359050613842816153b9565b92915050565b600081359050613857816153d0565b92915050565b600082601f83011261387257613871614c8a565b5b813561388284826020860161373f565b91505092915050565b60008135905061389a816153e7565b92915050565b6000815190506138af816153e7565b92915050565b6000813590506138c4816153fe565b92915050565b6000815190506138d9816153fe565b92915050565b600082601f8301126138f4576138f3614c8a565b5b81356139048482602086016137af565b91505092915050565b60008135905061391c81615415565b92915050565b600082601f83011261393757613936614c8a565b5b81356139478482602086016137f1565b91505092915050565b60008135905061395f8161542c565b92915050565b6000815190506139748161542c565b92915050565b6000602082840312156139905761398f614c9e565b5b600061399e84828501613833565b91505092915050565b6000602082840312156139bd576139bc614c9e565b5b60006139cb84828501613848565b91505092915050565b600080604083850312156139eb576139ea614c9e565b5b60006139f985828601613833565b9250506020613a0a85828601613833565b9150509250929050565b600080600060608486031215613a2d57613a2c614c9e565b5b6000613a3b86828701613833565b9350506020613a4c86828701613833565b9250506040613a5d86828701613950565b9150509250925092565b60008060008060808587031215613a8157613a80614c9e565b5b6000613a8f87828801613833565b9450506020613aa087828801613833565b9350506040613ab187828801613950565b925050606085013567ffffffffffffffff811115613ad257613ad1614c99565b5b613ade878288016138df565b91505092959194509250565b60008060408385031215613b0157613b00614c9e565b5b6000613b0f85828601613833565b9250506020613b208582860161388b565b9150509250929050565b60008060408385031215613b4157613b40614c9e565b5b6000613b4f85828601613833565b9250506020613b6085828601613950565b9150509250929050565b600060208284031215613b8057613b7f614c9e565b5b600082013567ffffffffffffffff811115613b9e57613b9d614c99565b5b613baa8482850161385d565b91505092915050565b600060208284031215613bc957613bc8614c9e565b5b6000613bd7848285016138a0565b91505092915050565b600060208284031215613bf657613bf5614c9e565b5b6000613c04848285016138b5565b91505092915050565b600060208284031215613c2357613c22614c9e565b5b6000613c31848285016138ca565b91505092915050565b600060208284031215613c5057613c4f614c9e565b5b6000613c5e8482850161390d565b91505092915050565b60008060408385031215613c7e57613c7d614c9e565b5b6000613c8c8582860161390d565b9250506020613c9d85828601613833565b9150509250929050565b600060208284031215613cbd57613cbc614c9e565b5b600082013567ffffffffffffffff811115613cdb57613cda614c99565b5b613ce784828501613922565b91505092915050565b600060208284031215613d0657613d05614c9e565b5b6000613d1484828501613950565b91505092915050565b600060208284031215613d3357613d32614c9e565b5b6000613d4184828501613965565b91505092915050565b60008060408385031215613d6157613d60614c9e565b5b6000613d6f85828601613950565b9250506020613d8085828601613833565b9150509250929050565b613d9381614a7b565b82525050565b613da2816149d6565b82525050565b613db1816149fa565b82525050565b6000613dc28261483c565b613dcc8185614852565b9350613ddc818560208601614ac0565b613de581614ca3565b840191505092915050565b6000613dfb8261483c565b613e058185614863565b9350613e15818560208601614ac0565b80840191505092915050565b6000613e2c82614847565b613e36818561486e565b9350613e46818560208601614ac0565b613e4f81614ca3565b840191505092915050565b6000613e6582614847565b613e6f818561487f565b9350613e7f818560208601614ac0565b80840191505092915050565b6000613e9860328361486e565b9150613ea382614cb4565b604082019050919050565b6000613ebb60268361486e565b9150613ec682614d03565b604082019050919050565b6000613ede60258361486e565b9150613ee982614d52565b604082019050919050565b6000613f01601c8361486e565b9150613f0c82614da1565b602082019050919050565b6000613f2460268361486e565b9150613f2f82614dca565b604082019050919050565b6000613f4760248361486e565b9150613f5282614e19565b604082019050919050565b6000613f6a60198361486e565b9150613f7582614e68565b602082019050919050565b6000613f8d603a8361486e565b9150613f9882614e91565b604082019050919050565b6000613fb0601d8361486e565b9150613fbb82614ee0565b602082019050919050565b6000613fd360268361486e565b9150613fde82614f09565b604082019050919050565b6000613ff6602c8361486e565b915061400182614f58565b604082019050919050565b6000614019602b8361486e565b915061402482614fa7565b604082019050919050565b600061403c60388361486e565b915061404782614ff6565b604082019050919050565b600061405f602a8361486e565b915061406a82615045565b604082019050919050565b600061408260298361486e565b915061408d82615094565b604082019050919050565b60006140a560208361486e565b91506140b0826150e3565b602082019050919050565b60006140c8602c8361486e565b91506140d38261510c565b604082019050919050565b60006140eb60208361486e565b91506140f68261515b565b602082019050919050565b600061410e600f8361486e565b915061411982615184565b602082019050919050565b6000614131602f8361486e565b915061413c826151ad565b604082019050919050565b600061415460168361486e565b915061415f826151fc565b602082019050919050565b600061417760218361486e565b915061418282615225565b604082019050919050565b600061419a60168361486e565b91506141a582615274565b602082019050919050565b60006141bd600083614863565b91506141c88261529d565b600082019050919050565b60006141e060318361486e565b91506141eb826152a0565b604082019050919050565b6000614203601d8361486e565b915061420e826152ef565b602082019050919050565b6000614226600d8361486e565b915061423182615318565b602082019050919050565b600061424960178361486e565b915061425482615341565b602082019050919050565b600061426c602a8361486e565b91506142778261536a565b604082019050919050565b61428b81614a64565b82525050565b600061429d8284613df0565b915081905092915050565b60006142b48284613e5a565b915081905092915050565b60006142cb8285613e5a565b91506142d78284613e5a565b91508190509392505050565b60006142ee826141b0565b9150819050919050565b600060208201905061430d6000830184613d99565b92915050565b60006040820190506143286000830185613d8a565b6143356020830184614282565b9392505050565b60006080820190506143516000830187613d99565b61435e6020830186613d99565b61436b6040830185614282565b818103606083015261437d8184613db7565b905095945050505050565b600060408201905061439d6000830185613d99565b6143aa6020830184614282565b9392505050565b60006020820190506143c66000830184613da8565b92915050565b600060208201905081810360008301526143e68184613e21565b905092915050565b6000602082019050818103600083015261440781613e8b565b9050919050565b6000602082019050818103600083015261442781613eae565b9050919050565b6000602082019050818103600083015261444781613ed1565b9050919050565b6000602082019050818103600083015261446781613ef4565b9050919050565b6000602082019050818103600083015261448781613f17565b9050919050565b600060208201905081810360008301526144a781613f3a565b9050919050565b600060208201905081810360008301526144c781613f5d565b9050919050565b600060208201905081810360008301526144e781613f80565b9050919050565b6000602082019050818103600083015261450781613fa3565b9050919050565b6000602082019050818103600083015261452781613fc6565b9050919050565b6000602082019050818103600083015261454781613fe9565b9050919050565b600060208201905081810360008301526145678161400c565b9050919050565b600060208201905081810360008301526145878161402f565b9050919050565b600060208201905081810360008301526145a781614052565b9050919050565b600060208201905081810360008301526145c781614075565b9050919050565b600060208201905081810360008301526145e781614098565b9050919050565b60006020820190508181036000830152614607816140bb565b9050919050565b60006020820190508181036000830152614627816140de565b9050919050565b6000602082019050818103600083015261464781614101565b9050919050565b6000602082019050818103600083015261466781614124565b9050919050565b6000602082019050818103600083015261468781614147565b9050919050565b600060208201905081810360008301526146a78161416a565b9050919050565b600060208201905081810360008301526146c78161418d565b9050919050565b600060208201905081810360008301526146e7816141d3565b9050919050565b60006020820190508181036000830152614707816141f6565b9050919050565b6000602082019050818103600083015261472781614219565b9050919050565b600060208201905081810360008301526147478161423c565b9050919050565b600060208201905081810360008301526147678161425f565b9050919050565b60006020820190506147836000830184614282565b92915050565b60006147936147a4565b905061479f8282614b25565b919050565b6000604051905090565b600067ffffffffffffffff8211156147c9576147c8614c5b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156147f5576147f4614c5b565b5b6147fe82614ca3565b9050602081019050919050565b600067ffffffffffffffff82111561482657614825614c5b565b5b61482f82614ca3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061489582614a64565b91506148a083614a64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148d5576148d4614b9f565b5b828201905092915050565b60006148eb82614a6e565b91506148f683614a6e565b92508260ff0382111561490c5761490b614b9f565b5b828201905092915050565b600061492282614a64565b915061492d83614a64565b92508261493d5761493c614bce565b5b828204905092915050565b600061495382614a64565b915061495e83614a64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561499757614996614b9f565b5b828202905092915050565b60006149ad82614a64565b91506149b883614a64565b9250828210156149cb576149ca614b9f565b5b828203905092915050565b60006149e182614a44565b9050919050565b60006149f382614a44565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614a3d826149d6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614a8682614a8d565b9050919050565b6000614a9882614a9f565b9050919050565b6000614aaa82614a44565b9050919050565b82818337600083830152505050565b60005b83811015614ade578082015181840152602081019050614ac3565b83811115614aed576000848401525b50505050565b60006002820490506001821680614b0b57607f821691505b60208210811415614b1f57614b1e614bfd565b5b50919050565b614b2e82614ca3565b810181811067ffffffffffffffff82111715614b4d57614b4c614c5b565b5b80604052505050565b6000614b6182614a64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b9457614b93614b9f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e204944204578697374730000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f766572206d61785065725472616e73616374696f6e00000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f726d616c2053616c65204e6f742041637469766500000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4174204d617820537570706c7900000000000000000000000000000000000000600082015250565b7f496e737566666369656e7420416d6f756e742053656e74000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6153c2816149d6565b81146153cd57600080fd5b50565b6153d9816149e8565b81146153e457600080fd5b50565b6153f0816149fa565b81146153fb57600080fd5b50565b61540781614a06565b811461541257600080fd5b50565b61541e81614a32565b811461542957600080fd5b50565b61543581614a64565b811461544057600080fd5b5056fea2646970667358221220217bc4f3c7c2d469cb0ffbe88e72d63c0b7d746ed27797ff299848423c62141c64736f6c6343000807003300000000000000000000000000000000000000000000000000b1a2bc2ec50000

Deployed Bytecode

0x6080604052600436106102765760003560e01c806370a082311161014f578063b88d4fde116100c1578063e33b7de31161007a578063e33b7de31461097c578063e985e9c5146109a7578063eb73900b146109e4578063f2fde38b14610a21578063f4a0a52814610a4a578063f7ea7a3d14610a73576102bd565b8063b88d4fde14610848578063c87b56dd14610871578063ce7c2ac2146108ae578063d52c57e0146108eb578063d5abeb0114610914578063d79779b21461093f576102bd565b80638da5cb5b116101135780638da5cb5b1461074a57806395d89b41146107755780639852595c146107a05780639f181b5e146107dd578063a040006614610808578063a22cb4651461081f576102bd565b806370a0823114610679578063715018a6146106b65780637f649783146106cd578063853828b6146106f65780638b83209b1461070d576102bd565b80633b2c3fb6116101e85780634b980d67116101ac5780634b980d671461056557806351830227146105905780636352211e146105bb5780636817c76c146105f857806368428a1b146106235780636c0360eb1461064e576102bd565b80633b2c3fb6146104a85780634041b35e146104bf578063406072a9146104d657806342842e0e1461051357806348b750441461053c576102bd565b8063095ea7b31161023a578063095ea7b3146103ae57806318160ddd146103d7578063191655871461040257806323b872dd1461042b57806331b5b907146104545780633a98ef391461047d576102bd565b806301ffc9a7146102c257806302ce5813146102ff57806306fdde031461032a5780630788370314610355578063081812fc14610371576102bd565b366102bd577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a4610a9c565b346040516102b3929190614388565b60405180910390a1005b600080fd5b3480156102ce57600080fd5b506102e960048036038101906102e49190613be0565b610aa4565b6040516102f691906143b1565b60405180910390f35b34801561030b57600080fd5b50610314610b86565b60405161032191906143b1565b60405180910390f35b34801561033657600080fd5b5061033f610b99565b60405161034c91906143cc565b60405180910390f35b61036f600480360381019061036a9190613cf0565b610c2b565b005b34801561037d57600080fd5b5061039860048036038101906103939190613cf0565b610eee565b6040516103a591906142f8565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613b2a565b610f73565b005b3480156103e357600080fd5b506103ec61108b565b6040516103f9919061476e565b60405180910390f35b34801561040e57600080fd5b50610429600480360381019061042491906139a7565b611095565b005b34801561043757600080fd5b50610452600480360381019061044d9190613a14565b611240565b005b34801561046057600080fd5b5061047b60048036038101906104769190613ca7565b6112a0565b005b34801561048957600080fd5b50610492611336565b60405161049f919061476e565b60405180910390f35b3480156104b457600080fd5b506104bd611340565b005b3480156104cb57600080fd5b506104d46113e8565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613c67565b611490565b60405161050a919061476e565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613a14565b611517565b005b34801561054857600080fd5b50610563600480360381019061055e9190613c67565b611537565b005b34801561057157600080fd5b5061057a6117ff565b604051610587919061476e565b60405180910390f35b34801561059c57600080fd5b506105a5611805565b6040516105b291906143b1565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190613cf0565b611818565b6040516105ef91906142f8565b60405180910390f35b34801561060457600080fd5b5061060d6118ca565b60405161061a919061476e565b60405180910390f35b34801561062f57600080fd5b506106386118d0565b60405161064591906143b1565b60405180910390f35b34801561065a57600080fd5b506106636118e3565b60405161067091906143cc565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b919061397a565b611971565b6040516106ad919061476e565b60405180910390f35b3480156106c257600080fd5b506106cb611a29565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190613b6a565b611ab1565b005b34801561070257600080fd5b5061070b611baf565b005b34801561071957600080fd5b50610734600480360381019061072f9190613cf0565b611c9e565b60405161074191906142f8565b60405180910390f35b34801561075657600080fd5b5061075f611ce6565b60405161076c91906142f8565b60405180910390f35b34801561078157600080fd5b5061078a611d10565b60405161079791906143cc565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c2919061397a565b611da2565b6040516107d4919061476e565b60405180910390f35b3480156107e957600080fd5b506107f2611deb565b6040516107ff919061476e565b60405180910390f35b34801561081457600080fd5b5061081d611df1565b005b34801561082b57600080fd5b5061084660048036038101906108419190613aea565b611e99565b005b34801561085457600080fd5b5061086f600480360381019061086a9190613a67565b611eaf565b005b34801561087d57600080fd5b5061089860048036038101906108939190613cf0565b611f11565b6040516108a591906143cc565b60405180910390f35b3480156108ba57600080fd5b506108d560048036038101906108d0919061397a565b612014565b6040516108e2919061476e565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d9190613d4a565b61205d565b005b34801561092057600080fd5b506109296121bc565b604051610936919061476e565b60405180910390f35b34801561094b57600080fd5b5061096660048036038101906109619190613c3a565b6121c2565b604051610973919061476e565b60405180910390f35b34801561098857600080fd5b5061099161220b565b60405161099e919061476e565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c991906139d4565b612215565b6040516109db91906143b1565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a06919061397a565b6122a9565b604051610a18919061476e565b60405180910390f35b348015610a2d57600080fd5b50610a486004803603810190610a43919061397a565b6122c1565b005b348015610a5657600080fd5b50610a716004803603810190610a6c9190613cf0565b6123b9565b005b348015610a7f57600080fd5b50610a9a6004803603810190610a959190613cf0565b61243f565b005b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b7f5750610b7e826124c5565b5b9050919050565b601560019054906101000a900460ff1681565b606060008054610ba890614af3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd490614af3565b8015610c215780601f10610bf657610100808354040283529160200191610c21565b820191906000526020600020905b815481529060010190602001808311610c0457829003601f168201915b5050505050905090565b60011515601560009054906101000a900460ff1615151480610cab575060011515601560019054906101000a900460ff161515148015610caa575080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b5b610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce1906146ae565b60405180910390fd5b601254811115610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d269061466e565b60405180910390fd5b80601054610d3d9190614948565b3414610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d759061472e565b60405180910390fd5b60115481601354610d8f919061488a565b10610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061470e565b60405180910390fd5b60005b81811015610e5c57610de560135461252f565b15610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c9061462e565b60405180910390fd5b610e313360135461259b565b60136000815480929190610e4490614b56565b91905055508080610e5490614b56565b915050610dd2565b506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610eeb576000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50565b6000610ef98261252f565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f906145ee565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611818565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe69061468e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100e610a9c565b73ffffffffffffffffffffffffffffffffffffffff16148061103d575061103c81611037610a9c565b612215565b5b61107c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110739061456e565b60405180910390fd5b61108683836125b9565b505050565b6000601354905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e9061446e565b60405180910390fd5b600061112161220b565b4761112c919061488a565b90506000611143838361113e86611da2565b612672565b90506000811415611189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111809061454e565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111d8919061488a565b9250508190555080600860008282546111f1919061488a565b9250508190555061120283826126e0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051611233929190614313565b60405180910390a1505050565b61125161124b610a9c565b826127d4565b611290576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611287906146ce565b60405180910390fd5b61129b8383836128b2565b505050565b6112a8610a9c565b73ffffffffffffffffffffffffffffffffffffffff166112c6611ce6565b73ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113139061460e565b60405180910390fd5b806016908051906020019061133292919061369c565b5050565b6000600754905090565b611348610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611366611ce6565b73ffffffffffffffffffffffffffffffffffffffff16146113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b39061460e565b60405180910390fd5b601560029054906101000a900460ff1615601560026101000a81548160ff021916908315150217905550565b6113f0610a9c565b73ffffffffffffffffffffffffffffffffffffffff1661140e611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b9061460e565b60405180910390fd5b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61153283838360405180602001604052806000815250611eaf565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b09061446e565b60405180910390fd5b60006115c4836121c2565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115fd91906142f8565b60206040518083038186803b15801561161557600080fd5b505afa158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190613d1d565b611657919061488a565b9050600061166f838361166a8787611490565b612672565b905060008114156116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac9061454e565b60405180910390fd5b80600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611741919061488a565b9250508190555080600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611797919061488a565b925050819055506117a9848483612b19565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516117f1929190614388565b60405180910390a250505050565b60125481565b601560029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b8906145ae565b60405180910390fd5b80915050919050565b60105481565b601560009054906101000a900460ff1681565b601680546118f090614af3565b80601f016020809104026020016040519081016040528092919081815260200182805461191c90614af3565b80156119695780601f1061193e57610100808354040283529160200191611969565b820191906000526020600020905b81548152906001019060200180831161194c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d99061458e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a31610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611a4f611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c9061460e565b60405180910390fd5b611aaf6000612b9f565b565b611ab9610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611ad7611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b249061460e565b60405180910390fd5b60005b8151811015611bab57600160146000848481518110611b5257611b51614c2c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611ba390614b56565b915050611b30565b5050565b611bb7610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611bd5611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c229061460e565b60405180910390fd5b60005b600e80549050811015611c9b576000600e8281548110611c5157611c50614c2c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611c8781611095565b508080611c9390614b56565b915050611c2e565b50565b6000600b8281548110611cb457611cb3614c2c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611d1f90614af3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4b90614af3565b8015611d985780601f10611d6d57610100808354040283529160200191611d98565b820191906000526020600020905b815481529060010190602001808311611d7b57829003601f168201915b5050505050905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60135481565b611df9610a9c565b73ffffffffffffffffffffffffffffffffffffffff16611e17611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e649061460e565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b611eab611ea4610a9c565b8383612c65565b5050565b611ec0611eba610a9c565b836127d4565b611eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef6906146ce565b60405180910390fd5b611f0b84848484612dd2565b50505050565b6060611f1c8261252f565b611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f529061464e565b60405180910390fd5b6000611f65612e2e565b9050601560029054906101000a900460ff16611fc2576000815111611f995760405180602001604052806000815250611fba565b80604051602001611faa91906142a8565b6040516020818303038152906040525b91505061200f565b6000815111611fe0576040518060200160405280600081525061200b565b80611fea84612ec0565b604051602001611ffb9291906142bf565b6040516020818303038152906040525b9150505b919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612065610a9c565b73ffffffffffffffffffffffffffffffffffffffff16612083611ce6565b73ffffffffffffffffffffffffffffffffffffffff16146120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d09061460e565b60405180910390fd5b601154826013546120ea919061488a565b1061212a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121219061470e565b60405180910390fd5b60005b828110156121b75761214060135461252f565b15612180576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121779061462e565b60405180910390fd5b61218c8260135461259b565b6013600081548092919061219f90614b56565b919050555080806121af90614b56565b91505061212d565b505050565b60115481565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600854905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60146020528060005260406000206000915090505481565b6122c9610a9c565b73ffffffffffffffffffffffffffffffffffffffff166122e7611ce6565b73ffffffffffffffffffffffffffffffffffffffff161461233d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123349061460e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a49061440e565b60405180910390fd5b6123b681612b9f565b50565b6123c1610a9c565b73ffffffffffffffffffffffffffffffffffffffff166123df611ce6565b73ffffffffffffffffffffffffffffffffffffffff1614612435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c9061460e565b60405180910390fd5b8060108190555050565b612447610a9c565b73ffffffffffffffffffffffffffffffffffffffff16612465611ce6565b73ffffffffffffffffffffffffffffffffffffffff16146124bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b29061460e565b60405180910390fd5b8060118190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6125b5828260405180602001604052806000815250613049565b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661262c83611818565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600754600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856126c39190614948565b6126cd9190614917565b6126d791906149a2565b90509392505050565b80471015612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a906144ee565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612749906142e3565b60006040518083038185875af1925050503d8060008114612786576040519150601f19603f3d011682016040523d82523d6000602084013e61278b565b606091505b50509050806127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c6906144ce565b60405180910390fd5b505050565b60006127df8261252f565b61281e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128159061452e565b60405180910390fd5b600061282983611818565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061289857508373ffffffffffffffffffffffffffffffffffffffff1661288084610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b806128a957506128a88185612215565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128d282611818565b73ffffffffffffffffffffffffffffffffffffffff1614612928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291f9061442e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f9061448e565b60405180910390fd5b6129a38383836130a4565b6129ae6000826125b9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129fe91906149a2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a55919061488a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b148383836130a9565b505050565b612b9a8363a9059cbb60e01b8484604051602401612b38929190614388565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130ae565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccb906144ae565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612dc591906143b1565b60405180910390a3505050565b612ddd8484846128b2565b612de984848484613175565b612e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1f906143ee565b60405180910390fd5b50505050565b606060168054612e3d90614af3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6990614af3565b8015612eb65780601f10612e8b57610100808354040283529160200191612eb6565b820191906000526020600020905b815481529060010190602001808311612e9957829003601f168201915b5050505050905090565b60606000821415612f08576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613044565b600082905060005b60008214612f3a578080612f2390614b56565b915050600a82612f339190614917565b9150612f10565b60008167ffffffffffffffff811115612f5657612f55614c5b565b5b6040519080825280601f01601f191660200182016040528015612f885781602001600182028036833780820191505090505b50905060008290505b6000861461303c57600181612fa691906149a2565b90506000600a8088612fb89190614917565b612fc29190614948565b87612fcd91906149a2565b6030612fd991906148e0565b905060008160f81b905080848481518110612ff757612ff6614c2c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886130339190614917565b97505050612f91565b819450505050505b919050565b613053838361330c565b6130606000848484613175565b61309f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613096906143ee565b60405180910390fd5b505050565b505050565b505050565b6000613110826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134e69092919063ffffffff16565b905060008151111561317057808060200190518101906131309190613bb3565b61316f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131669061474e565b60405180910390fd5b5b505050565b60006131968473ffffffffffffffffffffffffffffffffffffffff166134fe565b156132ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131bf610a9c565b8786866040518563ffffffff1660e01b81526004016131e1949392919061433c565b602060405180830381600087803b1580156131fb57600080fd5b505af192505050801561322c57506040513d601f19601f820116820180604052508101906132299190613c0d565b60015b6132af573d806000811461325c576040519150601f19603f3d011682016040523d82523d6000602084013e613261565b606091505b506000815114156132a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329e906143ee565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613304565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561337c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613373906145ce565b60405180910390fd5b6133858161252f565b156133c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bc9061444e565b60405180910390fd5b6133d1600083836130a4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613421919061488a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134e2600083836130a9565b5050565b60606134f58484600085613521565b90509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606082471015613566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355d9061450e565b60405180910390fd5b61356f856134fe565b6135ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a5906146ee565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135d79190614291565b60006040518083038185875af1925050503d8060008114613614576040519150601f19603f3d011682016040523d82523d6000602084013e613619565b606091505b5091509150613629828286613635565b92505050949350505050565b6060831561364557829050613695565b6000835111156136585782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368c91906143cc565b60405180910390fd5b9392505050565b8280546136a890614af3565b90600052602060002090601f0160209004810192826136ca5760008555613711565b82601f106136e357805160ff1916838001178555613711565b82800160010185558215613711579182015b828111156137105782518255916020019190600101906136f5565b5b50905061371e9190613722565b5090565b5b8082111561373b576000816000905550600101613723565b5090565b600061375261374d846147ae565b614789565b9050808382526020820190508285602086028201111561377557613774614c8f565b5b60005b858110156137a5578161378b8882613833565b845260208401935060208301925050600181019050613778565b5050509392505050565b60006137c26137bd846147da565b614789565b9050828152602081018484840111156137de576137dd614c94565b5b6137e9848285614ab1565b509392505050565b60006138046137ff8461480b565b614789565b9050828152602081018484840111156138205761381f614c94565b5b61382b848285614ab1565b509392505050565b600081359050613842816153b9565b92915050565b600081359050613857816153d0565b92915050565b600082601f83011261387257613871614c8a565b5b813561388284826020860161373f565b91505092915050565b60008135905061389a816153e7565b92915050565b6000815190506138af816153e7565b92915050565b6000813590506138c4816153fe565b92915050565b6000815190506138d9816153fe565b92915050565b600082601f8301126138f4576138f3614c8a565b5b81356139048482602086016137af565b91505092915050565b60008135905061391c81615415565b92915050565b600082601f83011261393757613936614c8a565b5b81356139478482602086016137f1565b91505092915050565b60008135905061395f8161542c565b92915050565b6000815190506139748161542c565b92915050565b6000602082840312156139905761398f614c9e565b5b600061399e84828501613833565b91505092915050565b6000602082840312156139bd576139bc614c9e565b5b60006139cb84828501613848565b91505092915050565b600080604083850312156139eb576139ea614c9e565b5b60006139f985828601613833565b9250506020613a0a85828601613833565b9150509250929050565b600080600060608486031215613a2d57613a2c614c9e565b5b6000613a3b86828701613833565b9350506020613a4c86828701613833565b9250506040613a5d86828701613950565b9150509250925092565b60008060008060808587031215613a8157613a80614c9e565b5b6000613a8f87828801613833565b9450506020613aa087828801613833565b9350506040613ab187828801613950565b925050606085013567ffffffffffffffff811115613ad257613ad1614c99565b5b613ade878288016138df565b91505092959194509250565b60008060408385031215613b0157613b00614c9e565b5b6000613b0f85828601613833565b9250506020613b208582860161388b565b9150509250929050565b60008060408385031215613b4157613b40614c9e565b5b6000613b4f85828601613833565b9250506020613b6085828601613950565b9150509250929050565b600060208284031215613b8057613b7f614c9e565b5b600082013567ffffffffffffffff811115613b9e57613b9d614c99565b5b613baa8482850161385d565b91505092915050565b600060208284031215613bc957613bc8614c9e565b5b6000613bd7848285016138a0565b91505092915050565b600060208284031215613bf657613bf5614c9e565b5b6000613c04848285016138b5565b91505092915050565b600060208284031215613c2357613c22614c9e565b5b6000613c31848285016138ca565b91505092915050565b600060208284031215613c5057613c4f614c9e565b5b6000613c5e8482850161390d565b91505092915050565b60008060408385031215613c7e57613c7d614c9e565b5b6000613c8c8582860161390d565b9250506020613c9d85828601613833565b9150509250929050565b600060208284031215613cbd57613cbc614c9e565b5b600082013567ffffffffffffffff811115613cdb57613cda614c99565b5b613ce784828501613922565b91505092915050565b600060208284031215613d0657613d05614c9e565b5b6000613d1484828501613950565b91505092915050565b600060208284031215613d3357613d32614c9e565b5b6000613d4184828501613965565b91505092915050565b60008060408385031215613d6157613d60614c9e565b5b6000613d6f85828601613950565b9250506020613d8085828601613833565b9150509250929050565b613d9381614a7b565b82525050565b613da2816149d6565b82525050565b613db1816149fa565b82525050565b6000613dc28261483c565b613dcc8185614852565b9350613ddc818560208601614ac0565b613de581614ca3565b840191505092915050565b6000613dfb8261483c565b613e058185614863565b9350613e15818560208601614ac0565b80840191505092915050565b6000613e2c82614847565b613e36818561486e565b9350613e46818560208601614ac0565b613e4f81614ca3565b840191505092915050565b6000613e6582614847565b613e6f818561487f565b9350613e7f818560208601614ac0565b80840191505092915050565b6000613e9860328361486e565b9150613ea382614cb4565b604082019050919050565b6000613ebb60268361486e565b9150613ec682614d03565b604082019050919050565b6000613ede60258361486e565b9150613ee982614d52565b604082019050919050565b6000613f01601c8361486e565b9150613f0c82614da1565b602082019050919050565b6000613f2460268361486e565b9150613f2f82614dca565b604082019050919050565b6000613f4760248361486e565b9150613f5282614e19565b604082019050919050565b6000613f6a60198361486e565b9150613f7582614e68565b602082019050919050565b6000613f8d603a8361486e565b9150613f9882614e91565b604082019050919050565b6000613fb0601d8361486e565b9150613fbb82614ee0565b602082019050919050565b6000613fd360268361486e565b9150613fde82614f09565b604082019050919050565b6000613ff6602c8361486e565b915061400182614f58565b604082019050919050565b6000614019602b8361486e565b915061402482614fa7565b604082019050919050565b600061403c60388361486e565b915061404782614ff6565b604082019050919050565b600061405f602a8361486e565b915061406a82615045565b604082019050919050565b600061408260298361486e565b915061408d82615094565b604082019050919050565b60006140a560208361486e565b91506140b0826150e3565b602082019050919050565b60006140c8602c8361486e565b91506140d38261510c565b604082019050919050565b60006140eb60208361486e565b91506140f68261515b565b602082019050919050565b600061410e600f8361486e565b915061411982615184565b602082019050919050565b6000614131602f8361486e565b915061413c826151ad565b604082019050919050565b600061415460168361486e565b915061415f826151fc565b602082019050919050565b600061417760218361486e565b915061418282615225565b604082019050919050565b600061419a60168361486e565b91506141a582615274565b602082019050919050565b60006141bd600083614863565b91506141c88261529d565b600082019050919050565b60006141e060318361486e565b91506141eb826152a0565b604082019050919050565b6000614203601d8361486e565b915061420e826152ef565b602082019050919050565b6000614226600d8361486e565b915061423182615318565b602082019050919050565b600061424960178361486e565b915061425482615341565b602082019050919050565b600061426c602a8361486e565b91506142778261536a565b604082019050919050565b61428b81614a64565b82525050565b600061429d8284613df0565b915081905092915050565b60006142b48284613e5a565b915081905092915050565b60006142cb8285613e5a565b91506142d78284613e5a565b91508190509392505050565b60006142ee826141b0565b9150819050919050565b600060208201905061430d6000830184613d99565b92915050565b60006040820190506143286000830185613d8a565b6143356020830184614282565b9392505050565b60006080820190506143516000830187613d99565b61435e6020830186613d99565b61436b6040830185614282565b818103606083015261437d8184613db7565b905095945050505050565b600060408201905061439d6000830185613d99565b6143aa6020830184614282565b9392505050565b60006020820190506143c66000830184613da8565b92915050565b600060208201905081810360008301526143e68184613e21565b905092915050565b6000602082019050818103600083015261440781613e8b565b9050919050565b6000602082019050818103600083015261442781613eae565b9050919050565b6000602082019050818103600083015261444781613ed1565b9050919050565b6000602082019050818103600083015261446781613ef4565b9050919050565b6000602082019050818103600083015261448781613f17565b9050919050565b600060208201905081810360008301526144a781613f3a565b9050919050565b600060208201905081810360008301526144c781613f5d565b9050919050565b600060208201905081810360008301526144e781613f80565b9050919050565b6000602082019050818103600083015261450781613fa3565b9050919050565b6000602082019050818103600083015261452781613fc6565b9050919050565b6000602082019050818103600083015261454781613fe9565b9050919050565b600060208201905081810360008301526145678161400c565b9050919050565b600060208201905081810360008301526145878161402f565b9050919050565b600060208201905081810360008301526145a781614052565b9050919050565b600060208201905081810360008301526145c781614075565b9050919050565b600060208201905081810360008301526145e781614098565b9050919050565b60006020820190508181036000830152614607816140bb565b9050919050565b60006020820190508181036000830152614627816140de565b9050919050565b6000602082019050818103600083015261464781614101565b9050919050565b6000602082019050818103600083015261466781614124565b9050919050565b6000602082019050818103600083015261468781614147565b9050919050565b600060208201905081810360008301526146a78161416a565b9050919050565b600060208201905081810360008301526146c78161418d565b9050919050565b600060208201905081810360008301526146e7816141d3565b9050919050565b60006020820190508181036000830152614707816141f6565b9050919050565b6000602082019050818103600083015261472781614219565b9050919050565b600060208201905081810360008301526147478161423c565b9050919050565b600060208201905081810360008301526147678161425f565b9050919050565b60006020820190506147836000830184614282565b92915050565b60006147936147a4565b905061479f8282614b25565b919050565b6000604051905090565b600067ffffffffffffffff8211156147c9576147c8614c5b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156147f5576147f4614c5b565b5b6147fe82614ca3565b9050602081019050919050565b600067ffffffffffffffff82111561482657614825614c5b565b5b61482f82614ca3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061489582614a64565b91506148a083614a64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148d5576148d4614b9f565b5b828201905092915050565b60006148eb82614a6e565b91506148f683614a6e565b92508260ff0382111561490c5761490b614b9f565b5b828201905092915050565b600061492282614a64565b915061492d83614a64565b92508261493d5761493c614bce565b5b828204905092915050565b600061495382614a64565b915061495e83614a64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561499757614996614b9f565b5b828202905092915050565b60006149ad82614a64565b91506149b883614a64565b9250828210156149cb576149ca614b9f565b5b828203905092915050565b60006149e182614a44565b9050919050565b60006149f382614a44565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614a3d826149d6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614a8682614a8d565b9050919050565b6000614a9882614a9f565b9050919050565b6000614aaa82614a44565b9050919050565b82818337600083830152505050565b60005b83811015614ade578082015181840152602081019050614ac3565b83811115614aed576000848401525b50505050565b60006002820490506001821680614b0b57607f821691505b60208210811415614b1f57614b1e614bfd565b5b50919050565b614b2e82614ca3565b810181811067ffffffffffffffff82111715614b4d57614b4c614c5b565b5b80604052505050565b6000614b6182614a64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b9457614b93614b9f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e204944204578697374730000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f766572206d61785065725472616e73616374696f6e00000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f726d616c2053616c65204e6f742041637469766500000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4174204d617820537570706c7900000000000000000000000000000000000000600082015250565b7f496e737566666369656e7420416d6f756e742053656e74000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6153c2816149d6565b81146153cd57600080fd5b50565b6153d9816149e8565b81146153e457600080fd5b50565b6153f0816149fa565b81146153fb57600080fd5b50565b61540781614a06565b811461541257600080fd5b50565b61541e81614a32565b811461542957600080fd5b50565b61543581614a64565b811461544057600080fd5b5056fea2646970667358221220217bc4f3c7c2d469cb0ffbe88e72d63c0b7d746ed27797ff299848423c62141c64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000b1a2bc2ec50000

-----Decoded View---------------
Arg [0] : _mintPrice (uint256): 50000000000000000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000


Deployed Bytecode Sourcemap

52458:4386:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24539:40;24555:12;:10;:12::i;:::-;24569:9;24539:40;;;;;;;:::i;:::-;;;;;;;;52458:4386;;;;;39260:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53183:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40205:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54385:726;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41764:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41287:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55636:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26325:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42514:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54071:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24670:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54182:80;;;;;;;;;;;;;:::i;:::-;;55739:95;;;;;;;;;;;;;:::i;:::-;;25799:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42924:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27159:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53029:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53217:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39899:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52963:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53154:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53250:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39629:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7838:103;;;;;;;;;;;;;:::i;:::-;;55450:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56055:202;;;;;;;;;;;;;:::i;:::-;;26025:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7187:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40374:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25521:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53070:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55842:87;;;;;;;;;;;;;:::i;:::-;;42057:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43180:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53490:449;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25317:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55117:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52991:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25107:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24855:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42283:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53103:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8096:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55941:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54273:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5858:98;5911:7;5938:10;5931:17;;5858:98;:::o;39260:305::-;39362:4;39414:25;39399:40;;;:11;:40;;;;:105;;;;39471:33;39456:48;;;:11;:48;;;;39399:105;:158;;;;39521:36;39545:11;39521:23;:36::i;:::-;39399:158;39379:178;;39260:305;;;:::o;53183:27::-;;;;;;;;;;;;;:::o;40205:100::-;40259:13;40292:5;40285:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40205:100;:::o;54385:726::-;54470:4;54456:18;;:10;;;;;;;;;;;:18;;;:82;;;;54498:4;54479:23;;:15;;;;;;;;;;;:23;;;:58;;;;;54531:6;54506:9;:21;54516:10;54506:21;;;;;;;;;;;;;;;;:31;;54479:58;54456:82;54448:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;54594:17;;54584:6;:27;;54576:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54682:6;54670:9;;:18;;;;:::i;:::-;54657:9;:31;54649:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54767:9;;54758:6;54745:10;;:19;;;;:::i;:::-;:31;54737:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54829:6;54825:188;54845:6;54841:1;:10;54825:188;;;54881:25;54895:10;;54881:13;:25::i;:::-;54880:26;54872:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;54941:33;54951:10;54963;;54941:9;:33::i;:::-;54989:10;;:12;;;;;;;;;:::i;:::-;;;;;;54853:3;;;;;:::i;:::-;;;;54825:188;;;;55050:1;55026:9;:21;55036:10;55026:21;;;;;;;;;;;;;;;;:25;55023:81;;;55091:1;55067:9;:21;55077:10;55067:21;;;;;;;;;;;;;;;:25;;;;55023:81;54385:726;:::o;41764:221::-;41840:7;41868:16;41876:7;41868;:16::i;:::-;41860:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41953:15;:24;41969:7;41953:24;;;;;;;;;;;;;;;;;;;;;41946:31;;41764:221;;;:::o;41287:411::-;41368:13;41384:23;41399:7;41384:14;:23::i;:::-;41368:39;;41432:5;41426:11;;:2;:11;;;;41418:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41526:5;41510:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41535:37;41552:5;41559:12;:10;:12::i;:::-;41535:16;:37::i;:::-;41510:62;41488:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;41669:21;41678:2;41682:7;41669:8;:21::i;:::-;41357:341;41287:411;;:::o;55636:91::-;55682:7;55709:10;;55702:17;;55636:91;:::o;26325:566::-;26420:1;26401:7;:16;26409:7;26401:16;;;;;;;;;;;;;;;;:20;26393:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26477:21;26525:15;:13;:15::i;:::-;26501:21;:39;;;;:::i;:::-;26477:63;;26551:15;26569:58;26585:7;26594:13;26609:17;26618:7;26609:8;:17::i;:::-;26569:15;:58::i;:::-;26551:76;;26659:1;26648:7;:12;;26640:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26743:7;26721:9;:18;26731:7;26721:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;26779:7;26761:14;;:25;;;;;;;:::i;:::-;;;;;;;;26799:35;26817:7;26826;26799:17;:35::i;:::-;26850:33;26866:7;26875;26850:33;;;;;;;:::i;:::-;;;;;;;;26382:509;;26325:566;:::o;42514:339::-;42709:41;42728:12;:10;:12::i;:::-;42742:7;42709:18;:41::i;:::-;42701:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;42817:28;42827:4;42833:2;42837:7;42817:9;:28::i;:::-;42514:339;;;:::o;54071:105::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54157:11:::1;54147:7;:21;;;;;;;;;;;;:::i;:::-;;54071:105:::0;:::o;24670:91::-;24714:7;24741:12;;24734:19;;24670:91;:::o;54182:80::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54246:8:::1;;;;;;;;;;;54245:9;54234:8;;:20;;;;;;;;;;;;;;;;;;54182:80::o:0;55739:95::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55811:15:::1;;;;;;;;;;;55810:16;55792:15;;:34;;;;;;;;;;;;;;;;;;55739:95::o:0;25799:135::-;25869:7;25896:14;:21;25911:5;25896:21;;;;;;;;;;;;;;;:30;25918:7;25896:30;;;;;;;;;;;;;;;;25889:37;;25799:135;;;;:::o;42924:185::-;43062:39;43079:4;43085:2;43089:7;43062:39;;;;;;;;;;;;:16;:39::i;:::-;42924:185;;;:::o;27159:641::-;27260:1;27241:7;:16;27249:7;27241:16;;;;;;;;;;;;;;;;:20;27233:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27317:21;27374:20;27388:5;27374:13;:20::i;:::-;27341:5;:15;;;27365:4;27341:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;27317:77;;27405:15;27423:65;27439:7;27448:13;27463:24;27472:5;27479:7;27463:8;:24::i;:::-;27423:15;:65::i;:::-;27405:83;;27520:1;27509:7;:12;;27501:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27616:7;27582:14;:21;27597:5;27582:21;;;;;;;;;;;;;;;:30;27604:7;27582:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;27664:7;27634:19;:26;27654:5;27634:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;27684:47;27707:5;27714:7;27723;27684:22;:47::i;:::-;27768:5;27747:45;;;27775:7;27784;27747:45;;;;;;;:::i;:::-;;;;;;;;27222:578;;27159:641;;:::o;53029:34::-;;;;:::o;53217:20::-;;;;;;;;;;;;;:::o;39899:239::-;39971:7;39991:13;40007:7;:16;40015:7;40007:16;;;;;;;;;;;;;;;;;;;;;39991:32;;40059:1;40042:19;;:5;:19;;;;40034:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40125:5;40118:12;;;39899:239;;;:::o;52963:21::-;;;;:::o;53154:22::-;;;;;;;;;;;;;:::o;53250:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39629:208::-;39701:7;39746:1;39729:19;;:5;:19;;;;39721:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39813:9;:16;39823:5;39813:16;;;;;;;;;;;;;;;;39806:23;;39629:208;;;:::o;7838:103::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7903:30:::1;7930:1;7903:18;:30::i;:::-;7838:103::o:0;55450:180::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55532:6:::1;55528:95;55549:8;:15;55545:1;:19;55528:95;;;55610:1;55585:9;:22;55595:8;55604:1;55595:11;;;;;;;;:::i;:::-;;;;;;;;55585:22;;;;;;;;;;;;;;;:26;;;;55566:3;;;;;:::i;:::-;;;;55528:95;;;;55450:180:::0;:::o;56055:202::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56113:9:::1;56108:142;56132:5;:12;;;;56128:1;:16;56108:142;;;56166:22;56199:5;56205:1;56199:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56166:42;;56223:15;56231:6;56223:7;:15::i;:::-;56151:99;56146:3;;;;;:::i;:::-;;;;56108:142;;;;56055:202::o:0;26025:100::-;26076:7;26103;26111:5;26103:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26096:21;;26025:100;;;:::o;7187:87::-;7233:7;7260:6;;;;;;;;;;;7253:13;;7187:87;:::o;40374:104::-;40430:13;40463:7;40456:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40374:104;:::o;25521:109::-;25577:7;25604:9;:18;25614:7;25604:18;;;;;;;;;;;;;;;;25597:25;;25521:109;;;:::o;53070:26::-;;;;:::o;55842:87::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55911:10:::1;;;;;;;;;;;55910:11;55897:10;;:24;;;;;;;;;;;;;;;;;;55842:87::o:0;42057:155::-;42152:52;42171:12;:10;:12::i;:::-;42185:8;42195;42152:18;:52::i;:::-;42057:155;;:::o;43180:328::-;43355:41;43374:12;:10;:12::i;:::-;43388:7;43355:18;:41::i;:::-;43347:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;43461:39;43475:4;43481:2;43485:7;43494:5;43461:13;:39::i;:::-;43180:328;;;;:::o;53490:449::-;53563:13;53597:16;53605:7;53597;:16::i;:::-;53589:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53686:18;53707:10;:8;:10::i;:::-;53686:31;;53732:8;;;;;;;;;;;53728:107;;53784:1;53769:4;53763:18;:22;:60;;;;;;;;;;;;;;;;;53812:4;53795:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;53763:60;53756:67;;;;;53728:107;53873:1;53858:4;53852:18;:22;:79;;;;;;;;;;;;;;;;;53901:4;53907:17;53916:7;53907:8;:17::i;:::-;53884:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53852:79;53845:86;;;53490:449;;;;:::o;25317:105::-;25371:7;25398;:16;25406:7;25398:16;;;;;;;;;;;;;;;;25391:23;;25317:105;;;:::o;55117:327::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55219:9:::1;;55210:6;55197:10;;:19;;;;:::i;:::-;:31;55189:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55261:6;55257:180;55277:6;55273:1;:10;55257:180;;;55313:25;55327:10;;55313:13;:25::i;:::-;55312:26;55304:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;55373:25;55383:3;55387:10;;55373:9;:25::i;:::-;55413:10;;:12;;;;;;;;;:::i;:::-;;;;;;55285:3;;;;;:::i;:::-;;;;55257:180;;;;55117:327:::0;;:::o;52991:31::-;;;;:::o;25107:119::-;25165:7;25192:19;:26;25212:5;25192:26;;;;;;;;;;;;;;;;25185:33;;25107:119;;;:::o;24855:95::-;24901:7;24928:14;;24921:21;;24855:95;:::o;42283:164::-;42380:4;42404:18;:25;42423:5;42404:25;;;;;;;;;;;;;;;:35;42430:8;42404:35;;;;;;;;;;;;;;;;;;;;;;;;;42397:42;;42283:164;;;;:::o;53103:44::-;;;;;;;;;;;;;;;;;:::o;8096:201::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8205:1:::1;8185:22;;:8;:22;;;;8177:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8261:28;8280:8;8261:18;:28::i;:::-;8096:201:::0;:::o;55941:102::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56025:10:::1;56013:9;:22;;;;55941:102:::0;:::o;54273:100::-;7418:12;:10;:12::i;:::-;7407:23;;:7;:5;:7::i;:::-;:23;;;7399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54354:12:::1;54342:9;:24;;;;54273:100:::0;:::o;31870:157::-;31955:4;31994:25;31979:40;;;:11;:40;;;;31972:47;;31870:157;;;:::o;45018:127::-;45083:4;45135:1;45107:30;;:7;:16;45115:7;45107:16;;;;;;;;;;;;;;;;;;;;;:30;;;;45100:37;;45018:127;;;:::o;46002:110::-;46078:26;46088:2;46092:7;46078:26;;;;;;;;;;;;:9;:26::i;:::-;46002:110;;:::o;49164:174::-;49266:2;49239:15;:24;49255:7;49239:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49322:7;49318:2;49284:46;;49293:23;49308:7;49293:14;:23::i;:::-;49284:46;;;;;;;;;;;;49164:174;;:::o;27978:248::-;28124:7;28203:15;28188:12;;28168:7;:16;28176:7;28168:16;;;;;;;;;;;;;;;;28152:13;:32;;;;:::i;:::-;28151:49;;;;:::i;:::-;:67;;;;:::i;:::-;28144:74;;27978:248;;;;;:::o;11187:317::-;11302:6;11277:21;:31;;11269:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11356:12;11374:9;:14;;11396:6;11374:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11355:52;;;11426:7;11418:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;11258:246;11187:317;;:::o;45312:348::-;45405:4;45430:16;45438:7;45430;:16::i;:::-;45422:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45506:13;45522:23;45537:7;45522:14;:23::i;:::-;45506:39;;45575:5;45564:16;;:7;:16;;;:51;;;;45608:7;45584:31;;:20;45596:7;45584:11;:20::i;:::-;:31;;;45564:51;:87;;;;45619:32;45636:5;45643:7;45619:16;:32::i;:::-;45564:87;45556:96;;;45312:348;;;;:::o;48421:625::-;48580:4;48553:31;;:23;48568:7;48553:14;:23::i;:::-;:31;;;48545:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48659:1;48645:16;;:2;:16;;;;48637:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48715:39;48736:4;48742:2;48746:7;48715:20;:39::i;:::-;48819:29;48836:1;48840:7;48819:8;:29::i;:::-;48880:1;48861:9;:15;48871:4;48861:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;48909:1;48892:9;:13;48902:2;48892:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48940:2;48921:7;:16;48929:7;48921:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48979:7;48975:2;48960:27;;48969:4;48960:27;;;;;;;;;;;;49000:38;49020:4;49026:2;49030:7;49000:19;:38::i;:::-;48421:625;;;:::o;17946:211::-;18063:86;18083:5;18113:23;;;18138:2;18142:5;18090:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18063:19;:86::i;:::-;17946:211;;;:::o;8457:191::-;8531:16;8550:6;;;;;;;;;;;8531:25;;8576:8;8567:6;;:17;;;;;;;;;;;;;;;;;;8631:8;8600:40;;8621:8;8600:40;;;;;;;;;;;;8520:128;8457:191;:::o;49480:315::-;49635:8;49626:17;;:5;:17;;;;49618:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49722:8;49684:18;:25;49703:5;49684:25;;;;;;;;;;;;;;;:35;49710:8;49684:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49768:8;49746:41;;49761:5;49746:41;;;49778:8;49746:41;;;;;;:::i;:::-;;;;;;;;49480:315;;;:::o;44390:::-;44547:28;44557:4;44563:2;44567:7;44547:9;:28::i;:::-;44594:48;44617:4;44623:2;44627:7;44636:5;44594:22;:48::i;:::-;44586:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;44390:315;;;;:::o;53951:108::-;54011:13;54044:7;54037:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53951:108;:::o;56269:572::-;56318:27;56368:1;56362:2;:7;56358:50;;;56386:10;;;;;;;;;;;;;;;;;;;;;56358:50;56418:6;56427:2;56418:11;;56440:8;56459:69;56471:1;56466;:6;56459:69;;56489:5;;;;;:::i;:::-;;;;56514:2;56509:7;;;;;:::i;:::-;;;56459:69;;;56538:17;56568:3;56558:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56538:34;;56583:6;56592:3;56583:12;;56606:198;56619:1;56613:2;:7;56606:198;;56643:1;56641;:3;;;;:::i;:::-;56637:7;;56659:10;56699:2;56694;56689;:7;;;;:::i;:::-;:12;;;;:::i;:::-;56684:2;:17;;;;:::i;:::-;56673:2;:29;;;;:::i;:::-;56659:44;;56718:9;56737:4;56730:12;;56718:24;;56767:2;56757:4;56762:1;56757:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;56790:2;56784:8;;;;;:::i;:::-;;;56622:182;;56606:198;;;56828:4;56814:19;;;;;;56269:572;;;;:::o;46339:321::-;46469:18;46475:2;46479:7;46469:5;:18::i;:::-;46520:54;46551:1;46555:2;46559:7;46568:5;46520:22;:54::i;:::-;46498:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;46339:321;;;:::o;51731:126::-;;;;:::o;52242:125::-;;;;:::o;20519:716::-;20943:23;20969:69;20997:4;20969:69;;;;;;;;;;;;;;;;;20977:5;20969:27;;;;:69;;;;;:::i;:::-;20943:95;;21073:1;21053:10;:17;:21;21049:179;;;21150:10;21139:30;;;;;;;;;;;;:::i;:::-;21131:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;21049:179;20589:646;20519:716;;:::o;50360:799::-;50515:4;50536:15;:2;:13;;;:15::i;:::-;50532:620;;;50588:2;50572:36;;;50609:12;:10;:12::i;:::-;50623:4;50629:7;50638:5;50572:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50568:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50831:1;50814:6;:13;:18;50810:272;;;50857:60;;;;;;;;;;:::i;:::-;;;;;;;;50810:272;51032:6;51026:13;51017:6;51013:2;51009:15;51002:38;50568:529;50705:41;;;50695:51;;;:6;:51;;;;50688:58;;;;;50532:620;51136:4;51129:11;;50360:799;;;;;;;:::o;46996:439::-;47090:1;47076:16;;:2;:16;;;;47068:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47149:16;47157:7;47149;:16::i;:::-;47148:17;47140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47211:45;47240:1;47244:2;47248:7;47211:20;:45::i;:::-;47286:1;47269:9;:13;47279:2;47269:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47317:2;47298:7;:16;47306:7;47298:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47362:7;47358:2;47337:33;;47354:1;47337:33;;;;;;;;;;;;47383:44;47411:1;47415:2;47419:7;47383:19;:44::i;:::-;46996:439;;:::o;12671:229::-;12808:12;12840:52;12862:6;12870:4;12876:1;12879:12;12840:21;:52::i;:::-;12833:59;;12671:229;;;;;:::o;9926:326::-;9986:4;10243:1;10221:7;:19;;;:23;10214:30;;9926:326;;;:::o;13791:510::-;13961:12;14019:5;13994:21;:30;;13986:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;14086:18;14097:6;14086:10;:18::i;:::-;14078:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14152:12;14166:23;14193:6;:11;;14212:5;14219:4;14193:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14151:73;;;;14242:51;14259:7;14268:10;14280:12;14242:16;:51::i;:::-;14235:58;;;;13791:510;;;;;;:::o;16477:712::-;16627:12;16656:7;16652:530;;;16687:10;16680:17;;;;16652:530;16821:1;16801:10;:17;:21;16797:374;;;16999:10;16993:17;17060:15;17047:10;17043:2;17039:19;17032:44;16797:374;17142:12;17135:20;;;;;;;;;;;:::i;:::-;;;;;;;;16477:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:155::-;1785:5;1823:6;1810:20;1801:29;;1839:41;1874:5;1839:41;:::i;:::-;1731:155;;;;:::o;1909:370::-;1980:5;2029:3;2022:4;2014:6;2010:17;2006:27;1996:122;;2037:79;;:::i;:::-;1996:122;2154:6;2141:20;2179:94;2269:3;2261:6;2254:4;2246:6;2242:17;2179:94;:::i;:::-;2170:103;;1986:293;1909:370;;;;:::o;2285:133::-;2328:5;2366:6;2353:20;2344:29;;2382:30;2406:5;2382:30;:::i;:::-;2285:133;;;;:::o;2424:137::-;2478:5;2509:6;2503:13;2494:22;;2525:30;2549:5;2525:30;:::i;:::-;2424:137;;;;:::o;2567:::-;2612:5;2650:6;2637:20;2628:29;;2666:32;2692:5;2666:32;:::i;:::-;2567:137;;;;:::o;2710:141::-;2766:5;2797:6;2791:13;2782:22;;2813:32;2839:5;2813:32;:::i;:::-;2710:141;;;;:::o;2870:338::-;2925:5;2974:3;2967:4;2959:6;2955:17;2951:27;2941:122;;2982:79;;:::i;:::-;2941:122;3099:6;3086:20;3124:78;3198:3;3190:6;3183:4;3175:6;3171:17;3124:78;:::i;:::-;3115:87;;2931:277;2870:338;;;;:::o;3214:165::-;3273:5;3311:6;3298:20;3289:29;;3327:46;3367:5;3327:46;:::i;:::-;3214:165;;;;:::o;3399:340::-;3455:5;3504:3;3497:4;3489:6;3485:17;3481:27;3471:122;;3512:79;;:::i;:::-;3471:122;3629:6;3616:20;3654:79;3729:3;3721:6;3714:4;3706:6;3702:17;3654:79;:::i;:::-;3645:88;;3461:278;3399:340;;;;:::o;3745:139::-;3791:5;3829:6;3816:20;3807:29;;3845:33;3872:5;3845:33;:::i;:::-;3745:139;;;;:::o;3890:143::-;3947:5;3978:6;3972:13;3963:22;;3994:33;4021:5;3994:33;:::i;:::-;3890:143;;;;:::o;4039:329::-;4098:6;4147:2;4135:9;4126:7;4122:23;4118:32;4115:119;;;4153:79;;:::i;:::-;4115:119;4273:1;4298:53;4343:7;4334:6;4323:9;4319:22;4298:53;:::i;:::-;4288:63;;4244:117;4039:329;;;;:::o;4374:345::-;4441:6;4490:2;4478:9;4469:7;4465:23;4461:32;4458:119;;;4496:79;;:::i;:::-;4458:119;4616:1;4641:61;4694:7;4685:6;4674:9;4670:22;4641:61;:::i;:::-;4631:71;;4587:125;4374:345;;;;:::o;4725:474::-;4793:6;4801;4850:2;4838:9;4829:7;4825:23;4821:32;4818:119;;;4856:79;;:::i;:::-;4818:119;4976:1;5001:53;5046:7;5037:6;5026:9;5022:22;5001:53;:::i;:::-;4991:63;;4947:117;5103:2;5129:53;5174:7;5165:6;5154:9;5150:22;5129:53;:::i;:::-;5119:63;;5074:118;4725:474;;;;;:::o;5205:619::-;5282:6;5290;5298;5347:2;5335:9;5326:7;5322:23;5318:32;5315:119;;;5353:79;;:::i;:::-;5315:119;5473:1;5498:53;5543:7;5534:6;5523:9;5519:22;5498:53;:::i;:::-;5488:63;;5444:117;5600:2;5626:53;5671:7;5662:6;5651:9;5647:22;5626:53;:::i;:::-;5616:63;;5571:118;5728:2;5754:53;5799:7;5790:6;5779:9;5775:22;5754:53;:::i;:::-;5744:63;;5699:118;5205:619;;;;;:::o;5830:943::-;5925:6;5933;5941;5949;5998:3;5986:9;5977:7;5973:23;5969:33;5966:120;;;6005:79;;:::i;:::-;5966:120;6125:1;6150:53;6195:7;6186:6;6175:9;6171:22;6150:53;:::i;:::-;6140:63;;6096:117;6252:2;6278:53;6323:7;6314:6;6303:9;6299:22;6278:53;:::i;:::-;6268:63;;6223:118;6380:2;6406:53;6451:7;6442:6;6431:9;6427:22;6406:53;:::i;:::-;6396:63;;6351:118;6536:2;6525:9;6521:18;6508:32;6567:18;6559:6;6556:30;6553:117;;;6589:79;;:::i;:::-;6553:117;6694:62;6748:7;6739:6;6728:9;6724:22;6694:62;:::i;:::-;6684:72;;6479:287;5830:943;;;;;;;:::o;6779:468::-;6844:6;6852;6901:2;6889:9;6880:7;6876:23;6872:32;6869:119;;;6907:79;;:::i;:::-;6869:119;7027:1;7052:53;7097:7;7088:6;7077:9;7073:22;7052:53;:::i;:::-;7042:63;;6998:117;7154:2;7180:50;7222:7;7213:6;7202:9;7198:22;7180:50;:::i;:::-;7170:60;;7125:115;6779:468;;;;;:::o;7253:474::-;7321:6;7329;7378:2;7366:9;7357:7;7353:23;7349:32;7346:119;;;7384:79;;:::i;:::-;7346:119;7504:1;7529:53;7574:7;7565:6;7554:9;7550:22;7529:53;:::i;:::-;7519:63;;7475:117;7631:2;7657:53;7702:7;7693:6;7682:9;7678:22;7657:53;:::i;:::-;7647:63;;7602:118;7253:474;;;;;:::o;7733:539::-;7817:6;7866:2;7854:9;7845:7;7841:23;7837:32;7834:119;;;7872:79;;:::i;:::-;7834:119;8020:1;8009:9;8005:17;7992:31;8050:18;8042:6;8039:30;8036:117;;;8072:79;;:::i;:::-;8036:117;8177:78;8247:7;8238:6;8227:9;8223:22;8177:78;:::i;:::-;8167:88;;7963:302;7733:539;;;;:::o;8278:345::-;8345:6;8394:2;8382:9;8373:7;8369:23;8365:32;8362:119;;;8400:79;;:::i;:::-;8362:119;8520:1;8545:61;8598:7;8589:6;8578:9;8574:22;8545:61;:::i;:::-;8535:71;;8491:125;8278:345;;;;:::o;8629:327::-;8687:6;8736:2;8724:9;8715:7;8711:23;8707:32;8704:119;;;8742:79;;:::i;:::-;8704:119;8862:1;8887:52;8931:7;8922:6;8911:9;8907:22;8887:52;:::i;:::-;8877:62;;8833:116;8629:327;;;;:::o;8962:349::-;9031:6;9080:2;9068:9;9059:7;9055:23;9051:32;9048:119;;;9086:79;;:::i;:::-;9048:119;9206:1;9231:63;9286:7;9277:6;9266:9;9262:22;9231:63;:::i;:::-;9221:73;;9177:127;8962:349;;;;:::o;9317:355::-;9389:6;9438:2;9426:9;9417:7;9413:23;9409:32;9406:119;;;9444:79;;:::i;:::-;9406:119;9564:1;9589:66;9647:7;9638:6;9627:9;9623:22;9589:66;:::i;:::-;9579:76;;9535:130;9317:355;;;;:::o;9678:500::-;9759:6;9767;9816:2;9804:9;9795:7;9791:23;9787:32;9784:119;;;9822:79;;:::i;:::-;9784:119;9942:1;9967:66;10025:7;10016:6;10005:9;10001:22;9967:66;:::i;:::-;9957:76;;9913:130;10082:2;10108:53;10153:7;10144:6;10133:9;10129:22;10108:53;:::i;:::-;10098:63;;10053:118;9678:500;;;;;:::o;10184:509::-;10253:6;10302:2;10290:9;10281:7;10277:23;10273:32;10270:119;;;10308:79;;:::i;:::-;10270:119;10456:1;10445:9;10441:17;10428:31;10486:18;10478:6;10475:30;10472:117;;;10508:79;;:::i;:::-;10472:117;10613:63;10668:7;10659:6;10648:9;10644:22;10613:63;:::i;:::-;10603:73;;10399:287;10184:509;;;;:::o;10699:329::-;10758:6;10807:2;10795:9;10786:7;10782:23;10778:32;10775:119;;;10813:79;;:::i;:::-;10775:119;10933:1;10958:53;11003:7;10994:6;10983:9;10979:22;10958:53;:::i;:::-;10948:63;;10904:117;10699:329;;;;:::o;11034:351::-;11104:6;11153:2;11141:9;11132:7;11128:23;11124:32;11121:119;;;11159:79;;:::i;:::-;11121:119;11279:1;11304:64;11360:7;11351:6;11340:9;11336:22;11304:64;:::i;:::-;11294:74;;11250:128;11034:351;;;;:::o;11391:474::-;11459:6;11467;11516:2;11504:9;11495:7;11491:23;11487:32;11484:119;;;11522:79;;:::i;:::-;11484:119;11642:1;11667:53;11712:7;11703:6;11692:9;11688:22;11667:53;:::i;:::-;11657:63;;11613:117;11769:2;11795:53;11840:7;11831:6;11820:9;11816:22;11795:53;:::i;:::-;11785:63;;11740:118;11391:474;;;;;:::o;11871:147::-;11966:45;12005:5;11966:45;:::i;:::-;11961:3;11954:58;11871:147;;:::o;12024:118::-;12111:24;12129:5;12111:24;:::i;:::-;12106:3;12099:37;12024:118;;:::o;12148:109::-;12229:21;12244:5;12229:21;:::i;:::-;12224:3;12217:34;12148:109;;:::o;12263:360::-;12349:3;12377:38;12409:5;12377:38;:::i;:::-;12431:70;12494:6;12489:3;12431:70;:::i;:::-;12424:77;;12510:52;12555:6;12550:3;12543:4;12536:5;12532:16;12510:52;:::i;:::-;12587:29;12609:6;12587:29;:::i;:::-;12582:3;12578:39;12571:46;;12353:270;12263:360;;;;:::o;12629:373::-;12733:3;12761:38;12793:5;12761:38;:::i;:::-;12815:88;12896:6;12891:3;12815:88;:::i;:::-;12808:95;;12912:52;12957:6;12952:3;12945:4;12938:5;12934:16;12912:52;:::i;:::-;12989:6;12984:3;12980:16;12973:23;;12737:265;12629:373;;;;:::o;13008:364::-;13096:3;13124:39;13157:5;13124:39;:::i;:::-;13179:71;13243:6;13238:3;13179:71;:::i;:::-;13172:78;;13259:52;13304:6;13299:3;13292:4;13285:5;13281:16;13259:52;:::i;:::-;13336:29;13358:6;13336:29;:::i;:::-;13331:3;13327:39;13320:46;;13100:272;13008:364;;;;:::o;13378:377::-;13484:3;13512:39;13545:5;13512:39;:::i;:::-;13567:89;13649:6;13644:3;13567:89;:::i;:::-;13560:96;;13665:52;13710:6;13705:3;13698:4;13691:5;13687:16;13665:52;:::i;:::-;13742:6;13737:3;13733:16;13726:23;;13488:267;13378:377;;;;:::o;13761:366::-;13903:3;13924:67;13988:2;13983:3;13924:67;:::i;:::-;13917:74;;14000:93;14089:3;14000:93;:::i;:::-;14118:2;14113:3;14109:12;14102:19;;13761:366;;;:::o;14133:::-;14275:3;14296:67;14360:2;14355:3;14296:67;:::i;:::-;14289:74;;14372:93;14461:3;14372:93;:::i;:::-;14490:2;14485:3;14481:12;14474:19;;14133:366;;;:::o;14505:::-;14647:3;14668:67;14732:2;14727:3;14668:67;:::i;:::-;14661:74;;14744:93;14833:3;14744:93;:::i;:::-;14862:2;14857:3;14853:12;14846:19;;14505:366;;;:::o;14877:::-;15019:3;15040:67;15104:2;15099:3;15040:67;:::i;:::-;15033:74;;15116:93;15205:3;15116:93;:::i;:::-;15234:2;15229:3;15225:12;15218:19;;14877:366;;;:::o;15249:::-;15391:3;15412:67;15476:2;15471:3;15412:67;:::i;:::-;15405:74;;15488:93;15577:3;15488:93;:::i;:::-;15606:2;15601:3;15597:12;15590:19;;15249:366;;;:::o;15621:::-;15763:3;15784:67;15848:2;15843:3;15784:67;:::i;:::-;15777:74;;15860:93;15949:3;15860:93;:::i;:::-;15978:2;15973:3;15969:12;15962:19;;15621:366;;;:::o;15993:::-;16135:3;16156:67;16220:2;16215:3;16156:67;:::i;:::-;16149:74;;16232:93;16321:3;16232:93;:::i;:::-;16350:2;16345:3;16341:12;16334:19;;15993:366;;;:::o;16365:::-;16507:3;16528:67;16592:2;16587:3;16528:67;:::i;:::-;16521:74;;16604:93;16693:3;16604:93;:::i;:::-;16722:2;16717:3;16713:12;16706:19;;16365:366;;;:::o;16737:::-;16879:3;16900:67;16964:2;16959:3;16900:67;:::i;:::-;16893:74;;16976:93;17065:3;16976:93;:::i;:::-;17094:2;17089:3;17085:12;17078:19;;16737:366;;;:::o;17109:::-;17251:3;17272:67;17336:2;17331:3;17272:67;:::i;:::-;17265:74;;17348:93;17437:3;17348:93;:::i;:::-;17466:2;17461:3;17457:12;17450:19;;17109:366;;;:::o;17481:::-;17623:3;17644:67;17708:2;17703:3;17644:67;:::i;:::-;17637:74;;17720:93;17809:3;17720:93;:::i;:::-;17838:2;17833:3;17829:12;17822:19;;17481:366;;;:::o;17853:::-;17995:3;18016:67;18080:2;18075:3;18016:67;:::i;:::-;18009:74;;18092:93;18181:3;18092:93;:::i;:::-;18210:2;18205:3;18201:12;18194:19;;17853:366;;;:::o;18225:::-;18367:3;18388:67;18452:2;18447:3;18388:67;:::i;:::-;18381:74;;18464:93;18553:3;18464:93;:::i;:::-;18582:2;18577:3;18573:12;18566:19;;18225:366;;;:::o;18597:::-;18739:3;18760:67;18824:2;18819:3;18760:67;:::i;:::-;18753:74;;18836:93;18925:3;18836:93;:::i;:::-;18954:2;18949:3;18945:12;18938:19;;18597:366;;;:::o;18969:::-;19111:3;19132:67;19196:2;19191:3;19132:67;:::i;:::-;19125:74;;19208:93;19297:3;19208:93;:::i;:::-;19326:2;19321:3;19317:12;19310:19;;18969:366;;;:::o;19341:::-;19483:3;19504:67;19568:2;19563:3;19504:67;:::i;:::-;19497:74;;19580:93;19669:3;19580:93;:::i;:::-;19698:2;19693:3;19689:12;19682:19;;19341:366;;;:::o;19713:::-;19855:3;19876:67;19940:2;19935:3;19876:67;:::i;:::-;19869:74;;19952:93;20041:3;19952:93;:::i;:::-;20070:2;20065:3;20061:12;20054:19;;19713:366;;;:::o;20085:::-;20227:3;20248:67;20312:2;20307:3;20248:67;:::i;:::-;20241:74;;20324:93;20413:3;20324:93;:::i;:::-;20442:2;20437:3;20433:12;20426:19;;20085:366;;;:::o;20457:::-;20599:3;20620:67;20684:2;20679:3;20620:67;:::i;:::-;20613:74;;20696:93;20785:3;20696:93;:::i;:::-;20814:2;20809:3;20805:12;20798:19;;20457:366;;;:::o;20829:::-;20971:3;20992:67;21056:2;21051:3;20992:67;:::i;:::-;20985:74;;21068:93;21157:3;21068:93;:::i;:::-;21186:2;21181:3;21177:12;21170:19;;20829:366;;;:::o;21201:::-;21343:3;21364:67;21428:2;21423:3;21364:67;:::i;:::-;21357:74;;21440:93;21529:3;21440:93;:::i;:::-;21558:2;21553:3;21549:12;21542:19;;21201:366;;;:::o;21573:::-;21715:3;21736:67;21800:2;21795:3;21736:67;:::i;:::-;21729:74;;21812:93;21901:3;21812:93;:::i;:::-;21930:2;21925:3;21921:12;21914:19;;21573:366;;;:::o;21945:::-;22087:3;22108:67;22172:2;22167:3;22108:67;:::i;:::-;22101:74;;22184:93;22273:3;22184:93;:::i;:::-;22302:2;22297:3;22293:12;22286:19;;21945:366;;;:::o;22317:398::-;22476:3;22497:83;22578:1;22573:3;22497:83;:::i;:::-;22490:90;;22589:93;22678:3;22589:93;:::i;:::-;22707:1;22702:3;22698:11;22691:18;;22317:398;;;:::o;22721:366::-;22863:3;22884:67;22948:2;22943:3;22884:67;:::i;:::-;22877:74;;22960:93;23049:3;22960:93;:::i;:::-;23078:2;23073:3;23069:12;23062:19;;22721:366;;;:::o;23093:::-;23235:3;23256:67;23320:2;23315:3;23256:67;:::i;:::-;23249:74;;23332:93;23421:3;23332:93;:::i;:::-;23450:2;23445:3;23441:12;23434:19;;23093:366;;;:::o;23465:::-;23607:3;23628:67;23692:2;23687:3;23628:67;:::i;:::-;23621:74;;23704:93;23793:3;23704:93;:::i;:::-;23822:2;23817:3;23813:12;23806:19;;23465:366;;;:::o;23837:::-;23979:3;24000:67;24064:2;24059:3;24000:67;:::i;:::-;23993:74;;24076:93;24165:3;24076:93;:::i;:::-;24194:2;24189:3;24185:12;24178:19;;23837:366;;;:::o;24209:::-;24351:3;24372:67;24436:2;24431:3;24372:67;:::i;:::-;24365:74;;24448:93;24537:3;24448:93;:::i;:::-;24566:2;24561:3;24557:12;24550:19;;24209:366;;;:::o;24581:118::-;24668:24;24686:5;24668:24;:::i;:::-;24663:3;24656:37;24581:118;;:::o;24705:271::-;24835:3;24857:93;24946:3;24937:6;24857:93;:::i;:::-;24850:100;;24967:3;24960:10;;24705:271;;;;:::o;24982:275::-;25114:3;25136:95;25227:3;25218:6;25136:95;:::i;:::-;25129:102;;25248:3;25241:10;;24982:275;;;;:::o;25263:435::-;25443:3;25465:95;25556:3;25547:6;25465:95;:::i;:::-;25458:102;;25577:95;25668:3;25659:6;25577:95;:::i;:::-;25570:102;;25689:3;25682:10;;25263:435;;;;;:::o;25704:379::-;25888:3;25910:147;26053:3;25910:147;:::i;:::-;25903:154;;26074:3;26067:10;;25704:379;;;:::o;26089:222::-;26182:4;26220:2;26209:9;26205:18;26197:26;;26233:71;26301:1;26290:9;26286:17;26277:6;26233:71;:::i;:::-;26089:222;;;;:::o;26317:348::-;26446:4;26484:2;26473:9;26469:18;26461:26;;26497:79;26573:1;26562:9;26558:17;26549:6;26497:79;:::i;:::-;26586:72;26654:2;26643:9;26639:18;26630:6;26586:72;:::i;:::-;26317:348;;;;;:::o;26671:640::-;26866:4;26904:3;26893:9;26889:19;26881:27;;26918:71;26986:1;26975:9;26971:17;26962:6;26918:71;:::i;:::-;26999:72;27067:2;27056:9;27052:18;27043:6;26999:72;:::i;:::-;27081;27149:2;27138:9;27134:18;27125:6;27081:72;:::i;:::-;27200:9;27194:4;27190:20;27185:2;27174:9;27170:18;27163:48;27228:76;27299:4;27290:6;27228:76;:::i;:::-;27220:84;;26671:640;;;;;;;:::o;27317:332::-;27438:4;27476:2;27465:9;27461:18;27453:26;;27489:71;27557:1;27546:9;27542:17;27533:6;27489:71;:::i;:::-;27570:72;27638:2;27627:9;27623:18;27614:6;27570:72;:::i;:::-;27317:332;;;;;:::o;27655:210::-;27742:4;27780:2;27769:9;27765:18;27757:26;;27793:65;27855:1;27844:9;27840:17;27831:6;27793:65;:::i;:::-;27655:210;;;;:::o;27871:313::-;27984:4;28022:2;28011:9;28007:18;27999:26;;28071:9;28065:4;28061:20;28057:1;28046:9;28042:17;28035:47;28099:78;28172:4;28163:6;28099:78;:::i;:::-;28091:86;;27871:313;;;;:::o;28190:419::-;28356:4;28394:2;28383:9;28379:18;28371:26;;28443:9;28437:4;28433:20;28429:1;28418:9;28414:17;28407:47;28471:131;28597:4;28471:131;:::i;:::-;28463:139;;28190:419;;;:::o;28615:::-;28781:4;28819:2;28808:9;28804:18;28796:26;;28868:9;28862:4;28858:20;28854:1;28843:9;28839:17;28832:47;28896:131;29022:4;28896:131;:::i;:::-;28888:139;;28615:419;;;:::o;29040:::-;29206:4;29244:2;29233:9;29229:18;29221:26;;29293:9;29287:4;29283:20;29279:1;29268:9;29264:17;29257:47;29321:131;29447:4;29321:131;:::i;:::-;29313:139;;29040:419;;;:::o;29465:::-;29631:4;29669:2;29658:9;29654:18;29646:26;;29718:9;29712:4;29708:20;29704:1;29693:9;29689:17;29682:47;29746:131;29872:4;29746:131;:::i;:::-;29738:139;;29465:419;;;:::o;29890:::-;30056:4;30094:2;30083:9;30079:18;30071:26;;30143:9;30137:4;30133:20;30129:1;30118:9;30114:17;30107:47;30171:131;30297:4;30171:131;:::i;:::-;30163:139;;29890:419;;;:::o;30315:::-;30481:4;30519:2;30508:9;30504:18;30496:26;;30568:9;30562:4;30558:20;30554:1;30543:9;30539:17;30532:47;30596:131;30722:4;30596:131;:::i;:::-;30588:139;;30315:419;;;:::o;30740:::-;30906:4;30944:2;30933:9;30929:18;30921:26;;30993:9;30987:4;30983:20;30979:1;30968:9;30964:17;30957:47;31021:131;31147:4;31021:131;:::i;:::-;31013:139;;30740:419;;;:::o;31165:::-;31331:4;31369:2;31358:9;31354:18;31346:26;;31418:9;31412:4;31408:20;31404:1;31393:9;31389:17;31382:47;31446:131;31572:4;31446:131;:::i;:::-;31438:139;;31165:419;;;:::o;31590:::-;31756:4;31794:2;31783:9;31779:18;31771:26;;31843:9;31837:4;31833:20;31829:1;31818:9;31814:17;31807:47;31871:131;31997:4;31871:131;:::i;:::-;31863:139;;31590:419;;;:::o;32015:::-;32181:4;32219:2;32208:9;32204:18;32196:26;;32268:9;32262:4;32258:20;32254:1;32243:9;32239:17;32232:47;32296:131;32422:4;32296:131;:::i;:::-;32288:139;;32015:419;;;:::o;32440:::-;32606:4;32644:2;32633:9;32629:18;32621:26;;32693:9;32687:4;32683:20;32679:1;32668:9;32664:17;32657:47;32721:131;32847:4;32721:131;:::i;:::-;32713:139;;32440:419;;;:::o;32865:::-;33031:4;33069:2;33058:9;33054:18;33046:26;;33118:9;33112:4;33108:20;33104:1;33093:9;33089:17;33082:47;33146:131;33272:4;33146:131;:::i;:::-;33138:139;;32865:419;;;:::o;33290:::-;33456:4;33494:2;33483:9;33479:18;33471:26;;33543:9;33537:4;33533:20;33529:1;33518:9;33514:17;33507:47;33571:131;33697:4;33571:131;:::i;:::-;33563:139;;33290:419;;;:::o;33715:::-;33881:4;33919:2;33908:9;33904:18;33896:26;;33968:9;33962:4;33958:20;33954:1;33943:9;33939:17;33932:47;33996:131;34122:4;33996:131;:::i;:::-;33988:139;;33715:419;;;:::o;34140:::-;34306:4;34344:2;34333:9;34329:18;34321:26;;34393:9;34387:4;34383:20;34379:1;34368:9;34364:17;34357:47;34421:131;34547:4;34421:131;:::i;:::-;34413:139;;34140:419;;;:::o;34565:::-;34731:4;34769:2;34758:9;34754:18;34746:26;;34818:9;34812:4;34808:20;34804:1;34793:9;34789:17;34782:47;34846:131;34972:4;34846:131;:::i;:::-;34838:139;;34565:419;;;:::o;34990:::-;35156:4;35194:2;35183:9;35179:18;35171:26;;35243:9;35237:4;35233:20;35229:1;35218:9;35214:17;35207:47;35271:131;35397:4;35271:131;:::i;:::-;35263:139;;34990:419;;;:::o;35415:::-;35581:4;35619:2;35608:9;35604:18;35596:26;;35668:9;35662:4;35658:20;35654:1;35643:9;35639:17;35632:47;35696:131;35822:4;35696:131;:::i;:::-;35688:139;;35415:419;;;:::o;35840:::-;36006:4;36044:2;36033:9;36029:18;36021:26;;36093:9;36087:4;36083:20;36079:1;36068:9;36064:17;36057:47;36121:131;36247:4;36121:131;:::i;:::-;36113:139;;35840:419;;;:::o;36265:::-;36431:4;36469:2;36458:9;36454:18;36446:26;;36518:9;36512:4;36508:20;36504:1;36493:9;36489:17;36482:47;36546:131;36672:4;36546:131;:::i;:::-;36538:139;;36265:419;;;:::o;36690:::-;36856:4;36894:2;36883:9;36879:18;36871:26;;36943:9;36937:4;36933:20;36929:1;36918:9;36914:17;36907:47;36971:131;37097:4;36971:131;:::i;:::-;36963:139;;36690:419;;;:::o;37115:::-;37281:4;37319:2;37308:9;37304:18;37296:26;;37368:9;37362:4;37358:20;37354:1;37343:9;37339:17;37332:47;37396:131;37522:4;37396:131;:::i;:::-;37388:139;;37115:419;;;:::o;37540:::-;37706:4;37744:2;37733:9;37729:18;37721:26;;37793:9;37787:4;37783:20;37779:1;37768:9;37764:17;37757:47;37821:131;37947:4;37821:131;:::i;:::-;37813:139;;37540:419;;;:::o;37965:::-;38131:4;38169:2;38158:9;38154:18;38146:26;;38218:9;38212:4;38208:20;38204:1;38193:9;38189:17;38182:47;38246:131;38372:4;38246:131;:::i;:::-;38238:139;;37965:419;;;:::o;38390:::-;38556:4;38594:2;38583:9;38579:18;38571:26;;38643:9;38637:4;38633:20;38629:1;38618:9;38614:17;38607:47;38671:131;38797:4;38671:131;:::i;:::-;38663:139;;38390:419;;;:::o;38815:::-;38981:4;39019:2;39008:9;39004:18;38996:26;;39068:9;39062:4;39058:20;39054:1;39043:9;39039:17;39032:47;39096:131;39222:4;39096:131;:::i;:::-;39088:139;;38815:419;;;:::o;39240:::-;39406:4;39444:2;39433:9;39429:18;39421:26;;39493:9;39487:4;39483:20;39479:1;39468:9;39464:17;39457:47;39521:131;39647:4;39521:131;:::i;:::-;39513:139;;39240:419;;;:::o;39665:::-;39831:4;39869:2;39858:9;39854:18;39846:26;;39918:9;39912:4;39908:20;39904:1;39893:9;39889:17;39882:47;39946:131;40072:4;39946:131;:::i;:::-;39938:139;;39665:419;;;:::o;40090:222::-;40183:4;40221:2;40210:9;40206:18;40198:26;;40234:71;40302:1;40291:9;40287:17;40278:6;40234:71;:::i;:::-;40090:222;;;;:::o;40318:129::-;40352:6;40379:20;;:::i;:::-;40369:30;;40408:33;40436:4;40428:6;40408:33;:::i;:::-;40318:129;;;:::o;40453:75::-;40486:6;40519:2;40513:9;40503:19;;40453:75;:::o;40534:311::-;40611:4;40701:18;40693:6;40690:30;40687:56;;;40723:18;;:::i;:::-;40687:56;40773:4;40765:6;40761:17;40753:25;;40833:4;40827;40823:15;40815:23;;40534:311;;;:::o;40851:307::-;40912:4;41002:18;40994:6;40991:30;40988:56;;;41024:18;;:::i;:::-;40988:56;41062:29;41084:6;41062:29;:::i;:::-;41054:37;;41146:4;41140;41136:15;41128:23;;40851:307;;;:::o;41164:308::-;41226:4;41316:18;41308:6;41305:30;41302:56;;;41338:18;;:::i;:::-;41302:56;41376:29;41398:6;41376:29;:::i;:::-;41368:37;;41460:4;41454;41450:15;41442:23;;41164:308;;;:::o;41478:98::-;41529:6;41563:5;41557:12;41547:22;;41478:98;;;:::o;41582:99::-;41634:6;41668:5;41662:12;41652:22;;41582:99;;;:::o;41687:168::-;41770:11;41804:6;41799:3;41792:19;41844:4;41839:3;41835:14;41820:29;;41687:168;;;;:::o;41861:147::-;41962:11;41999:3;41984:18;;41861:147;;;;:::o;42014:169::-;42098:11;42132:6;42127:3;42120:19;42172:4;42167:3;42163:14;42148:29;;42014:169;;;;:::o;42189:148::-;42291:11;42328:3;42313:18;;42189:148;;;;:::o;42343:305::-;42383:3;42402:20;42420:1;42402:20;:::i;:::-;42397:25;;42436:20;42454:1;42436:20;:::i;:::-;42431:25;;42590:1;42522:66;42518:74;42515:1;42512:81;42509:107;;;42596:18;;:::i;:::-;42509:107;42640:1;42637;42633:9;42626:16;;42343:305;;;;:::o;42654:237::-;42692:3;42711:18;42727:1;42711:18;:::i;:::-;42706:23;;42743:18;42759:1;42743:18;:::i;:::-;42738:23;;42833:1;42827:4;42823:12;42820:1;42817:19;42814:45;;;42839:18;;:::i;:::-;42814:45;42883:1;42880;42876:9;42869:16;;42654:237;;;;:::o;42897:185::-;42937:1;42954:20;42972:1;42954:20;:::i;:::-;42949:25;;42988:20;43006:1;42988:20;:::i;:::-;42983:25;;43027:1;43017:35;;43032:18;;:::i;:::-;43017:35;43074:1;43071;43067:9;43062:14;;42897:185;;;;:::o;43088:348::-;43128:7;43151:20;43169:1;43151:20;:::i;:::-;43146:25;;43185:20;43203:1;43185:20;:::i;:::-;43180:25;;43373:1;43305:66;43301:74;43298:1;43295:81;43290:1;43283:9;43276:17;43272:105;43269:131;;;43380:18;;:::i;:::-;43269:131;43428:1;43425;43421:9;43410:20;;43088:348;;;;:::o;43442:191::-;43482:4;43502:20;43520:1;43502:20;:::i;:::-;43497:25;;43536:20;43554:1;43536:20;:::i;:::-;43531:25;;43575:1;43572;43569:8;43566:34;;;43580:18;;:::i;:::-;43566:34;43625:1;43622;43618:9;43610:17;;43442:191;;;;:::o;43639:96::-;43676:7;43705:24;43723:5;43705:24;:::i;:::-;43694:35;;43639:96;;;:::o;43741:104::-;43786:7;43815:24;43833:5;43815:24;:::i;:::-;43804:35;;43741:104;;;:::o;43851:90::-;43885:7;43928:5;43921:13;43914:21;43903:32;;43851:90;;;:::o;43947:149::-;43983:7;44023:66;44016:5;44012:78;44001:89;;43947:149;;;:::o;44102:109::-;44152:7;44181:24;44199:5;44181:24;:::i;:::-;44170:35;;44102:109;;;:::o;44217:126::-;44254:7;44294:42;44287:5;44283:54;44272:65;;44217:126;;;:::o;44349:77::-;44386:7;44415:5;44404:16;;44349:77;;;:::o;44432:86::-;44467:7;44507:4;44500:5;44496:16;44485:27;;44432:86;;;:::o;44524:134::-;44582:9;44615:37;44646:5;44615:37;:::i;:::-;44602:50;;44524:134;;;:::o;44664:126::-;44714:9;44747:37;44778:5;44747:37;:::i;:::-;44734:50;;44664:126;;;:::o;44796:113::-;44846:9;44879:24;44897:5;44879:24;:::i;:::-;44866:37;;44796:113;;;:::o;44915:154::-;44999:6;44994:3;44989;44976:30;45061:1;45052:6;45047:3;45043:16;45036:27;44915:154;;;:::o;45075:307::-;45143:1;45153:113;45167:6;45164:1;45161:13;45153:113;;;45252:1;45247:3;45243:11;45237:18;45233:1;45228:3;45224:11;45217:39;45189:2;45186:1;45182:10;45177:15;;45153:113;;;45284:6;45281:1;45278:13;45275:101;;;45364:1;45355:6;45350:3;45346:16;45339:27;45275:101;45124:258;45075:307;;;:::o;45388:320::-;45432:6;45469:1;45463:4;45459:12;45449:22;;45516:1;45510:4;45506:12;45537:18;45527:81;;45593:4;45585:6;45581:17;45571:27;;45527:81;45655:2;45647:6;45644:14;45624:18;45621:38;45618:84;;;45674:18;;:::i;:::-;45618:84;45439:269;45388:320;;;:::o;45714:281::-;45797:27;45819:4;45797:27;:::i;:::-;45789:6;45785:40;45927:6;45915:10;45912:22;45891:18;45879:10;45876:34;45873:62;45870:88;;;45938:18;;:::i;:::-;45870:88;45978:10;45974:2;45967:22;45757:238;45714:281;;:::o;46001:233::-;46040:3;46063:24;46081:5;46063:24;:::i;:::-;46054:33;;46109:66;46102:5;46099:77;46096:103;;;46179:18;;:::i;:::-;46096:103;46226:1;46219:5;46215:13;46208:20;;46001:233;;;:::o;46240:180::-;46288:77;46285:1;46278:88;46385:4;46382:1;46375:15;46409:4;46406:1;46399:15;46426:180;46474:77;46471:1;46464:88;46571:4;46568:1;46561:15;46595:4;46592:1;46585:15;46612:180;46660:77;46657:1;46650:88;46757:4;46754:1;46747:15;46781:4;46778:1;46771:15;46798:180;46846:77;46843:1;46836:88;46943:4;46940:1;46933:15;46967:4;46964:1;46957:15;46984:180;47032:77;47029:1;47022:88;47129:4;47126:1;47119:15;47153:4;47150:1;47143:15;47170:117;47279:1;47276;47269:12;47293:117;47402:1;47399;47392:12;47416:117;47525:1;47522;47515:12;47539:117;47648:1;47645;47638:12;47662:117;47771:1;47768;47761:12;47785:102;47826:6;47877:2;47873:7;47868:2;47861:5;47857:14;47853:28;47843:38;;47785:102;;;:::o;47893:237::-;48033:34;48029:1;48021:6;48017:14;48010:58;48102:20;48097:2;48089:6;48085:15;48078:45;47893:237;:::o;48136:225::-;48276:34;48272:1;48264:6;48260:14;48253:58;48345:8;48340:2;48332:6;48328:15;48321:33;48136:225;:::o;48367:224::-;48507:34;48503:1;48495:6;48491:14;48484:58;48576:7;48571:2;48563:6;48559:15;48552:32;48367:224;:::o;48597:178::-;48737:30;48733:1;48725:6;48721:14;48714:54;48597:178;:::o;48781:225::-;48921:34;48917:1;48909:6;48905:14;48898:58;48990:8;48985:2;48977:6;48973:15;48966:33;48781:225;:::o;49012:223::-;49152:34;49148:1;49140:6;49136:14;49129:58;49221:6;49216:2;49208:6;49204:15;49197:31;49012:223;:::o;49241:175::-;49381:27;49377:1;49369:6;49365:14;49358:51;49241:175;:::o;49422:245::-;49562:34;49558:1;49550:6;49546:14;49539:58;49631:28;49626:2;49618:6;49614:15;49607:53;49422:245;:::o;49673:179::-;49813:31;49809:1;49801:6;49797:14;49790:55;49673:179;:::o;49858:225::-;49998:34;49994:1;49986:6;49982:14;49975:58;50067:8;50062:2;50054:6;50050:15;50043:33;49858:225;:::o;50089:231::-;50229:34;50225:1;50217:6;50213:14;50206:58;50298:14;50293:2;50285:6;50281:15;50274:39;50089:231;:::o;50326:230::-;50466:34;50462:1;50454:6;50450:14;50443:58;50535:13;50530:2;50522:6;50518:15;50511:38;50326:230;:::o;50562:243::-;50702:34;50698:1;50690:6;50686:14;50679:58;50771:26;50766:2;50758:6;50754:15;50747:51;50562:243;:::o;50811:229::-;50951:34;50947:1;50939:6;50935:14;50928:58;51020:12;51015:2;51007:6;51003:15;50996:37;50811:229;:::o;51046:228::-;51186:34;51182:1;51174:6;51170:14;51163:58;51255:11;51250:2;51242:6;51238:15;51231:36;51046:228;:::o;51280:182::-;51420:34;51416:1;51408:6;51404:14;51397:58;51280:182;:::o;51468:231::-;51608:34;51604:1;51596:6;51592:14;51585:58;51677:14;51672:2;51664:6;51660:15;51653:39;51468:231;:::o;51705:182::-;51845:34;51841:1;51833:6;51829:14;51822:58;51705:182;:::o;51893:165::-;52033:17;52029:1;52021:6;52017:14;52010:41;51893:165;:::o;52064:234::-;52204:34;52200:1;52192:6;52188:14;52181:58;52273:17;52268:2;52260:6;52256:15;52249:42;52064:234;:::o;52304:172::-;52444:24;52440:1;52432:6;52428:14;52421:48;52304:172;:::o;52482:220::-;52622:34;52618:1;52610:6;52606:14;52599:58;52691:3;52686:2;52678:6;52674:15;52667:28;52482:220;:::o;52708:172::-;52848:24;52844:1;52836:6;52832:14;52825:48;52708:172;:::o;52886:114::-;;:::o;53006:236::-;53146:34;53142:1;53134:6;53130:14;53123:58;53215:19;53210:2;53202:6;53198:15;53191:44;53006:236;:::o;53248:179::-;53388:31;53384:1;53376:6;53372:14;53365:55;53248:179;:::o;53433:163::-;53573:15;53569:1;53561:6;53557:14;53550:39;53433:163;:::o;53602:173::-;53742:25;53738:1;53730:6;53726:14;53719:49;53602:173;:::o;53781:229::-;53921:34;53917:1;53909:6;53905:14;53898:58;53990:12;53985:2;53977:6;53973:15;53966:37;53781:229;:::o;54016:122::-;54089:24;54107:5;54089:24;:::i;:::-;54082:5;54079:35;54069:63;;54128:1;54125;54118:12;54069:63;54016:122;:::o;54144:138::-;54225:32;54251:5;54225:32;:::i;:::-;54218:5;54215:43;54205:71;;54272:1;54269;54262:12;54205:71;54144:138;:::o;54288:116::-;54358:21;54373:5;54358:21;:::i;:::-;54351:5;54348:32;54338:60;;54394:1;54391;54384:12;54338:60;54288:116;:::o;54410:120::-;54482:23;54499:5;54482:23;:::i;:::-;54475:5;54472:34;54462:62;;54520:1;54517;54510:12;54462:62;54410:120;:::o;54536:148::-;54622:37;54653:5;54622:37;:::i;:::-;54615:5;54612:48;54602:76;;54674:1;54671;54664:12;54602:76;54536:148;:::o;54690:122::-;54763:24;54781:5;54763:24;:::i;:::-;54756:5;54753:35;54743:63;;54802:1;54799;54792:12;54743:63;54690:122;:::o

Swarm Source

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