ETH Price: $2,572.82 (+0.71%)

Token

Stoner Ape Club (SAC)
 

Overview

Max Total Supply

6,666 SAC

Holders

2,747

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SAC
0xdc61247fa0ce4eb7f5c34923fd63ed5c7ec6d234
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Stoner Ape Club is a private collection of 6,666 stoned apes NFTs -- unique digital collectibles, stored as ERC-721 tokens on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SAC

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-29
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

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



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() {
        _setOwner(_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 {
    //    _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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: 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 Edit for rawOwnerOf token
     */
    function rawOwnerOf(uint256 tokenId) public view returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

    /**
     * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        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));
    }

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

    /**
     * @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);
        address to = address(0);

        _beforeTokenTransfer(owner, to, tokenId);

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

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

        emit Transfer(owner, to, 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 of token that is not own");
        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);
    }

    /**
     * @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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("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 {}
}
// File: ERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    //function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
    //    require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
    //    return _ownedTokens[owner][index];
    //}

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

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

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

pragma solidity ^0.8.0;
pragma abicoder v2;

contract SAC is ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    address private owner_;
    uint256 private tokenId;
    bytes32 public merkleRoot;
	bytes32 public merkleRootVIP;
	address private wallet1 = 0x25eDb46cBB7744De5507ebe50b5086D236B63073;
    address private wallet2 = 0x827dfa08e6282961b6491851869001cB444b840F;
    address private wallet3 = 0xDf958FE148633B49930775c1E0393594983a128B;
	address private wallet4 = 0x458f5AA4393035f4713bE4EB7176B89f8dD4A6F1;
    address private wallet5 = 0x5f09Bd6Ef7EBDB9CC7d090DC43f9047a2b7A2240;
    address private wallet6 = 0x0308539095797e6F562203C3d8F60Cae82566eBA;
    address private Authorized = 0x7a29d9a21A45E269F1bFFFa15a84c16BA0050E27;


    uint256 public SACPrice_whitelist = 80000000000000000;
	uint256 public SACPrice_public = 80000000000000000;
    uint public maxSACTx = 1;
	uint public maxSACPurchase = 10;
    uint public maxSACPurchaseWl = 1;
    uint public maxSACPurchaseVip = 2;

    uint256 public constant MAX_SAC = 6666;
    uint public SACReserve = 100;
	uint public SACWhitelistReserve = 3900;


    bool public whitelistSaleIsActive = false;
	bool public publicSaleIsActive = false;
    mapping(address => uint) private max_mints_per_address;

	



    string public baseTokenURI;

    constructor() ERC721("Stoner Ape Club", "SAC") { }

    modifier onlyAuthorized {
        require(_msgSender() == owner() || _msgSender() == Authorized , "Not authorized");
        _;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function reserveSAC(address _to, uint256 _reserveAmount) public onlyAuthorized {
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= SACReserve, "Not enough reserve");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i + 1);
        }
        SACReserve = SACReserve.sub(_reserveAmount);
    }


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

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


    function flipPublicSaleState() public onlyAuthorized {
        publicSaleIsActive = !publicSaleIsActive;
    }

	 function flipWPSaleState() public onlyAuthorized {
        whitelistSaleIsActive = !whitelistSaleIsActive;
    }


     function mintSAC(uint numberOfTokens) public payable {
        require(publicSaleIsActive, "Sale not active");
        require(numberOfTokens > 0 && numberOfTokens <= maxSACTx, "1 pTX allowed");
        require(msg.value == SACPrice_public.mul(numberOfTokens), "Check ETH");
        require(max_mints_per_address[msg.sender].add(numberOfTokens) <= maxSACPurchase,"Max pW reached");

        for(uint i = 0; i < numberOfTokens; i++) {
            if (totalSupply() < MAX_SAC) {
                _safeMint(msg.sender, totalSupply()+1);
                max_mints_per_address[msg.sender] = max_mints_per_address[msg.sender].add(1);
            } else {
               publicSaleIsActive = !publicSaleIsActive;
                payable(msg.sender).transfer(numberOfTokens.sub(i).mul(SACPrice_public));
                break;
            }
        }
    }


   // to set the merkle root
    function updateMerkleRoot(bytes32 newmerkleRoot) external onlyAuthorized {
        merkleRoot = newmerkleRoot;
     
    }

	// to set the merkle root for VIP
    function updateMerkleRootVIP(bytes32 newmerkleRoot) external onlyAuthorized {
        merkleRootVIP = newmerkleRoot;
       
    }


    function whitelistedMints(uint numberOfTokens, bytes32[] calldata merkleProof ) payable external  {
        address user_ = msg.sender;
		require(whitelistSaleIsActive, "WL sale not active");
        require(numberOfTokens > 0 && numberOfTokens <= 1, "1 pTX allowed");
        require(msg.value == SACPrice_whitelist.mul(numberOfTokens), "Check ETH");
        require(max_mints_per_address[msg.sender].add(numberOfTokens) <= maxSACPurchaseWl,"Max pW reached");

        // Verify the merkle proof
        require(MerkleProof.verify(merkleProof, merkleRoot,  keccak256(abi.encodePacked(user_))  ), "Check proof");


             if (totalSupply() <= SACWhitelistReserve) {
                _safeMint(msg.sender, totalSupply()+1);
                max_mints_per_address[msg.sender] = max_mints_per_address[msg.sender].add(1);
            }
		     else {
                whitelistSaleIsActive = !whitelistSaleIsActive;
            }


       
    }

	function whitelistedVIPMints(uint numberOfTokens, bytes32[] calldata merkleProof ) payable external  {
        address user_ = msg.sender;
		require(whitelistSaleIsActive, "WL sale not active");
        require(numberOfTokens > 0 && numberOfTokens <= 2, "2 pTX allowed");
        require(msg.value == SACPrice_whitelist.mul(numberOfTokens), "Check ETH");
        require(max_mints_per_address[msg.sender].add(numberOfTokens) <= maxSACPurchaseVip,"Max pW reached");

        // Verify the merkle proof
        require(MerkleProof.verify(merkleProof, merkleRootVIP,  keccak256(abi.encodePacked(user_))  ), "Check proof");

		for(uint i = 0; i < numberOfTokens; i++) {
            if (totalSupply() <= SACWhitelistReserve) {
                _safeMint(msg.sender, totalSupply()+1);
                max_mints_per_address[msg.sender] = max_mints_per_address[msg.sender].add(1);
            }
			else {
               whitelistSaleIsActive = !whitelistSaleIsActive;
                payable(msg.sender).transfer(numberOfTokens.sub(i).mul(SACPrice_whitelist));
                break;
            }
		}


       
    }

    function withdrawAll() external onlyOwner {
        require(address(this).balance > 0, "No balance");
        uint256 _amount = address(this).balance;
        (bool wallet1Success, ) = wallet1.call{value: _amount.mul(23).div(100)}("");
        (bool wallet2Success, ) = wallet2.call{value: _amount.mul(23).div(100)}("");
        (bool wallet3Success, ) = wallet3.call{value: _amount.mul(23).div(100)}("");
		(bool wallet4Success, ) = wallet4.call{value: _amount.mul(19).div(100)}("");
		(bool wallet5Success, ) = wallet5.call{value: _amount.mul(7).div(100)}("");
		(bool wallet6Success, ) = wallet6.call{value: _amount.mul(5).div(100)}("");

        require(wallet1Success && wallet2Success && wallet3Success && wallet4Success && wallet5Success && wallet6Success, "Withdrawal failed.");
    }

    function setPriceWL(uint256 newPriceWL) public onlyAuthorized {
        SACPrice_whitelist = newPriceWL;
    }

    function setPrice(uint256 newPrice) public onlyAuthorized {
        SACPrice_public = newPrice;
    }

   function setMaxSACTx(uint256 newMaxSACTx) public onlyAuthorized {
        maxSACTx = newMaxSACTx;
    }

   function setMaxSACPurchase(uint256 newMaxSACPurchase) public onlyAuthorized {
        maxSACPurchase = newMaxSACPurchase;
    }

  function setMaxSACPurchaseWl(uint256 newMaxSACPurchaseWl) public onlyAuthorized {
            maxSACPurchaseWl = newMaxSACPurchaseWl;
        }

  function setMaxSACPurchaseVip(uint256 newMaxSACPurchaseVip) public onlyAuthorized {
                    maxSACPurchaseVip = newMaxSACPurchaseVip;
                } 

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SAC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SACPrice_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SACPrice_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SACReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SACWhitelistReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWPSaleState","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":"maxSACPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSACPurchaseVip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSACPurchaseWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSACTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootVIP","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintSAC","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveSAC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSACPurchase","type":"uint256"}],"name":"setMaxSACPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSACPurchaseVip","type":"uint256"}],"name":"setMaxSACPurchaseVip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSACPurchaseWl","type":"uint256"}],"name":"setMaxSACPurchaseWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSACTx","type":"uint256"}],"name":"setMaxSACTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceWL","type":"uint256"}],"name":"setPriceWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newmerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newmerkleRoot","type":"bytes32"}],"name":"updateMerkleRootVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistedMints","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistedVIPMints","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527325edb46cbb7744de5507ebe50b5086d236b63073600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073827dfa08e6282961b6491851869001cb444b840f601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073df958fe148633b49930775c1e0393594983a128b601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073458f5aa4393035f4713be4eb7176b89f8dd4a6f1601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735f09bd6ef7ebdb9cc7d090dc43f9047a2b7a2240601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730308539095797e6f562203c3d8f60cae82566eba601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a29d9a21a45e269f1bfffa15a84c16ba0050e27601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555067011c37937e08000060165567011c37937e0800006017556001601855600a6019556001601a556002601b556064601c55610f3c601d556000601e60006101000a81548160ff0219169083151502179055506000601e60016101000a81548160ff021916908315150217905550348015620002d157600080fd5b506040518060400160405280600f81526020017f53746f6e65722041706520436c756200000000000000000000000000000000008152506040518060400160405280600381526020017f534143000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200035692919062000466565b5080600190805190602001906200036f92919062000466565b50505062000392620003866200039860201b60201c565b620003a060201b60201c565b6200057b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004749062000545565b90600052602060002090601f016020900481019282620004985760008555620004e4565b82601f10620004b357805160ff1916838001178555620004e4565b82800160010185558215620004e4579182015b82811115620004e3578251825591602001919060010190620004c6565b5b509050620004f39190620004f7565b5090565b5b8082111562000512576000816000905550600101620004f8565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055e57607f821691505b6020821081141562000575576200057462000516565b5b50919050565b615fb6806200058b6000396000f3fe6080604052600436106102ae5760003560e01c806367fbc385116101755780639aa380d9116100dc578063d31a111211610095578063f2fde38b1161006f578063f2fde38b14610a5a578063f6efe0ed14610a83578063faedb01214610a9a578063fecaa28f14610ac5576102ae565b8063d31a1112146109d6578063d547cfb7146109f2578063e985e9c514610a1d576102ae565b80639aa380d9146108dc5780639e0e25fd14610907578063a10866ef14610930578063a22cb46514610947578063b88d4fde14610970578063c87b56dd14610999576102ae565b8063853828b61161012e578063853828b6146107ff57806388e1aa10146108165780638da5cb5b1461084157806391b7f5ed1461086c57806395d89b41146108955780639641d752146108c0576102ae565b806367fbc385146106db57806370a08231146107065780637f81be691461074357806381d8488f1461078057806383eeb79b146107a957806384925fd6146107d4576102ae565b806329a2af9a1161021957806342842e0e116101d257806342842e0e146105bd578063464d2156146105e65780634783f0ef1461060f5780634f6ccce71461063857806355f804b3146106755780636352211e1461069e576102ae565b806329a2af9a146104d35780632c93954b146104fc5780632eb4a7ab146105275780633cbe25b9146105525780633ccfd60b1461057d57806341994ce514610594576102ae565b80631003c9e81161026b5780631003c9e8146103d757806310b5454d1461040057806318160ddd1461042b57806318ed2f5b146104565780632252731f1461048157806323b872dd146104aa576102ae565b806301ffc9a7146102b357806303116a17146102f057806306fdde031461031b578063081812fc14610346578063095ea7b3146103835780630fcf2e75146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d591906144f8565b610ae1565b6040516102e79190614540565b60405180910390f35b3480156102fc57600080fd5b50610305610b5b565b6040516103129190614574565b60405180910390f35b34801561032757600080fd5b50610330610b61565b60405161033d9190614628565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190614676565b610bf3565b60405161037a91906146e4565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a5919061472b565b610c78565b005b3480156103b857600080fd5b506103c1610d90565b6040516103ce9190614540565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190614676565b610da3565b005b34801561040c57600080fd5b50610415610e88565b6040516104229190614540565b60405180910390f35b34801561043757600080fd5b50610440610e9b565b60405161044d9190614574565b60405180910390f35b34801561046257600080fd5b5061046b610ea8565b6040516104789190614574565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190614676565b610eae565b005b3480156104b657600080fd5b506104d160048036038101906104cc919061476b565b610f93565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190614676565b610ff3565b005b34801561050857600080fd5b506105116110d8565b60405161051e9190614574565b60405180910390f35b34801561053357600080fd5b5061053c6110de565b60405161054991906147d7565b60405180910390f35b34801561055e57600080fd5b506105676110e4565b6040516105749190614574565b60405180910390f35b34801561058957600080fd5b506105926110ea565b005b3480156105a057600080fd5b506105bb60048036038101906105b69190614676565b6111b5565b005b3480156105c957600080fd5b506105e460048036038101906105df919061476b565b61129a565b005b3480156105f257600080fd5b5061060d6004803603810190610608919061472b565b6112ba565b005b34801561061b57600080fd5b506106366004803603810190610631919061481e565b611452565b005b34801561064457600080fd5b5061065f600480360381019061065a9190614676565b611537565b60405161066c9190614574565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190614980565b6115a8565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190614676565b61169d565b6040516106d291906146e4565b60405180910390f35b3480156106e757600080fd5b506106f061174f565b6040516106fd91906147d7565b60405180910390f35b34801561071257600080fd5b5061072d600480360381019061072891906149c9565b611755565b60405161073a9190614574565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190614676565b61180d565b60405161077791906146e4565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190614676565b61184a565b005b3480156107b557600080fd5b506107be61192f565b6040516107cb9190614574565b60405180910390f35b3480156107e057600080fd5b506107e9611935565b6040516107f69190614574565b60405180910390f35b34801561080b57600080fd5b5061081461193b565b005b34801561082257600080fd5b5061082b611ead565b6040516108389190614574565b60405180910390f35b34801561084d57600080fd5b50610856611eb3565b60405161086391906146e4565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e9190614676565b611edd565b005b3480156108a157600080fd5b506108aa611fc2565b6040516108b79190614628565b60405180910390f35b6108da60048036038101906108d59190614a56565b612054565b005b3480156108e857600080fd5b506108f1612420565b6040516108fe9190614574565b60405180910390f35b34801561091357600080fd5b5061092e6004803603810190610929919061481e565b612426565b005b34801561093c57600080fd5b5061094561250b565b005b34801561095357600080fd5b5061096e60048036038101906109699190614ae2565b612612565b005b34801561097c57600080fd5b5061099760048036038101906109929190614bc3565b612793565b005b3480156109a557600080fd5b506109c060048036038101906109bb9190614676565b6127f5565b6040516109cd9190614628565b60405180910390f35b6109f060048036038101906109eb9190614a56565b61289c565b005b3480156109fe57600080fd5b50610a07612bd8565b604051610a149190614628565b60405180910390f35b348015610a2957600080fd5b50610a446004803603810190610a3f9190614c46565b612c66565b604051610a519190614540565b60405180910390f35b348015610a6657600080fd5b50610a816004803603810190610a7c91906149c9565b612cfa565b005b348015610a8f57600080fd5b50610a98612df2565b005b348015610aa657600080fd5b50610aaf612ef9565b604051610abc9190614574565b60405180910390f35b610adf6004803603810190610ada9190614676565b612eff565b005b60007f577ac13a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b545750610b5382613212565b5b9050919050565b611a0a81565b606060008054610b7090614cb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9c90614cb5565b8015610be95780601f10610bbe57610100808354040283529160200191610be9565b820191906000526020600020905b815481529060010190602001808311610bcc57829003601f168201915b5050505050905090565b6000610bfe826132f4565b610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490614d59565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c838261169d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614deb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d13613360565b73ffffffffffffffffffffffffffffffffffffffff161480610d425750610d4181610d3c613360565b612c66565b5b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890614e7d565b60405180910390fd5b610d8b8383613368565b505050565b601e60019054906101000a900460ff1681565b610dab611eb3565b73ffffffffffffffffffffffffffffffffffffffff16610dc9613360565b73ffffffffffffffffffffffffffffffffffffffff161480610e3f5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e27613360565b73ffffffffffffffffffffffffffffffffffffffff16145b610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590614ee9565b60405180910390fd5b80601b8190555050565b601e60009054906101000a900460ff1681565b6000600880549050905090565b601a5481565b610eb6611eb3565b73ffffffffffffffffffffffffffffffffffffffff16610ed4613360565b73ffffffffffffffffffffffffffffffffffffffff161480610f4a5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f32613360565b73ffffffffffffffffffffffffffffffffffffffff16145b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8090614ee9565b60405180910390fd5b80601a8190555050565b610fa4610f9e613360565b82613421565b610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda90614f7b565b60405180910390fd5b610fee8383836134ff565b505050565b610ffb611eb3565b73ffffffffffffffffffffffffffffffffffffffff16611019613360565b73ffffffffffffffffffffffffffffffffffffffff16148061108f5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611077613360565b73ffffffffffffffffffffffffffffffffffffffff16145b6110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590614ee9565b60405180910390fd5b8060188190555050565b60195481565b600d5481565b601d5481565b6110f2613360565b73ffffffffffffffffffffffffffffffffffffffff16611110611eb3565b73ffffffffffffffffffffffffffffffffffffffff1614611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90614fe7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111b1573d6000803e3d6000fd5b5050565b6111bd611eb3565b73ffffffffffffffffffffffffffffffffffffffff166111db613360565b73ffffffffffffffffffffffffffffffffffffffff1614806112515750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611239613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790614ee9565b60405180910390fd5b8060198190555050565b6112b583838360405180602001604052806000815250612793565b505050565b6112c2611eb3565b73ffffffffffffffffffffffffffffffffffffffff166112e0613360565b73ffffffffffffffffffffffffffffffffffffffff1614806113565750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661133e613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90614ee9565b60405180910390fd5b600061139f610e9b565b90506000821180156113b35750601c548211155b6113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e990615053565b60405180910390fd5b60005b828110156114315761141e846001838561140f91906150a2565b61141991906150a2565b61375b565b8080611429906150f8565b9150506113f5565b5061144782601c5461377990919063ffffffff16565b601c81905550505050565b61145a611eb3565b73ffffffffffffffffffffffffffffffffffffffff16611478613360565b73ffffffffffffffffffffffffffffffffffffffff1614806114ee5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166114d6613360565b73ffffffffffffffffffffffffffffffffffffffff16145b61152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152490614ee9565b60405180910390fd5b80600d8190555050565b6000611541610e9b565b8210611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906151b3565b60405180910390fd5b60088281548110611596576115956151d3565b5b90600052602060002001549050919050565b6115b0611eb3565b73ffffffffffffffffffffffffffffffffffffffff166115ce613360565b73ffffffffffffffffffffffffffffffffffffffff1614806116445750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661162c613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a90614ee9565b60405180910390fd5b80602090805190602001906116999291906143e9565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90615274565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd90615306565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611852611eb3565b73ffffffffffffffffffffffffffffffffffffffff16611870613360565b73ffffffffffffffffffffffffffffffffffffffff1614806118e65750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118ce613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90614ee9565b60405180910390fd5b8060168190555050565b601b5481565b601c5481565b611943613360565b73ffffffffffffffffffffffffffffffffffffffff16611961611eb3565b73ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90614fe7565b60405180910390fd5b600047116119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190615372565b60405180910390fd5b60004790506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a616064611a5360178661378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611a6d906153c3565b60006040518083038185875af1925050503d8060008114611aaa576040519150601f19603f3d011682016040523d82523d6000602084013e611aaf565b606091505b505090506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b156064611b0760178761378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611b21906153c3565b60006040518083038185875af1925050503d8060008114611b5e576040519150601f19603f3d011682016040523d82523d6000602084013e611b63565b606091505b505090506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611bc96064611bbb60178861378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611bd5906153c3565b60006040518083038185875af1925050503d8060008114611c12576040519150601f19603f3d011682016040523d82523d6000602084013e611c17565b606091505b505090506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c7d6064611c6f60138961378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611c89906153c3565b60006040518083038185875af1925050503d8060008114611cc6576040519150601f19603f3d011682016040523d82523d6000602084013e611ccb565b606091505b505090506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d316064611d2360078a61378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611d3d906153c3565b60006040518083038185875af1925050503d8060008114611d7a576040519150601f19603f3d011682016040523d82523d6000602084013e611d7f565b606091505b505090506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611de56064611dd760058b61378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611df1906153c3565b60006040518083038185875af1925050503d8060008114611e2e576040519150601f19603f3d011682016040523d82523d6000602084013e611e33565b606091505b50509050858015611e415750845b8015611e4a5750835b8015611e535750825b8015611e5c5750815b8015611e655750805b611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90615424565b60405180910390fd5b50505050505050565b60175481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ee5611eb3565b73ffffffffffffffffffffffffffffffffffffffff16611f03613360565b73ffffffffffffffffffffffffffffffffffffffff161480611f795750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f61613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf90614ee9565b60405180910390fd5b8060178190555050565b606060018054611fd190614cb5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ffd90614cb5565b801561204a5780601f1061201f5761010080835404028352916020019161204a565b820191906000526020600020905b81548152906001019060200180831161202d57829003601f168201915b5050505050905090565b6000339050601e60009054906101000a900460ff166120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90615490565b60405180910390fd5b6000841180156120b9575060028411155b6120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906154fc565b60405180910390fd5b61210d8460165461378f90919063ffffffff16565b341461214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590615568565b60405180910390fd5b601b546121a385601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b11156121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db906155d4565b60405180910390fd5b612258838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e548360405160200161223d919061563c565b604051602081830303815290604052805190602001206137d1565b612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e906156a3565b60405180910390fd5b60005b8481101561241957601d546122ad610e9b565b1161236a576122cf3360016122c0610e9b565b6122ca91906150a2565b61375b565b6123226001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612406565b601e60009054906101000a900460ff1615601e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166108fc6123d56016546123c7858a61377990919063ffffffff16565b61378f90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015612400573d6000803e3d6000fd5b50612419565b8080612411906150f8565b91505061229a565b5050505050565b60185481565b61242e611eb3565b73ffffffffffffffffffffffffffffffffffffffff1661244c613360565b73ffffffffffffffffffffffffffffffffffffffff1614806124c25750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124aa613360565b73ffffffffffffffffffffffffffffffffffffffff16145b612501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f890614ee9565b60405180910390fd5b80600e8190555050565b612513611eb3565b73ffffffffffffffffffffffffffffffffffffffff16612531613360565b73ffffffffffffffffffffffffffffffffffffffff1614806125a75750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661258f613360565b73ffffffffffffffffffffffffffffffffffffffff16145b6125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90614ee9565b60405180910390fd5b601e60019054906101000a900460ff1615601e60016101000a81548160ff021916908315150217905550565b61261a613360565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267f9061570f565b60405180910390fd5b8060056000612695613360565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612742613360565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127879190614540565b60405180910390a35050565b6127a461279e613360565b83613421565b6127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614f7b565b60405180910390fd5b6127ef84848484613887565b50505050565b6060612800826132f4565b61283f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612836906157a1565b60405180910390fd5b60006128496138e3565b905060008151116128695760405180602001604052806000815250612894565b8061287384613975565b604051602001612884929190615849565b6040516020818303038152906040525b915050919050565b6000339050601e60009054906101000a900460ff166128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790615490565b60405180910390fd5b600084118015612901575060018411155b612940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612937906158c4565b60405180910390fd5b6129558460165461378f90919063ffffffff16565b3414612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d90615568565b60405180910390fd5b601a546129eb85601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b1115612a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a23906155d4565b60405180910390fd5b612aa0838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483604051602001612a85919061563c565b604051602081830303815290604052805190602001206137d1565b612adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad6906156a3565b60405180910390fd5b601d54612aea610e9b565b11612ba757612b0c336001612afd610e9b565b612b0791906150a2565b61375b565b612b5f6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612bd2565b601e60009054906101000a900460ff1615601e60006101000a81548160ff0219169083151502179055505b50505050565b60208054612be590614cb5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c1190614cb5565b8015612c5e5780601f10612c3357610100808354040283529160200191612c5e565b820191906000526020600020905b815481529060010190602001808311612c4157829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612d02613360565b73ffffffffffffffffffffffffffffffffffffffff16612d20611eb3565b73ffffffffffffffffffffffffffffffffffffffff1614612d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6d90614fe7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd90615956565b60405180910390fd5b612def81613ad6565b50565b612dfa611eb3565b73ffffffffffffffffffffffffffffffffffffffff16612e18613360565b73ffffffffffffffffffffffffffffffffffffffff161480612e8e5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e76613360565b73ffffffffffffffffffffffffffffffffffffffff16145b612ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec490614ee9565b60405180910390fd5b601e60009054906101000a900460ff1615601e60006101000a81548160ff021916908315150217905550565b60165481565b601e60019054906101000a900460ff16612f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f45906159c2565b60405180910390fd5b600081118015612f6057506018548111155b612f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f96906158c4565b60405180910390fd5b612fb48160175461378f90919063ffffffff16565b3414612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec90615568565b60405180910390fd5b60195461304a82601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b111561308b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613082906155d4565b60405180910390fd5b60005b8181101561320e57611a0a6130a1610e9b565b101561315f576130c43360016130b5610e9b565b6130bf91906150a2565b61375b565b6131176001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131fb565b601e60019054906101000a900460ff1615601e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166108fc6131ca6017546131bc858761377990919063ffffffff16565b61378f90919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156131f5573d6000803e3d6000fd5b5061320e565b8080613206906150f8565b91505061308e565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806132dd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806132ed57506132ec82613b9c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166133db8361169d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061342c826132f4565b61346b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346290615a54565b60405180910390fd5b60006134768361169d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806134e557508373ffffffffffffffffffffffffffffffffffffffff166134cd84610bf3565b73ffffffffffffffffffffffffffffffffffffffff16145b806134f657506134f58185612c66565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661351f8261169d565b73ffffffffffffffffffffffffffffffffffffffff1614613575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356c90615ae6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dc90615b78565b60405180910390fd5b6135f0838383613c06565b6135fb600082613368565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461364b9190615b98565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136a291906150a2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b613775828260405180602001604052806000815250613d1a565b5050565b600081836137879190615b98565b905092915050565b6000818361379d9190615bcc565b905092915050565b600081836137b39190615c55565b905092915050565b600081836137c991906150a2565b905092915050565b60008082905060005b85518110156138795760008682815181106137f8576137f76151d3565b5b6020026020010151905080831161383957828160405160200161381c929190615ca7565b604051602081830303815290604052805190602001209250613865565b808360405160200161384c929190615ca7565b6040516020818303038152906040528051906020012092505b508080613871906150f8565b9150506137da565b508381149150509392505050565b6138928484846134ff565b61389e84848484613d75565b6138dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d490615d45565b60405180910390fd5b50505050565b6060602080546138f290614cb5565b80601f016020809104026020016040519081016040528092919081815260200182805461391e90614cb5565b801561396b5780601f106139405761010080835404028352916020019161396b565b820191906000526020600020905b81548152906001019060200180831161394e57829003601f168201915b5050505050905090565b606060008214156139bd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613ad1565b600082905060005b600082146139ef5780806139d8906150f8565b915050600a826139e89190615c55565b91506139c5565b60008167ffffffffffffffff811115613a0b57613a0a614855565b5b6040519080825280601f01601f191660200182016040528015613a3d5781602001600182028036833780820191505090505b5090505b60008514613aca57600182613a569190615b98565b9150600a85613a659190615d65565b6030613a7191906150a2565b60f81b818381518110613a8757613a866151d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613ac39190615c55565b9450613a41565b8093505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613c11838383613efd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c5457613c4f81613f02565b613c93565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613c9257613c918382613f4b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cd657613cd1816140b8565b613d15565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613d1457613d138282614189565b5b5b505050565b613d248383614208565b613d316000848484613d75565b613d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d6790615d45565b60405180910390fd5b505050565b6000613d968473ffffffffffffffffffffffffffffffffffffffff166143d6565b15613ef0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613dbf613360565b8786866040518563ffffffff1660e01b8152600401613de19493929190615deb565b6020604051808303816000875af1925050508015613e1d57506040513d601f19601f82011682018060405250810190613e1a9190615e4c565b60015b613ea0573d8060008114613e4d576040519150601f19603f3d011682016040523d82523d6000602084013e613e52565b606091505b50600081511415613e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8f90615d45565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ef5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613f5884611755565b613f629190615b98565b9050600060076000848152602001908152602001600020549050818114614047576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506140cc9190615b98565b90506000600960008481526020019081526020016000205490506000600883815481106140fc576140fb6151d3565b5b90600052602060002001549050806008838154811061411e5761411d6151d3565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061416d5761416c615e79565b5b6001900381819060005260206000200160009055905550505050565b600061419483611755565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161426f90615ef4565b60405180910390fd5b614281816132f4565b156142c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b890615f60565b60405180910390fd5b6142cd60008383613c06565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461431d91906150a2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546143f590614cb5565b90600052602060002090601f016020900481019282614417576000855561445e565b82601f1061443057805160ff191683800117855561445e565b8280016001018555821561445e579182015b8281111561445d578251825591602001919060010190614442565b5b50905061446b919061446f565b5090565b5b80821115614488576000816000905550600101614470565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144d5816144a0565b81146144e057600080fd5b50565b6000813590506144f2816144cc565b92915050565b60006020828403121561450e5761450d614496565b5b600061451c848285016144e3565b91505092915050565b60008115159050919050565b61453a81614525565b82525050565b60006020820190506145556000830184614531565b92915050565b6000819050919050565b61456e8161455b565b82525050565b60006020820190506145896000830184614565565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145c95780820151818401526020810190506145ae565b838111156145d8576000848401525b50505050565b6000601f19601f8301169050919050565b60006145fa8261458f565b614604818561459a565b93506146148185602086016145ab565b61461d816145de565b840191505092915050565b6000602082019050818103600083015261464281846145ef565b905092915050565b6146538161455b565b811461465e57600080fd5b50565b6000813590506146708161464a565b92915050565b60006020828403121561468c5761468b614496565b5b600061469a84828501614661565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146ce826146a3565b9050919050565b6146de816146c3565b82525050565b60006020820190506146f960008301846146d5565b92915050565b614708816146c3565b811461471357600080fd5b50565b600081359050614725816146ff565b92915050565b6000806040838503121561474257614741614496565b5b600061475085828601614716565b925050602061476185828601614661565b9150509250929050565b60008060006060848603121561478457614783614496565b5b600061479286828701614716565b93505060206147a386828701614716565b92505060406147b486828701614661565b9150509250925092565b6000819050919050565b6147d1816147be565b82525050565b60006020820190506147ec60008301846147c8565b92915050565b6147fb816147be565b811461480657600080fd5b50565b600081359050614818816147f2565b92915050565b60006020828403121561483457614833614496565b5b600061484284828501614809565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61488d826145de565b810181811067ffffffffffffffff821117156148ac576148ab614855565b5b80604052505050565b60006148bf61448c565b90506148cb8282614884565b919050565b600067ffffffffffffffff8211156148eb576148ea614855565b5b6148f4826145de565b9050602081019050919050565b82818337600083830152505050565b600061492361491e846148d0565b6148b5565b90508281526020810184848401111561493f5761493e614850565b5b61494a848285614901565b509392505050565b600082601f8301126149675761496661484b565b5b8135614977848260208601614910565b91505092915050565b60006020828403121561499657614995614496565b5b600082013567ffffffffffffffff8111156149b4576149b361449b565b5b6149c084828501614952565b91505092915050565b6000602082840312156149df576149de614496565b5b60006149ed84828501614716565b91505092915050565b600080fd5b600080fd5b60008083601f840112614a1657614a1561484b565b5b8235905067ffffffffffffffff811115614a3357614a326149f6565b5b602083019150836020820283011115614a4f57614a4e6149fb565b5b9250929050565b600080600060408486031215614a6f57614a6e614496565b5b6000614a7d86828701614661565b935050602084013567ffffffffffffffff811115614a9e57614a9d61449b565b5b614aaa86828701614a00565b92509250509250925092565b614abf81614525565b8114614aca57600080fd5b50565b600081359050614adc81614ab6565b92915050565b60008060408385031215614af957614af8614496565b5b6000614b0785828601614716565b9250506020614b1885828601614acd565b9150509250929050565b600067ffffffffffffffff821115614b3d57614b3c614855565b5b614b46826145de565b9050602081019050919050565b6000614b66614b6184614b22565b6148b5565b905082815260208101848484011115614b8257614b81614850565b5b614b8d848285614901565b509392505050565b600082601f830112614baa57614ba961484b565b5b8135614bba848260208601614b53565b91505092915050565b60008060008060808587031215614bdd57614bdc614496565b5b6000614beb87828801614716565b9450506020614bfc87828801614716565b9350506040614c0d87828801614661565b925050606085013567ffffffffffffffff811115614c2e57614c2d61449b565b5b614c3a87828801614b95565b91505092959194509250565b60008060408385031215614c5d57614c5c614496565b5b6000614c6b85828601614716565b9250506020614c7c85828601614716565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ccd57607f821691505b60208210811415614ce157614ce0614c86565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d43602c8361459a565b9150614d4e82614ce7565b604082019050919050565b60006020820190508181036000830152614d7281614d36565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614dd560218361459a565b9150614de082614d79565b604082019050919050565b60006020820190508181036000830152614e0481614dc8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614e6760388361459a565b9150614e7282614e0b565b604082019050919050565b60006020820190508181036000830152614e9681614e5a565b9050919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614ed3600e8361459a565b9150614ede82614e9d565b602082019050919050565b60006020820190508181036000830152614f0281614ec6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614f6560318361459a565b9150614f7082614f09565b604082019050919050565b60006020820190508181036000830152614f9481614f58565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fd160208361459a565b9150614fdc82614f9b565b602082019050919050565b6000602082019050818103600083015261500081614fc4565b9050919050565b7f4e6f7420656e6f75676820726573657276650000000000000000000000000000600082015250565b600061503d60128361459a565b915061504882615007565b602082019050919050565b6000602082019050818103600083015261506c81615030565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150ad8261455b565b91506150b88361455b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150ed576150ec615073565b5b828201905092915050565b60006151038261455b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561513657615135615073565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061519d602c8361459a565b91506151a882615141565b604082019050919050565b600060208201905081810360008301526151cc81615190565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061525e60298361459a565b915061526982615202565b604082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006152f0602a8361459a565b91506152fb82615294565b604082019050919050565b6000602082019050818103600083015261531f816152e3565b9050919050565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b600061535c600a8361459a565b915061536782615326565b602082019050919050565b6000602082019050818103600083015261538b8161534f565b9050919050565b600081905092915050565b50565b60006153ad600083615392565b91506153b88261539d565b600082019050919050565b60006153ce826153a0565b9150819050919050565b7f5769746864726177616c206661696c65642e0000000000000000000000000000600082015250565b600061540e60128361459a565b9150615419826153d8565b602082019050919050565b6000602082019050818103600083015261543d81615401565b9050919050565b7f574c2073616c65206e6f74206163746976650000000000000000000000000000600082015250565b600061547a60128361459a565b915061548582615444565b602082019050919050565b600060208201905081810360008301526154a98161546d565b9050919050565b7f322070545820616c6c6f77656400000000000000000000000000000000000000600082015250565b60006154e6600d8361459a565b91506154f1826154b0565b602082019050919050565b60006020820190508181036000830152615515816154d9565b9050919050565b7f436865636b204554480000000000000000000000000000000000000000000000600082015250565b600061555260098361459a565b915061555d8261551c565b602082019050919050565b6000602082019050818103600083015261558181615545565b9050919050565b7f4d61782070572072656163686564000000000000000000000000000000000000600082015250565b60006155be600e8361459a565b91506155c982615588565b602082019050919050565b600060208201905081810360008301526155ed816155b1565b9050919050565b60008160601b9050919050565b600061560c826155f4565b9050919050565b600061561e82615601565b9050919050565b615636615631826146c3565b615613565b82525050565b60006156488284615625565b60148201915081905092915050565b7f436865636b2070726f6f66000000000000000000000000000000000000000000600082015250565b600061568d600b8361459a565b915061569882615657565b602082019050919050565b600060208201905081810360008301526156bc81615680565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006156f960198361459a565b9150615704826156c3565b602082019050919050565b60006020820190508181036000830152615728816156ec565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061578b602f8361459a565b91506157968261572f565b604082019050919050565b600060208201905081810360008301526157ba8161577e565b9050919050565b600081905092915050565b60006157d78261458f565b6157e181856157c1565b93506157f18185602086016145ab565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006158336005836157c1565b915061583e826157fd565b600582019050919050565b600061585582856157cc565b915061586182846157cc565b915061586c82615826565b91508190509392505050565b7f312070545820616c6c6f77656400000000000000000000000000000000000000600082015250565b60006158ae600d8361459a565b91506158b982615878565b602082019050919050565b600060208201905081810360008301526158dd816158a1565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061594060268361459a565b915061594b826158e4565b604082019050919050565b6000602082019050818103600083015261596f81615933565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b60006159ac600f8361459a565b91506159b782615976565b602082019050919050565b600060208201905081810360008301526159db8161599f565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615a3e602c8361459a565b9150615a49826159e2565b604082019050919050565b60006020820190508181036000830152615a6d81615a31565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615ad060298361459a565b9150615adb82615a74565b604082019050919050565b60006020820190508181036000830152615aff81615ac3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615b6260248361459a565b9150615b6d82615b06565b604082019050919050565b60006020820190508181036000830152615b9181615b55565b9050919050565b6000615ba38261455b565b9150615bae8361455b565b925082821015615bc157615bc0615073565b5b828203905092915050565b6000615bd78261455b565b9150615be28361455b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615c1b57615c1a615073565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615c608261455b565b9150615c6b8361455b565b925082615c7b57615c7a615c26565b5b828204905092915050565b6000819050919050565b615ca1615c9c826147be565b615c86565b82525050565b6000615cb38285615c90565b602082019150615cc38284615c90565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615d2f60328361459a565b9150615d3a82615cd3565b604082019050919050565b60006020820190508181036000830152615d5e81615d22565b9050919050565b6000615d708261455b565b9150615d7b8361455b565b925082615d8b57615d8a615c26565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000615dbd82615d96565b615dc78185615da1565b9350615dd78185602086016145ab565b615de0816145de565b840191505092915050565b6000608082019050615e0060008301876146d5565b615e0d60208301866146d5565b615e1a6040830185614565565b8181036060830152615e2c8184615db2565b905095945050505050565b600081519050615e46816144cc565b92915050565b600060208284031215615e6257615e61614496565b5b6000615e7084828501615e37565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615ede60208361459a565b9150615ee982615ea8565b602082019050919050565b60006020820190508181036000830152615f0d81615ed1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615f4a601c8361459a565b9150615f5582615f14565b602082019050919050565b60006020820190508181036000830152615f7981615f3d565b905091905056fea26469706673582212200adde866ac3fac2b389933b23e3669c8690d3266deabcde588a53c4afa9e4d7564736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c806367fbc385116101755780639aa380d9116100dc578063d31a111211610095578063f2fde38b1161006f578063f2fde38b14610a5a578063f6efe0ed14610a83578063faedb01214610a9a578063fecaa28f14610ac5576102ae565b8063d31a1112146109d6578063d547cfb7146109f2578063e985e9c514610a1d576102ae565b80639aa380d9146108dc5780639e0e25fd14610907578063a10866ef14610930578063a22cb46514610947578063b88d4fde14610970578063c87b56dd14610999576102ae565b8063853828b61161012e578063853828b6146107ff57806388e1aa10146108165780638da5cb5b1461084157806391b7f5ed1461086c57806395d89b41146108955780639641d752146108c0576102ae565b806367fbc385146106db57806370a08231146107065780637f81be691461074357806381d8488f1461078057806383eeb79b146107a957806384925fd6146107d4576102ae565b806329a2af9a1161021957806342842e0e116101d257806342842e0e146105bd578063464d2156146105e65780634783f0ef1461060f5780634f6ccce71461063857806355f804b3146106755780636352211e1461069e576102ae565b806329a2af9a146104d35780632c93954b146104fc5780632eb4a7ab146105275780633cbe25b9146105525780633ccfd60b1461057d57806341994ce514610594576102ae565b80631003c9e81161026b5780631003c9e8146103d757806310b5454d1461040057806318160ddd1461042b57806318ed2f5b146104565780632252731f1461048157806323b872dd146104aa576102ae565b806301ffc9a7146102b357806303116a17146102f057806306fdde031461031b578063081812fc14610346578063095ea7b3146103835780630fcf2e75146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d591906144f8565b610ae1565b6040516102e79190614540565b60405180910390f35b3480156102fc57600080fd5b50610305610b5b565b6040516103129190614574565b60405180910390f35b34801561032757600080fd5b50610330610b61565b60405161033d9190614628565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190614676565b610bf3565b60405161037a91906146e4565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a5919061472b565b610c78565b005b3480156103b857600080fd5b506103c1610d90565b6040516103ce9190614540565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190614676565b610da3565b005b34801561040c57600080fd5b50610415610e88565b6040516104229190614540565b60405180910390f35b34801561043757600080fd5b50610440610e9b565b60405161044d9190614574565b60405180910390f35b34801561046257600080fd5b5061046b610ea8565b6040516104789190614574565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190614676565b610eae565b005b3480156104b657600080fd5b506104d160048036038101906104cc919061476b565b610f93565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190614676565b610ff3565b005b34801561050857600080fd5b506105116110d8565b60405161051e9190614574565b60405180910390f35b34801561053357600080fd5b5061053c6110de565b60405161054991906147d7565b60405180910390f35b34801561055e57600080fd5b506105676110e4565b6040516105749190614574565b60405180910390f35b34801561058957600080fd5b506105926110ea565b005b3480156105a057600080fd5b506105bb60048036038101906105b69190614676565b6111b5565b005b3480156105c957600080fd5b506105e460048036038101906105df919061476b565b61129a565b005b3480156105f257600080fd5b5061060d6004803603810190610608919061472b565b6112ba565b005b34801561061b57600080fd5b506106366004803603810190610631919061481e565b611452565b005b34801561064457600080fd5b5061065f600480360381019061065a9190614676565b611537565b60405161066c9190614574565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190614980565b6115a8565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190614676565b61169d565b6040516106d291906146e4565b60405180910390f35b3480156106e757600080fd5b506106f061174f565b6040516106fd91906147d7565b60405180910390f35b34801561071257600080fd5b5061072d600480360381019061072891906149c9565b611755565b60405161073a9190614574565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190614676565b61180d565b60405161077791906146e4565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190614676565b61184a565b005b3480156107b557600080fd5b506107be61192f565b6040516107cb9190614574565b60405180910390f35b3480156107e057600080fd5b506107e9611935565b6040516107f69190614574565b60405180910390f35b34801561080b57600080fd5b5061081461193b565b005b34801561082257600080fd5b5061082b611ead565b6040516108389190614574565b60405180910390f35b34801561084d57600080fd5b50610856611eb3565b60405161086391906146e4565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e9190614676565b611edd565b005b3480156108a157600080fd5b506108aa611fc2565b6040516108b79190614628565b60405180910390f35b6108da60048036038101906108d59190614a56565b612054565b005b3480156108e857600080fd5b506108f1612420565b6040516108fe9190614574565b60405180910390f35b34801561091357600080fd5b5061092e6004803603810190610929919061481e565b612426565b005b34801561093c57600080fd5b5061094561250b565b005b34801561095357600080fd5b5061096e60048036038101906109699190614ae2565b612612565b005b34801561097c57600080fd5b5061099760048036038101906109929190614bc3565b612793565b005b3480156109a557600080fd5b506109c060048036038101906109bb9190614676565b6127f5565b6040516109cd9190614628565b60405180910390f35b6109f060048036038101906109eb9190614a56565b61289c565b005b3480156109fe57600080fd5b50610a07612bd8565b604051610a149190614628565b60405180910390f35b348015610a2957600080fd5b50610a446004803603810190610a3f9190614c46565b612c66565b604051610a519190614540565b60405180910390f35b348015610a6657600080fd5b50610a816004803603810190610a7c91906149c9565b612cfa565b005b348015610a8f57600080fd5b50610a98612df2565b005b348015610aa657600080fd5b50610aaf612ef9565b604051610abc9190614574565b60405180910390f35b610adf6004803603810190610ada9190614676565b612eff565b005b60007f577ac13a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b545750610b5382613212565b5b9050919050565b611a0a81565b606060008054610b7090614cb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9c90614cb5565b8015610be95780601f10610bbe57610100808354040283529160200191610be9565b820191906000526020600020905b815481529060010190602001808311610bcc57829003601f168201915b5050505050905090565b6000610bfe826132f4565b610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490614d59565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c838261169d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90614deb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d13613360565b73ffffffffffffffffffffffffffffffffffffffff161480610d425750610d4181610d3c613360565b612c66565b5b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890614e7d565b60405180910390fd5b610d8b8383613368565b505050565b601e60019054906101000a900460ff1681565b610dab611eb3565b73ffffffffffffffffffffffffffffffffffffffff16610dc9613360565b73ffffffffffffffffffffffffffffffffffffffff161480610e3f5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e27613360565b73ffffffffffffffffffffffffffffffffffffffff16145b610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590614ee9565b60405180910390fd5b80601b8190555050565b601e60009054906101000a900460ff1681565b6000600880549050905090565b601a5481565b610eb6611eb3565b73ffffffffffffffffffffffffffffffffffffffff16610ed4613360565b73ffffffffffffffffffffffffffffffffffffffff161480610f4a5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f32613360565b73ffffffffffffffffffffffffffffffffffffffff16145b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8090614ee9565b60405180910390fd5b80601a8190555050565b610fa4610f9e613360565b82613421565b610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda90614f7b565b60405180910390fd5b610fee8383836134ff565b505050565b610ffb611eb3565b73ffffffffffffffffffffffffffffffffffffffff16611019613360565b73ffffffffffffffffffffffffffffffffffffffff16148061108f5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611077613360565b73ffffffffffffffffffffffffffffffffffffffff16145b6110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590614ee9565b60405180910390fd5b8060188190555050565b60195481565b600d5481565b601d5481565b6110f2613360565b73ffffffffffffffffffffffffffffffffffffffff16611110611eb3565b73ffffffffffffffffffffffffffffffffffffffff1614611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90614fe7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111b1573d6000803e3d6000fd5b5050565b6111bd611eb3565b73ffffffffffffffffffffffffffffffffffffffff166111db613360565b73ffffffffffffffffffffffffffffffffffffffff1614806112515750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611239613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790614ee9565b60405180910390fd5b8060198190555050565b6112b583838360405180602001604052806000815250612793565b505050565b6112c2611eb3565b73ffffffffffffffffffffffffffffffffffffffff166112e0613360565b73ffffffffffffffffffffffffffffffffffffffff1614806113565750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661133e613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90614ee9565b60405180910390fd5b600061139f610e9b565b90506000821180156113b35750601c548211155b6113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e990615053565b60405180910390fd5b60005b828110156114315761141e846001838561140f91906150a2565b61141991906150a2565b61375b565b8080611429906150f8565b9150506113f5565b5061144782601c5461377990919063ffffffff16565b601c81905550505050565b61145a611eb3565b73ffffffffffffffffffffffffffffffffffffffff16611478613360565b73ffffffffffffffffffffffffffffffffffffffff1614806114ee5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166114d6613360565b73ffffffffffffffffffffffffffffffffffffffff16145b61152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152490614ee9565b60405180910390fd5b80600d8190555050565b6000611541610e9b565b8210611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906151b3565b60405180910390fd5b60088281548110611596576115956151d3565b5b90600052602060002001549050919050565b6115b0611eb3565b73ffffffffffffffffffffffffffffffffffffffff166115ce613360565b73ffffffffffffffffffffffffffffffffffffffff1614806116445750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661162c613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a90614ee9565b60405180910390fd5b80602090805190602001906116999291906143e9565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90615274565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd90615306565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611852611eb3565b73ffffffffffffffffffffffffffffffffffffffff16611870613360565b73ffffffffffffffffffffffffffffffffffffffff1614806118e65750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118ce613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90614ee9565b60405180910390fd5b8060168190555050565b601b5481565b601c5481565b611943613360565b73ffffffffffffffffffffffffffffffffffffffff16611961611eb3565b73ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90614fe7565b60405180910390fd5b600047116119fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f190615372565b60405180910390fd5b60004790506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a616064611a5360178661378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611a6d906153c3565b60006040518083038185875af1925050503d8060008114611aaa576040519150601f19603f3d011682016040523d82523d6000602084013e611aaf565b606091505b505090506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b156064611b0760178761378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611b21906153c3565b60006040518083038185875af1925050503d8060008114611b5e576040519150601f19603f3d011682016040523d82523d6000602084013e611b63565b606091505b505090506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611bc96064611bbb60178861378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611bd5906153c3565b60006040518083038185875af1925050503d8060008114611c12576040519150601f19603f3d011682016040523d82523d6000602084013e611c17565b606091505b505090506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c7d6064611c6f60138961378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611c89906153c3565b60006040518083038185875af1925050503d8060008114611cc6576040519150601f19603f3d011682016040523d82523d6000602084013e611ccb565b606091505b505090506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d316064611d2360078a61378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611d3d906153c3565b60006040518083038185875af1925050503d8060008114611d7a576040519150601f19603f3d011682016040523d82523d6000602084013e611d7f565b606091505b505090506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611de56064611dd760058b61378f90919063ffffffff16565b6137a590919063ffffffff16565b604051611df1906153c3565b60006040518083038185875af1925050503d8060008114611e2e576040519150601f19603f3d011682016040523d82523d6000602084013e611e33565b606091505b50509050858015611e415750845b8015611e4a5750835b8015611e535750825b8015611e5c5750815b8015611e655750805b611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90615424565b60405180910390fd5b50505050505050565b60175481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ee5611eb3565b73ffffffffffffffffffffffffffffffffffffffff16611f03613360565b73ffffffffffffffffffffffffffffffffffffffff161480611f795750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f61613360565b73ffffffffffffffffffffffffffffffffffffffff16145b611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf90614ee9565b60405180910390fd5b8060178190555050565b606060018054611fd190614cb5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ffd90614cb5565b801561204a5780601f1061201f5761010080835404028352916020019161204a565b820191906000526020600020905b81548152906001019060200180831161202d57829003601f168201915b5050505050905090565b6000339050601e60009054906101000a900460ff166120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90615490565b60405180910390fd5b6000841180156120b9575060028411155b6120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906154fc565b60405180910390fd5b61210d8460165461378f90919063ffffffff16565b341461214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590615568565b60405180910390fd5b601b546121a385601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b11156121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db906155d4565b60405180910390fd5b612258838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e548360405160200161223d919061563c565b604051602081830303815290604052805190602001206137d1565b612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e906156a3565b60405180910390fd5b60005b8481101561241957601d546122ad610e9b565b1161236a576122cf3360016122c0610e9b565b6122ca91906150a2565b61375b565b6123226001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612406565b601e60009054906101000a900460ff1615601e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166108fc6123d56016546123c7858a61377990919063ffffffff16565b61378f90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015612400573d6000803e3d6000fd5b50612419565b8080612411906150f8565b91505061229a565b5050505050565b60185481565b61242e611eb3565b73ffffffffffffffffffffffffffffffffffffffff1661244c613360565b73ffffffffffffffffffffffffffffffffffffffff1614806124c25750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124aa613360565b73ffffffffffffffffffffffffffffffffffffffff16145b612501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f890614ee9565b60405180910390fd5b80600e8190555050565b612513611eb3565b73ffffffffffffffffffffffffffffffffffffffff16612531613360565b73ffffffffffffffffffffffffffffffffffffffff1614806125a75750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661258f613360565b73ffffffffffffffffffffffffffffffffffffffff16145b6125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90614ee9565b60405180910390fd5b601e60019054906101000a900460ff1615601e60016101000a81548160ff021916908315150217905550565b61261a613360565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267f9061570f565b60405180910390fd5b8060056000612695613360565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612742613360565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127879190614540565b60405180910390a35050565b6127a461279e613360565b83613421565b6127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614f7b565b60405180910390fd5b6127ef84848484613887565b50505050565b6060612800826132f4565b61283f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612836906157a1565b60405180910390fd5b60006128496138e3565b905060008151116128695760405180602001604052806000815250612894565b8061287384613975565b604051602001612884929190615849565b6040516020818303038152906040525b915050919050565b6000339050601e60009054906101000a900460ff166128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790615490565b60405180910390fd5b600084118015612901575060018411155b612940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612937906158c4565b60405180910390fd5b6129558460165461378f90919063ffffffff16565b3414612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d90615568565b60405180910390fd5b601a546129eb85601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b1115612a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a23906155d4565b60405180910390fd5b612aa0838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483604051602001612a85919061563c565b604051602081830303815290604052805190602001206137d1565b612adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad6906156a3565b60405180910390fd5b601d54612aea610e9b565b11612ba757612b0c336001612afd610e9b565b612b0791906150a2565b61375b565b612b5f6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612bd2565b601e60009054906101000a900460ff1615601e60006101000a81548160ff0219169083151502179055505b50505050565b60208054612be590614cb5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c1190614cb5565b8015612c5e5780601f10612c3357610100808354040283529160200191612c5e565b820191906000526020600020905b815481529060010190602001808311612c4157829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612d02613360565b73ffffffffffffffffffffffffffffffffffffffff16612d20611eb3565b73ffffffffffffffffffffffffffffffffffffffff1614612d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6d90614fe7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd90615956565b60405180910390fd5b612def81613ad6565b50565b612dfa611eb3565b73ffffffffffffffffffffffffffffffffffffffff16612e18613360565b73ffffffffffffffffffffffffffffffffffffffff161480612e8e5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e76613360565b73ffffffffffffffffffffffffffffffffffffffff16145b612ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec490614ee9565b60405180910390fd5b601e60009054906101000a900460ff1615601e60006101000a81548160ff021916908315150217905550565b60165481565b601e60019054906101000a900460ff16612f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f45906159c2565b60405180910390fd5b600081118015612f6057506018548111155b612f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f96906158c4565b60405180910390fd5b612fb48160175461378f90919063ffffffff16565b3414612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec90615568565b60405180910390fd5b60195461304a82601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b111561308b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613082906155d4565b60405180910390fd5b60005b8181101561320e57611a0a6130a1610e9b565b101561315f576130c43360016130b5610e9b565b6130bf91906150a2565b61375b565b6131176001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137bb90919063ffffffff16565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131fb565b601e60019054906101000a900460ff1615601e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff166108fc6131ca6017546131bc858761377990919063ffffffff16565b61378f90919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156131f5573d6000803e3d6000fd5b5061320e565b8080613206906150f8565b91505061308e565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806132dd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806132ed57506132ec82613b9c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166133db8361169d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061342c826132f4565b61346b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346290615a54565b60405180910390fd5b60006134768361169d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806134e557508373ffffffffffffffffffffffffffffffffffffffff166134cd84610bf3565b73ffffffffffffffffffffffffffffffffffffffff16145b806134f657506134f58185612c66565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661351f8261169d565b73ffffffffffffffffffffffffffffffffffffffff1614613575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356c90615ae6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dc90615b78565b60405180910390fd5b6135f0838383613c06565b6135fb600082613368565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461364b9190615b98565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136a291906150a2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b613775828260405180602001604052806000815250613d1a565b5050565b600081836137879190615b98565b905092915050565b6000818361379d9190615bcc565b905092915050565b600081836137b39190615c55565b905092915050565b600081836137c991906150a2565b905092915050565b60008082905060005b85518110156138795760008682815181106137f8576137f76151d3565b5b6020026020010151905080831161383957828160405160200161381c929190615ca7565b604051602081830303815290604052805190602001209250613865565b808360405160200161384c929190615ca7565b6040516020818303038152906040528051906020012092505b508080613871906150f8565b9150506137da565b508381149150509392505050565b6138928484846134ff565b61389e84848484613d75565b6138dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d490615d45565b60405180910390fd5b50505050565b6060602080546138f290614cb5565b80601f016020809104026020016040519081016040528092919081815260200182805461391e90614cb5565b801561396b5780601f106139405761010080835404028352916020019161396b565b820191906000526020600020905b81548152906001019060200180831161394e57829003601f168201915b5050505050905090565b606060008214156139bd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613ad1565b600082905060005b600082146139ef5780806139d8906150f8565b915050600a826139e89190615c55565b91506139c5565b60008167ffffffffffffffff811115613a0b57613a0a614855565b5b6040519080825280601f01601f191660200182016040528015613a3d5781602001600182028036833780820191505090505b5090505b60008514613aca57600182613a569190615b98565b9150600a85613a659190615d65565b6030613a7191906150a2565b60f81b818381518110613a8757613a866151d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613ac39190615c55565b9450613a41565b8093505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613c11838383613efd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c5457613c4f81613f02565b613c93565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613c9257613c918382613f4b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cd657613cd1816140b8565b613d15565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613d1457613d138282614189565b5b5b505050565b613d248383614208565b613d316000848484613d75565b613d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d6790615d45565b60405180910390fd5b505050565b6000613d968473ffffffffffffffffffffffffffffffffffffffff166143d6565b15613ef0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613dbf613360565b8786866040518563ffffffff1660e01b8152600401613de19493929190615deb565b6020604051808303816000875af1925050508015613e1d57506040513d601f19601f82011682018060405250810190613e1a9190615e4c565b60015b613ea0573d8060008114613e4d576040519150601f19603f3d011682016040523d82523d6000602084013e613e52565b606091505b50600081511415613e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e8f90615d45565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ef5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613f5884611755565b613f629190615b98565b9050600060076000848152602001908152602001600020549050818114614047576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506140cc9190615b98565b90506000600960008481526020019081526020016000205490506000600883815481106140fc576140fb6151d3565b5b90600052602060002001549050806008838154811061411e5761411d6151d3565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061416d5761416c615e79565b5b6001900381819060005260206000200160009055905550505050565b600061419483611755565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161426f90615ef4565b60405180910390fd5b614281816132f4565b156142c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b890615f60565b60405180910390fd5b6142cd60008383613c06565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461431d91906150a2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546143f590614cb5565b90600052602060002090601f016020900481019282614417576000855561445e565b82601f1061443057805160ff191683800117855561445e565b8280016001018555821561445e579182015b8281111561445d578251825591602001919060010190614442565b5b50905061446b919061446f565b5090565b5b80821115614488576000816000905550600101614470565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144d5816144a0565b81146144e057600080fd5b50565b6000813590506144f2816144cc565b92915050565b60006020828403121561450e5761450d614496565b5b600061451c848285016144e3565b91505092915050565b60008115159050919050565b61453a81614525565b82525050565b60006020820190506145556000830184614531565b92915050565b6000819050919050565b61456e8161455b565b82525050565b60006020820190506145896000830184614565565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145c95780820151818401526020810190506145ae565b838111156145d8576000848401525b50505050565b6000601f19601f8301169050919050565b60006145fa8261458f565b614604818561459a565b93506146148185602086016145ab565b61461d816145de565b840191505092915050565b6000602082019050818103600083015261464281846145ef565b905092915050565b6146538161455b565b811461465e57600080fd5b50565b6000813590506146708161464a565b92915050565b60006020828403121561468c5761468b614496565b5b600061469a84828501614661565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146ce826146a3565b9050919050565b6146de816146c3565b82525050565b60006020820190506146f960008301846146d5565b92915050565b614708816146c3565b811461471357600080fd5b50565b600081359050614725816146ff565b92915050565b6000806040838503121561474257614741614496565b5b600061475085828601614716565b925050602061476185828601614661565b9150509250929050565b60008060006060848603121561478457614783614496565b5b600061479286828701614716565b93505060206147a386828701614716565b92505060406147b486828701614661565b9150509250925092565b6000819050919050565b6147d1816147be565b82525050565b60006020820190506147ec60008301846147c8565b92915050565b6147fb816147be565b811461480657600080fd5b50565b600081359050614818816147f2565b92915050565b60006020828403121561483457614833614496565b5b600061484284828501614809565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61488d826145de565b810181811067ffffffffffffffff821117156148ac576148ab614855565b5b80604052505050565b60006148bf61448c565b90506148cb8282614884565b919050565b600067ffffffffffffffff8211156148eb576148ea614855565b5b6148f4826145de565b9050602081019050919050565b82818337600083830152505050565b600061492361491e846148d0565b6148b5565b90508281526020810184848401111561493f5761493e614850565b5b61494a848285614901565b509392505050565b600082601f8301126149675761496661484b565b5b8135614977848260208601614910565b91505092915050565b60006020828403121561499657614995614496565b5b600082013567ffffffffffffffff8111156149b4576149b361449b565b5b6149c084828501614952565b91505092915050565b6000602082840312156149df576149de614496565b5b60006149ed84828501614716565b91505092915050565b600080fd5b600080fd5b60008083601f840112614a1657614a1561484b565b5b8235905067ffffffffffffffff811115614a3357614a326149f6565b5b602083019150836020820283011115614a4f57614a4e6149fb565b5b9250929050565b600080600060408486031215614a6f57614a6e614496565b5b6000614a7d86828701614661565b935050602084013567ffffffffffffffff811115614a9e57614a9d61449b565b5b614aaa86828701614a00565b92509250509250925092565b614abf81614525565b8114614aca57600080fd5b50565b600081359050614adc81614ab6565b92915050565b60008060408385031215614af957614af8614496565b5b6000614b0785828601614716565b9250506020614b1885828601614acd565b9150509250929050565b600067ffffffffffffffff821115614b3d57614b3c614855565b5b614b46826145de565b9050602081019050919050565b6000614b66614b6184614b22565b6148b5565b905082815260208101848484011115614b8257614b81614850565b5b614b8d848285614901565b509392505050565b600082601f830112614baa57614ba961484b565b5b8135614bba848260208601614b53565b91505092915050565b60008060008060808587031215614bdd57614bdc614496565b5b6000614beb87828801614716565b9450506020614bfc87828801614716565b9350506040614c0d87828801614661565b925050606085013567ffffffffffffffff811115614c2e57614c2d61449b565b5b614c3a87828801614b95565b91505092959194509250565b60008060408385031215614c5d57614c5c614496565b5b6000614c6b85828601614716565b9250506020614c7c85828601614716565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ccd57607f821691505b60208210811415614ce157614ce0614c86565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d43602c8361459a565b9150614d4e82614ce7565b604082019050919050565b60006020820190508181036000830152614d7281614d36565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614dd560218361459a565b9150614de082614d79565b604082019050919050565b60006020820190508181036000830152614e0481614dc8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614e6760388361459a565b9150614e7282614e0b565b604082019050919050565b60006020820190508181036000830152614e9681614e5a565b9050919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614ed3600e8361459a565b9150614ede82614e9d565b602082019050919050565b60006020820190508181036000830152614f0281614ec6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614f6560318361459a565b9150614f7082614f09565b604082019050919050565b60006020820190508181036000830152614f9481614f58565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fd160208361459a565b9150614fdc82614f9b565b602082019050919050565b6000602082019050818103600083015261500081614fc4565b9050919050565b7f4e6f7420656e6f75676820726573657276650000000000000000000000000000600082015250565b600061503d60128361459a565b915061504882615007565b602082019050919050565b6000602082019050818103600083015261506c81615030565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150ad8261455b565b91506150b88361455b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150ed576150ec615073565b5b828201905092915050565b60006151038261455b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561513657615135615073565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061519d602c8361459a565b91506151a882615141565b604082019050919050565b600060208201905081810360008301526151cc81615190565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061525e60298361459a565b915061526982615202565b604082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006152f0602a8361459a565b91506152fb82615294565b604082019050919050565b6000602082019050818103600083015261531f816152e3565b9050919050565b7f4e6f2062616c616e636500000000000000000000000000000000000000000000600082015250565b600061535c600a8361459a565b915061536782615326565b602082019050919050565b6000602082019050818103600083015261538b8161534f565b9050919050565b600081905092915050565b50565b60006153ad600083615392565b91506153b88261539d565b600082019050919050565b60006153ce826153a0565b9150819050919050565b7f5769746864726177616c206661696c65642e0000000000000000000000000000600082015250565b600061540e60128361459a565b9150615419826153d8565b602082019050919050565b6000602082019050818103600083015261543d81615401565b9050919050565b7f574c2073616c65206e6f74206163746976650000000000000000000000000000600082015250565b600061547a60128361459a565b915061548582615444565b602082019050919050565b600060208201905081810360008301526154a98161546d565b9050919050565b7f322070545820616c6c6f77656400000000000000000000000000000000000000600082015250565b60006154e6600d8361459a565b91506154f1826154b0565b602082019050919050565b60006020820190508181036000830152615515816154d9565b9050919050565b7f436865636b204554480000000000000000000000000000000000000000000000600082015250565b600061555260098361459a565b915061555d8261551c565b602082019050919050565b6000602082019050818103600083015261558181615545565b9050919050565b7f4d61782070572072656163686564000000000000000000000000000000000000600082015250565b60006155be600e8361459a565b91506155c982615588565b602082019050919050565b600060208201905081810360008301526155ed816155b1565b9050919050565b60008160601b9050919050565b600061560c826155f4565b9050919050565b600061561e82615601565b9050919050565b615636615631826146c3565b615613565b82525050565b60006156488284615625565b60148201915081905092915050565b7f436865636b2070726f6f66000000000000000000000000000000000000000000600082015250565b600061568d600b8361459a565b915061569882615657565b602082019050919050565b600060208201905081810360008301526156bc81615680565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006156f960198361459a565b9150615704826156c3565b602082019050919050565b60006020820190508181036000830152615728816156ec565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061578b602f8361459a565b91506157968261572f565b604082019050919050565b600060208201905081810360008301526157ba8161577e565b9050919050565b600081905092915050565b60006157d78261458f565b6157e181856157c1565b93506157f18185602086016145ab565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006158336005836157c1565b915061583e826157fd565b600582019050919050565b600061585582856157cc565b915061586182846157cc565b915061586c82615826565b91508190509392505050565b7f312070545820616c6c6f77656400000000000000000000000000000000000000600082015250565b60006158ae600d8361459a565b91506158b982615878565b602082019050919050565b600060208201905081810360008301526158dd816158a1565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061594060268361459a565b915061594b826158e4565b604082019050919050565b6000602082019050818103600083015261596f81615933565b9050919050565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b60006159ac600f8361459a565b91506159b782615976565b602082019050919050565b600060208201905081810360008301526159db8161599f565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615a3e602c8361459a565b9150615a49826159e2565b604082019050919050565b60006020820190508181036000830152615a6d81615a31565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615ad060298361459a565b9150615adb82615a74565b604082019050919050565b60006020820190508181036000830152615aff81615ac3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615b6260248361459a565b9150615b6d82615b06565b604082019050919050565b60006020820190508181036000830152615b9181615b55565b9050919050565b6000615ba38261455b565b9150615bae8361455b565b925082821015615bc157615bc0615073565b5b828203905092915050565b6000615bd78261455b565b9150615be28361455b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615c1b57615c1a615073565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615c608261455b565b9150615c6b8361455b565b925082615c7b57615c7a615c26565b5b828204905092915050565b6000819050919050565b615ca1615c9c826147be565b615c86565b82525050565b6000615cb38285615c90565b602082019150615cc38284615c90565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615d2f60328361459a565b9150615d3a82615cd3565b604082019050919050565b60006020820190508181036000830152615d5e81615d22565b9050919050565b6000615d708261455b565b9150615d7b8361455b565b925082615d8b57615d8a615c26565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000615dbd82615d96565b615dc78185615da1565b9350615dd78185602086016145ab565b615de0816145de565b840191505092915050565b6000608082019050615e0060008301876146d5565b615e0d60208301866146d5565b615e1a6040830185614565565b8181036060830152615e2c8184615db2565b905095945050505050565b600081519050615e46816144cc565b92915050565b600060208284031215615e6257615e61614496565b5b6000615e7084828501615e37565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615ede60208361459a565b9150615ee982615ea8565b602082019050919050565b60006020820190508181036000830152615f0d81615ed1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615f4a601c8361459a565b9150615f5582615f14565b602082019050919050565b60006020820190508181036000830152615f7981615f3d565b905091905056fea26469706673582212200adde866ac3fac2b389933b23e3669c8690d3266deabcde588a53c4afa9e4d7564736f6c634300080a0033

Deployed Bytecode Sourcemap

53376:7473:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47172:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54372:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35064:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36631:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36154:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54543:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60678:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54498:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47820:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54291:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60527:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37521:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60280:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54253:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53521:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54449:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54897:140;;;;;;;;;;;;;:::i;:::-;;60392:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37931:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55045:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56818:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48010:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55556:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34584:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53550:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34314:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34888:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60050:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54330:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54417:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59239:803;;;;;;;;;;;;;:::i;:::-;;54168:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13979:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60170:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35233:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58099:1132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54225:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56987:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55672:112;;;;;;;;;;;;;:::i;:::-;;36924:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38187:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35408:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57130:964;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54660:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37290:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14885:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55790:114;;;;;;;;;;;;;:::i;:::-;;54111:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55915:863;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47172:224;47274:4;47313:35;47298:50;;;:11;:50;;;;:90;;;;47352:36;47376:11;47352:23;:36::i;:::-;47298:90;47291:97;;47172:224;;;:::o;54372:38::-;54406:4;54372:38;:::o;35064:100::-;35118:13;35151:5;35144:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35064:100;:::o;36631:221::-;36707:7;36735:16;36743:7;36735;:16::i;:::-;36727:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36820:15;:24;36836:7;36820:24;;;;;;;;;;;;;;;;;;;;;36813:31;;36631:221;;;:::o;36154:411::-;36235:13;36251:23;36266:7;36251:14;:23::i;:::-;36235:39;;36299:5;36293:11;;:2;:11;;;;36285:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36393:5;36377:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36402:37;36419:5;36426:12;:10;:12::i;:::-;36402:16;:37::i;:::-;36377:62;36355:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36536:21;36545:2;36549:7;36536:8;:21::i;:::-;36224:341;36154:411;;:::o;54543:38::-;;;;;;;;;;;;;:::o;60678:165::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60803:20:::1;60783:17;:40;;;;60678:165:::0;:::o;54498:41::-;;;;;;;;;;;;;:::o;47820:113::-;47881:7;47908:10;:17;;;;47901:24;;47820:113;:::o;54291:32::-;;;;:::o;60527:145::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60641:19:::1;60622:16;:38;;;;60527:145:::0;:::o;37521:339::-;37716:41;37735:12;:10;:12::i;:::-;37749:7;37716:18;:41::i;:::-;37708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37824:28;37834:4;37840:2;37844:7;37824:9;:28::i;:::-;37521:339;;;:::o;60280:105::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60366:11:::1;60355:8;:22;;;;60280:105:::0;:::o;54253:31::-;;;;:::o;53521:25::-;;;;:::o;54449:38::-;;;;:::o;54897:140::-;14210:12;:10;:12::i;:::-;14199:23;;:7;:5;:7::i;:::-;:23;;;14191:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54945:12:::1;54960:21;54945:36;;55000:10;54992:28;;:37;55021:7;54992:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54934:103;54897:140::o:0;60392:129::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60496:17:::1;60479:14;:34;;;;60392:129:::0;:::o;37931:185::-;38069:39;38086:4;38092:2;38096:7;38069:39;;;;;;;;;;;;:16;:39::i;:::-;37931:185;;;:::o;55045:380::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55135:11:::1;55149:13;:11;:13::i;:::-;55135:27;;55198:1;55181:14;:18;:50;;;;;55221:10;;55203:14;:28;;55181:50;55173:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55270:6;55265:99;55286:14;55282:1;:18;55265:99;;;55322:30;55332:3;55350:1;55346;55337:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;55322:9;:30::i;:::-;55302:3;;;;;:::i;:::-;;;;55265:99;;;;55387:30;55402:14;55387:10;;:14;;:30;;;;:::i;:::-;55374:10;:43;;;;55124:301;55045:380:::0;;:::o;56818:125::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56915:13:::1;56902:10;:26;;;;56818:125:::0;:::o;48010:233::-;48085:7;48121:30;:28;:30::i;:::-;48113:5;:38;48105:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48218:10;48229:5;48218:17;;;;;;;;:::i;:::-;;;;;;;;;;48211:24;;48010:233;;;:::o;55556:106::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55647:7:::1;55632:12;:22;;;;;;;;;;;;:::i;:::-;;55556:106:::0;:::o;34584:239::-;34656:7;34676:13;34692:7;:16;34700:7;34692:16;;;;;;;;;;;;;;;;;;;;;34676:32;;34744:1;34727:19;;:5;:19;;;;34719:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34810:5;34803:12;;;34584:239;;;:::o;53550:28::-;;;;:::o;34314:208::-;34386:7;34431:1;34414:19;;:5;:19;;;;34406:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34498:9;:16;34508:5;34498:16;;;;;;;;;;;;;;;;34491:23;;34314:208;;;:::o;34888:109::-;34946:7;34973;:16;34981:7;34973:16;;;;;;;;;;;;;;;;;;;;;34966:23;;34888:109;;;:::o;60050:112::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60144:10:::1;60123:18;:31;;;;60050:112:::0;:::o;54330:33::-;;;;:::o;54417:28::-;;;;:::o;59239:803::-;14210:12;:10;:12::i;:::-;14199:23;;:7;:5;:7::i;:::-;:23;;;14191:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59324:1:::1;59300:21;:25;59292:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;59351:15;59369:21;59351:39;;59402:19;59427:7;;;;;;;;;;;:12;;59447:24;59467:3;59447:15;59459:2;59447:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;59427:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59401:75;;;59488:19;59513:7;;;;;;;;;;;:12;;59533:24;59553:3;59533:15;59545:2;59533:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;59513:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59487:75;;;59574:19;59599:7;;;;;;;;;;;:12;;59619:24;59639:3;59619:15;59631:2;59619:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;59599:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59573:75;;;59654:19;59679:7;;;;;;;;;;;:12;;59699:24;59719:3;59699:15;59711:2;59699:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;59679:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59653:75;;;59734:19;59759:7;;;;;;;;;;;:12;;59779:23;59798:3;59779:14;59791:1;59779:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;59759:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59733:74;;;59813:19;59838:7;;;;;;;;;;;:12;;59858:23;59877:3;59858:14;59870:1;59858:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;59838:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59812:74;;;59907:14;:32;;;;;59925:14;59907:32;:50;;;;;59943:14;59907:50;:68;;;;;59961:14;59907:68;:86;;;;;59979:14;59907:86;:104;;;;;59997:14;59907:104;59899:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;59281:761;;;;;;;59239:803::o:0;54168:50::-;;;;:::o;13979:87::-;14025:7;14052:6;;;;;;;;;;;14045:13;;13979:87;:::o;60170:103::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60257:8:::1;60239:15;:26;;;;60170:103:::0;:::o;35233:104::-;35289:13;35322:7;35315:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35233:104;:::o;58099:1132::-;58211:13;58227:10;58211:26;;58250:21;;;;;;;;;;;58242:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;58330:1;58313:14;:18;:41;;;;;58353:1;58335:14;:19;;58313:41;58305:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58404:38;58427:14;58404:18;;:22;;:38;;;;:::i;:::-;58391:9;:51;58383:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58532:17;;58475:53;58513:14;58475:21;:33;58497:10;58475:33;;;;;;;;;;;;;;;;:37;;:53;;;;:::i;:::-;:74;;58467:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;58624:85;58643:11;;58624:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58656:13;;58699:5;58682:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;58672:34;;;;;;58624:18;:85::i;:::-;58616:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;58736:6;58732:479;58752:14;58748:1;:18;58732:479;;;58809:19;;58792:13;:11;:13::i;:::-;:36;58788:418;;58849:38;58859:10;58885:1;58871:13;:11;:13::i;:::-;:15;;;;:::i;:::-;58849:9;:38::i;:::-;58942:40;58980:1;58942:21;:33;58964:10;58942:33;;;;;;;;;;;;;;;;:37;;:40;;;;:::i;:::-;58906:21;:33;58928:10;58906:33;;;;;;;;;;;;;;;:76;;;;58788:418;;;59051:21;;;;;;;;;;;59050:22;59026:21;;:46;;;;;;;;;;;;;;;;;;59099:10;59091:28;;:75;59120:45;59146:18;;59120:21;59139:1;59120:14;:18;;:21;;;;:::i;:::-;:25;;:45;;;;:::i;:::-;59091:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59185:5;;58788:418;58768:3;;;;;:::i;:::-;;;;58732:479;;;;58200:1031;58099:1132;;;:::o;54225:24::-;;;;:::o;56987:133::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57090:13:::1;57074;:29;;;;56987:133:::0;:::o;55672:112::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55758:18:::1;;;;;;;;;;;55757:19;55736:18;;:40;;;;;;;;;;;;;;;;;;55672:112::o:0;36924:295::-;37039:12;:10;:12::i;:::-;37027:24;;:8;:24;;;;37019:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37139:8;37094:18;:32;37113:12;:10;:12::i;:::-;37094:32;;;;;;;;;;;;;;;:42;37127:8;37094:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37192:8;37163:48;;37178:12;:10;:12::i;:::-;37163:48;;;37202:8;37163:48;;;;;;:::i;:::-;;;;;;;;36924:295;;:::o;38187:328::-;38362:41;38381:12;:10;:12::i;:::-;38395:7;38362:18;:41::i;:::-;38354:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38468:39;38482:4;38488:2;38492:7;38501:5;38468:13;:39::i;:::-;38187:328;;;;:::o;35408:342::-;35481:13;35515:16;35523:7;35515;:16::i;:::-;35507:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35596:21;35620:10;:8;:10::i;:::-;35596:34;;35672:1;35654:7;35648:21;:25;:94;;;;;;;;;;;;;;;;;35700:7;35709:18;:7;:16;:18::i;:::-;35683:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35648:94;35641:101;;;35408:342;;;:::o;57130:964::-;57239:13;57255:10;57239:26;;57278:21;;;;;;;;;;;57270:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;57358:1;57341:14;:18;:41;;;;;57381:1;57363:14;:19;;57341:41;57333:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;57432:38;57455:14;57432:18;;:22;;:38;;;;:::i;:::-;57419:9;:51;57411:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57560:16;;57503:53;57541:14;57503:21;:33;57525:10;57503:33;;;;;;;;;;;;;;;;:37;;:53;;;;:::i;:::-;:73;;57495:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57651:82;57670:11;;57651:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57683:10;;57723:5;57706:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;57696:34;;;;;;57651:18;:82::i;:::-;57643:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;57790:19;;57773:13;:11;:13::i;:::-;:36;57769:305;;57830:38;57840:10;57866:1;57852:13;:11;:13::i;:::-;:15;;;;:::i;:::-;57830:9;:38::i;:::-;57923:40;57961:1;57923:21;:33;57945:10;57923:33;;;;;;;;;;;;;;;;:37;;:40;;;;:::i;:::-;57887:21;:33;57909:10;57887:33;;;;;;;;;;;;;;;:76;;;;57769:305;;;58037:21;;;;;;;;;;;58036:22;58012:21;;:46;;;;;;;;;;;;;;;;;;57769:305;57228:866;57130:964;;;:::o;54660:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37290:164::-;37387:4;37411:18;:25;37430:5;37411:25;;;;;;;;;;;;;;;:35;37437:8;37411:35;;;;;;;;;;;;;;;;;;;;;;;;;37404:42;;37290:164;;;;:::o;14885:192::-;14210:12;:10;:12::i;:::-;14199:23;;:7;:5;:7::i;:::-;:23;;;14191:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14994:1:::1;14974:22;;:8;:22;;;;14966:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15050:19;15060:8;15050:9;:19::i;:::-;14885:192:::0;:::o;55790:114::-;54812:7;:5;:7::i;:::-;54796:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;54839:10;;;;;;;;;;;54823:26;;:12;:10;:12::i;:::-;:26;;;54796:53;54788:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55875:21:::1;;;;;;;;;;;55874:22;55850:21;;:46;;;;;;;;;;;;;;;;;;55790:114::o:0;54111:53::-;;;;:::o;55915:863::-;55987:18;;;;;;;;;;;55979:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56061:1;56044:14;:18;:48;;;;;56084:8;;56066:14;:26;;56044:48;56036:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56142:35;56162:14;56142:15;;:19;;:35;;;;:::i;:::-;56129:9;:48;56121:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;56267:14;;56210:53;56248:14;56210:21;:33;56232:10;56210:33;;;;;;;;;;;;;;;;:37;;:53;;;;:::i;:::-;:71;;56202:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;56316:6;56312:459;56332:14;56328:1;:18;56312:459;;;54406:4;56372:13;:11;:13::i;:::-;:23;56368:392;;;56416:38;56426:10;56452:1;56438:13;:11;:13::i;:::-;:15;;;;:::i;:::-;56416:9;:38::i;:::-;56509:40;56547:1;56509:21;:33;56531:10;56509:33;;;;;;;;;;;;;;;;:37;;:40;;;;:::i;:::-;56473:21;:33;56495:10;56473:33;;;;;;;;;;;;;;;:76;;;;56368:392;;;56611:18;;;;;;;;;;;56610:19;56589:18;;:40;;;;;;;;;;;;;;;;;;56656:10;56648:28;;:72;56677:42;56703:15;;56677:21;56696:1;56677:14;:18;;:21;;;;:::i;:::-;:25;;:42;;;;:::i;:::-;56648:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56739:5;;56368:392;56348:3;;;;;:::i;:::-;;;;56312:459;;;;55915:863;:::o;33957:293::-;34059:4;34107:25;34092:40;;;:11;:40;;;;:101;;;;34160:33;34145:48;;;:11;:48;;;;34092:101;:150;;;;34206:36;34230:11;34206:23;:36::i;:::-;34092:150;34076:166;;33957:293;;;:::o;40025:127::-;40090:4;40142:1;40114:30;;:7;:16;40122:7;40114:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40107:37;;40025:127;;;:::o;12767:98::-;12820:7;12847:10;12840:17;;12767:98;:::o;44047:174::-;44149:2;44122:15;:24;44138:7;44122:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44205:7;44201:2;44167:46;;44176:23;44191:7;44176:14;:23::i;:::-;44167:46;;;;;;;;;;;;44047:174;;:::o;40319:348::-;40412:4;40437:16;40445:7;40437;:16::i;:::-;40429:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40513:13;40529:23;40544:7;40529:14;:23::i;:::-;40513:39;;40582:5;40571:16;;:7;:16;;;:51;;;;40615:7;40591:31;;:20;40603:7;40591:11;:20::i;:::-;:31;;;40571:51;:87;;;;40626:32;40643:5;40650:7;40626:16;:32::i;:::-;40571:87;40563:96;;;40319:348;;;;:::o;43351:578::-;43510:4;43483:31;;:23;43498:7;43483:14;:23::i;:::-;:31;;;43475:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43593:1;43579:16;;:2;:16;;;;43571:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43649:39;43670:4;43676:2;43680:7;43649:20;:39::i;:::-;43753:29;43770:1;43774:7;43753:8;:29::i;:::-;43814:1;43795:9;:15;43805:4;43795:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43843:1;43826:9;:13;43836:2;43826:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43874:2;43855:7;:16;43863:7;43855:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43913:7;43909:2;43894:27;;43903:4;43894:27;;;;;;;;;;;;43351:578;;;:::o;41031:110::-;41107:26;41117:2;41121:7;41107:26;;;;;;;;;;;;:9;:26::i;:::-;41031:110;;:::o;6288:98::-;6346:7;6377:1;6373;:5;;;;:::i;:::-;6366:12;;6288:98;;;;:::o;6645:::-;6703:7;6734:1;6730;:5;;;;:::i;:::-;6723:12;;6645:98;;;;:::o;7044:::-;7102:7;7133:1;7129;:5;;;;:::i;:::-;7122:12;;7044:98;;;;:::o;5907:::-;5965:7;5996:1;5992;:5;;;;:::i;:::-;5985:12;;5907:98;;;;:::o;868:830::-;993:4;1010:20;1033:4;1010:27;;1055:9;1050:525;1074:5;:12;1070:1;:16;1050:525;;;1108:20;1131:5;1137:1;1131:8;;;;;;;;:::i;:::-;;;;;;;;1108:31;;1176:12;1160;:28;1156:408;;1330:12;1344;1313:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1303:55;;;;;;1288:70;;1156:408;;;1520:12;1534;1503:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1493:55;;;;;;1478:70;;1156:408;1093:482;1088:3;;;;;:::i;:::-;;;;1050:525;;;;1686:4;1670:12;:20;1663:27;;;868:830;;;;;:::o;39397:315::-;39554:28;39564:4;39570:2;39574:7;39554:9;:28::i;:::-;39601:48;39624:4;39630:2;39634:7;39643:5;39601:22;:48::i;:::-;39593:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39397:315;;;;:::o;55435:113::-;55495:13;55528:12;55521:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55435:113;:::o;10383:723::-;10439:13;10669:1;10660:5;:10;10656:53;;;10687:10;;;;;;;;;;;;;;;;;;;;;10656:53;10719:12;10734:5;10719:20;;10750:14;10775:78;10790:1;10782:4;:9;10775:78;;10808:8;;;;;:::i;:::-;;;;10839:2;10831:10;;;;;:::i;:::-;;;10775:78;;;10863:19;10895:6;10885:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10863:39;;10913:154;10929:1;10920:5;:10;10913:154;;10957:1;10947:11;;;;;:::i;:::-;;;11024:2;11016:5;:10;;;;:::i;:::-;11003:2;:24;;;;:::i;:::-;10990:39;;10973:6;10980;10973:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11053:2;11044:11;;;;;:::i;:::-;;;10913:154;;;11091:6;11077:21;;;;;10383:723;;;;:::o;15085:173::-;15141:16;15160:6;;;;;;;;;;;15141:25;;15186:8;15177:6;;:17;;;;;;;;;;;;;;;;;;15241:8;15210:40;;15231:8;15210:40;;;;;;;;;;;;15130:128;15085:173;:::o;25971:157::-;26056:4;26095:25;26080:40;;;:11;:40;;;;26073:47;;25971:157;;;:::o;48856:589::-;49000:45;49027:4;49033:2;49037:7;49000:26;:45::i;:::-;49078:1;49062:18;;:4;:18;;;49058:187;;;49097:40;49129:7;49097:31;:40::i;:::-;49058:187;;;49167:2;49159:10;;:4;:10;;;49155:90;;49186:47;49219:4;49225:7;49186:32;:47::i;:::-;49155:90;49058:187;49273:1;49259:16;;:2;:16;;;49255:183;;;49292:45;49329:7;49292:36;:45::i;:::-;49255:183;;;49365:4;49359:10;;:2;:10;;;49355:83;;49386:40;49414:2;49418:7;49386:27;:40::i;:::-;49355:83;49255:183;48856:589;;;:::o;41368:321::-;41498:18;41504:2;41508:7;41498:5;:18::i;:::-;41549:54;41580:1;41584:2;41588:7;41597:5;41549:22;:54::i;:::-;41527:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41368:321;;;:::o;44786:803::-;44941:4;44962:15;:2;:13;;;:15::i;:::-;44958:624;;;45014:2;44998:36;;;45035:12;:10;:12::i;:::-;45049:4;45055:7;45064:5;44998:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44994:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45261:1;45244:6;:13;:18;45240:272;;;45287:60;;;;;;;;;;:::i;:::-;;;;;;;;45240:272;45462:6;45456:13;45447:6;45443:2;45439:15;45432:38;44994:533;45131:45;;;45121:55;;;:6;:55;;;;45114:62;;;;;44958:624;45566:4;45559:11;;44786:803;;;;;;;:::o;46161:126::-;;;;:::o;50168:164::-;50272:10;:17;;;;50245:15;:24;50261:7;50245:24;;;;;;;;;;;:44;;;;50300:10;50316:7;50300:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50168:164;:::o;50959:988::-;51225:22;51275:1;51250:22;51267:4;51250:16;:22::i;:::-;:26;;;;:::i;:::-;51225:51;;51287:18;51308:17;:26;51326:7;51308:26;;;;;;;;;;;;51287:47;;51455:14;51441:10;:28;51437:328;;51486:19;51508:12;:18;51521:4;51508:18;;;;;;;;;;;;;;;:34;51527:14;51508:34;;;;;;;;;;;;51486:56;;51592:11;51559:12;:18;51572:4;51559:18;;;;;;;;;;;;;;;:30;51578:10;51559:30;;;;;;;;;;;:44;;;;51709:10;51676:17;:30;51694:11;51676:30;;;;;;;;;;;:43;;;;51471:294;51437:328;51861:17;:26;51879:7;51861:26;;;;;;;;;;;51854:33;;;51905:12;:18;51918:4;51905:18;;;;;;;;;;;;;;;:34;51924:14;51905:34;;;;;;;;;;;51898:41;;;51040:907;;50959:988;;:::o;52242:1079::-;52495:22;52540:1;52520:10;:17;;;;:21;;;;:::i;:::-;52495:46;;52552:18;52573:15;:24;52589:7;52573:24;;;;;;;;;;;;52552:45;;52924:19;52946:10;52957:14;52946:26;;;;;;;;:::i;:::-;;;;;;;;;;52924:48;;53010:11;52985:10;52996;52985:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53121:10;53090:15;:28;53106:11;53090:28;;;;;;;;;;;:41;;;;53262:15;:24;53278:7;53262:24;;;;;;;;;;;53255:31;;;53297:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52313:1008;;;52242:1079;:::o;49746:221::-;49831:14;49848:20;49865:2;49848:16;:20::i;:::-;49831:37;;49906:7;49879:12;:16;49892:2;49879:16;;;;;;;;;;;;;;;:24;49896:6;49879:24;;;;;;;;;;;:34;;;;49953:6;49924:17;:26;49942:7;49924:26;;;;;;;;;;;:35;;;;49820:147;49746:221;;:::o;42025:382::-;42119:1;42105:16;;:2;:16;;;;42097:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42178:16;42186:7;42178;:16::i;:::-;42177:17;42169:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42240:45;42269:1;42273:2;42277:7;42240:20;:45::i;:::-;42315:1;42298:9;:13;42308:2;42298:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42346:2;42327:7;:16;42335:7;42327:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42391:7;42387:2;42366:33;;42383:1;42366:33;;;;;;;;;;;;42025:382;;:::o;16031:387::-;16091:4;16299:12;16366:7;16354:20;16346:28;;16409:1;16402:4;:8;16395:15;;;16031:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:122::-;6423:24;6441:5;6423:24;:::i;:::-;6416:5;6413:35;6403:63;;6462:1;6459;6452:12;6403:63;6350:122;:::o;6478:139::-;6524:5;6562:6;6549:20;6540:29;;6578:33;6605:5;6578:33;:::i;:::-;6478:139;;;;:::o;6623:329::-;6682:6;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:53;6927:7;6918:6;6907:9;6903:22;6882:53;:::i;:::-;6872:63;;6828:117;6623:329;;;;:::o;6958:117::-;7067:1;7064;7057:12;7081:117;7190:1;7187;7180:12;7204:180;7252:77;7249:1;7242:88;7349:4;7346:1;7339:15;7373:4;7370:1;7363:15;7390:281;7473:27;7495:4;7473:27;:::i;:::-;7465:6;7461:40;7603:6;7591:10;7588:22;7567:18;7555:10;7552:34;7549:62;7546:88;;;7614:18;;:::i;:::-;7546:88;7654:10;7650:2;7643:22;7433:238;7390:281;;:::o;7677:129::-;7711:6;7738:20;;:::i;:::-;7728:30;;7767:33;7795:4;7787:6;7767:33;:::i;:::-;7677:129;;;:::o;7812:308::-;7874:4;7964:18;7956:6;7953:30;7950:56;;;7986:18;;:::i;:::-;7950:56;8024:29;8046:6;8024:29;:::i;:::-;8016:37;;8108:4;8102;8098:15;8090:23;;7812:308;;;:::o;8126:154::-;8210:6;8205:3;8200;8187:30;8272:1;8263:6;8258:3;8254:16;8247:27;8126:154;;;:::o;8286:412::-;8364:5;8389:66;8405:49;8447:6;8405:49;:::i;:::-;8389:66;:::i;:::-;8380:75;;8478:6;8471:5;8464:21;8516:4;8509:5;8505:16;8554:3;8545:6;8540:3;8536:16;8533:25;8530:112;;;8561:79;;:::i;:::-;8530:112;8651:41;8685:6;8680:3;8675;8651:41;:::i;:::-;8370:328;8286:412;;;;;:::o;8718:340::-;8774:5;8823:3;8816:4;8808:6;8804:17;8800:27;8790:122;;8831:79;;:::i;:::-;8790:122;8948:6;8935:20;8973:79;9048:3;9040:6;9033:4;9025:6;9021:17;8973:79;:::i;:::-;8964:88;;8780:278;8718:340;;;;:::o;9064:509::-;9133:6;9182:2;9170:9;9161:7;9157:23;9153:32;9150:119;;;9188:79;;:::i;:::-;9150:119;9336:1;9325:9;9321:17;9308:31;9366:18;9358:6;9355:30;9352:117;;;9388:79;;:::i;:::-;9352:117;9493:63;9548:7;9539:6;9528:9;9524:22;9493:63;:::i;:::-;9483:73;;9279:287;9064:509;;;;:::o;9579:329::-;9638:6;9687:2;9675:9;9666:7;9662:23;9658:32;9655:119;;;9693:79;;:::i;:::-;9655:119;9813:1;9838:53;9883:7;9874:6;9863:9;9859:22;9838:53;:::i;:::-;9828:63;;9784:117;9579:329;;;;:::o;9914:117::-;10023:1;10020;10013:12;10037:117;10146:1;10143;10136:12;10177:568;10250:8;10260:6;10310:3;10303:4;10295:6;10291:17;10287:27;10277:122;;10318:79;;:::i;:::-;10277:122;10431:6;10418:20;10408:30;;10461:18;10453:6;10450:30;10447:117;;;10483:79;;:::i;:::-;10447:117;10597:4;10589:6;10585:17;10573:29;;10651:3;10643:4;10635:6;10631:17;10621:8;10617:32;10614:41;10611:128;;;10658:79;;:::i;:::-;10611:128;10177:568;;;;;:::o;10751:704::-;10846:6;10854;10862;10911:2;10899:9;10890:7;10886:23;10882:32;10879:119;;;10917:79;;:::i;:::-;10879:119;11037:1;11062:53;11107:7;11098:6;11087:9;11083:22;11062:53;:::i;:::-;11052:63;;11008:117;11192:2;11181:9;11177:18;11164:32;11223:18;11215:6;11212:30;11209:117;;;11245:79;;:::i;:::-;11209:117;11358:80;11430:7;11421:6;11410:9;11406:22;11358:80;:::i;:::-;11340:98;;;;11135:313;10751:704;;;;;:::o;11461:116::-;11531:21;11546:5;11531:21;:::i;:::-;11524:5;11521:32;11511:60;;11567:1;11564;11557:12;11511:60;11461:116;:::o;11583:133::-;11626:5;11664:6;11651:20;11642:29;;11680:30;11704:5;11680:30;:::i;:::-;11583:133;;;;:::o;11722:468::-;11787:6;11795;11844:2;11832:9;11823:7;11819:23;11815:32;11812:119;;;11850:79;;:::i;:::-;11812:119;11970:1;11995:53;12040:7;12031:6;12020:9;12016:22;11995:53;:::i;:::-;11985:63;;11941:117;12097:2;12123:50;12165:7;12156:6;12145:9;12141:22;12123:50;:::i;:::-;12113:60;;12068:115;11722:468;;;;;:::o;12196:307::-;12257:4;12347:18;12339:6;12336:30;12333:56;;;12369:18;;:::i;:::-;12333:56;12407:29;12429:6;12407:29;:::i;:::-;12399:37;;12491:4;12485;12481:15;12473:23;;12196:307;;;:::o;12509:410::-;12586:5;12611:65;12627:48;12668:6;12627:48;:::i;:::-;12611:65;:::i;:::-;12602:74;;12699:6;12692:5;12685:21;12737:4;12730:5;12726:16;12775:3;12766:6;12761:3;12757:16;12754:25;12751:112;;;12782:79;;:::i;:::-;12751:112;12872:41;12906:6;12901:3;12896;12872:41;:::i;:::-;12592:327;12509:410;;;;;:::o;12938:338::-;12993:5;13042:3;13035:4;13027:6;13023:17;13019:27;13009:122;;13050:79;;:::i;:::-;13009:122;13167:6;13154:20;13192:78;13266:3;13258:6;13251:4;13243:6;13239:17;13192:78;:::i;:::-;13183:87;;12999:277;12938:338;;;;:::o;13282:943::-;13377:6;13385;13393;13401;13450:3;13438:9;13429:7;13425:23;13421:33;13418:120;;;13457:79;;:::i;:::-;13418:120;13577:1;13602:53;13647:7;13638:6;13627:9;13623:22;13602:53;:::i;:::-;13592:63;;13548:117;13704:2;13730:53;13775:7;13766:6;13755:9;13751:22;13730:53;:::i;:::-;13720:63;;13675:118;13832:2;13858:53;13903:7;13894:6;13883:9;13879:22;13858:53;:::i;:::-;13848:63;;13803:118;13988:2;13977:9;13973:18;13960:32;14019:18;14011:6;14008:30;14005:117;;;14041:79;;:::i;:::-;14005:117;14146:62;14200:7;14191:6;14180:9;14176:22;14146:62;:::i;:::-;14136:72;;13931:287;13282:943;;;;;;;:::o;14231:474::-;14299:6;14307;14356:2;14344:9;14335:7;14331:23;14327:32;14324:119;;;14362:79;;:::i;:::-;14324:119;14482:1;14507:53;14552:7;14543:6;14532:9;14528:22;14507:53;:::i;:::-;14497:63;;14453:117;14609:2;14635:53;14680:7;14671:6;14660:9;14656:22;14635:53;:::i;:::-;14625:63;;14580:118;14231:474;;;;;:::o;14711:180::-;14759:77;14756:1;14749:88;14856:4;14853:1;14846:15;14880:4;14877:1;14870:15;14897:320;14941:6;14978:1;14972:4;14968:12;14958:22;;15025:1;15019:4;15015:12;15046:18;15036:81;;15102:4;15094:6;15090:17;15080:27;;15036:81;15164:2;15156:6;15153:14;15133:18;15130:38;15127:84;;;15183:18;;:::i;:::-;15127:84;14948:269;14897:320;;;:::o;15223:231::-;15363:34;15359:1;15351:6;15347:14;15340:58;15432:14;15427:2;15419:6;15415:15;15408:39;15223:231;:::o;15460:366::-;15602:3;15623:67;15687:2;15682:3;15623:67;:::i;:::-;15616:74;;15699:93;15788:3;15699:93;:::i;:::-;15817:2;15812:3;15808:12;15801:19;;15460:366;;;:::o;15832:419::-;15998:4;16036:2;16025:9;16021:18;16013:26;;16085:9;16079:4;16075:20;16071:1;16060:9;16056:17;16049:47;16113:131;16239:4;16113:131;:::i;:::-;16105:139;;15832:419;;;:::o;16257:220::-;16397:34;16393:1;16385:6;16381:14;16374:58;16466:3;16461:2;16453:6;16449:15;16442:28;16257:220;:::o;16483:366::-;16625:3;16646:67;16710:2;16705:3;16646:67;:::i;:::-;16639:74;;16722:93;16811:3;16722:93;:::i;:::-;16840:2;16835:3;16831:12;16824:19;;16483:366;;;:::o;16855:419::-;17021:4;17059:2;17048:9;17044:18;17036:26;;17108:9;17102:4;17098:20;17094:1;17083:9;17079:17;17072:47;17136:131;17262:4;17136:131;:::i;:::-;17128:139;;16855:419;;;:::o;17280:243::-;17420:34;17416:1;17408:6;17404:14;17397:58;17489:26;17484:2;17476:6;17472:15;17465:51;17280:243;:::o;17529:366::-;17671:3;17692:67;17756:2;17751:3;17692:67;:::i;:::-;17685:74;;17768:93;17857:3;17768:93;:::i;:::-;17886:2;17881:3;17877:12;17870:19;;17529:366;;;:::o;17901:419::-;18067:4;18105:2;18094:9;18090:18;18082:26;;18154:9;18148:4;18144:20;18140:1;18129:9;18125:17;18118:47;18182:131;18308:4;18182:131;:::i;:::-;18174:139;;17901:419;;;:::o;18326:164::-;18466:16;18462:1;18454:6;18450:14;18443:40;18326:164;:::o;18496:366::-;18638:3;18659:67;18723:2;18718:3;18659:67;:::i;:::-;18652:74;;18735:93;18824:3;18735:93;:::i;:::-;18853:2;18848:3;18844:12;18837:19;;18496:366;;;:::o;18868:419::-;19034:4;19072:2;19061:9;19057:18;19049:26;;19121:9;19115:4;19111:20;19107:1;19096:9;19092:17;19085:47;19149:131;19275:4;19149:131;:::i;:::-;19141:139;;18868:419;;;:::o;19293:236::-;19433:34;19429:1;19421:6;19417:14;19410:58;19502:19;19497:2;19489:6;19485:15;19478:44;19293:236;:::o;19535:366::-;19677:3;19698:67;19762:2;19757:3;19698:67;:::i;:::-;19691:74;;19774:93;19863:3;19774:93;:::i;:::-;19892:2;19887:3;19883:12;19876:19;;19535:366;;;:::o;19907:419::-;20073:4;20111:2;20100:9;20096:18;20088:26;;20160:9;20154:4;20150:20;20146:1;20135:9;20131:17;20124:47;20188:131;20314:4;20188:131;:::i;:::-;20180:139;;19907:419;;;:::o;20332:182::-;20472:34;20468:1;20460:6;20456:14;20449:58;20332:182;:::o;20520:366::-;20662:3;20683:67;20747:2;20742:3;20683:67;:::i;:::-;20676:74;;20759:93;20848:3;20759:93;:::i;:::-;20877:2;20872:3;20868:12;20861:19;;20520:366;;;:::o;20892:419::-;21058:4;21096:2;21085:9;21081:18;21073:26;;21145:9;21139:4;21135:20;21131:1;21120:9;21116:17;21109:47;21173:131;21299:4;21173:131;:::i;:::-;21165:139;;20892:419;;;:::o;21317:168::-;21457:20;21453:1;21445:6;21441:14;21434:44;21317:168;:::o;21491:366::-;21633:3;21654:67;21718:2;21713:3;21654:67;:::i;:::-;21647:74;;21730:93;21819:3;21730:93;:::i;:::-;21848:2;21843:3;21839:12;21832:19;;21491:366;;;:::o;21863:419::-;22029:4;22067:2;22056:9;22052:18;22044:26;;22116:9;22110:4;22106:20;22102:1;22091:9;22087:17;22080:47;22144:131;22270:4;22144:131;:::i;:::-;22136:139;;21863:419;;;:::o;22288:180::-;22336:77;22333:1;22326:88;22433:4;22430:1;22423:15;22457:4;22454:1;22447:15;22474:305;22514:3;22533:20;22551:1;22533:20;:::i;:::-;22528:25;;22567:20;22585:1;22567:20;:::i;:::-;22562:25;;22721:1;22653:66;22649:74;22646:1;22643:81;22640:107;;;22727:18;;:::i;:::-;22640:107;22771:1;22768;22764:9;22757:16;;22474:305;;;;:::o;22785:233::-;22824:3;22847:24;22865:5;22847:24;:::i;:::-;22838:33;;22893:66;22886:5;22883:77;22880:103;;;22963:18;;:::i;:::-;22880:103;23010:1;23003:5;22999:13;22992:20;;22785:233;;;:::o;23024:231::-;23164:34;23160:1;23152:6;23148:14;23141:58;23233:14;23228:2;23220:6;23216:15;23209:39;23024:231;:::o;23261:366::-;23403:3;23424:67;23488:2;23483:3;23424:67;:::i;:::-;23417:74;;23500:93;23589:3;23500:93;:::i;:::-;23618:2;23613:3;23609:12;23602:19;;23261:366;;;:::o;23633:419::-;23799:4;23837:2;23826:9;23822:18;23814:26;;23886:9;23880:4;23876:20;23872:1;23861:9;23857:17;23850:47;23914:131;24040:4;23914:131;:::i;:::-;23906:139;;23633:419;;;:::o;24058:180::-;24106:77;24103:1;24096:88;24203:4;24200:1;24193:15;24227:4;24224:1;24217:15;24244:228;24384:34;24380:1;24372:6;24368:14;24361:58;24453:11;24448:2;24440:6;24436:15;24429:36;24244:228;:::o;24478:366::-;24620:3;24641:67;24705:2;24700:3;24641:67;:::i;:::-;24634:74;;24717:93;24806:3;24717:93;:::i;:::-;24835:2;24830:3;24826:12;24819:19;;24478:366;;;:::o;24850:419::-;25016:4;25054:2;25043:9;25039:18;25031:26;;25103:9;25097:4;25093:20;25089:1;25078:9;25074:17;25067:47;25131:131;25257:4;25131:131;:::i;:::-;25123:139;;24850:419;;;:::o;25275:229::-;25415:34;25411:1;25403:6;25399:14;25392:58;25484:12;25479:2;25471:6;25467:15;25460:37;25275:229;:::o;25510:366::-;25652:3;25673:67;25737:2;25732:3;25673:67;:::i;:::-;25666:74;;25749:93;25838:3;25749:93;:::i;:::-;25867:2;25862:3;25858:12;25851:19;;25510:366;;;:::o;25882:419::-;26048:4;26086:2;26075:9;26071:18;26063:26;;26135:9;26129:4;26125:20;26121:1;26110:9;26106:17;26099:47;26163:131;26289:4;26163:131;:::i;:::-;26155:139;;25882:419;;;:::o;26307:160::-;26447:12;26443:1;26435:6;26431:14;26424:36;26307:160;:::o;26473:366::-;26615:3;26636:67;26700:2;26695:3;26636:67;:::i;:::-;26629:74;;26712:93;26801:3;26712:93;:::i;:::-;26830:2;26825:3;26821:12;26814:19;;26473:366;;;:::o;26845:419::-;27011:4;27049:2;27038:9;27034:18;27026:26;;27098:9;27092:4;27088:20;27084:1;27073:9;27069:17;27062:47;27126:131;27252:4;27126:131;:::i;:::-;27118:139;;26845:419;;;:::o;27270:147::-;27371:11;27408:3;27393:18;;27270:147;;;;:::o;27423:114::-;;:::o;27543:398::-;27702:3;27723:83;27804:1;27799:3;27723:83;:::i;:::-;27716:90;;27815:93;27904:3;27815:93;:::i;:::-;27933:1;27928:3;27924:11;27917:18;;27543:398;;;:::o;27947:379::-;28131:3;28153:147;28296:3;28153:147;:::i;:::-;28146:154;;28317:3;28310:10;;27947:379;;;:::o;28332:168::-;28472:20;28468:1;28460:6;28456:14;28449:44;28332:168;:::o;28506:366::-;28648:3;28669:67;28733:2;28728:3;28669:67;:::i;:::-;28662:74;;28745:93;28834:3;28745:93;:::i;:::-;28863:2;28858:3;28854:12;28847:19;;28506:366;;;:::o;28878:419::-;29044:4;29082:2;29071:9;29067:18;29059:26;;29131:9;29125:4;29121:20;29117:1;29106:9;29102:17;29095:47;29159:131;29285:4;29159:131;:::i;:::-;29151:139;;28878:419;;;:::o;29303:168::-;29443:20;29439:1;29431:6;29427:14;29420:44;29303:168;:::o;29477:366::-;29619:3;29640:67;29704:2;29699:3;29640:67;:::i;:::-;29633:74;;29716:93;29805:3;29716:93;:::i;:::-;29834:2;29829:3;29825:12;29818:19;;29477:366;;;:::o;29849:419::-;30015:4;30053:2;30042:9;30038:18;30030:26;;30102:9;30096:4;30092:20;30088:1;30077:9;30073:17;30066:47;30130:131;30256:4;30130:131;:::i;:::-;30122:139;;29849:419;;;:::o;30274:163::-;30414:15;30410:1;30402:6;30398:14;30391:39;30274:163;:::o;30443:366::-;30585:3;30606:67;30670:2;30665:3;30606:67;:::i;:::-;30599:74;;30682:93;30771:3;30682:93;:::i;:::-;30800:2;30795:3;30791:12;30784:19;;30443:366;;;:::o;30815:419::-;30981:4;31019:2;31008:9;31004:18;30996:26;;31068:9;31062:4;31058:20;31054:1;31043:9;31039:17;31032:47;31096:131;31222:4;31096:131;:::i;:::-;31088:139;;30815:419;;;:::o;31240:159::-;31380:11;31376:1;31368:6;31364:14;31357:35;31240:159;:::o;31405:365::-;31547:3;31568:66;31632:1;31627:3;31568:66;:::i;:::-;31561:73;;31643:93;31732:3;31643:93;:::i;:::-;31761:2;31756:3;31752:12;31745:19;;31405:365;;;:::o;31776:419::-;31942:4;31980:2;31969:9;31965:18;31957:26;;32029:9;32023:4;32019:20;32015:1;32004:9;32000:17;31993:47;32057:131;32183:4;32057:131;:::i;:::-;32049:139;;31776:419;;;:::o;32201:164::-;32341:16;32337:1;32329:6;32325:14;32318:40;32201:164;:::o;32371:366::-;32513:3;32534:67;32598:2;32593:3;32534:67;:::i;:::-;32527:74;;32610:93;32699:3;32610:93;:::i;:::-;32728:2;32723:3;32719:12;32712:19;;32371:366;;;:::o;32743:419::-;32909:4;32947:2;32936:9;32932:18;32924:26;;32996:9;32990:4;32986:20;32982:1;32971:9;32967:17;32960:47;33024:131;33150:4;33024:131;:::i;:::-;33016:139;;32743:419;;;:::o;33168:94::-;33201:8;33249:5;33245:2;33241:14;33220:35;;33168:94;;;:::o;33268:::-;33307:7;33336:20;33350:5;33336:20;:::i;:::-;33325:31;;33268:94;;;:::o;33368:100::-;33407:7;33436:26;33456:5;33436:26;:::i;:::-;33425:37;;33368:100;;;:::o;33474:157::-;33579:45;33599:24;33617:5;33599:24;:::i;:::-;33579:45;:::i;:::-;33574:3;33567:58;33474:157;;:::o;33637:256::-;33749:3;33764:75;33835:3;33826:6;33764:75;:::i;:::-;33864:2;33859:3;33855:12;33848:19;;33884:3;33877:10;;33637:256;;;;:::o;33899:161::-;34039:13;34035:1;34027:6;34023:14;34016:37;33899:161;:::o;34066:366::-;34208:3;34229:67;34293:2;34288:3;34229:67;:::i;:::-;34222:74;;34305:93;34394:3;34305:93;:::i;:::-;34423:2;34418:3;34414:12;34407:19;;34066:366;;;:::o;34438:419::-;34604:4;34642:2;34631:9;34627:18;34619:26;;34691:9;34685:4;34681:20;34677:1;34666:9;34662:17;34655:47;34719:131;34845:4;34719:131;:::i;:::-;34711:139;;34438:419;;;:::o;34863:175::-;35003:27;34999:1;34991:6;34987:14;34980:51;34863:175;:::o;35044:366::-;35186:3;35207:67;35271:2;35266:3;35207:67;:::i;:::-;35200:74;;35283:93;35372:3;35283:93;:::i;:::-;35401:2;35396:3;35392:12;35385:19;;35044:366;;;:::o;35416:419::-;35582:4;35620:2;35609:9;35605:18;35597:26;;35669:9;35663:4;35659:20;35655:1;35644:9;35640:17;35633:47;35697:131;35823:4;35697:131;:::i;:::-;35689:139;;35416:419;;;:::o;35841:234::-;35981:34;35977:1;35969:6;35965:14;35958:58;36050:17;36045:2;36037:6;36033:15;36026:42;35841:234;:::o;36081:366::-;36223:3;36244:67;36308:2;36303:3;36244:67;:::i;:::-;36237:74;;36320:93;36409:3;36320:93;:::i;:::-;36438:2;36433:3;36429:12;36422:19;;36081:366;;;:::o;36453:419::-;36619:4;36657:2;36646:9;36642:18;36634:26;;36706:9;36700:4;36696:20;36692:1;36681:9;36677:17;36670:47;36734:131;36860:4;36734:131;:::i;:::-;36726:139;;36453:419;;;:::o;36878:148::-;36980:11;37017:3;37002:18;;36878:148;;;;:::o;37032:377::-;37138:3;37166:39;37199:5;37166:39;:::i;:::-;37221:89;37303:6;37298:3;37221:89;:::i;:::-;37214:96;;37319:52;37364:6;37359:3;37352:4;37345:5;37341:16;37319:52;:::i;:::-;37396:6;37391:3;37387:16;37380:23;;37142:267;37032:377;;;;:::o;37415:155::-;37555:7;37551:1;37543:6;37539:14;37532:31;37415:155;:::o;37576:400::-;37736:3;37757:84;37839:1;37834:3;37757:84;:::i;:::-;37750:91;;37850:93;37939:3;37850:93;:::i;:::-;37968:1;37963:3;37959:11;37952:18;;37576:400;;;:::o;37982:701::-;38263:3;38285:95;38376:3;38367:6;38285:95;:::i;:::-;38278:102;;38397:95;38488:3;38479:6;38397:95;:::i;:::-;38390:102;;38509:148;38653:3;38509:148;:::i;:::-;38502:155;;38674:3;38667:10;;37982:701;;;;;:::o;38689:163::-;38829:15;38825:1;38817:6;38813:14;38806:39;38689:163;:::o;38858:366::-;39000:3;39021:67;39085:2;39080:3;39021:67;:::i;:::-;39014:74;;39097:93;39186:3;39097:93;:::i;:::-;39215:2;39210:3;39206:12;39199:19;;38858:366;;;:::o;39230:419::-;39396:4;39434:2;39423:9;39419:18;39411:26;;39483:9;39477:4;39473:20;39469:1;39458:9;39454:17;39447:47;39511:131;39637:4;39511:131;:::i;:::-;39503:139;;39230:419;;;:::o;39655:225::-;39795:34;39791:1;39783:6;39779:14;39772:58;39864:8;39859:2;39851:6;39847:15;39840:33;39655:225;:::o;39886:366::-;40028:3;40049:67;40113:2;40108:3;40049:67;:::i;:::-;40042:74;;40125:93;40214:3;40125:93;:::i;:::-;40243:2;40238:3;40234:12;40227:19;;39886:366;;;:::o;40258:419::-;40424:4;40462:2;40451:9;40447:18;40439:26;;40511:9;40505:4;40501:20;40497:1;40486:9;40482:17;40475:47;40539:131;40665:4;40539:131;:::i;:::-;40531:139;;40258:419;;;:::o;40683:165::-;40823:17;40819:1;40811:6;40807:14;40800:41;40683:165;:::o;40854:366::-;40996:3;41017:67;41081:2;41076:3;41017:67;:::i;:::-;41010:74;;41093:93;41182:3;41093:93;:::i;:::-;41211:2;41206:3;41202:12;41195:19;;40854:366;;;:::o;41226:419::-;41392:4;41430:2;41419:9;41415:18;41407:26;;41479:9;41473:4;41469:20;41465:1;41454:9;41450:17;41443:47;41507:131;41633:4;41507:131;:::i;:::-;41499:139;;41226:419;;;:::o;41651:231::-;41791:34;41787:1;41779:6;41775:14;41768:58;41860:14;41855:2;41847:6;41843:15;41836:39;41651:231;:::o;41888:366::-;42030:3;42051:67;42115:2;42110:3;42051:67;:::i;:::-;42044:74;;42127:93;42216:3;42127:93;:::i;:::-;42245:2;42240:3;42236:12;42229:19;;41888:366;;;:::o;42260:419::-;42426:4;42464:2;42453:9;42449:18;42441:26;;42513:9;42507:4;42503:20;42499:1;42488:9;42484:17;42477:47;42541:131;42667:4;42541:131;:::i;:::-;42533:139;;42260:419;;;:::o;42685:228::-;42825:34;42821:1;42813:6;42809:14;42802:58;42894:11;42889:2;42881:6;42877:15;42870:36;42685:228;:::o;42919:366::-;43061:3;43082:67;43146:2;43141:3;43082:67;:::i;:::-;43075:74;;43158:93;43247:3;43158:93;:::i;:::-;43276:2;43271:3;43267:12;43260:19;;42919:366;;;:::o;43291:419::-;43457:4;43495:2;43484:9;43480:18;43472:26;;43544:9;43538:4;43534:20;43530:1;43519:9;43515:17;43508:47;43572:131;43698:4;43572:131;:::i;:::-;43564:139;;43291:419;;;:::o;43716:223::-;43856:34;43852:1;43844:6;43840:14;43833:58;43925:6;43920:2;43912:6;43908:15;43901:31;43716:223;:::o;43945:366::-;44087:3;44108:67;44172:2;44167:3;44108:67;:::i;:::-;44101:74;;44184:93;44273:3;44184:93;:::i;:::-;44302:2;44297:3;44293:12;44286:19;;43945:366;;;:::o;44317:419::-;44483:4;44521:2;44510:9;44506:18;44498:26;;44570:9;44564:4;44560:20;44556:1;44545:9;44541:17;44534:47;44598:131;44724:4;44598:131;:::i;:::-;44590:139;;44317:419;;;:::o;44742:191::-;44782:4;44802:20;44820:1;44802:20;:::i;:::-;44797:25;;44836:20;44854:1;44836:20;:::i;:::-;44831:25;;44875:1;44872;44869:8;44866:34;;;44880:18;;:::i;:::-;44866:34;44925:1;44922;44918:9;44910:17;;44742:191;;;;:::o;44939:348::-;44979:7;45002:20;45020:1;45002:20;:::i;:::-;44997:25;;45036:20;45054:1;45036:20;:::i;:::-;45031:25;;45224:1;45156:66;45152:74;45149:1;45146:81;45141:1;45134:9;45127:17;45123:105;45120:131;;;45231:18;;:::i;:::-;45120:131;45279:1;45276;45272:9;45261:20;;44939:348;;;;:::o;45293:180::-;45341:77;45338:1;45331:88;45438:4;45435:1;45428:15;45462:4;45459:1;45452:15;45479:185;45519:1;45536:20;45554:1;45536:20;:::i;:::-;45531:25;;45570:20;45588:1;45570:20;:::i;:::-;45565:25;;45609:1;45599:35;;45614:18;;:::i;:::-;45599:35;45656:1;45653;45649:9;45644:14;;45479:185;;;;:::o;45670:79::-;45709:7;45738:5;45727:16;;45670:79;;;:::o;45755:157::-;45860:45;45880:24;45898:5;45880:24;:::i;:::-;45860:45;:::i;:::-;45855:3;45848:58;45755:157;;:::o;45918:397::-;46058:3;46073:75;46144:3;46135:6;46073:75;:::i;:::-;46173:2;46168:3;46164:12;46157:19;;46186:75;46257:3;46248:6;46186:75;:::i;:::-;46286:2;46281:3;46277:12;46270:19;;46306:3;46299:10;;45918:397;;;;;:::o;46321:237::-;46461:34;46457:1;46449:6;46445:14;46438:58;46530:20;46525:2;46517:6;46513:15;46506:45;46321:237;:::o;46564:366::-;46706:3;46727:67;46791:2;46786:3;46727:67;:::i;:::-;46720:74;;46803:93;46892:3;46803:93;:::i;:::-;46921:2;46916:3;46912:12;46905:19;;46564:366;;;:::o;46936:419::-;47102:4;47140:2;47129:9;47125:18;47117:26;;47189:9;47183:4;47179:20;47175:1;47164:9;47160:17;47153:47;47217:131;47343:4;47217:131;:::i;:::-;47209:139;;46936:419;;;:::o;47361:176::-;47393:1;47410:20;47428:1;47410:20;:::i;:::-;47405:25;;47444:20;47462:1;47444:20;:::i;:::-;47439:25;;47483:1;47473:35;;47488:18;;:::i;:::-;47473:35;47529:1;47526;47522:9;47517:14;;47361:176;;;;:::o;47543:98::-;47594:6;47628:5;47622:12;47612:22;;47543:98;;;:::o;47647:168::-;47730:11;47764:6;47759:3;47752:19;47804:4;47799:3;47795:14;47780:29;;47647:168;;;;:::o;47821:360::-;47907:3;47935:38;47967:5;47935:38;:::i;:::-;47989:70;48052:6;48047:3;47989:70;:::i;:::-;47982:77;;48068:52;48113:6;48108:3;48101:4;48094:5;48090:16;48068:52;:::i;:::-;48145:29;48167:6;48145:29;:::i;:::-;48140:3;48136:39;48129:46;;47911:270;47821:360;;;;:::o;48187:640::-;48382:4;48420:3;48409:9;48405:19;48397:27;;48434:71;48502:1;48491:9;48487:17;48478:6;48434:71;:::i;:::-;48515:72;48583:2;48572:9;48568:18;48559:6;48515:72;:::i;:::-;48597;48665:2;48654:9;48650:18;48641:6;48597:72;:::i;:::-;48716:9;48710:4;48706:20;48701:2;48690:9;48686:18;48679:48;48744:76;48815:4;48806:6;48744:76;:::i;:::-;48736:84;;48187:640;;;;;;;:::o;48833:141::-;48889:5;48920:6;48914:13;48905:22;;48936:32;48962:5;48936:32;:::i;:::-;48833:141;;;;:::o;48980:349::-;49049:6;49098:2;49086:9;49077:7;49073:23;49069:32;49066:119;;;49104:79;;:::i;:::-;49066:119;49224:1;49249:63;49304:7;49295:6;49284:9;49280:22;49249:63;:::i;:::-;49239:73;;49195:127;48980:349;;;;:::o;49335:180::-;49383:77;49380:1;49373:88;49480:4;49477:1;49470:15;49504:4;49501:1;49494:15;49521:182;49661:34;49657:1;49649:6;49645:14;49638:58;49521:182;:::o;49709:366::-;49851:3;49872:67;49936:2;49931:3;49872:67;:::i;:::-;49865:74;;49948:93;50037:3;49948:93;:::i;:::-;50066:2;50061:3;50057:12;50050:19;;49709:366;;;:::o;50081:419::-;50247:4;50285:2;50274:9;50270:18;50262:26;;50334:9;50328:4;50324:20;50320:1;50309:9;50305:17;50298:47;50362:131;50488:4;50362:131;:::i;:::-;50354:139;;50081:419;;;:::o;50506:178::-;50646:30;50642:1;50634:6;50630:14;50623:54;50506:178;:::o;50690:366::-;50832:3;50853:67;50917:2;50912:3;50853:67;:::i;:::-;50846:74;;50929:93;51018:3;50929:93;:::i;:::-;51047:2;51042:3;51038:12;51031:19;;50690:366;;;:::o;51062:419::-;51228:4;51266:2;51255:9;51251:18;51243:26;;51315:9;51309:4;51305:20;51301:1;51290:9;51286:17;51279:47;51343:131;51469:4;51343:131;:::i;:::-;51335:139;;51062:419;;;:::o

Swarm Source

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