ETH Price: $3,304.50 (-3.77%)
Gas: 15 Gwei

Token

Smoking Apes (SA)
 

Overview

Max Total Supply

555 SA

Holders

374

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SA
0xCF35dD0df56A4e88FCF5A02518b1f8B8a8D74a68
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
nft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0
// 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/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: contracts/creepies.sol



pragma solidity >=0.8.2;
// to enable certain compiler features

//import '@openzeppelin/contracts/token/ERC721/ERC721.sol';









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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

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

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

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

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

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

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

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

contract nft is ERC721, Ownable {
    using Strings for uint256;

    //amount of tokens that have been minted so far, in total and in presale
    uint256 private numberOfTotalTokens;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private constant mintCostPresale = 0.2 ether;
    uint private constant mintCostPublicSale = 0.3 ether;
    
    //the amount of reserved mints that have currently been executed by creator and giveaways
    uint private initialMints;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;
    
    //marks the timestamp of when the respective sales open
    uint256 internal presaleLaunchTime;
    uint256 internal publicSaleLaunchTime;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;

    //maximum amount of mints allowed per person
    uint256 public constant maxMint = 5;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}
    
    //declaring initial values for variables
    constructor() ERC721('Smoking Apes', 'SA') {
        numberOfTotalTokens = 0;
        maxTotalTokens = 555;

        _currentBaseURI = "ipfs://../";

        _safeMint(msg.sender, 0);
        mintsPerAddress[msg.sender] += 1;
        numberOfTotalTokens += 1;
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }
    
    //gets the tokenID of NFT to be minted
    function tokenId() internal view returns(uint256) {
        uint currentId = totalSupply() + 134 - initialMints;
        return currentId;
    }

    function switchToPresale() public onlyOwner {
        require(saleState() == State.NoSale, 'Sale is already Open!');
        presaleLaunchTime = block.timestamp;
    }

    function switchToPublicSale() public onlyOwner {
        require(saleState() == State.Presale, 'Cannot Open Public Sale!');
        publicSaleLaunchTime = block.timestamp;
    }
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }
    
    //mint a @param number of NFTs in presale
    function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public payable {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!");
        require(numberOfTotalTokens + number <= maxTotalTokens - (134 - initialMints), "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMint, "Maximum 5 Mints per Address allowed!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.2 ether each NFT)");
        
        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            numberOfTotalTokens += 1;
        }

    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint(uint256 number) public payable {
        State saleState_ = saleState();
        require(saleState_ == State.PublicSale, "Public Sale in not open yet!");
        require(numberOfTotalTokens + number <= maxTotalTokens - (134 - initialMints), "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMint, "Maximum 5 Mints per Address allowed!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.3 ether for each NFT)");


        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            numberOfTotalTokens += 1;
        }
    }
    
    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')) : "";
          
    }
    
    //reserved NFTs for creator
    function initialMint(uint[] memory tokenIds, address[] memory recipients) public onlyOwner {
        require(initialMints + tokenIds.length <= 134, "Not enough Initial NFTs left to mint..");

        for (uint i = 0; i < tokenIds.length; i++) {
            _safeMint(recipients[i], tokenIds[i]);
            mintsPerAddress[recipients[i]] += 1;
            numberOfTotalTokens += 1;
            initialMints++;
        }    
        
    }
    
    //burn the tokens that have not been sold yet
    function burnTokens() public onlyOwner {
        maxTotalTokens = numberOfTotalTokens;
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //retrieve all funds recieved from minting
    function withdraw() public onlyOwner {
        uint256 balance = accountBalance();
        require(balance > 0, 'No Funds to withdraw, Balance is 0');

        _withdraw(payable(owner()), accountBalance()); 
    }
    
    //send the percentage of funds to a shareholder´s wallet
    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //see the total amount of tokens that have been minted
    function totalSupply() public view returns(uint) {
        return numberOfTotalTokens;
    }
    
    //to see the total amount of reserved mints left 
    function initialMintsLeft() public onlyOwner view returns(uint) {
        return 134 - initialMints;
    }
    
    //see current state of sale
    //see the current state of the sale
    function saleState() public view returns(State){
        if (presaleLaunchTime == 0) {
            return State.NoSale;
        }
        else if (publicSaleLaunchTime == 0) {
            return State.Presale;
        }
        else {
            return State.PublicSale;
        }
    }
    
    //gets the cost of current mint
    function mintCost() public view returns(uint) {
        State saleState_ = saleState();
        if (saleState_ == State.NoSale || saleState_ == State.Presale) {
            return mintCostPresale;
        }
        else {
            return mintCostPublicSale;
        }       
    }
   
}

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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","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":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"initialMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040527380e4929c869102140e69550bbecc20bed61b080c600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600c81526020017f536d6f6b696e67204170657300000000000000000000000000000000000000008152506040518060400160405280600281526020017f53410000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000eb9291906200079a565b508060019080519060200190620001049291906200079a565b505050620001276200011b6200021460201b60201c565b6200021c60201b60201c565b600060088190555061022b6009819055506040518060400160405280600a81526020017f697066733a2f2f2e2e2f00000000000000000000000000000000000000000000815250600a9080519060200190620001859291906200079a565b5062000199336000620002e260201b60201c565b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620001eb919062000a52565b9250508190555060016008600082825462000207919062000a52565b9250508190555062000cb4565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003048282604051806020016040528060008152506200030860201b60201c565b5050565b6200031a83836200037660201b60201c565b6200032f60008484846200055c60201b60201c565b62000371576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036890620009bf565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003e9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e09062000a03565b60405180910390fd5b620003fa816200071660201b60201c565b156200043d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043490620009e1565b60405180910390fd5b62000451600083836200078260201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004a3919062000a52565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200058a8473ffffffffffffffffffffffffffffffffffffffff166200078760201b620020df1760201c565b1562000709578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005bc6200021460201b60201c565b8786866040518563ffffffff1660e01b8152600401620005e094939291906200096b565b602060405180830381600087803b158015620005fb57600080fd5b505af19250505080156200062f57506040513d601f19601f820116820180604052508101906200062c919062000861565b60015b620006b8573d806000811462000662576040519150601f19603f3d011682016040523d82523d6000602084013e62000667565b606091505b50600081511415620006b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006a790620009bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200070e565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b600080823b905060008111915050919050565b828054620007a89062000b4f565b90600052602060002090601f016020900481019282620007cc576000855562000818565b82601f10620007e757805160ff191683800117855562000818565b8280016001018555821562000818579182015b8281111562000817578251825591602001919060010190620007fa565b5b5090506200082791906200082b565b5090565b5b80821115620008465760008160009055506001016200082c565b5090565b6000815190506200085b8162000c9a565b92915050565b6000602082840312156200087a576200087962000be3565b5b60006200088a848285016200084a565b91505092915050565b6200089e8162000aaf565b82525050565b6000620008b18262000a25565b620008bd818562000a30565b9350620008cf81856020860162000b19565b620008da8162000be8565b840191505092915050565b6000620008f460328362000a41565b9150620009018262000bf9565b604082019050919050565b60006200091b601c8362000a41565b9150620009288262000c48565b602082019050919050565b60006200094260208362000a41565b91506200094f8262000c71565b602082019050919050565b620009658162000b0f565b82525050565b600060808201905062000982600083018762000893565b62000991602083018662000893565b620009a060408301856200095a565b8181036060830152620009b48184620008a4565b905095945050505050565b60006020820190508181036000830152620009da81620008e5565b9050919050565b60006020820190508181036000830152620009fc816200090c565b9050919050565b6000602082019050818103600083015262000a1e8162000933565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000a5f8262000b0f565b915062000a6c8362000b0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000aa45762000aa362000b85565b5b828201905092915050565b600062000abc8262000aef565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b3957808201518184015260208101905062000b1c565b8381111562000b49576000848401525b50505050565b6000600282049050600182168062000b6857607f821691505b6020821081141562000b7f5762000b7e62000bb4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62000ca58162000ac3565b811462000cb157600080fd5b50565b614dfa8062000cc46000396000f3fe6080604052600436106101f25760003560e01c80636352211e1161010d578063b3ab66b0116100a0578063dcd4e7321161006f578063dcd4e732146106d5578063e985e9c5146106f1578063eab417821461072e578063f2fde38b14610745578063ff9849941461076e576101f9565b8063b3ab66b014610628578063b88d4fde14610644578063bdb4b8481461066d578063c87b56dd14610698576101f9565b80638da5cb5b116100dc5780638da5cb5b1461057e57806395d89b41146105a9578063a22cb465146105d4578063b0a1c1c4146105fd576101f9565b80636352211e146104c257806370a08231146104ff578063715018a61461053c5780637501f74114610553576101f9565b80632c74d772116101855780633ccfd60b116101545780633ccfd60b1461042c57806342842e0e146104435780635d351ce71461046c578063603f4d5214610497576101f9565b80632c74d772146103605780633023eba61461038957806332624114146103c657806339a0c6f914610403576101f9565b8063081812fc116101c1578063081812fc146102a6578063095ea7b3146102e357806318160ddd1461030c57806323b872dd14610337576101f9565b80630191a657146101fe57806301ffc9a71461022757806306fdde031461026457806308003f781461028f576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906130eb565b610785565b005b34801561023357600080fd5b5061024e6004803603810190610249919061338d565b610845565b60405161025b9190613b4c565b60405180910390f35b34801561027057600080fd5b50610279610927565b6040516102869190613bc7565b60405180910390f35b34801561029b57600080fd5b506102a46109b9565b005b3480156102b257600080fd5b506102cd60048036038101906102c89190613430565b610a40565b6040516102da9190613ae5565b60405180910390f35b3480156102ef57600080fd5b5061030a6004803603810190610305919061326e565b610ac5565b005b34801561031857600080fd5b50610321610bdd565b60405161032e9190613f89565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190613158565b610be7565b005b34801561036c57600080fd5b5061038760048036038101906103829190613315565b610c47565b005b34801561039557600080fd5b506103b060048036038101906103ab91906130eb565b610e1a565b6040516103bd9190613f89565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906132ae565b610e32565b6040516103fa9190613b4c565b60405180910390f35b34801561040f57600080fd5b5061042a600480360381019061042591906133e7565b610f30565b005b34801561043857600080fd5b50610441610fc6565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613158565b6110ac565b005b34801561047857600080fd5b506104816110cc565b60405161048e9190613f89565b60405180910390f35b3480156104a357600080fd5b506104ac61115e565b6040516104b99190613bac565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190613430565b61118f565b6040516104f69190613ae5565b60405180910390f35b34801561050b57600080fd5b50610526600480360381019061052191906130eb565b611241565b6040516105339190613f89565b60405180910390f35b34801561054857600080fd5b506105516112f9565b005b34801561055f57600080fd5b50610568611381565b6040516105759190613f89565b60405180910390f35b34801561058a57600080fd5b50610593611386565b6040516105a09190613ae5565b60405180910390f35b3480156105b557600080fd5b506105be6113b0565b6040516105cb9190613bc7565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f6919061322e565b611442565b005b34801561060957600080fd5b506106126115c3565b60405161061f9190613f89565b60405180910390f35b610642600480360381019061063d9190613430565b611647565b005b34801561065057600080fd5b5061066b600480360381019061066691906131ab565b6118b2565b005b34801561067957600080fd5b50610682611914565b60405161068f9190613f89565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613430565b61199e565b6040516106cc9190613bc7565b60405180910390f35b6106ef60048036038101906106ea919061345d565b611a45565b005b3480156106fd57600080fd5b5061071860048036038101906107139190613118565b611d6d565b6040516107259190613b4c565b60405180910390f35b34801561073a57600080fd5b50610743611e01565b005b34801561075157600080fd5b5061076c600480360381019061076791906130eb565b611ef4565b005b34801561077a57600080fd5b50610783611fec565b005b61078d6120f2565b73ffffffffffffffffffffffffffffffffffffffff166107ab611386565b73ffffffffffffffffffffffffffffffffffffffff1614610801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f890613e29565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610920575061091f826120fa565b5b9050919050565b606060008054610936906142d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610962906142d8565b80156109af5780601f10610984576101008083540402835291602001916109af565b820191906000526020600020905b81548152906001019060200180831161099257829003601f168201915b5050505050905090565b6109c16120f2565b73ffffffffffffffffffffffffffffffffffffffff166109df611386565b73ffffffffffffffffffffffffffffffffffffffff1614610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613e29565b60405180910390fd5b600854600981905550565b6000610a4b82612164565b610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613de9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad08261118f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613ec9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b606120f2565b73ffffffffffffffffffffffffffffffffffffffff161480610b8f5750610b8e81610b896120f2565b611d6d565b5b610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590613d29565b60405180910390fd5b610bd883836121d0565b505050565b6000600854905090565b610bf8610bf26120f2565b82612289565b610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90613f09565b60405180910390fd5b610c42838383612367565b505050565b610c4f6120f2565b73ffffffffffffffffffffffffffffffffffffffff16610c6d611386565b73ffffffffffffffffffffffffffffffffffffffff1614610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90613e29565b60405180910390fd5b60868251600b54610cd491906140d1565b1115610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c90613ce9565b60405180910390fd5b60005b8251811015610e1557610d5f828281518110610d3757610d3661449f565b5b6020026020010151848381518110610d5257610d5161449f565b5b60200260200101516125c3565b6001600f6000848481518110610d7857610d7761449f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dc991906140d1565b92505081905550600160086000828254610de391906140d1565b92505081905550600b6000815480929190610dfd9061433b565b91905055508080610e0d9061433b565b915050610d18565b505050565b600f6020528060005260406000206000915090505481565b6000803086604051602001610e48929190613a4f565b604051602081830303815290604052805190602001209050600181604051602001610e739190613aaa565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610ea99493929190613b67565b6020604051602081039080840390855afa158015610ecb573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b610f386120f2565b73ffffffffffffffffffffffffffffffffffffffff16610f56611386565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390613e29565b60405180910390fd5b80600a9080519060200190610fc2929190612d99565b5050565b610fce6120f2565b73ffffffffffffffffffffffffffffffffffffffff16610fec611386565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990613e29565b60405180910390fd5b600061104c6115c3565b905060008111611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890613f69565b60405180910390fd5b6110a961109c611386565b6110a46115c3565b6125e1565b50565b6110c7838383604051806020016040528060008152506118b2565b505050565b60006110d66120f2565b73ffffffffffffffffffffffffffffffffffffffff166110f4611386565b73ffffffffffffffffffffffffffffffffffffffff161461114a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114190613e29565b60405180910390fd5b600b54608661115991906141b2565b905090565b600080600d541415611173576000905061118c565b6000600e541415611187576001905061118c565b600290505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f90613d89565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613d69565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113016120f2565b73ffffffffffffffffffffffffffffffffffffffff1661131f611386565b73ffffffffffffffffffffffffffffffffffffffff1614611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90613e29565b60405180910390fd5b61137f6000612692565b565b600581565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113bf906142d8565b80601f01602080910402602001604051908101604052809291908181526020018280546113eb906142d8565b80156114385780601f1061140d57610100808354040283529160200191611438565b820191906000526020600020905b81548152906001019060200180831161141b57829003601f168201915b5050505050905090565b61144a6120f2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613c89565b60405180910390fd5b80600560006114c56120f2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115726120f2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115b79190613b4c565b60405180910390a35050565b60006115cd6120f2565b73ffffffffffffffffffffffffffffffffffffffff166115eb611386565b73ffffffffffffffffffffffffffffffffffffffff1614611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163890613e29565b60405180910390fd5b47905090565b600061165161115e565b905060028081111561166657611665614441565b5b81600281111561167957611678614441565b5b146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090613da9565b60405180910390fd5b600b5460866116c891906141b2565b6009546116d591906141b2565b826008546116e391906140d1565b1115611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b90613ca9565b60405180910390fd5b600582600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461177191906140d1565b11156117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990613e89565b60405180910390fd5b816117bb611914565b6117c59190614158565b341015611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe90613ea9565b60405180910390fd5b60005b828110156118ad57600061181c612758565b905061182833826125c3565b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461187891906140d1565b9250508190555060016008600082825461189291906140d1565b925050819055505080806118a59061433b565b91505061180a565b505050565b6118c36118bd6120f2565b83612289565b611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990613f09565b60405180910390fd5b61190e84848484612785565b50505050565b60008061191f61115e565b90506000600281111561193557611934614441565b5b81600281111561194857611947614441565b5b148061197857506001600281111561196357611962614441565b5b81600281111561197657611975614441565b5b145b1561198e576702c68af0bb14000091505061199b565b670429d069189e00009150505b90565b60606119a982612164565b6119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90613e69565b60405180910390fd5b60006119f26127e1565b90506000815111611a125760405180602001604052806000815250611a3d565b80611a1c84612873565b604051602001611a2d929190613a7b565b6040516020818303038152906040525b915050919050565b828282611a5433848484610e32565b611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90613e09565b60405180910390fd5b6000611a9d61115e565b905060006002811115611ab357611ab2614441565b5b816002811115611ac657611ac5614441565b5b1415611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe90613f49565b60405180910390fd5b600280811115611b1a57611b19614441565b5b816002811115611b2d57611b2c614441565b5b1415611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6590613d49565b60405180910390fd5b600b546086611b7d91906141b2565b600954611b8a91906141b2565b88600854611b9891906140d1565b1115611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090613ca9565b60405180910390fd5b600588600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c2691906140d1565b1115611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90613e89565b60405180910390fd5b87611c70611914565b611c7a9190614158565b341015611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390613f29565b60405180910390fd5b60005b88811015611d62576000611cd1612758565b9050611cdd33826125c3565b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2d91906140d1565b92505081905550600160086000828254611d4791906140d1565b92505081905550508080611d5a9061433b565b915050611cbf565b505050505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e096120f2565b73ffffffffffffffffffffffffffffffffffffffff16611e27611386565b73ffffffffffffffffffffffffffffffffffffffff1614611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613e29565b60405180910390fd5b60006002811115611e9157611e90614441565b5b611e9961115e565b6002811115611eab57611eaa614441565b5b14611eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee290613d09565b60405180910390fd5b42600d81905550565b611efc6120f2565b73ffffffffffffffffffffffffffffffffffffffff16611f1a611386565b73ffffffffffffffffffffffffffffffffffffffff1614611f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6790613e29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd790613c09565b60405180910390fd5b611fe981612692565b50565b611ff46120f2565b73ffffffffffffffffffffffffffffffffffffffff16612012611386565b73ffffffffffffffffffffffffffffffffffffffff1614612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f90613e29565b60405180910390fd5b6001600281111561207c5761207b614441565b5b61208461115e565b600281111561209657612095614441565b5b146120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd90613ee9565b60405180910390fd5b42600e81905550565b600080823b905060008111915050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122438361118f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061229482612164565b6122d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ca90613cc9565b60405180910390fd5b60006122de8361118f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061234d57508373ffffffffffffffffffffffffffffffffffffffff1661233584610a40565b73ffffffffffffffffffffffffffffffffffffffff16145b8061235e575061235d8185611d6d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123878261118f565b73ffffffffffffffffffffffffffffffffffffffff16146123dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d490613e49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561244d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244490613c69565b60405180910390fd5b6124588383836129d4565b6124636000826121d0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124b391906141b2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461250a91906140d1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6125dd8282604051806020016040528060008152506129d9565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161260790613ad0565b60006040518083038185875af1925050503d8060008114612644576040519150601f19603f3d011682016040523d82523d6000602084013e612649565b606091505b505090508061268d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268490613c49565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600b546086612768610bdd565b61277291906140d1565b61277c91906141b2565b90508091505090565b612790848484612367565b61279c84848484612a34565b6127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d290613be9565b60405180910390fd5b50505050565b6060600a80546127f0906142d8565b80601f016020809104026020016040519081016040528092919081815260200182805461281c906142d8565b80156128695780601f1061283e57610100808354040283529160200191612869565b820191906000526020600020905b81548152906001019060200180831161284c57829003601f168201915b5050505050905090565b606060008214156128bb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129cf565b600082905060005b600082146128ed5780806128d69061433b565b915050600a826128e69190614127565b91506128c3565b60008167ffffffffffffffff811115612909576129086144ce565b5b6040519080825280601f01601f19166020018201604052801561293b5781602001600182028036833780820191505090505b5090505b600085146129c85760018261295491906141b2565b9150600a8561296391906143b2565b603061296f91906140d1565b60f81b8183815181106129855761298461449f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129c19190614127565b945061293f565b8093505050505b919050565b505050565b6129e38383612bcb565b6129f06000848484612a34565b612a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2690613be9565b60405180910390fd5b505050565b6000612a558473ffffffffffffffffffffffffffffffffffffffff166120df565b15612bbe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a7e6120f2565b8786866040518563ffffffff1660e01b8152600401612aa09493929190613b00565b602060405180830381600087803b158015612aba57600080fd5b505af1925050508015612aeb57506040513d601f19601f82011682018060405250810190612ae891906133ba565b60015b612b6e573d8060008114612b1b576040519150601f19603f3d011682016040523d82523d6000602084013e612b20565b606091505b50600081511415612b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5d90613be9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bc3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3290613dc9565b60405180910390fd5b612c4481612164565b15612c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7b90613c29565b60405180910390fd5b612c90600083836129d4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ce091906140d1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612da5906142d8565b90600052602060002090601f016020900481019282612dc75760008555612e0e565b82601f10612de057805160ff1916838001178555612e0e565b82800160010185558215612e0e579182015b82811115612e0d578251825591602001919060010190612df2565b5b509050612e1b9190612e1f565b5090565b5b80821115612e38576000816000905550600101612e20565b5090565b6000612e4f612e4a84613fc9565b613fa4565b90508083825260208201905082856020860282011115612e7257612e71614502565b5b60005b85811015612ea25781612e888882612fa0565b845260208401935060208301925050600181019050612e75565b5050509392505050565b6000612ebf612eba84613ff5565b613fa4565b90508083825260208201905082856020860282011115612ee257612ee1614502565b5b60005b85811015612f125781612ef888826130c1565b845260208401935060208301925050600181019050612ee5565b5050509392505050565b6000612f2f612f2a84614021565b613fa4565b905082815260208101848484011115612f4b57612f4a614507565b5b612f56848285614296565b509392505050565b6000612f71612f6c84614052565b613fa4565b905082815260208101848484011115612f8d57612f8c614507565b5b612f98848285614296565b509392505050565b600081359050612faf81614d3a565b92915050565b600082601f830112612fca57612fc96144fd565b5b8135612fda848260208601612e3c565b91505092915050565b600082601f830112612ff857612ff76144fd565b5b8135613008848260208601612eac565b91505092915050565b60008135905061302081614d51565b92915050565b60008135905061303581614d68565b92915050565b60008135905061304a81614d7f565b92915050565b60008151905061305f81614d7f565b92915050565b600082601f83011261307a576130796144fd565b5b813561308a848260208601612f1c565b91505092915050565b600082601f8301126130a8576130a76144fd565b5b81356130b8848260208601612f5e565b91505092915050565b6000813590506130d081614d96565b92915050565b6000813590506130e581614dad565b92915050565b60006020828403121561310157613100614511565b5b600061310f84828501612fa0565b91505092915050565b6000806040838503121561312f5761312e614511565b5b600061313d85828601612fa0565b925050602061314e85828601612fa0565b9150509250929050565b60008060006060848603121561317157613170614511565b5b600061317f86828701612fa0565b935050602061319086828701612fa0565b92505060406131a1868287016130c1565b9150509250925092565b600080600080608085870312156131c5576131c4614511565b5b60006131d387828801612fa0565b94505060206131e487828801612fa0565b93505060406131f5878288016130c1565b925050606085013567ffffffffffffffff8111156132165761321561450c565b5b61322287828801613065565b91505092959194509250565b6000806040838503121561324557613244614511565b5b600061325385828601612fa0565b925050602061326485828601613011565b9150509250929050565b6000806040838503121561328557613284614511565b5b600061329385828601612fa0565b92505060206132a4858286016130c1565b9150509250929050565b600080600080608085870312156132c8576132c7614511565b5b60006132d687828801612fa0565b94505060206132e7878288016130d6565b93505060406132f887828801613026565b925050606061330987828801613026565b91505092959194509250565b6000806040838503121561332c5761332b614511565b5b600083013567ffffffffffffffff81111561334a5761334961450c565b5b61335685828601612fe3565b925050602083013567ffffffffffffffff8111156133775761337661450c565b5b61338385828601612fb5565b9150509250929050565b6000602082840312156133a3576133a2614511565b5b60006133b18482850161303b565b91505092915050565b6000602082840312156133d0576133cf614511565b5b60006133de84828501613050565b91505092915050565b6000602082840312156133fd576133fc614511565b5b600082013567ffffffffffffffff81111561341b5761341a61450c565b5b61342784828501613093565b91505092915050565b60006020828403121561344657613445614511565b5b6000613454848285016130c1565b91505092915050565b6000806000806080858703121561347757613476614511565b5b6000613485878288016130c1565b9450506020613496878288016130d6565b93505060406134a787828801613026565b92505060606134b887828801613026565b91505092959194509250565b6134cd816141e6565b82525050565b6134e46134df826141e6565b614384565b82525050565b6134f3816141f8565b82525050565b61350281614204565b82525050565b61351961351482614204565b614396565b82525050565b600061352a82614083565b6135348185614099565b93506135448185602086016142a5565b61354d81614516565b840191505092915050565b61356181614284565b82525050565b60006135728261408e565b61357c81856140b5565b935061358c8185602086016142a5565b61359581614516565b840191505092915050565b60006135ab8261408e565b6135b581856140c6565b93506135c58185602086016142a5565b80840191505092915050565b60006135de601c836140c6565b91506135e982614534565b601c82019050919050565b60006136016032836140b5565b915061360c8261455d565b604082019050919050565b60006136246026836140b5565b915061362f826145ac565b604082019050919050565b6000613647601c836140b5565b9150613652826145fb565b602082019050919050565b600061366a6014836140b5565b915061367582614624565b602082019050919050565b600061368d6024836140b5565b91506136988261464d565b604082019050919050565b60006136b06019836140b5565b91506136bb8261469c565b602082019050919050565b60006136d3601e836140b5565b91506136de826146c5565b602082019050919050565b60006136f6602c836140b5565b9150613701826146ee565b604082019050919050565b60006137196026836140b5565b91506137248261473d565b604082019050919050565b600061373c6015836140b5565b91506137478261478c565b602082019050919050565b600061375f6038836140b5565b915061376a826147b5565b604082019050919050565b6000613782602a836140b5565b915061378d82614804565b604082019050919050565b60006137a5602a836140b5565b91506137b082614853565b604082019050919050565b60006137c86029836140b5565b91506137d3826148a2565b604082019050919050565b60006137eb601c836140b5565b91506137f6826148f1565b602082019050919050565b600061380e6020836140b5565b91506138198261491a565b602082019050919050565b6000613831602c836140b5565b915061383c82614943565b604082019050919050565b60006138546005836140c6565b915061385f82614992565b600582019050919050565b60006138776011836140b5565b9150613882826149bb565b602082019050919050565b600061389a6020836140b5565b91506138a5826149e4565b602082019050919050565b60006138bd6029836140b5565b91506138c882614a0d565b604082019050919050565b60006138e0602f836140b5565b91506138eb82614a5c565b604082019050919050565b60006139036024836140b5565b915061390e82614aab565b604082019050919050565b60006139266050836140b5565b915061393182614afa565b606082019050919050565b60006139496021836140b5565b915061395482614b6f565b604082019050919050565b600061396c6018836140b5565b915061397782614bbe565b602082019050919050565b600061398f6000836140aa565b915061399a82614be7565b600082019050919050565b60006139b26031836140b5565b91506139bd82614bea565b604082019050919050565b60006139d5604c836140b5565b91506139e082614c39565b606082019050919050565b60006139f86015836140b5565b9150613a0382614cae565b602082019050919050565b6000613a1b6022836140b5565b9150613a2682614cd7565b604082019050919050565b613a3a8161426d565b82525050565b613a4981614277565b82525050565b6000613a5b82856134d3565b601482019150613a6b82846134d3565b6014820191508190509392505050565b6000613a8782856135a0565b9150613a9382846135a0565b9150613a9e82613847565b91508190509392505050565b6000613ab5826135d1565b9150613ac18284613508565b60208201915081905092915050565b6000613adb82613982565b9150819050919050565b6000602082019050613afa60008301846134c4565b92915050565b6000608082019050613b1560008301876134c4565b613b2260208301866134c4565b613b2f6040830185613a31565b8181036060830152613b41818461351f565b905095945050505050565b6000602082019050613b6160008301846134ea565b92915050565b6000608082019050613b7c60008301876134f9565b613b896020830186613a40565b613b9660408301856134f9565b613ba360608301846134f9565b95945050505050565b6000602082019050613bc16000830184613558565b92915050565b60006020820190508181036000830152613be18184613567565b905092915050565b60006020820190508181036000830152613c02816135f4565b9050919050565b60006020820190508181036000830152613c2281613617565b9050919050565b60006020820190508181036000830152613c428161363a565b9050919050565b60006020820190508181036000830152613c628161365d565b9050919050565b60006020820190508181036000830152613c8281613680565b9050919050565b60006020820190508181036000830152613ca2816136a3565b9050919050565b60006020820190508181036000830152613cc2816136c6565b9050919050565b60006020820190508181036000830152613ce2816136e9565b9050919050565b60006020820190508181036000830152613d028161370c565b9050919050565b60006020820190508181036000830152613d228161372f565b9050919050565b60006020820190508181036000830152613d4281613752565b9050919050565b60006020820190508181036000830152613d6281613775565b9050919050565b60006020820190508181036000830152613d8281613798565b9050919050565b60006020820190508181036000830152613da2816137bb565b9050919050565b60006020820190508181036000830152613dc2816137de565b9050919050565b60006020820190508181036000830152613de281613801565b9050919050565b60006020820190508181036000830152613e0281613824565b9050919050565b60006020820190508181036000830152613e228161386a565b9050919050565b60006020820190508181036000830152613e428161388d565b9050919050565b60006020820190508181036000830152613e62816138b0565b9050919050565b60006020820190508181036000830152613e82816138d3565b9050919050565b60006020820190508181036000830152613ea2816138f6565b9050919050565b60006020820190508181036000830152613ec281613919565b9050919050565b60006020820190508181036000830152613ee28161393c565b9050919050565b60006020820190508181036000830152613f028161395f565b9050919050565b60006020820190508181036000830152613f22816139a5565b9050919050565b60006020820190508181036000830152613f42816139c8565b9050919050565b60006020820190508181036000830152613f62816139eb565b9050919050565b60006020820190508181036000830152613f8281613a0e565b9050919050565b6000602082019050613f9e6000830184613a31565b92915050565b6000613fae613fbf565b9050613fba828261430a565b919050565b6000604051905090565b600067ffffffffffffffff821115613fe457613fe36144ce565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156140105761400f6144ce565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561403c5761403b6144ce565b5b61404582614516565b9050602081019050919050565b600067ffffffffffffffff82111561406d5761406c6144ce565b5b61407682614516565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140dc8261426d565b91506140e78361426d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561411c5761411b6143e3565b5b828201905092915050565b60006141328261426d565b915061413d8361426d565b92508261414d5761414c614412565b5b828204905092915050565b60006141638261426d565b915061416e8361426d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141a7576141a66143e3565b5b828202905092915050565b60006141bd8261426d565b91506141c88361426d565b9250828210156141db576141da6143e3565b5b828203905092915050565b60006141f18261424d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061424882614d26565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061428f8261423a565b9050919050565b82818337600083830152505050565b60005b838110156142c35780820151818401526020810190506142a8565b838111156142d2576000848401525b50505050565b600060028204905060018216806142f057607f821691505b6020821081141561430457614303614470565b5b50919050565b61431382614516565b810181811067ffffffffffffffff82111715614332576143316144ce565b5b80604052505050565b60006143468261426d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614379576143786143e3565b5b600182019050919050565b600061438f826143a0565b9050919050565b6000819050919050565b60006143ab82614527565b9050919050565b60006143bd8261426d565b91506143c88361426d565b9250826143d8576143d7614412565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820496e697469616c204e465473206c65667420746f2060008201527f6d696e742e2e0000000000000000000000000000000000000000000000000000602082015250565b7f53616c6520697320616c7265616479204f70656e210000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178696d756d2035204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e332065746860208201527f657220666f722065616368204e46542900000000000000000000000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74204f70656e205075626c69632053616c65210000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e322065746860208201527f65722065616368204e4654290000000000000000000000000000000000000000604082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b60038110614d3757614d36614441565b5b50565b614d43816141e6565b8114614d4e57600080fd5b50565b614d5a816141f8565b8114614d6557600080fd5b50565b614d7181614204565b8114614d7c57600080fd5b50565b614d888161420e565b8114614d9357600080fd5b50565b614d9f8161426d565b8114614daa57600080fd5b50565b614db681614277565b8114614dc157600080fd5b5056fea2646970667358221220fc2531e0a0b594d2686f03b3bf1d2669921c81fdfbebb2432dd918b736790fe264736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101f25760003560e01c80636352211e1161010d578063b3ab66b0116100a0578063dcd4e7321161006f578063dcd4e732146106d5578063e985e9c5146106f1578063eab417821461072e578063f2fde38b14610745578063ff9849941461076e576101f9565b8063b3ab66b014610628578063b88d4fde14610644578063bdb4b8481461066d578063c87b56dd14610698576101f9565b80638da5cb5b116100dc5780638da5cb5b1461057e57806395d89b41146105a9578063a22cb465146105d4578063b0a1c1c4146105fd576101f9565b80636352211e146104c257806370a08231146104ff578063715018a61461053c5780637501f74114610553576101f9565b80632c74d772116101855780633ccfd60b116101545780633ccfd60b1461042c57806342842e0e146104435780635d351ce71461046c578063603f4d5214610497576101f9565b80632c74d772146103605780633023eba61461038957806332624114146103c657806339a0c6f914610403576101f9565b8063081812fc116101c1578063081812fc146102a6578063095ea7b3146102e357806318160ddd1461030c57806323b872dd14610337576101f9565b80630191a657146101fe57806301ffc9a71461022757806306fdde031461026457806308003f781461028f576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906130eb565b610785565b005b34801561023357600080fd5b5061024e6004803603810190610249919061338d565b610845565b60405161025b9190613b4c565b60405180910390f35b34801561027057600080fd5b50610279610927565b6040516102869190613bc7565b60405180910390f35b34801561029b57600080fd5b506102a46109b9565b005b3480156102b257600080fd5b506102cd60048036038101906102c89190613430565b610a40565b6040516102da9190613ae5565b60405180910390f35b3480156102ef57600080fd5b5061030a6004803603810190610305919061326e565b610ac5565b005b34801561031857600080fd5b50610321610bdd565b60405161032e9190613f89565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190613158565b610be7565b005b34801561036c57600080fd5b5061038760048036038101906103829190613315565b610c47565b005b34801561039557600080fd5b506103b060048036038101906103ab91906130eb565b610e1a565b6040516103bd9190613f89565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906132ae565b610e32565b6040516103fa9190613b4c565b60405180910390f35b34801561040f57600080fd5b5061042a600480360381019061042591906133e7565b610f30565b005b34801561043857600080fd5b50610441610fc6565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613158565b6110ac565b005b34801561047857600080fd5b506104816110cc565b60405161048e9190613f89565b60405180910390f35b3480156104a357600080fd5b506104ac61115e565b6040516104b99190613bac565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190613430565b61118f565b6040516104f69190613ae5565b60405180910390f35b34801561050b57600080fd5b50610526600480360381019061052191906130eb565b611241565b6040516105339190613f89565b60405180910390f35b34801561054857600080fd5b506105516112f9565b005b34801561055f57600080fd5b50610568611381565b6040516105759190613f89565b60405180910390f35b34801561058a57600080fd5b50610593611386565b6040516105a09190613ae5565b60405180910390f35b3480156105b557600080fd5b506105be6113b0565b6040516105cb9190613bc7565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f6919061322e565b611442565b005b34801561060957600080fd5b506106126115c3565b60405161061f9190613f89565b60405180910390f35b610642600480360381019061063d9190613430565b611647565b005b34801561065057600080fd5b5061066b600480360381019061066691906131ab565b6118b2565b005b34801561067957600080fd5b50610682611914565b60405161068f9190613f89565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613430565b61199e565b6040516106cc9190613bc7565b60405180910390f35b6106ef60048036038101906106ea919061345d565b611a45565b005b3480156106fd57600080fd5b5061071860048036038101906107139190613118565b611d6d565b6040516107259190613b4c565b60405180910390f35b34801561073a57600080fd5b50610743611e01565b005b34801561075157600080fd5b5061076c600480360381019061076791906130eb565b611ef4565b005b34801561077a57600080fd5b50610783611fec565b005b61078d6120f2565b73ffffffffffffffffffffffffffffffffffffffff166107ab611386565b73ffffffffffffffffffffffffffffffffffffffff1614610801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f890613e29565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610920575061091f826120fa565b5b9050919050565b606060008054610936906142d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610962906142d8565b80156109af5780601f10610984576101008083540402835291602001916109af565b820191906000526020600020905b81548152906001019060200180831161099257829003601f168201915b5050505050905090565b6109c16120f2565b73ffffffffffffffffffffffffffffffffffffffff166109df611386565b73ffffffffffffffffffffffffffffffffffffffff1614610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613e29565b60405180910390fd5b600854600981905550565b6000610a4b82612164565b610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613de9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad08261118f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613ec9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b606120f2565b73ffffffffffffffffffffffffffffffffffffffff161480610b8f5750610b8e81610b896120f2565b611d6d565b5b610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590613d29565b60405180910390fd5b610bd883836121d0565b505050565b6000600854905090565b610bf8610bf26120f2565b82612289565b610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90613f09565b60405180910390fd5b610c42838383612367565b505050565b610c4f6120f2565b73ffffffffffffffffffffffffffffffffffffffff16610c6d611386565b73ffffffffffffffffffffffffffffffffffffffff1614610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90613e29565b60405180910390fd5b60868251600b54610cd491906140d1565b1115610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c90613ce9565b60405180910390fd5b60005b8251811015610e1557610d5f828281518110610d3757610d3661449f565b5b6020026020010151848381518110610d5257610d5161449f565b5b60200260200101516125c3565b6001600f6000848481518110610d7857610d7761449f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dc991906140d1565b92505081905550600160086000828254610de391906140d1565b92505081905550600b6000815480929190610dfd9061433b565b91905055508080610e0d9061433b565b915050610d18565b505050565b600f6020528060005260406000206000915090505481565b6000803086604051602001610e48929190613a4f565b604051602081830303815290604052805190602001209050600181604051602001610e739190613aaa565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610ea99493929190613b67565b6020604051602081039080840390855afa158015610ecb573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b610f386120f2565b73ffffffffffffffffffffffffffffffffffffffff16610f56611386565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390613e29565b60405180910390fd5b80600a9080519060200190610fc2929190612d99565b5050565b610fce6120f2565b73ffffffffffffffffffffffffffffffffffffffff16610fec611386565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990613e29565b60405180910390fd5b600061104c6115c3565b905060008111611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890613f69565b60405180910390fd5b6110a961109c611386565b6110a46115c3565b6125e1565b50565b6110c7838383604051806020016040528060008152506118b2565b505050565b60006110d66120f2565b73ffffffffffffffffffffffffffffffffffffffff166110f4611386565b73ffffffffffffffffffffffffffffffffffffffff161461114a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114190613e29565b60405180910390fd5b600b54608661115991906141b2565b905090565b600080600d541415611173576000905061118c565b6000600e541415611187576001905061118c565b600290505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f90613d89565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613d69565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113016120f2565b73ffffffffffffffffffffffffffffffffffffffff1661131f611386565b73ffffffffffffffffffffffffffffffffffffffff1614611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90613e29565b60405180910390fd5b61137f6000612692565b565b600581565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113bf906142d8565b80601f01602080910402602001604051908101604052809291908181526020018280546113eb906142d8565b80156114385780601f1061140d57610100808354040283529160200191611438565b820191906000526020600020905b81548152906001019060200180831161141b57829003601f168201915b5050505050905090565b61144a6120f2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613c89565b60405180910390fd5b80600560006114c56120f2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115726120f2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115b79190613b4c565b60405180910390a35050565b60006115cd6120f2565b73ffffffffffffffffffffffffffffffffffffffff166115eb611386565b73ffffffffffffffffffffffffffffffffffffffff1614611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163890613e29565b60405180910390fd5b47905090565b600061165161115e565b905060028081111561166657611665614441565b5b81600281111561167957611678614441565b5b146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090613da9565b60405180910390fd5b600b5460866116c891906141b2565b6009546116d591906141b2565b826008546116e391906140d1565b1115611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b90613ca9565b60405180910390fd5b600582600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461177191906140d1565b11156117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990613e89565b60405180910390fd5b816117bb611914565b6117c59190614158565b341015611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe90613ea9565b60405180910390fd5b60005b828110156118ad57600061181c612758565b905061182833826125c3565b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461187891906140d1565b9250508190555060016008600082825461189291906140d1565b925050819055505080806118a59061433b565b91505061180a565b505050565b6118c36118bd6120f2565b83612289565b611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990613f09565b60405180910390fd5b61190e84848484612785565b50505050565b60008061191f61115e565b90506000600281111561193557611934614441565b5b81600281111561194857611947614441565b5b148061197857506001600281111561196357611962614441565b5b81600281111561197657611975614441565b5b145b1561198e576702c68af0bb14000091505061199b565b670429d069189e00009150505b90565b60606119a982612164565b6119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90613e69565b60405180910390fd5b60006119f26127e1565b90506000815111611a125760405180602001604052806000815250611a3d565b80611a1c84612873565b604051602001611a2d929190613a7b565b6040516020818303038152906040525b915050919050565b828282611a5433848484610e32565b611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90613e09565b60405180910390fd5b6000611a9d61115e565b905060006002811115611ab357611ab2614441565b5b816002811115611ac657611ac5614441565b5b1415611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe90613f49565b60405180910390fd5b600280811115611b1a57611b19614441565b5b816002811115611b2d57611b2c614441565b5b1415611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6590613d49565b60405180910390fd5b600b546086611b7d91906141b2565b600954611b8a91906141b2565b88600854611b9891906140d1565b1115611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090613ca9565b60405180910390fd5b600588600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c2691906140d1565b1115611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90613e89565b60405180910390fd5b87611c70611914565b611c7a9190614158565b341015611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390613f29565b60405180910390fd5b60005b88811015611d62576000611cd1612758565b9050611cdd33826125c3565b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2d91906140d1565b92505081905550600160086000828254611d4791906140d1565b92505081905550508080611d5a9061433b565b915050611cbf565b505050505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e096120f2565b73ffffffffffffffffffffffffffffffffffffffff16611e27611386565b73ffffffffffffffffffffffffffffffffffffffff1614611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613e29565b60405180910390fd5b60006002811115611e9157611e90614441565b5b611e9961115e565b6002811115611eab57611eaa614441565b5b14611eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee290613d09565b60405180910390fd5b42600d81905550565b611efc6120f2565b73ffffffffffffffffffffffffffffffffffffffff16611f1a611386565b73ffffffffffffffffffffffffffffffffffffffff1614611f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6790613e29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd790613c09565b60405180910390fd5b611fe981612692565b50565b611ff46120f2565b73ffffffffffffffffffffffffffffffffffffffff16612012611386565b73ffffffffffffffffffffffffffffffffffffffff1614612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f90613e29565b60405180910390fd5b6001600281111561207c5761207b614441565b5b61208461115e565b600281111561209657612095614441565b5b146120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd90613ee9565b60405180910390fd5b42600e81905550565b600080823b905060008111915050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122438361118f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061229482612164565b6122d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ca90613cc9565b60405180910390fd5b60006122de8361118f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061234d57508373ffffffffffffffffffffffffffffffffffffffff1661233584610a40565b73ffffffffffffffffffffffffffffffffffffffff16145b8061235e575061235d8185611d6d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123878261118f565b73ffffffffffffffffffffffffffffffffffffffff16146123dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d490613e49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561244d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244490613c69565b60405180910390fd5b6124588383836129d4565b6124636000826121d0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124b391906141b2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461250a91906140d1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6125dd8282604051806020016040528060008152506129d9565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161260790613ad0565b60006040518083038185875af1925050503d8060008114612644576040519150601f19603f3d011682016040523d82523d6000602084013e612649565b606091505b505090508061268d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268490613c49565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600b546086612768610bdd565b61277291906140d1565b61277c91906141b2565b90508091505090565b612790848484612367565b61279c84848484612a34565b6127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d290613be9565b60405180910390fd5b50505050565b6060600a80546127f0906142d8565b80601f016020809104026020016040519081016040528092919081815260200182805461281c906142d8565b80156128695780601f1061283e57610100808354040283529160200191612869565b820191906000526020600020905b81548152906001019060200180831161284c57829003601f168201915b5050505050905090565b606060008214156128bb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129cf565b600082905060005b600082146128ed5780806128d69061433b565b915050600a826128e69190614127565b91506128c3565b60008167ffffffffffffffff811115612909576129086144ce565b5b6040519080825280601f01601f19166020018201604052801561293b5781602001600182028036833780820191505090505b5090505b600085146129c85760018261295491906141b2565b9150600a8561296391906143b2565b603061296f91906140d1565b60f81b8183815181106129855761298461449f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129c19190614127565b945061293f565b8093505050505b919050565b505050565b6129e38383612bcb565b6129f06000848484612a34565b612a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2690613be9565b60405180910390fd5b505050565b6000612a558473ffffffffffffffffffffffffffffffffffffffff166120df565b15612bbe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a7e6120f2565b8786866040518563ffffffff1660e01b8152600401612aa09493929190613b00565b602060405180830381600087803b158015612aba57600080fd5b505af1925050508015612aeb57506040513d601f19601f82011682018060405250810190612ae891906133ba565b60015b612b6e573d8060008114612b1b576040519150601f19603f3d011682016040523d82523d6000602084013e612b20565b606091505b50600081511415612b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5d90613be9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bc3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3290613dc9565b60405180910390fd5b612c4481612164565b15612c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7b90613c29565b60405180910390fd5b612c90600083836129d4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ce091906140d1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612da5906142d8565b90600052602060002090601f016020900481019282612dc75760008555612e0e565b82601f10612de057805160ff1916838001178555612e0e565b82800160010185558215612e0e579182015b82811115612e0d578251825591602001919060010190612df2565b5b509050612e1b9190612e1f565b5090565b5b80821115612e38576000816000905550600101612e20565b5090565b6000612e4f612e4a84613fc9565b613fa4565b90508083825260208201905082856020860282011115612e7257612e71614502565b5b60005b85811015612ea25781612e888882612fa0565b845260208401935060208301925050600181019050612e75565b5050509392505050565b6000612ebf612eba84613ff5565b613fa4565b90508083825260208201905082856020860282011115612ee257612ee1614502565b5b60005b85811015612f125781612ef888826130c1565b845260208401935060208301925050600181019050612ee5565b5050509392505050565b6000612f2f612f2a84614021565b613fa4565b905082815260208101848484011115612f4b57612f4a614507565b5b612f56848285614296565b509392505050565b6000612f71612f6c84614052565b613fa4565b905082815260208101848484011115612f8d57612f8c614507565b5b612f98848285614296565b509392505050565b600081359050612faf81614d3a565b92915050565b600082601f830112612fca57612fc96144fd565b5b8135612fda848260208601612e3c565b91505092915050565b600082601f830112612ff857612ff76144fd565b5b8135613008848260208601612eac565b91505092915050565b60008135905061302081614d51565b92915050565b60008135905061303581614d68565b92915050565b60008135905061304a81614d7f565b92915050565b60008151905061305f81614d7f565b92915050565b600082601f83011261307a576130796144fd565b5b813561308a848260208601612f1c565b91505092915050565b600082601f8301126130a8576130a76144fd565b5b81356130b8848260208601612f5e565b91505092915050565b6000813590506130d081614d96565b92915050565b6000813590506130e581614dad565b92915050565b60006020828403121561310157613100614511565b5b600061310f84828501612fa0565b91505092915050565b6000806040838503121561312f5761312e614511565b5b600061313d85828601612fa0565b925050602061314e85828601612fa0565b9150509250929050565b60008060006060848603121561317157613170614511565b5b600061317f86828701612fa0565b935050602061319086828701612fa0565b92505060406131a1868287016130c1565b9150509250925092565b600080600080608085870312156131c5576131c4614511565b5b60006131d387828801612fa0565b94505060206131e487828801612fa0565b93505060406131f5878288016130c1565b925050606085013567ffffffffffffffff8111156132165761321561450c565b5b61322287828801613065565b91505092959194509250565b6000806040838503121561324557613244614511565b5b600061325385828601612fa0565b925050602061326485828601613011565b9150509250929050565b6000806040838503121561328557613284614511565b5b600061329385828601612fa0565b92505060206132a4858286016130c1565b9150509250929050565b600080600080608085870312156132c8576132c7614511565b5b60006132d687828801612fa0565b94505060206132e7878288016130d6565b93505060406132f887828801613026565b925050606061330987828801613026565b91505092959194509250565b6000806040838503121561332c5761332b614511565b5b600083013567ffffffffffffffff81111561334a5761334961450c565b5b61335685828601612fe3565b925050602083013567ffffffffffffffff8111156133775761337661450c565b5b61338385828601612fb5565b9150509250929050565b6000602082840312156133a3576133a2614511565b5b60006133b18482850161303b565b91505092915050565b6000602082840312156133d0576133cf614511565b5b60006133de84828501613050565b91505092915050565b6000602082840312156133fd576133fc614511565b5b600082013567ffffffffffffffff81111561341b5761341a61450c565b5b61342784828501613093565b91505092915050565b60006020828403121561344657613445614511565b5b6000613454848285016130c1565b91505092915050565b6000806000806080858703121561347757613476614511565b5b6000613485878288016130c1565b9450506020613496878288016130d6565b93505060406134a787828801613026565b92505060606134b887828801613026565b91505092959194509250565b6134cd816141e6565b82525050565b6134e46134df826141e6565b614384565b82525050565b6134f3816141f8565b82525050565b61350281614204565b82525050565b61351961351482614204565b614396565b82525050565b600061352a82614083565b6135348185614099565b93506135448185602086016142a5565b61354d81614516565b840191505092915050565b61356181614284565b82525050565b60006135728261408e565b61357c81856140b5565b935061358c8185602086016142a5565b61359581614516565b840191505092915050565b60006135ab8261408e565b6135b581856140c6565b93506135c58185602086016142a5565b80840191505092915050565b60006135de601c836140c6565b91506135e982614534565b601c82019050919050565b60006136016032836140b5565b915061360c8261455d565b604082019050919050565b60006136246026836140b5565b915061362f826145ac565b604082019050919050565b6000613647601c836140b5565b9150613652826145fb565b602082019050919050565b600061366a6014836140b5565b915061367582614624565b602082019050919050565b600061368d6024836140b5565b91506136988261464d565b604082019050919050565b60006136b06019836140b5565b91506136bb8261469c565b602082019050919050565b60006136d3601e836140b5565b91506136de826146c5565b602082019050919050565b60006136f6602c836140b5565b9150613701826146ee565b604082019050919050565b60006137196026836140b5565b91506137248261473d565b604082019050919050565b600061373c6015836140b5565b91506137478261478c565b602082019050919050565b600061375f6038836140b5565b915061376a826147b5565b604082019050919050565b6000613782602a836140b5565b915061378d82614804565b604082019050919050565b60006137a5602a836140b5565b91506137b082614853565b604082019050919050565b60006137c86029836140b5565b91506137d3826148a2565b604082019050919050565b60006137eb601c836140b5565b91506137f6826148f1565b602082019050919050565b600061380e6020836140b5565b91506138198261491a565b602082019050919050565b6000613831602c836140b5565b915061383c82614943565b604082019050919050565b60006138546005836140c6565b915061385f82614992565b600582019050919050565b60006138776011836140b5565b9150613882826149bb565b602082019050919050565b600061389a6020836140b5565b91506138a5826149e4565b602082019050919050565b60006138bd6029836140b5565b91506138c882614a0d565b604082019050919050565b60006138e0602f836140b5565b91506138eb82614a5c565b604082019050919050565b60006139036024836140b5565b915061390e82614aab565b604082019050919050565b60006139266050836140b5565b915061393182614afa565b606082019050919050565b60006139496021836140b5565b915061395482614b6f565b604082019050919050565b600061396c6018836140b5565b915061397782614bbe565b602082019050919050565b600061398f6000836140aa565b915061399a82614be7565b600082019050919050565b60006139b26031836140b5565b91506139bd82614bea565b604082019050919050565b60006139d5604c836140b5565b91506139e082614c39565b606082019050919050565b60006139f86015836140b5565b9150613a0382614cae565b602082019050919050565b6000613a1b6022836140b5565b9150613a2682614cd7565b604082019050919050565b613a3a8161426d565b82525050565b613a4981614277565b82525050565b6000613a5b82856134d3565b601482019150613a6b82846134d3565b6014820191508190509392505050565b6000613a8782856135a0565b9150613a9382846135a0565b9150613a9e82613847565b91508190509392505050565b6000613ab5826135d1565b9150613ac18284613508565b60208201915081905092915050565b6000613adb82613982565b9150819050919050565b6000602082019050613afa60008301846134c4565b92915050565b6000608082019050613b1560008301876134c4565b613b2260208301866134c4565b613b2f6040830185613a31565b8181036060830152613b41818461351f565b905095945050505050565b6000602082019050613b6160008301846134ea565b92915050565b6000608082019050613b7c60008301876134f9565b613b896020830186613a40565b613b9660408301856134f9565b613ba360608301846134f9565b95945050505050565b6000602082019050613bc16000830184613558565b92915050565b60006020820190508181036000830152613be18184613567565b905092915050565b60006020820190508181036000830152613c02816135f4565b9050919050565b60006020820190508181036000830152613c2281613617565b9050919050565b60006020820190508181036000830152613c428161363a565b9050919050565b60006020820190508181036000830152613c628161365d565b9050919050565b60006020820190508181036000830152613c8281613680565b9050919050565b60006020820190508181036000830152613ca2816136a3565b9050919050565b60006020820190508181036000830152613cc2816136c6565b9050919050565b60006020820190508181036000830152613ce2816136e9565b9050919050565b60006020820190508181036000830152613d028161370c565b9050919050565b60006020820190508181036000830152613d228161372f565b9050919050565b60006020820190508181036000830152613d4281613752565b9050919050565b60006020820190508181036000830152613d6281613775565b9050919050565b60006020820190508181036000830152613d8281613798565b9050919050565b60006020820190508181036000830152613da2816137bb565b9050919050565b60006020820190508181036000830152613dc2816137de565b9050919050565b60006020820190508181036000830152613de281613801565b9050919050565b60006020820190508181036000830152613e0281613824565b9050919050565b60006020820190508181036000830152613e228161386a565b9050919050565b60006020820190508181036000830152613e428161388d565b9050919050565b60006020820190508181036000830152613e62816138b0565b9050919050565b60006020820190508181036000830152613e82816138d3565b9050919050565b60006020820190508181036000830152613ea2816138f6565b9050919050565b60006020820190508181036000830152613ec281613919565b9050919050565b60006020820190508181036000830152613ee28161393c565b9050919050565b60006020820190508181036000830152613f028161395f565b9050919050565b60006020820190508181036000830152613f22816139a5565b9050919050565b60006020820190508181036000830152613f42816139c8565b9050919050565b60006020820190508181036000830152613f62816139eb565b9050919050565b60006020820190508181036000830152613f8281613a0e565b9050919050565b6000602082019050613f9e6000830184613a31565b92915050565b6000613fae613fbf565b9050613fba828261430a565b919050565b6000604051905090565b600067ffffffffffffffff821115613fe457613fe36144ce565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156140105761400f6144ce565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561403c5761403b6144ce565b5b61404582614516565b9050602081019050919050565b600067ffffffffffffffff82111561406d5761406c6144ce565b5b61407682614516565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140dc8261426d565b91506140e78361426d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561411c5761411b6143e3565b5b828201905092915050565b60006141328261426d565b915061413d8361426d565b92508261414d5761414c614412565b5b828204905092915050565b60006141638261426d565b915061416e8361426d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141a7576141a66143e3565b5b828202905092915050565b60006141bd8261426d565b91506141c88361426d565b9250828210156141db576141da6143e3565b5b828203905092915050565b60006141f18261424d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061424882614d26565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061428f8261423a565b9050919050565b82818337600083830152505050565b60005b838110156142c35780820151818401526020810190506142a8565b838111156142d2576000848401525b50505050565b600060028204905060018216806142f057607f821691505b6020821081141561430457614303614470565b5b50919050565b61431382614516565b810181811067ffffffffffffffff82111715614332576143316144ce565b5b80604052505050565b60006143468261426d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614379576143786143e3565b5b600182019050919050565b600061438f826143a0565b9050919050565b6000819050919050565b60006143ab82614527565b9050919050565b60006143bd8261426d565b91506143c88361426d565b9250826143d8576143d7614412565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820496e697469616c204e465473206c65667420746f2060008201527f6d696e742e2e0000000000000000000000000000000000000000000000000000602082015250565b7f53616c6520697320616c7265616479204f70656e210000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178696d756d2035204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e332065746860208201527f657220666f722065616368204e46542900000000000000000000000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74204f70656e205075626c69632053616c65210000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e322065746860208201527f65722065616368204e4654290000000000000000000000000000000000000000604082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b60038110614d3757614d36614441565b5b50565b614d43816141e6565b8114614d4e57600080fd5b50565b614d5a816141f8565b8114614d6557600080fd5b50565b614d7181614204565b8114614d7c57600080fd5b50565b614d888161420e565b8114614d9357600080fd5b50565b614d9f8161426d565b8114614daa57600080fd5b50565b614db681614277565b8114614dc157600080fd5b5056fea2646970667358221220fc2531e0a0b594d2686f03b3bf1d2669921c81fdfbebb2432dd918b736790fe264736f6c63430008070033

Deployed Bytecode Sourcemap

34788:8396:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36604:8;;;42025:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22903:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23854:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41162:94;;;;;;;;;;;;;:::i;:::-;;25169:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24692:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42184:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26059:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40650:449;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35885:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38098:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36831:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41475:218;;;;;;;;;;;;;:::i;:::-;;26469:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42345:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42539:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23548:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23278:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;35994:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24023:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25462:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41306:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39451:780;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26725:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42885:291;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40243:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38463:929;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25828:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37151:170;;;;;;;;;;;;;:::i;:::-;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37329:180;;;;;;;;;;;;;:::i;:::-;;42025:87;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42098:6:::1;42090:5;;:14;;;;;;;;;;;;;;;;;;42025:87:::0;:::o;22903:305::-;23005:4;23057:25;23042:40;;;:11;:40;;;;:105;;;;23114:33;23099:48;;;:11;:48;;;;23042:105;:158;;;;23164:36;23188:11;23164:23;:36::i;:::-;23042:158;23022:178;;22903:305;;;:::o;23854:100::-;23908:13;23941:5;23934:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23854:100;:::o;41162:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41229:19:::1;;41212:14;:36;;;;41162:94::o:0;25169:221::-;25245:7;25273:16;25281:7;25273;:16::i;:::-;25265:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25358:15;:24;25374:7;25358:24;;;;;;;;;;;;;;;;;;;;;25351:31;;25169:221;;;:::o;24692:411::-;24773:13;24789:23;24804:7;24789:14;:23::i;:::-;24773:39;;24837:5;24831:11;;:2;:11;;;;24823:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24931:5;24915:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24940:37;24957:5;24964:12;:10;:12::i;:::-;24940:16;:37::i;:::-;24915:62;24893:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25074:21;25083:2;25087:7;25074:8;:21::i;:::-;24762:341;24692:411;;:::o;42184:94::-;42227:4;42251:19;;42244:26;;42184:94;:::o;26059:339::-;26254:41;26273:12;:10;:12::i;:::-;26287:7;26254:18;:41::i;:::-;26246:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26362:28;26372:4;26378:2;26382:7;26362:9;:28::i;:::-;26059:339;;;:::o;40650:449::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40794:3:::1;40775:8;:15;40760:12;;:30;;;;:::i;:::-;:37;;40752:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;40858:6;40853:225;40874:8;:15;40870:1;:19;40853:225;;;40911:37;40921:10;40932:1;40921:13;;;;;;;;:::i;:::-;;;;;;;;40936:8;40945:1;40936:11;;;;;;;;:::i;:::-;;;;;;;;40911:9;:37::i;:::-;40997:1;40963:15;:30;40979:10;40990:1;40979:13;;;;;;;;:::i;:::-;;;;;;;;40963:30;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;41036:1;41013:19;;:24;;;;;;;:::i;:::-;;;;;;;;41052:12;;:14;;;;;;;;;:::i;:::-;;;;;;40891:3;;;;;:::i;:::-;;;;40853:225;;;;40650:449:::0;;:::o;35885:50::-;;;;;;;;;;;;;;;;;:::o;38098:306::-;38197:4;38214:12;38264:4;38271;38239:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38229:48;;;;;;38214:63;;38304:92;38377:4;38324:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;38314:69;;;;;;38385:2;38389;38393;38304:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38295:101;;:5;;;;;;;;;;;:101;;;38288:108;;;38098:306;;;;;;:::o;36831:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36924:8:::1;36906:15;:26;;;;;;;;;;;;:::i;:::-;;36831:109:::0;:::o;41475:218::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41523:15:::1;41541:16;:14;:16::i;:::-;41523:34;;41586:1;41576:7;:11;41568:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41639:45;41657:7;:5;:7::i;:::-;41667:16;:14;:16::i;:::-;41639:9;:45::i;:::-;41512:181;41475:218::o:0;26469:185::-;26607:39;26624:4;26630:2;26634:7;26607:39;;;;;;;;;;;;:16;:39::i;:::-;26469:185;;;:::o;42345:108::-;42403:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42433:12:::1;;42427:3;:18;;;;:::i;:::-;42420:25;;42345:108:::0;:::o;42539:297::-;42580:5;42622:1;42601:17;;:22;42597:232;;;42647:12;42640:19;;;;42597:232;42714:1;42690:20;;:25;42686:143;;;42739:13;42732:20;;;;42686:143;42801:16;42794:23;;42539:297;;:::o;23548:239::-;23620:7;23640:13;23656:7;:16;23664:7;23656:16;;;;;;;;;;;;;;;;;;;;;23640:32;;23708:1;23691:19;;:5;:19;;;;23683:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23774:5;23767:12;;;23548:239;;;:::o;23278:208::-;23350:7;23395:1;23378:19;;:5;:19;;;;23370:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23462:9;:16;23472:5;23462:16;;;;;;;;;;;;;;;;23455:23;;23278:208;;;:::o;4591:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;35994:35::-;36028:1;35994:35;:::o;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;24023:104::-;24079:13;24112:7;24105:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24023:104;:::o;25462:295::-;25577:12;:10;:12::i;:::-;25565:24;;:8;:24;;;;25557:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25677:8;25632:18;:32;25651:12;:10;:12::i;:::-;25632:32;;;;;;;;;;;;;;;:42;25665:8;25632:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25730:8;25701:48;;25716:12;:10;:12::i;:::-;25701:48;;;25740:8;25701:48;;;;;;:::i;:::-;;;;;;;;25462:295;;:::o;41306:109::-;41362:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41386:21:::1;41379:28;;41306:109:::0;:::o;39451:780::-;39517:16;39536:11;:9;:11::i;:::-;39517:30;;39580:16;39566:30;;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;39558:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39704:12;;39698:3;:18;;;;:::i;:::-;39680:14;;:37;;;;:::i;:::-;39670:6;39648:19;;:28;;;;:::i;:::-;:69;;39640:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;36028:1;39801:6;39771:15;:27;39787:10;39771:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;39763:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;39904:6;39891:10;:8;:10::i;:::-;:19;;;;:::i;:::-;39878:9;:32;;39870:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;40015:9;40010:214;40034:6;40030:1;:10;40010:214;;;40062:11;40076:9;:7;:9::i;:::-;40062:23;;40100:26;40110:10;40122:3;40100:9;:26::i;:::-;40172:1;40141:15;:27;40157:10;40141:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;40211:1;40188:19;;:24;;;;;;;:::i;:::-;;;;;;;;40047:177;40042:3;;;;;:::i;:::-;;;;40010:214;;;;39506:725;39451:780;:::o;26725:328::-;26900:41;26919:12;:10;:12::i;:::-;26933:7;26900:18;:41::i;:::-;26892:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27006:39;27020:4;27026:2;27030:7;27039:5;27006:13;:39::i;:::-;26725:328;;;;:::o;42885:291::-;42925:4;42942:16;42961:11;:9;:11::i;:::-;42942:30;;43001:12;42987:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;:57;;;;43031:13;43017:27;;;;;;;;:::i;:::-;;:10;:27;;;;;;;;:::i;:::-;;;42987:57;42983:179;;;35303:9;43061:22;;;;;42983:179;35362:9;43125:25;;;42885:291;;:::o;40243:362::-;40317:13;40351:17;40359:8;40351:7;:17::i;:::-;40343:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;40437:21;40461:10;:8;:10::i;:::-;40437:34;;40513:1;40495:7;40489:21;:25;:96;;;;;;;;;;;;;;;;;40541:7;40550:19;:8;:17;:19::i;:::-;40524:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40489:96;40482:103;;;40243:362;;;:::o;38463:929::-;38550:2;38555;38559;37600:41;37621:10;37632:2;37635;37638;37600:20;:41::i;:::-;37591:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38589:16:::1;38608:11;:9;:11::i;:::-;38589:30;;38652:12;38638:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;38630:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;38723:16;38709:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;38701:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38861:12;;38855:3;:18;;;;:::i;:::-;38837:14;;:37;;;;:::i;:::-;38827:6;38805:19;;:28;;;;:::i;:::-;:69;;38797:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;36028:1;38958:6;38928:15;:27;38944:10;38928:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;38920:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;39061:6;39048:10;:8;:10::i;:::-;:19;;;;:::i;:::-;39035:9;:32;;39027:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;39174:9;39169:214;39193:6;39189:1;:10;39169:214;;;39221:11;39235:9;:7;:9::i;:::-;39221:23;;39259:26;39269:10;39281:3;39259:9;:26::i;:::-;39331:1;39300:15;:27;39316:10;39300:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;39370:1;39347:19;;:24;;;;;;;:::i;:::-;;;;;;;;39206:177;39201:3;;;;;:::i;:::-;;;;39169:214;;;;38578:814;38463:929:::0;;;;;;;:::o;25828:164::-;25925:4;25949:18;:25;25968:5;25949:25;;;;;;;;;;;;;;;:35;25975:8;25949:35;;;;;;;;;;;;;;;;;;;;;;;;;25942:42;;25828:164;;;;:::o;37151:170::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37229:12:::1;37214:27;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;;37206:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37298:15;37278:17;:35;;;;37151:170::o:0;4840:192::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:1:::1;4929:22;;:8;:22;;;;4921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;37329:180::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37410:13:::1;37395:28;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:28;;;;;;;;:::i;:::-;;;37387:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37486:15;37463:20;:38;;;;37329:180::o:0;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15926:157::-;16011:4;16050:25;16035:40;;;:11;:40;;;;16028:47;;15926:157;;;:::o;28563:127::-;28628:4;28680:1;28652:30;;:7;:16;28660:7;28652:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28645:37;;28563:127;;;:::o;32545:174::-;32647:2;32620:15;:24;32636:7;32620:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32703:7;32699:2;32665:46;;32674:23;32689:7;32674:14;:23::i;:::-;32665:46;;;;;;;;;;;;32545:174;;:::o;28857:348::-;28950:4;28975:16;28983:7;28975;:16::i;:::-;28967:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29051:13;29067:23;29082:7;29067:14;:23::i;:::-;29051:39;;29120:5;29109:16;;:7;:16;;;:51;;;;29153:7;29129:31;;:20;29141:7;29129:11;:20::i;:::-;:31;;;29109:51;:87;;;;29164:32;29181:5;29188:7;29164:16;:32::i;:::-;29109:87;29101:96;;;28857:348;;;;:::o;31849:578::-;32008:4;31981:31;;:23;31996:7;31981:14;:23::i;:::-;:31;;;31973:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32091:1;32077:16;;:2;:16;;;;32069:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32147:39;32168:4;32174:2;32178:7;32147:20;:39::i;:::-;32251:29;32268:1;32272:7;32251:8;:29::i;:::-;32312:1;32293:9;:15;32303:4;32293:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32341:1;32324:9;:13;32334:2;32324:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32372:2;32353:7;:16;32361:7;32353:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32411:7;32407:2;32392:27;;32401:4;32392:27;;;;;;;;;;;;31849:578;;;:::o;29547:110::-;29623:26;29633:2;29637:7;29623:26;;;;;;;;;;;;:9;:26::i;:::-;29547:110;;:::o;41768:183::-;41849:9;41864:7;:12;;41884:6;41864:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41848:47;;;41914:4;41906:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;41837:114;41768:183;;:::o;5040:173::-;5096:16;5115:6;;;;;;;;;;;5096:25;;5141:8;5132:6;;:17;;;;;;;;;;;;;;;;;;5196:8;5165:40;;5186:8;5165:40;;;;;;;;;;;;5085:128;5040:173;:::o;36996:147::-;37037:7;37057:14;37096:12;;37090:3;37074:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:34;;;;:::i;:::-;37057:51;;37126:9;37119:16;;;36996:147;:::o;27935:315::-;28092:28;28102:4;28108:2;28112:7;28092:9;:28::i;:::-;28139:48;28162:4;28168:2;28172:7;28181:5;28139:22;:48::i;:::-;28131:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27935:315;;;;:::o;36657:116::-;36717:13;36750:15;36743:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36657:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;34655:126::-;;;;:::o;29884:321::-;30014:18;30020:2;30024:7;30014:5;:18::i;:::-;30065:54;30096:1;30100:2;30104:7;30113:5;30065:22;:54::i;:::-;30043:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29884:321;;;:::o;33284:799::-;33439:4;33460:15;:2;:13;;;:15::i;:::-;33456:620;;;33512:2;33496:36;;;33533:12;:10;:12::i;:::-;33547:4;33553:7;33562:5;33496:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33492:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33755:1;33738:6;:13;:18;33734:272;;;33781:60;;;;;;;;;;:::i;:::-;;;;;;;;33734:272;33956:6;33950:13;33941:6;33937:2;33933:15;33926:38;33492:529;33629:41;;;33619:51;;;:6;:51;;;;33612:58;;;;;33456:620;34060:4;34053:11;;33284:799;;;;;;;:::o;30541:382::-;30635:1;30621:16;;:2;:16;;;;30613:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30694:16;30702:7;30694;:16::i;:::-;30693:17;30685:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30756:45;30785:1;30789:2;30793:7;30756:20;:45::i;:::-;30831:1;30814:9;:13;30824:2;30814:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30862:2;30843:7;:16;30851:7;30843:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30907:7;30903:2;30882:33;;30899:1;30882:33;;;;;;;;;;;;30541:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:139::-;3447:5;3485:6;3472:20;3463:29;;3501:33;3528:5;3501:33;:::i;:::-;3401:139;;;;:::o;3546:137::-;3591:5;3629:6;3616:20;3607:29;;3645:32;3671:5;3645:32;:::i;:::-;3546:137;;;;:::o;3689:141::-;3745:5;3776:6;3770:13;3761:22;;3792:32;3818:5;3792:32;:::i;:::-;3689:141;;;;:::o;3849:338::-;3904:5;3953:3;3946:4;3938:6;3934:17;3930:27;3920:122;;3961:79;;:::i;:::-;3920:122;4078:6;4065:20;4103:78;4177:3;4169:6;4162:4;4154:6;4150:17;4103:78;:::i;:::-;4094:87;;3910:277;3849:338;;;;:::o;4207:340::-;4263:5;4312:3;4305:4;4297:6;4293:17;4289:27;4279:122;;4320:79;;:::i;:::-;4279:122;4437:6;4424:20;4462:79;4537:3;4529:6;4522:4;4514:6;4510:17;4462:79;:::i;:::-;4453:88;;4269:278;4207:340;;;;:::o;4553:139::-;4599:5;4637:6;4624:20;4615:29;;4653:33;4680:5;4653:33;:::i;:::-;4553:139;;;;:::o;4698:135::-;4742:5;4780:6;4767:20;4758:29;;4796:31;4821:5;4796:31;:::i;:::-;4698:135;;;;:::o;4839:329::-;4898:6;4947:2;4935:9;4926:7;4922:23;4918:32;4915:119;;;4953:79;;:::i;:::-;4915:119;5073:1;5098:53;5143:7;5134:6;5123:9;5119:22;5098:53;:::i;:::-;5088:63;;5044:117;4839:329;;;;:::o;5174:474::-;5242:6;5250;5299:2;5287:9;5278:7;5274:23;5270:32;5267:119;;;5305:79;;:::i;:::-;5267:119;5425:1;5450:53;5495:7;5486:6;5475:9;5471:22;5450:53;:::i;:::-;5440:63;;5396:117;5552:2;5578:53;5623:7;5614:6;5603:9;5599:22;5578:53;:::i;:::-;5568:63;;5523:118;5174:474;;;;;:::o;5654:619::-;5731:6;5739;5747;5796:2;5784:9;5775:7;5771:23;5767:32;5764:119;;;5802:79;;:::i;:::-;5764:119;5922:1;5947:53;5992:7;5983:6;5972:9;5968:22;5947:53;:::i;:::-;5937:63;;5893:117;6049:2;6075:53;6120:7;6111:6;6100:9;6096:22;6075:53;:::i;:::-;6065:63;;6020:118;6177:2;6203:53;6248:7;6239:6;6228:9;6224:22;6203:53;:::i;:::-;6193:63;;6148:118;5654:619;;;;;:::o;6279:943::-;6374:6;6382;6390;6398;6447:3;6435:9;6426:7;6422:23;6418:33;6415:120;;;6454:79;;:::i;:::-;6415:120;6574:1;6599:53;6644:7;6635:6;6624:9;6620:22;6599:53;:::i;:::-;6589:63;;6545:117;6701:2;6727:53;6772:7;6763:6;6752:9;6748:22;6727:53;:::i;:::-;6717:63;;6672:118;6829:2;6855:53;6900:7;6891:6;6880:9;6876:22;6855:53;:::i;:::-;6845:63;;6800:118;6985:2;6974:9;6970:18;6957:32;7016:18;7008:6;7005:30;7002:117;;;7038:79;;:::i;:::-;7002:117;7143:62;7197:7;7188:6;7177:9;7173:22;7143:62;:::i;:::-;7133:72;;6928:287;6279:943;;;;;;;:::o;7228:468::-;7293:6;7301;7350:2;7338:9;7329:7;7325:23;7321:32;7318:119;;;7356:79;;:::i;:::-;7318:119;7476:1;7501:53;7546:7;7537:6;7526:9;7522:22;7501:53;:::i;:::-;7491:63;;7447:117;7603:2;7629:50;7671:7;7662:6;7651:9;7647:22;7629:50;:::i;:::-;7619:60;;7574:115;7228:468;;;;;:::o;7702:474::-;7770:6;7778;7827:2;7815:9;7806:7;7802:23;7798:32;7795:119;;;7833:79;;:::i;:::-;7795:119;7953:1;7978:53;8023:7;8014:6;8003:9;7999:22;7978:53;:::i;:::-;7968:63;;7924:117;8080:2;8106:53;8151:7;8142:6;8131:9;8127:22;8106:53;:::i;:::-;8096:63;;8051:118;7702:474;;;;;:::o;8182:761::-;8266:6;8274;8282;8290;8339:3;8327:9;8318:7;8314:23;8310:33;8307:120;;;8346:79;;:::i;:::-;8307:120;8466:1;8491:53;8536:7;8527:6;8516:9;8512:22;8491:53;:::i;:::-;8481:63;;8437:117;8593:2;8619:51;8662:7;8653:6;8642:9;8638:22;8619:51;:::i;:::-;8609:61;;8564:116;8719:2;8745:53;8790:7;8781:6;8770:9;8766:22;8745:53;:::i;:::-;8735:63;;8690:118;8847:2;8873:53;8918:7;8909:6;8898:9;8894:22;8873:53;:::i;:::-;8863:63;;8818:118;8182:761;;;;;;;:::o;8949:894::-;9067:6;9075;9124:2;9112:9;9103:7;9099:23;9095:32;9092:119;;;9130:79;;:::i;:::-;9092:119;9278:1;9267:9;9263:17;9250:31;9308:18;9300:6;9297:30;9294:117;;;9330:79;;:::i;:::-;9294:117;9435:78;9505:7;9496:6;9485:9;9481:22;9435:78;:::i;:::-;9425:88;;9221:302;9590:2;9579:9;9575:18;9562:32;9621:18;9613:6;9610:30;9607:117;;;9643:79;;:::i;:::-;9607:117;9748:78;9818:7;9809:6;9798:9;9794:22;9748:78;:::i;:::-;9738:88;;9533:303;8949:894;;;;;:::o;9849:327::-;9907:6;9956:2;9944:9;9935:7;9931:23;9927:32;9924:119;;;9962:79;;:::i;:::-;9924:119;10082:1;10107:52;10151:7;10142:6;10131:9;10127:22;10107:52;:::i;:::-;10097:62;;10053:116;9849:327;;;;:::o;10182:349::-;10251:6;10300:2;10288:9;10279:7;10275:23;10271:32;10268:119;;;10306:79;;:::i;:::-;10268:119;10426:1;10451:63;10506:7;10497:6;10486:9;10482:22;10451:63;:::i;:::-;10441:73;;10397:127;10182:349;;;;:::o;10537:509::-;10606:6;10655:2;10643:9;10634:7;10630:23;10626:32;10623:119;;;10661:79;;:::i;:::-;10623:119;10809:1;10798:9;10794:17;10781:31;10839:18;10831:6;10828:30;10825:117;;;10861:79;;:::i;:::-;10825:117;10966:63;11021:7;11012:6;11001:9;10997:22;10966:63;:::i;:::-;10956:73;;10752:287;10537:509;;;;:::o;11052:329::-;11111:6;11160:2;11148:9;11139:7;11135:23;11131:32;11128:119;;;11166:79;;:::i;:::-;11128:119;11286:1;11311:53;11356:7;11347:6;11336:9;11332:22;11311:53;:::i;:::-;11301:63;;11257:117;11052:329;;;;:::o;11387:761::-;11471:6;11479;11487;11495;11544:3;11532:9;11523:7;11519:23;11515:33;11512:120;;;11551:79;;:::i;:::-;11512:120;11671:1;11696:53;11741:7;11732:6;11721:9;11717:22;11696:53;:::i;:::-;11686:63;;11642:117;11798:2;11824:51;11867:7;11858:6;11847:9;11843:22;11824:51;:::i;:::-;11814:61;;11769:116;11924:2;11950:53;11995:7;11986:6;11975:9;11971:22;11950:53;:::i;:::-;11940:63;;11895:118;12052:2;12078:53;12123:7;12114:6;12103:9;12099:22;12078:53;:::i;:::-;12068:63;;12023:118;11387:761;;;;;;;:::o;12154:118::-;12241:24;12259:5;12241:24;:::i;:::-;12236:3;12229:37;12154:118;;:::o;12278:157::-;12383:45;12403:24;12421:5;12403:24;:::i;:::-;12383:45;:::i;:::-;12378:3;12371:58;12278:157;;:::o;12441:109::-;12522:21;12537:5;12522:21;:::i;:::-;12517:3;12510:34;12441:109;;:::o;12556:118::-;12643:24;12661:5;12643:24;:::i;:::-;12638:3;12631:37;12556:118;;:::o;12680:157::-;12785:45;12805:24;12823:5;12805:24;:::i;:::-;12785:45;:::i;:::-;12780:3;12773:58;12680:157;;:::o;12843:360::-;12929:3;12957:38;12989:5;12957:38;:::i;:::-;13011:70;13074:6;13069:3;13011:70;:::i;:::-;13004:77;;13090:52;13135:6;13130:3;13123:4;13116:5;13112:16;13090:52;:::i;:::-;13167:29;13189:6;13167:29;:::i;:::-;13162:3;13158:39;13151:46;;12933:270;12843:360;;;;:::o;13209:147::-;13304:45;13343:5;13304:45;:::i;:::-;13299:3;13292:58;13209:147;;:::o;13362:364::-;13450:3;13478:39;13511:5;13478:39;:::i;:::-;13533:71;13597:6;13592:3;13533:71;:::i;:::-;13526:78;;13613:52;13658:6;13653:3;13646:4;13639:5;13635:16;13613:52;:::i;:::-;13690:29;13712:6;13690:29;:::i;:::-;13685:3;13681:39;13674:46;;13454:272;13362:364;;;;:::o;13732:377::-;13838:3;13866:39;13899:5;13866:39;:::i;:::-;13921:89;14003:6;13998:3;13921:89;:::i;:::-;13914:96;;14019:52;14064:6;14059:3;14052:4;14045:5;14041:16;14019:52;:::i;:::-;14096:6;14091:3;14087:16;14080:23;;13842:267;13732:377;;;;:::o;14115:402::-;14275:3;14296:85;14378:2;14373:3;14296:85;:::i;:::-;14289:92;;14390:93;14479:3;14390:93;:::i;:::-;14508:2;14503:3;14499:12;14492:19;;14115:402;;;:::o;14523:366::-;14665:3;14686:67;14750:2;14745:3;14686:67;:::i;:::-;14679:74;;14762:93;14851:3;14762:93;:::i;:::-;14880:2;14875:3;14871:12;14864:19;;14523:366;;;:::o;14895:::-;15037:3;15058:67;15122:2;15117:3;15058:67;:::i;:::-;15051:74;;15134:93;15223:3;15134:93;:::i;:::-;15252:2;15247:3;15243:12;15236:19;;14895:366;;;:::o;15267:::-;15409:3;15430:67;15494:2;15489:3;15430:67;:::i;:::-;15423:74;;15506:93;15595:3;15506:93;:::i;:::-;15624:2;15619:3;15615:12;15608:19;;15267:366;;;:::o;15639:::-;15781:3;15802:67;15866:2;15861:3;15802:67;:::i;:::-;15795:74;;15878:93;15967:3;15878:93;:::i;:::-;15996:2;15991:3;15987:12;15980:19;;15639:366;;;:::o;16011:::-;16153:3;16174:67;16238:2;16233:3;16174:67;:::i;:::-;16167:74;;16250:93;16339:3;16250:93;:::i;:::-;16368:2;16363:3;16359:12;16352:19;;16011:366;;;:::o;16383:::-;16525:3;16546:67;16610:2;16605:3;16546:67;:::i;:::-;16539:74;;16622:93;16711:3;16622:93;:::i;:::-;16740:2;16735:3;16731:12;16724:19;;16383:366;;;:::o;16755:::-;16897:3;16918:67;16982:2;16977:3;16918:67;:::i;:::-;16911:74;;16994:93;17083:3;16994:93;:::i;:::-;17112:2;17107:3;17103:12;17096:19;;16755:366;;;:::o;17127:::-;17269:3;17290:67;17354:2;17349:3;17290:67;:::i;:::-;17283:74;;17366:93;17455:3;17366:93;:::i;:::-;17484:2;17479:3;17475:12;17468:19;;17127:366;;;:::o;17499:::-;17641:3;17662:67;17726:2;17721:3;17662:67;:::i;:::-;17655:74;;17738:93;17827:3;17738:93;:::i;:::-;17856:2;17851:3;17847:12;17840:19;;17499:366;;;:::o;17871:::-;18013:3;18034:67;18098:2;18093:3;18034:67;:::i;:::-;18027:74;;18110:93;18199:3;18110:93;:::i;:::-;18228:2;18223:3;18219:12;18212:19;;17871:366;;;:::o;18243:::-;18385:3;18406:67;18470:2;18465:3;18406:67;:::i;:::-;18399:74;;18482:93;18571:3;18482:93;:::i;:::-;18600:2;18595:3;18591:12;18584:19;;18243:366;;;:::o;18615:::-;18757:3;18778:67;18842:2;18837:3;18778:67;:::i;:::-;18771:74;;18854:93;18943:3;18854:93;:::i;:::-;18972:2;18967:3;18963:12;18956:19;;18615:366;;;:::o;18987:::-;19129:3;19150:67;19214:2;19209:3;19150:67;:::i;:::-;19143:74;;19226:93;19315:3;19226:93;:::i;:::-;19344:2;19339:3;19335:12;19328:19;;18987:366;;;:::o;19359:::-;19501:3;19522:67;19586:2;19581:3;19522:67;:::i;:::-;19515:74;;19598:93;19687:3;19598:93;:::i;:::-;19716:2;19711:3;19707:12;19700:19;;19359:366;;;:::o;19731:::-;19873:3;19894:67;19958:2;19953:3;19894:67;:::i;:::-;19887:74;;19970:93;20059:3;19970:93;:::i;:::-;20088:2;20083:3;20079:12;20072:19;;19731:366;;;:::o;20103:::-;20245:3;20266:67;20330:2;20325:3;20266:67;:::i;:::-;20259:74;;20342:93;20431:3;20342:93;:::i;:::-;20460:2;20455:3;20451:12;20444:19;;20103:366;;;:::o;20475:::-;20617:3;20638:67;20702:2;20697:3;20638:67;:::i;:::-;20631:74;;20714:93;20803:3;20714:93;:::i;:::-;20832:2;20827:3;20823:12;20816:19;;20475:366;;;:::o;20847:400::-;21007:3;21028:84;21110:1;21105:3;21028:84;:::i;:::-;21021:91;;21121:93;21210:3;21121:93;:::i;:::-;21239:1;21234:3;21230:11;21223:18;;20847:400;;;:::o;21253:366::-;21395:3;21416:67;21480:2;21475:3;21416:67;:::i;:::-;21409:74;;21492:93;21581:3;21492:93;:::i;:::-;21610:2;21605:3;21601:12;21594:19;;21253:366;;;:::o;21625:::-;21767:3;21788:67;21852:2;21847:3;21788:67;:::i;:::-;21781:74;;21864:93;21953:3;21864:93;:::i;:::-;21982:2;21977:3;21973:12;21966:19;;21625:366;;;:::o;21997:::-;22139:3;22160:67;22224:2;22219:3;22160:67;:::i;:::-;22153:74;;22236:93;22325:3;22236:93;:::i;:::-;22354:2;22349:3;22345:12;22338:19;;21997:366;;;:::o;22369:::-;22511:3;22532:67;22596:2;22591:3;22532:67;:::i;:::-;22525:74;;22608:93;22697:3;22608:93;:::i;:::-;22726:2;22721:3;22717:12;22710:19;;22369:366;;;:::o;22741:::-;22883:3;22904:67;22968:2;22963:3;22904:67;:::i;:::-;22897:74;;22980:93;23069:3;22980:93;:::i;:::-;23098:2;23093:3;23089:12;23082:19;;22741:366;;;:::o;23113:::-;23255:3;23276:67;23340:2;23335:3;23276:67;:::i;:::-;23269:74;;23352:93;23441:3;23352:93;:::i;:::-;23470:2;23465:3;23461:12;23454:19;;23113:366;;;:::o;23485:::-;23627:3;23648:67;23712:2;23707:3;23648:67;:::i;:::-;23641:74;;23724:93;23813:3;23724:93;:::i;:::-;23842:2;23837:3;23833:12;23826:19;;23485:366;;;:::o;23857:::-;23999:3;24020:67;24084:2;24079:3;24020:67;:::i;:::-;24013:74;;24096:93;24185:3;24096:93;:::i;:::-;24214:2;24209:3;24205:12;24198:19;;23857:366;;;:::o;24229:398::-;24388:3;24409:83;24490:1;24485:3;24409:83;:::i;:::-;24402:90;;24501:93;24590:3;24501:93;:::i;:::-;24619:1;24614:3;24610:11;24603:18;;24229:398;;;:::o;24633:366::-;24775:3;24796:67;24860:2;24855:3;24796:67;:::i;:::-;24789:74;;24872:93;24961:3;24872:93;:::i;:::-;24990:2;24985:3;24981:12;24974:19;;24633:366;;;:::o;25005:::-;25147:3;25168:67;25232:2;25227:3;25168:67;:::i;:::-;25161:74;;25244:93;25333:3;25244:93;:::i;:::-;25362:2;25357:3;25353:12;25346:19;;25005:366;;;:::o;25377:::-;25519:3;25540:67;25604:2;25599:3;25540:67;:::i;:::-;25533:74;;25616:93;25705:3;25616:93;:::i;:::-;25734:2;25729:3;25725:12;25718:19;;25377:366;;;:::o;25749:::-;25891:3;25912:67;25976:2;25971:3;25912:67;:::i;:::-;25905:74;;25988:93;26077:3;25988:93;:::i;:::-;26106:2;26101:3;26097:12;26090:19;;25749:366;;;:::o;26121:118::-;26208:24;26226:5;26208:24;:::i;:::-;26203:3;26196:37;26121:118;;:::o;26245:112::-;26328:22;26344:5;26328:22;:::i;:::-;26323:3;26316:35;26245:112;;:::o;26363:397::-;26503:3;26518:75;26589:3;26580:6;26518:75;:::i;:::-;26618:2;26613:3;26609:12;26602:19;;26631:75;26702:3;26693:6;26631:75;:::i;:::-;26731:2;26726:3;26722:12;26715:19;;26751:3;26744:10;;26363:397;;;;;:::o;26766:701::-;27047:3;27069:95;27160:3;27151:6;27069:95;:::i;:::-;27062:102;;27181:95;27272:3;27263:6;27181:95;:::i;:::-;27174:102;;27293:148;27437:3;27293:148;:::i;:::-;27286:155;;27458:3;27451:10;;26766:701;;;;;:::o;27473:522::-;27686:3;27708:148;27852:3;27708:148;:::i;:::-;27701:155;;27866:75;27937:3;27928:6;27866:75;:::i;:::-;27966:2;27961:3;27957:12;27950:19;;27986:3;27979:10;;27473:522;;;;:::o;28001:379::-;28185:3;28207:147;28350:3;28207:147;:::i;:::-;28200:154;;28371:3;28364:10;;28001:379;;;:::o;28386:222::-;28479:4;28517:2;28506:9;28502:18;28494:26;;28530:71;28598:1;28587:9;28583:17;28574:6;28530:71;:::i;:::-;28386:222;;;;:::o;28614:640::-;28809:4;28847:3;28836:9;28832:19;28824:27;;28861:71;28929:1;28918:9;28914:17;28905:6;28861:71;:::i;:::-;28942:72;29010:2;28999:9;28995:18;28986:6;28942:72;:::i;:::-;29024;29092:2;29081:9;29077:18;29068:6;29024:72;:::i;:::-;29143:9;29137:4;29133:20;29128:2;29117:9;29113:18;29106:48;29171:76;29242:4;29233:6;29171:76;:::i;:::-;29163:84;;28614:640;;;;;;;:::o;29260:210::-;29347:4;29385:2;29374:9;29370:18;29362:26;;29398:65;29460:1;29449:9;29445:17;29436:6;29398:65;:::i;:::-;29260:210;;;;:::o;29476:545::-;29649:4;29687:3;29676:9;29672:19;29664:27;;29701:71;29769:1;29758:9;29754:17;29745:6;29701:71;:::i;:::-;29782:68;29846:2;29835:9;29831:18;29822:6;29782:68;:::i;:::-;29860:72;29928:2;29917:9;29913:18;29904:6;29860:72;:::i;:::-;29942;30010:2;29999:9;29995:18;29986:6;29942:72;:::i;:::-;29476:545;;;;;;;:::o;30027:238::-;30128:4;30166:2;30155:9;30151:18;30143:26;;30179:79;30255:1;30244:9;30240:17;30231:6;30179:79;:::i;:::-;30027:238;;;;:::o;30271:313::-;30384:4;30422:2;30411:9;30407:18;30399:26;;30471:9;30465:4;30461:20;30457:1;30446:9;30442:17;30435:47;30499:78;30572:4;30563:6;30499:78;:::i;:::-;30491:86;;30271:313;;;;:::o;30590:419::-;30756:4;30794:2;30783:9;30779:18;30771:26;;30843:9;30837:4;30833:20;30829:1;30818:9;30814:17;30807:47;30871:131;30997:4;30871:131;:::i;:::-;30863:139;;30590:419;;;:::o;31015:::-;31181:4;31219:2;31208:9;31204:18;31196:26;;31268:9;31262:4;31258:20;31254:1;31243:9;31239:17;31232:47;31296:131;31422:4;31296:131;:::i;:::-;31288:139;;31015:419;;;:::o;31440:::-;31606:4;31644:2;31633:9;31629:18;31621:26;;31693:9;31687:4;31683:20;31679:1;31668:9;31664:17;31657:47;31721:131;31847:4;31721:131;:::i;:::-;31713:139;;31440:419;;;:::o;31865:::-;32031:4;32069:2;32058:9;32054:18;32046:26;;32118:9;32112:4;32108:20;32104:1;32093:9;32089:17;32082:47;32146:131;32272:4;32146:131;:::i;:::-;32138:139;;31865:419;;;:::o;32290:::-;32456:4;32494:2;32483:9;32479:18;32471:26;;32543:9;32537:4;32533:20;32529:1;32518:9;32514:17;32507:47;32571:131;32697:4;32571:131;:::i;:::-;32563:139;;32290:419;;;:::o;32715:::-;32881:4;32919:2;32908:9;32904:18;32896:26;;32968:9;32962:4;32958:20;32954:1;32943:9;32939:17;32932:47;32996:131;33122:4;32996:131;:::i;:::-;32988:139;;32715:419;;;:::o;33140:::-;33306:4;33344:2;33333:9;33329:18;33321:26;;33393:9;33387:4;33383:20;33379:1;33368:9;33364:17;33357:47;33421:131;33547:4;33421:131;:::i;:::-;33413:139;;33140:419;;;:::o;33565:::-;33731:4;33769:2;33758:9;33754:18;33746:26;;33818:9;33812:4;33808:20;33804:1;33793:9;33789:17;33782:47;33846:131;33972:4;33846:131;:::i;:::-;33838:139;;33565:419;;;:::o;33990:::-;34156:4;34194:2;34183:9;34179:18;34171:26;;34243:9;34237:4;34233:20;34229:1;34218:9;34214:17;34207:47;34271:131;34397:4;34271:131;:::i;:::-;34263:139;;33990:419;;;:::o;34415:::-;34581:4;34619:2;34608:9;34604:18;34596:26;;34668:9;34662:4;34658:20;34654:1;34643:9;34639:17;34632:47;34696:131;34822:4;34696:131;:::i;:::-;34688:139;;34415:419;;;:::o;34840:::-;35006:4;35044:2;35033:9;35029:18;35021:26;;35093:9;35087:4;35083:20;35079:1;35068:9;35064:17;35057:47;35121:131;35247:4;35121:131;:::i;:::-;35113:139;;34840:419;;;:::o;35265:::-;35431:4;35469:2;35458:9;35454:18;35446:26;;35518:9;35512:4;35508:20;35504:1;35493:9;35489:17;35482:47;35546:131;35672:4;35546:131;:::i;:::-;35538:139;;35265:419;;;:::o;35690:::-;35856:4;35894:2;35883:9;35879:18;35871:26;;35943:9;35937:4;35933:20;35929:1;35918:9;35914:17;35907:47;35971:131;36097:4;35971:131;:::i;:::-;35963:139;;35690:419;;;:::o;36115:::-;36281:4;36319:2;36308:9;36304:18;36296:26;;36368:9;36362:4;36358:20;36354:1;36343:9;36339:17;36332:47;36396:131;36522:4;36396:131;:::i;:::-;36388:139;;36115:419;;;:::o;36540:::-;36706:4;36744:2;36733:9;36729:18;36721:26;;36793:9;36787:4;36783:20;36779:1;36768:9;36764:17;36757:47;36821:131;36947:4;36821:131;:::i;:::-;36813:139;;36540:419;;;:::o;36965:::-;37131:4;37169:2;37158:9;37154:18;37146:26;;37218:9;37212:4;37208:20;37204:1;37193:9;37189:17;37182:47;37246:131;37372:4;37246:131;:::i;:::-;37238:139;;36965:419;;;:::o;37390:::-;37556:4;37594:2;37583:9;37579:18;37571:26;;37643:9;37637:4;37633:20;37629:1;37618:9;37614:17;37607:47;37671:131;37797:4;37671:131;:::i;:::-;37663:139;;37390:419;;;:::o;37815:::-;37981:4;38019:2;38008:9;38004:18;37996:26;;38068:9;38062:4;38058:20;38054:1;38043:9;38039:17;38032:47;38096:131;38222:4;38096:131;:::i;:::-;38088:139;;37815:419;;;:::o;38240:::-;38406:4;38444:2;38433:9;38429:18;38421:26;;38493:9;38487:4;38483:20;38479:1;38468:9;38464:17;38457:47;38521:131;38647:4;38521:131;:::i;:::-;38513:139;;38240:419;;;:::o;38665:::-;38831:4;38869:2;38858:9;38854:18;38846:26;;38918:9;38912:4;38908:20;38904:1;38893:9;38889:17;38882:47;38946:131;39072:4;38946:131;:::i;:::-;38938:139;;38665:419;;;:::o;39090:::-;39256:4;39294:2;39283:9;39279:18;39271:26;;39343:9;39337:4;39333:20;39329:1;39318:9;39314:17;39307:47;39371:131;39497:4;39371:131;:::i;:::-;39363:139;;39090:419;;;:::o;39515:::-;39681:4;39719:2;39708:9;39704:18;39696:26;;39768:9;39762:4;39758:20;39754:1;39743:9;39739:17;39732:47;39796:131;39922:4;39796:131;:::i;:::-;39788:139;;39515:419;;;:::o;39940:::-;40106:4;40144:2;40133:9;40129:18;40121:26;;40193:9;40187:4;40183:20;40179:1;40168:9;40164:17;40157:47;40221:131;40347:4;40221:131;:::i;:::-;40213:139;;39940:419;;;:::o;40365:::-;40531:4;40569:2;40558:9;40554:18;40546:26;;40618:9;40612:4;40608:20;40604:1;40593:9;40589:17;40582:47;40646:131;40772:4;40646:131;:::i;:::-;40638:139;;40365:419;;;:::o;40790:::-;40956:4;40994:2;40983:9;40979:18;40971:26;;41043:9;41037:4;41033:20;41029:1;41018:9;41014:17;41007:47;41071:131;41197:4;41071:131;:::i;:::-;41063:139;;40790:419;;;:::o;41215:::-;41381:4;41419:2;41408:9;41404:18;41396:26;;41468:9;41462:4;41458:20;41454:1;41443:9;41439:17;41432:47;41496:131;41622:4;41496:131;:::i;:::-;41488:139;;41215:419;;;:::o;41640:::-;41806:4;41844:2;41833:9;41829:18;41821:26;;41893:9;41887:4;41883:20;41879:1;41868:9;41864:17;41857:47;41921:131;42047:4;41921:131;:::i;:::-;41913:139;;41640:419;;;:::o;42065:::-;42231:4;42269:2;42258:9;42254:18;42246:26;;42318:9;42312:4;42308:20;42304:1;42293:9;42289:17;42282:47;42346:131;42472:4;42346:131;:::i;:::-;42338:139;;42065:419;;;:::o;42490:::-;42656:4;42694:2;42683:9;42679:18;42671:26;;42743:9;42737:4;42733:20;42729:1;42718:9;42714:17;42707:47;42771:131;42897:4;42771:131;:::i;:::-;42763:139;;42490:419;;;:::o;42915:222::-;43008:4;43046:2;43035:9;43031:18;43023:26;;43059:71;43127:1;43116:9;43112:17;43103:6;43059:71;:::i;:::-;42915:222;;;;:::o;43143:129::-;43177:6;43204:20;;:::i;:::-;43194:30;;43233:33;43261:4;43253:6;43233:33;:::i;:::-;43143:129;;;:::o;43278:75::-;43311:6;43344:2;43338:9;43328:19;;43278:75;:::o;43359:311::-;43436:4;43526:18;43518:6;43515:30;43512:56;;;43548:18;;:::i;:::-;43512:56;43598:4;43590:6;43586:17;43578:25;;43658:4;43652;43648:15;43640:23;;43359:311;;;:::o;43676:::-;43753:4;43843:18;43835:6;43832:30;43829:56;;;43865:18;;:::i;:::-;43829:56;43915:4;43907:6;43903:17;43895:25;;43975:4;43969;43965:15;43957:23;;43676:311;;;:::o;43993:307::-;44054:4;44144:18;44136:6;44133:30;44130:56;;;44166:18;;:::i;:::-;44130:56;44204:29;44226:6;44204:29;:::i;:::-;44196:37;;44288:4;44282;44278:15;44270:23;;43993:307;;;:::o;44306:308::-;44368:4;44458:18;44450:6;44447:30;44444:56;;;44480:18;;:::i;:::-;44444:56;44518:29;44540:6;44518:29;:::i;:::-;44510:37;;44602:4;44596;44592:15;44584:23;;44306:308;;;:::o;44620:98::-;44671:6;44705:5;44699:12;44689:22;;44620:98;;;:::o;44724:99::-;44776:6;44810:5;44804:12;44794:22;;44724:99;;;:::o;44829:168::-;44912:11;44946:6;44941:3;44934:19;44986:4;44981:3;44977:14;44962:29;;44829:168;;;;:::o;45003:147::-;45104:11;45141:3;45126:18;;45003:147;;;;:::o;45156:169::-;45240:11;45274:6;45269:3;45262:19;45314:4;45309:3;45305:14;45290:29;;45156:169;;;;:::o;45331:148::-;45433:11;45470:3;45455:18;;45331:148;;;;:::o;45485:305::-;45525:3;45544:20;45562:1;45544:20;:::i;:::-;45539:25;;45578:20;45596:1;45578:20;:::i;:::-;45573:25;;45732:1;45664:66;45660:74;45657:1;45654:81;45651:107;;;45738:18;;:::i;:::-;45651:107;45782:1;45779;45775:9;45768:16;;45485:305;;;;:::o;45796:185::-;45836:1;45853:20;45871:1;45853:20;:::i;:::-;45848:25;;45887:20;45905:1;45887:20;:::i;:::-;45882:25;;45926:1;45916:35;;45931:18;;:::i;:::-;45916:35;45973:1;45970;45966:9;45961:14;;45796:185;;;;:::o;45987:348::-;46027:7;46050:20;46068:1;46050:20;:::i;:::-;46045:25;;46084:20;46102:1;46084:20;:::i;:::-;46079:25;;46272:1;46204:66;46200:74;46197:1;46194:81;46189:1;46182:9;46175:17;46171:105;46168:131;;;46279:18;;:::i;:::-;46168:131;46327:1;46324;46320:9;46309:20;;45987:348;;;;:::o;46341:191::-;46381:4;46401:20;46419:1;46401:20;:::i;:::-;46396:25;;46435:20;46453:1;46435:20;:::i;:::-;46430:25;;46474:1;46471;46468:8;46465:34;;;46479:18;;:::i;:::-;46465:34;46524:1;46521;46517:9;46509:17;;46341:191;;;;:::o;46538:96::-;46575:7;46604:24;46622:5;46604:24;:::i;:::-;46593:35;;46538:96;;;:::o;46640:90::-;46674:7;46717:5;46710:13;46703:21;46692:32;;46640:90;;;:::o;46736:77::-;46773:7;46802:5;46791:16;;46736:77;;;:::o;46819:149::-;46855:7;46895:66;46888:5;46884:78;46873:89;;46819:149;;;:::o;46974:131::-;47021:7;47050:5;47039:16;;47056:43;47093:5;47056:43;:::i;:::-;46974:131;;;:::o;47111:126::-;47148:7;47188:42;47181:5;47177:54;47166:65;;47111:126;;;:::o;47243:77::-;47280:7;47309:5;47298:16;;47243:77;;;:::o;47326:86::-;47361:7;47401:4;47394:5;47390:16;47379:27;;47326:86;;;:::o;47418:131::-;47476:9;47509:34;47537:5;47509:34;:::i;:::-;47496:47;;47418:131;;;:::o;47555:154::-;47639:6;47634:3;47629;47616:30;47701:1;47692:6;47687:3;47683:16;47676:27;47555:154;;;:::o;47715:307::-;47783:1;47793:113;47807:6;47804:1;47801:13;47793:113;;;47892:1;47887:3;47883:11;47877:18;47873:1;47868:3;47864:11;47857:39;47829:2;47826:1;47822:10;47817:15;;47793:113;;;47924:6;47921:1;47918:13;47915:101;;;48004:1;47995:6;47990:3;47986:16;47979:27;47915:101;47764:258;47715:307;;;:::o;48028:320::-;48072:6;48109:1;48103:4;48099:12;48089:22;;48156:1;48150:4;48146:12;48177:18;48167:81;;48233:4;48225:6;48221:17;48211:27;;48167:81;48295:2;48287:6;48284:14;48264:18;48261:38;48258:84;;;48314:18;;:::i;:::-;48258:84;48079:269;48028:320;;;:::o;48354:281::-;48437:27;48459:4;48437:27;:::i;:::-;48429:6;48425:40;48567:6;48555:10;48552:22;48531:18;48519:10;48516:34;48513:62;48510:88;;;48578:18;;:::i;:::-;48510:88;48618:10;48614:2;48607:22;48397:238;48354:281;;:::o;48641:233::-;48680:3;48703:24;48721:5;48703:24;:::i;:::-;48694:33;;48749:66;48742:5;48739:77;48736:103;;;48819:18;;:::i;:::-;48736:103;48866:1;48859:5;48855:13;48848:20;;48641:233;;;:::o;48880:100::-;48919:7;48948:26;48968:5;48948:26;:::i;:::-;48937:37;;48880:100;;;:::o;48986:79::-;49025:7;49054:5;49043:16;;48986:79;;;:::o;49071:94::-;49110:7;49139:20;49153:5;49139:20;:::i;:::-;49128:31;;49071:94;;;:::o;49171:176::-;49203:1;49220:20;49238:1;49220:20;:::i;:::-;49215:25;;49254:20;49272:1;49254:20;:::i;:::-;49249:25;;49293:1;49283:35;;49298:18;;:::i;:::-;49283:35;49339:1;49336;49332:9;49327:14;;49171:176;;;;:::o;49353:180::-;49401:77;49398:1;49391:88;49498:4;49495:1;49488:15;49522:4;49519:1;49512:15;49539:180;49587:77;49584:1;49577:88;49684:4;49681:1;49674:15;49708:4;49705:1;49698:15;49725:180;49773:77;49770:1;49763:88;49870:4;49867:1;49860:15;49894:4;49891:1;49884:15;49911:180;49959:77;49956:1;49949:88;50056:4;50053:1;50046:15;50080:4;50077:1;50070:15;50097:180;50145:77;50142:1;50135:88;50242:4;50239:1;50232:15;50266:4;50263:1;50256:15;50283:180;50331:77;50328:1;50321:88;50428:4;50425:1;50418:15;50452:4;50449:1;50442:15;50469:117;50578:1;50575;50568:12;50592:117;50701:1;50698;50691:12;50715:117;50824:1;50821;50814:12;50838:117;50947:1;50944;50937:12;50961:117;51070:1;51067;51060:12;51084:102;51125:6;51176:2;51172:7;51167:2;51160:5;51156:14;51152:28;51142:38;;51084:102;;;:::o;51192:94::-;51225:8;51273:5;51269:2;51265:14;51244:35;;51192:94;;;:::o;51292:214::-;51432:66;51428:1;51420:6;51416:14;51409:90;51292:214;:::o;51512:237::-;51652:34;51648:1;51640:6;51636:14;51629:58;51721:20;51716:2;51708:6;51704:15;51697:45;51512:237;:::o;51755:225::-;51895:34;51891:1;51883:6;51879:14;51872:58;51964:8;51959:2;51951:6;51947:15;51940:33;51755:225;:::o;51986:178::-;52126:30;52122:1;52114:6;52110:14;52103:54;51986:178;:::o;52170:170::-;52310:22;52306:1;52298:6;52294:14;52287:46;52170:170;:::o;52346:223::-;52486:34;52482:1;52474:6;52470:14;52463:58;52555:6;52550:2;52542:6;52538:15;52531:31;52346:223;:::o;52575:175::-;52715:27;52711:1;52703:6;52699:14;52692:51;52575:175;:::o;52756:180::-;52896:32;52892:1;52884:6;52880:14;52873:56;52756:180;:::o;52942:231::-;53082:34;53078:1;53070:6;53066:14;53059:58;53151:14;53146:2;53138:6;53134:15;53127:39;52942:231;:::o;53179:225::-;53319:34;53315:1;53307:6;53303:14;53296:58;53388:8;53383:2;53375:6;53371:15;53364:33;53179:225;:::o;53410:171::-;53550:23;53546:1;53538:6;53534:14;53527:47;53410:171;:::o;53587:243::-;53727:34;53723:1;53715:6;53711:14;53704:58;53796:26;53791:2;53783:6;53779:15;53772:51;53587:243;:::o;53836:229::-;53976:34;53972:1;53964:6;53960:14;53953:58;54045:12;54040:2;54032:6;54028:15;54021:37;53836:229;:::o;54071:::-;54211:34;54207:1;54199:6;54195:14;54188:58;54280:12;54275:2;54267:6;54263:15;54256:37;54071:229;:::o;54306:228::-;54446:34;54442:1;54434:6;54430:14;54423:58;54515:11;54510:2;54502:6;54498:15;54491:36;54306:228;:::o;54540:178::-;54680:30;54676:1;54668:6;54664:14;54657:54;54540:178;:::o;54724:182::-;54864:34;54860:1;54852:6;54848:14;54841:58;54724:182;:::o;54912:231::-;55052:34;55048:1;55040:6;55036:14;55029:58;55121:14;55116:2;55108:6;55104:15;55097:39;54912:231;:::o;55149:155::-;55289:7;55285:1;55277:6;55273:14;55266:31;55149:155;:::o;55310:167::-;55450:19;55446:1;55438:6;55434:14;55427:43;55310:167;:::o;55483:182::-;55623:34;55619:1;55611:6;55607:14;55600:58;55483:182;:::o;55671:228::-;55811:34;55807:1;55799:6;55795:14;55788:58;55880:11;55875:2;55867:6;55863:15;55856:36;55671:228;:::o;55905:234::-;56045:34;56041:1;56033:6;56029:14;56022:58;56114:17;56109:2;56101:6;56097:15;56090:42;55905:234;:::o;56145:223::-;56285:34;56281:1;56273:6;56269:14;56262:58;56354:6;56349:2;56341:6;56337:15;56330:31;56145:223;:::o;56374:304::-;56514:34;56510:1;56502:6;56498:14;56491:58;56583:34;56578:2;56570:6;56566:15;56559:59;56652:18;56647:2;56639:6;56635:15;56628:43;56374:304;:::o;56684:220::-;56824:34;56820:1;56812:6;56808:14;56801:58;56893:3;56888:2;56880:6;56876:15;56869:28;56684:220;:::o;56910:174::-;57050:26;57046:1;57038:6;57034:14;57027:50;56910:174;:::o;57090:114::-;;:::o;57210:236::-;57350:34;57346:1;57338:6;57334:14;57327:58;57419:19;57414:2;57406:6;57402:15;57395:44;57210:236;:::o;57452:300::-;57592:34;57588:1;57580:6;57576:14;57569:58;57661:34;57656:2;57648:6;57644:15;57637:59;57730:14;57725:2;57717:6;57713:15;57706:39;57452:300;:::o;57758:171::-;57898:23;57894:1;57886:6;57882:14;57875:47;57758:171;:::o;57935:221::-;58075:34;58071:1;58063:6;58059:14;58052:58;58144:4;58139:2;58131:6;58127:15;58120:29;57935:221;:::o;58162:115::-;58245:1;58238:5;58235:12;58225:46;;58251:18;;:::i;:::-;58225:46;58162:115;:::o;58283:122::-;58356:24;58374:5;58356:24;:::i;:::-;58349:5;58346:35;58336:63;;58395:1;58392;58385:12;58336:63;58283:122;:::o;58411:116::-;58481:21;58496:5;58481:21;:::i;:::-;58474:5;58471:32;58461:60;;58517:1;58514;58507:12;58461:60;58411:116;:::o;58533:122::-;58606:24;58624:5;58606:24;:::i;:::-;58599:5;58596:35;58586:63;;58645:1;58642;58635:12;58586:63;58533:122;:::o;58661:120::-;58733:23;58750:5;58733:23;:::i;:::-;58726:5;58723:34;58713:62;;58771:1;58768;58761:12;58713:62;58661:120;:::o;58787:122::-;58860:24;58878:5;58860:24;:::i;:::-;58853:5;58850:35;58840:63;;58899:1;58896;58889:12;58840:63;58787:122;:::o;58915:118::-;58986:22;59002:5;58986:22;:::i;:::-;58979:5;58976:33;58966:61;;59023:1;59020;59013:12;58966:61;58915:118;:::o

Swarm Source

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