ETH Price: $3,199.24 (-7.12%)
Gas: 8 Gwei

Token

Sticky DAO (SDAO)
 

Overview

Max Total Supply

726 SDAO

Holders

386

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SDAO
0x6994aa3c83455705a514798fc29aff6d94d06da2
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Sticky DAO is an alpha focused community of NFT collectors here to Stick Around™ in the metaverse.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
StickyDAO

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-13
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.9;

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

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


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

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

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

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


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


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


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


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



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

pragma solidity ^0.8.9;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


pragma solidity ^0.8.9;

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

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.9;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 {
        _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 override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

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

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

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)


pragma solidity ^0.8.9;

contract StickyDAO is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens = 8888;

    //reservedmints for the team
    uint256 private _reservedMints;
    uint256 private maxReservedMints = 150;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private mintCostPresale = 0.069 ether;
    uint private mintCostPublicSale = 0.089 ether;

    //max number of mints per transaction in public sale
    uint private maxMintPerTX = 3;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}

    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;
    
    //marks the timestamp of when the respective sales open
    uint256 public presaleLaunchTime;
    uint256 public publicSaleLaunchTime;
    uint256 public revealTime;
    
    //declaring initial values for variables
    constructor() ERC721A("Sticky DAO", "SDAO"){
        
        unrevealedURI = "ipfs://QmewxUZYZJCU3nG77U9ucD1Ph4BUCfhoBRxmyor4Rs8Y2i/";
    }
    
    //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_;
    }
    
    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }
    
    //gets the tokenID of NFT to be minted
    /*function tokenId() internal view returns(uint256) {
        return numberOfTotalTokens + 1;
    }*/
    
    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, uint maxMint, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public payable nonReentrant {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        //require(msg.sender == tx.origin, "No transaction from smart contracts!");
        require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!");
        require(totalSupply() + number <= maxTotalTokens, "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMint, "Maximum Mints per Address exceeded!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.069 ether each NFT)");
        
        _safeMint(msg.sender, number);
        mintsPerAddress[msg.sender] += number;

    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint(uint256 number) public payable nonReentrant {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        //require(msg.sender == tx.origin, "No transaction from smart contracts!");
        require(saleState_ != State.Presale, "Presale has closed, Check out Public Sale!");
        require(totalSupply() + number <= maxTotalTokens, "Not enough NFTs left to mint..");
        require(number <= maxMintPerTX, "Maximum Mints per Address exceeded!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.089 ether each NFT)");
        
        _safeMint(msg.sender, number);
        mintsPerAddress[msg.sender] += number;
    }
    
    //reserved NFTs for creator
    function reservedMints(uint256 number, address recipient) public onlyOwner {
        require(_reservedMints + number <= maxReservedMints, "Not enough NFTs left to mint..");
        _safeMint(recipient, number);
        mintsPerAddress[recipient] += number;
    }

    function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
        
        //check to see that 24 hours have passed since beginning of publicsale launch
        if (revealTime == 0) {
            return unrevealedURI;
        }
        
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }    
    }
    
    //begins the minting of the NFTs
    function switchToPresale() public onlyOwner{
        State saleState_ = saleState();
        require(saleState_ == State.NoSale, "Presale has already opened!");
        presaleLaunchTime = block.timestamp;
    }
    
    //begins the public sale
    function switchToPublicSale() public onlyOwner {
        State saleState_ = saleState();
        require(saleState_ != State.PublicSale, "Public Sale is already live!");
        require(saleState_ != State.NoSale, "Cannot change to Public Sale if there has not been a Presale!");
        
        publicSaleLaunchTime = block.timestamp;
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //to see the total amount of reserved mints left 
    function reservedMintsLeft() public onlyOwner view returns(uint) {
        return maxReservedMints - _reservedMints;
    }
    
    //get the funds from the minting of the NFTs
    function withdraw() public onlyOwner nonReentrant{
        uint256 balance = accountBalance();
        require(balance > 0, "No funds to retrieve!");

        _withdraw(payable(owner()), balance); //to avoid dust eth
        
    }

    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }

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

    //get the current price to mint
    function mintCost() public view returns(uint256) {
        State saleState_ = saleState();
        if (saleState_ == State.NoSale || saleState_ == State.Presale) {
            return mintCostPresale;
        }
        else {
            return mintCostPublicSale;
        }

    }

    //reveal the NFTs
    function reveal() public onlyOwner {
        revealTime = block.timestamp;
    }

}

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":[{"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":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"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":[],"name":"presaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"maxMint","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":[],"name":"publicSaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTime","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":"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 StickyDAO.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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526122b86009556096600b5566f5232269808000600d5567013c310749028000600e556003600f557380e4929c869102140e69550bbecc20bed61b080c601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200008d57600080fd5b506040518060400160405280600a81526020017f537469636b792044414f000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5344414f000000000000000000000000000000000000000000000000000000008152508160019080519060200190620001129291906200025c565b5080600290805190602001906200012b9291906200025c565b5050506200014e620001426200018e60201b60201c565b6200019660201b60201c565b600160088190555060405180606001604052806036815260200162005b406036913960129080519060200190620001879291906200025c565b5062000371565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026a906200033b565b90600052602060002090601f0160209004810192826200028e5760008555620002da565b82601f10620002a957805160ff1916838001178555620002da565b82800160010185558215620002da579182015b82811115620002d9578251825591602001919060010190620002bc565b5b509050620002e99190620002ed565b5090565b5b8082111562000308576000816000905550600101620002ee565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035457607f821691505b602082108114156200036b576200036a6200030c565b5b50919050565b6157bf80620003816000396000f3fe6080604052600436106102345760003560e01c80637035bf181161012e578063b88d4fde116100ab578063cd5fe7251161006f578063cd5fe7251461082c578063e985e9c514610857578063eab4178214610894578063f2fde38b146108ab578063ff984994146108d45761023b565b8063b88d4fde14610747578063ba829d7114610770578063bdb4b8481461079b578063c4d8b9df146107c6578063c87b56dd146107ef5761023b565b8063a22cb465116100f2578063a22cb46514610697578063a475b5dd146106c0578063b0a1c1c4146106d7578063b3ab66b014610702578063b620e9751461071e5761023b565b80637035bf18146105c257806370a08231146105ed578063715018a61461062a5780638da5cb5b1461064157806395d89b411461066c5761023b565b80633023eba6116101bc5780634520e916116101805780634520e916146104d65780634f6ccce714610501578063549863291461053e578063603f4d521461055a5780636352211e146105855761023b565b80633023eba6146103f3578063326241141461043057806339a0c6f91461046d5780633ccfd60b1461049657806342842e0e146104ad5761023b565b8063095ea7b311610203578063095ea7b31461030e57806318160ddd146103375780631a17fe5e1461036257806323b872dd1461038d5780632f745c59146103b65761023b565b80630191a6571461024057806301ffc9a71461026957806306fdde03146102a6578063081812fc146102d15761023b565b3661023b57005b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613854565b6108eb565b005b34801561027557600080fd5b50610290600480360381019061028b91906138d9565b6109ab565b60405161029d9190613921565b60405180910390f35b3480156102b257600080fd5b506102bb610af5565b6040516102c891906139d5565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190613a2d565b610b87565b6040516103059190613a69565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190613a84565b610c0c565b005b34801561034357600080fd5b5061034c610d25565b6040516103599190613ad3565b60405180910390f35b34801561036e57600080fd5b50610377610d2e565b6040516103849190613ad3565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613aee565b610d34565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190613a84565b610d44565b6040516103ea9190613ad3565b60405180910390f35b3480156103ff57600080fd5b5061041a60048036038101906104159190613854565b610f36565b6040516104279190613ad3565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613bb0565b610f4e565b6040516104649190613921565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613d4c565b61104c565b005b3480156104a257600080fd5b506104ab6110e2565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190613aee565b611217565b005b3480156104e257600080fd5b506104eb611237565b6040516104f89190613ad3565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190613a2d565b6112ca565b6040516105359190613ad3565b60405180910390f35b61055860048036038101906105539190613d95565b61131d565b005b34801561056657600080fd5b5061056f611640565b60405161057c9190613e87565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a79190613a2d565b611671565b6040516105b99190613a69565b60405180910390f35b3480156105ce57600080fd5b506105d7611687565b6040516105e491906139d5565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190613854565b611715565b6040516106219190613ad3565b60405180910390f35b34801561063657600080fd5b5061063f6117fe565b005b34801561064d57600080fd5b50610656611886565b6040516106639190613a69565b60405180910390f35b34801561067857600080fd5b506106816118b0565b60405161068e91906139d5565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190613ece565b611942565b005b3480156106cc57600080fd5b506106d5611ac3565b005b3480156106e357600080fd5b506106ec611b48565b6040516106f99190613ad3565b60405180910390f35b61071c60048036038101906107179190613a2d565b611bcc565b005b34801561072a57600080fd5b5061074560048036038101906107409190613f0e565b611e53565b005b34801561075357600080fd5b5061076e60048036038101906107699190613fef565b611f85565b005b34801561077c57600080fd5b50610785611fe1565b6040516107929190613ad3565b60405180910390f35b3480156107a757600080fd5b506107b0611fe7565b6040516107bd9190613ad3565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e89190613d4c565b612065565b005b3480156107fb57600080fd5b5061081660048036038101906108119190613a2d565b6120fb565b60405161082391906139d5565b60405180910390f35b34801561083857600080fd5b50610841612240565b60405161084e9190613ad3565b60405180910390f35b34801561086357600080fd5b5061087e60048036038101906108799190614072565b612246565b60405161088b9190613921565b60405180910390f35b3480156108a057600080fd5b506108a96122da565b005b3480156108b757600080fd5b506108d260048036038101906108cd9190613854565b6123d3565b005b3480156108e057600080fd5b506108e96124cb565b005b6108f361262c565b73ffffffffffffffffffffffffffffffffffffffff16610911611886565b73ffffffffffffffffffffffffffffffffffffffff1614610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e906140fe565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ade57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aee5750610aed82612634565b5b9050919050565b606060018054610b049061414d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b309061414d565b8015610b7d5780601f10610b5257610100808354040283529160200191610b7d565b820191906000526020600020905b815481529060010190602001808311610b6057829003601f168201915b5050505050905090565b6000610b928261269e565b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc8906141f1565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1782611671565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614283565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca761262c565b73ffffffffffffffffffffffffffffffffffffffff161480610cd65750610cd581610cd061262c565b612246565b5b610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c90614315565b60405180910390fd5b610d208383836126ab565b505050565b60008054905090565b60145481565b610d3f83838361275d565b505050565b6000610d4f83611715565b8210610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d87906143a7565b60405180910390fd5b6000610d9a610d25565b905060008060005b83811015610ef4576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e9457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ee65786841415610edd578195505050505050610f30565b83806001019450505b508080600101915050610da2565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790614439565b60405180910390fd5b92915050565b60116020528060005260406000206000915090505481565b6000803086604051602001610f649291906144a1565b604051602081830303815290604052805190602001209050600181604051602001610f8f9190614545565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610fc59493929190614589565b6020604051602081039080840390855afa158015610fe7573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b61105461262c565b73ffffffffffffffffffffffffffffffffffffffff16611072611886565b73ffffffffffffffffffffffffffffffffffffffff16146110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf906140fe565b60405180910390fd5b80600c90805190602001906110de929190613705565b5050565b6110ea61262c565b73ffffffffffffffffffffffffffffffffffffffff16611108611886565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906140fe565b60405180910390fd5b600260085414156111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b9061461a565b60405180910390fd5b600260088190555060006111b6611b48565b9050600081116111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f290614686565b60405180910390fd5b61120c611206611886565b82612c9d565b506001600881905550565b61123283838360405180602001604052806000815250611f85565b505050565b600061124161262c565b73ffffffffffffffffffffffffffffffffffffffff1661125f611886565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906140fe565b60405180910390fd5b600a54600b546112c591906146d5565b905090565b60006112d4610d25565b8210611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c9061477b565b60405180910390fd5b819050919050565b82828261132c33848484610f4e565b61136b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611362906147e7565b60405180910390fd5b600260085414156113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a89061461a565b60405180910390fd5b600260088190555060006113c3611640565b9050600060028111156113d9576113d8613e10565b5b8160028111156113ec576113eb613e10565b5b141561142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490614853565b60405180910390fd5b6002808111156114405761143f613e10565b5b81600281111561145357611452613e10565b5b1415611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b906148e5565b60405180910390fd5b600954896114a0610d25565b6114aa9190614905565b11156114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e2906149a7565b60405180910390fd5b8789601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115379190614905565b1115611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f90614a39565b60405180910390fd5b88611581611fe7565b61158b9190614a59565b3410156115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c490614b4b565b60405180910390fd5b6115d7338a612d4e565b88601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116269190614905565b925050819055505060016008819055505050505050505050565b6000806013541415611655576000905061166e565b60006014541415611669576001905061166e565b600290505b90565b600061167c82612d6c565b600001519050919050565b601280546116949061414d565b80601f01602080910402602001604051908101604052809291908181526020018280546116c09061414d565b801561170d5780601f106116e25761010080835404028352916020019161170d565b820191906000526020600020905b8154815290600101906020018083116116f057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90614bdd565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61180661262c565b73ffffffffffffffffffffffffffffffffffffffff16611824611886565b73ffffffffffffffffffffffffffffffffffffffff161461187a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611871906140fe565b60405180910390fd5b6118846000612f06565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546118bf9061414d565b80601f01602080910402602001604051908101604052809291908181526020018280546118eb9061414d565b80156119385780601f1061190d57610100808354040283529160200191611938565b820191906000526020600020905b81548152906001019060200180831161191b57829003601f168201915b5050505050905090565b61194a61262c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90614c49565b60405180910390fd5b80600660006119c561262c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a7261262c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab79190613921565b60405180910390a35050565b611acb61262c565b73ffffffffffffffffffffffffffffffffffffffff16611ae9611886565b73ffffffffffffffffffffffffffffffffffffffff1614611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b36906140fe565b60405180910390fd5b42601581905550565b6000611b5261262c565b73ffffffffffffffffffffffffffffffffffffffff16611b70611886565b73ffffffffffffffffffffffffffffffffffffffff1614611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd906140fe565b60405180910390fd5b47905090565b60026008541415611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c099061461a565b60405180910390fd5b60026008819055506000611c24611640565b905060006002811115611c3a57611c39613e10565b5b816002811115611c4d57611c4c613e10565b5b1415611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8590614853565b60405180910390fd5b60016002811115611ca257611ca1613e10565b5b816002811115611cb557611cb4613e10565b5b1415611cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ced906148e5565b60405180910390fd5b60095482611d02610d25565b611d0c9190614905565b1115611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d44906149a7565b60405180910390fd5b600f54821115611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990614a39565b60405180910390fd5b81611d9b611fe7565b611da59190614a59565b341015611de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dde90614d01565b60405180910390fd5b611df13383612d4e565b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e409190614905565b9250508190555050600160088190555050565b611e5b61262c565b73ffffffffffffffffffffffffffffffffffffffff16611e79611886565b73ffffffffffffffffffffffffffffffffffffffff1614611ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec6906140fe565b60405180910390fd5b600b5482600a54611ee09190614905565b1115611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f18906149a7565b60405180910390fd5b611f2b8183612d4e565b81601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f7a9190614905565b925050819055505050565b611f9084848461275d565b611f9c84848484612fcc565b611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd290614d93565b60405180910390fd5b50505050565b60155481565b600080611ff2611640565b90506000600281111561200857612007613e10565b5b81600281111561201b5761201a613e10565b5b148061204b57506001600281111561203657612035613e10565b5b81600281111561204957612048613e10565b5b145b1561205b57600d54915050612062565b600e549150505b90565b61206d61262c565b73ffffffffffffffffffffffffffffffffffffffff1661208b611886565b73ffffffffffffffffffffffffffffffffffffffff16146120e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d8906140fe565b60405180910390fd5b80601290805190602001906120f7929190613705565b5050565b60606121068261269e565b612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90614e25565b60405180910390fd5b600060155414156121e2576012805461215d9061414d565b80601f01602080910402602001604051908101604052809291908181526020018280546121899061414d565b80156121d65780601f106121ab576101008083540402835291602001916121d6565b820191906000526020600020905b8154815290600101906020018083116121b957829003601f168201915b5050505050905061223b565b60006121ec613163565b9050600081511161220c5760405180602001604052806000815250612237565b80612216846131f5565b604051602001612227929190614ec2565b6040516020818303038152906040525b9150505b919050565b60135481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e261262c565b73ffffffffffffffffffffffffffffffffffffffff16612300611886565b73ffffffffffffffffffffffffffffffffffffffff1614612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d906140fe565b60405180910390fd5b6000612360611640565b90506000600281111561237657612375613e10565b5b81600281111561238957612388613e10565b5b146123c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c090614f3d565b60405180910390fd5b4260138190555050565b6123db61262c565b73ffffffffffffffffffffffffffffffffffffffff166123f9611886565b73ffffffffffffffffffffffffffffffffffffffff161461244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906140fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690614fcf565b60405180910390fd5b6124c881612f06565b50565b6124d361262c565b73ffffffffffffffffffffffffffffffffffffffff166124f1611886565b73ffffffffffffffffffffffffffffffffffffffff1614612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e906140fe565b60405180910390fd5b6000612551611640565b905060028081111561256657612565613e10565b5b81600281111561257957612578613e10565b5b14156125ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b19061503b565b60405180910390fd5b600060028111156125ce576125cd613e10565b5b8160028111156125e1576125e0613e10565b5b1415612622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612619906150cd565b60405180910390fd5b4260148190555050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061276882612d6c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661278f61262c565b73ffffffffffffffffffffffffffffffffffffffff1614806127eb57506127b461262c565b73ffffffffffffffffffffffffffffffffffffffff166127d384610b87565b73ffffffffffffffffffffffffffffffffffffffff16145b806128075750612806826000015161280161262c565b612246565b5b905080612849576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128409061515f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b2906151f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290615283565b60405180910390fd5b6129388585856001613356565b61294860008484600001516126ab565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c2d57612b8c8161269e565b15612c2c5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c96858585600161335c565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612cc3906152d4565b60006040518083038185875af1925050503d8060008114612d00576040519150601f19603f3d011682016040523d82523d6000602084013e612d05565b606091505b5050905080612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4090615335565b60405180910390fd5b505050565b612d68828260405180602001604052806000815250613362565b5050565b612d7461378b565b612d7d8261269e565b612dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db3906153c7565b60405180910390fd5b60008290505b60008110612ec5576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eb6578092505050612f01565b50808060019003915050612dc2565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef890615459565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612fed8473ffffffffffffffffffffffffffffffffffffffff16613374565b15613156578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261301661262c565b8786866040518563ffffffff1660e01b815260040161303894939291906154ce565b602060405180830381600087803b15801561305257600080fd5b505af192505050801561308357506040513d601f19601f82011682018060405250810190613080919061552f565b60015b613106573d80600081146130b3576040519150601f19603f3d011682016040523d82523d6000602084013e6130b8565b606091505b506000815114156130fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f590614d93565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061315b565b600190505b949350505050565b6060600c80546131729061414d565b80601f016020809104026020016040519081016040528092919081815260200182805461319e9061414d565b80156131eb5780601f106131c0576101008083540402835291602001916131eb565b820191906000526020600020905b8154815290600101906020018083116131ce57829003601f168201915b5050505050905090565b6060600082141561323d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613351565b600082905060005b6000821461326f5780806132589061555c565b915050600a8261326891906155d4565b9150613245565b60008167ffffffffffffffff81111561328b5761328a613c21565b5b6040519080825280601f01601f1916602001820160405280156132bd5781602001600182028036833780820191505090505b5090505b6000851461334a576001826132d691906146d5565b9150600a856132e59190615605565b60306132f19190614905565b60f81b81838151811061330757613306615636565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561334391906155d4565b94506132c1565b8093505050505b919050565b50505050565b50505050565b61336f8383836001613387565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f4906156d7565b60405180910390fd5b6000841415613441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343890615769565b60405180910390fd5b61344e6000868387613356565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156136e857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156136d3576136936000888488612fcc565b6136d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c990614d93565b60405180910390fd5b5b8180600101925050808060010191505061361c565b5080600081905550506136fe600086838761335c565b5050505050565b8280546137119061414d565b90600052602060002090601f016020900481019282613733576000855561377a565b82601f1061374c57805160ff191683800117855561377a565b8280016001018555821561377a579182015b8281111561377957825182559160200191906001019061375e565b5b50905061378791906137c5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156137de5760008160009055506001016137c6565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613821826137f6565b9050919050565b61383181613816565b811461383c57600080fd5b50565b60008135905061384e81613828565b92915050565b60006020828403121561386a576138696137ec565b5b60006138788482850161383f565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138b681613881565b81146138c157600080fd5b50565b6000813590506138d3816138ad565b92915050565b6000602082840312156138ef576138ee6137ec565b5b60006138fd848285016138c4565b91505092915050565b60008115159050919050565b61391b81613906565b82525050565b60006020820190506139366000830184613912565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561397657808201518184015260208101905061395b565b83811115613985576000848401525b50505050565b6000601f19601f8301169050919050565b60006139a78261393c565b6139b18185613947565b93506139c1818560208601613958565b6139ca8161398b565b840191505092915050565b600060208201905081810360008301526139ef818461399c565b905092915050565b6000819050919050565b613a0a816139f7565b8114613a1557600080fd5b50565b600081359050613a2781613a01565b92915050565b600060208284031215613a4357613a426137ec565b5b6000613a5184828501613a18565b91505092915050565b613a6381613816565b82525050565b6000602082019050613a7e6000830184613a5a565b92915050565b60008060408385031215613a9b57613a9a6137ec565b5b6000613aa98582860161383f565b9250506020613aba85828601613a18565b9150509250929050565b613acd816139f7565b82525050565b6000602082019050613ae86000830184613ac4565b92915050565b600080600060608486031215613b0757613b066137ec565b5b6000613b158682870161383f565b9350506020613b268682870161383f565b9250506040613b3786828701613a18565b9150509250925092565b600060ff82169050919050565b613b5781613b41565b8114613b6257600080fd5b50565b600081359050613b7481613b4e565b92915050565b6000819050919050565b613b8d81613b7a565b8114613b9857600080fd5b50565b600081359050613baa81613b84565b92915050565b60008060008060808587031215613bca57613bc96137ec565b5b6000613bd88782880161383f565b9450506020613be987828801613b65565b9350506040613bfa87828801613b9b565b9250506060613c0b87828801613b9b565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c598261398b565b810181811067ffffffffffffffff82111715613c7857613c77613c21565b5b80604052505050565b6000613c8b6137e2565b9050613c978282613c50565b919050565b600067ffffffffffffffff821115613cb757613cb6613c21565b5b613cc08261398b565b9050602081019050919050565b82818337600083830152505050565b6000613cef613cea84613c9c565b613c81565b905082815260208101848484011115613d0b57613d0a613c1c565b5b613d16848285613ccd565b509392505050565b600082601f830112613d3357613d32613c17565b5b8135613d43848260208601613cdc565b91505092915050565b600060208284031215613d6257613d616137ec565b5b600082013567ffffffffffffffff811115613d8057613d7f6137f1565b5b613d8c84828501613d1e565b91505092915050565b600080600080600060a08688031215613db157613db06137ec565b5b6000613dbf88828901613a18565b9550506020613dd088828901613a18565b9450506040613de188828901613b65565b9350506060613df288828901613b9b565b9250506080613e0388828901613b9b565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613e5057613e4f613e10565b5b50565b6000819050613e6182613e3f565b919050565b6000613e7182613e53565b9050919050565b613e8181613e66565b82525050565b6000602082019050613e9c6000830184613e78565b92915050565b613eab81613906565b8114613eb657600080fd5b50565b600081359050613ec881613ea2565b92915050565b60008060408385031215613ee557613ee46137ec565b5b6000613ef38582860161383f565b9250506020613f0485828601613eb9565b9150509250929050565b60008060408385031215613f2557613f246137ec565b5b6000613f3385828601613a18565b9250506020613f448582860161383f565b9150509250929050565b600067ffffffffffffffff821115613f6957613f68613c21565b5b613f728261398b565b9050602081019050919050565b6000613f92613f8d84613f4e565b613c81565b905082815260208101848484011115613fae57613fad613c1c565b5b613fb9848285613ccd565b509392505050565b600082601f830112613fd657613fd5613c17565b5b8135613fe6848260208601613f7f565b91505092915050565b60008060008060808587031215614009576140086137ec565b5b60006140178782880161383f565b94505060206140288782880161383f565b935050604061403987828801613a18565b925050606085013567ffffffffffffffff81111561405a576140596137f1565b5b61406687828801613fc1565b91505092959194509250565b60008060408385031215614089576140886137ec565b5b60006140978582860161383f565b92505060206140a88582860161383f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140e8602083613947565b91506140f3826140b2565b602082019050919050565b60006020820190508181036000830152614117816140db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061416557607f821691505b602082108114156141795761417861411e565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006141db602d83613947565b91506141e68261417f565b604082019050919050565b6000602082019050818103600083015261420a816141ce565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061426d602283613947565b915061427882614211565b604082019050919050565b6000602082019050818103600083015261429c81614260565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006142ff603983613947565b915061430a826142a3565b604082019050919050565b6000602082019050818103600083015261432e816142f2565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614391602283613947565b915061439c82614335565b604082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614423602e83613947565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b60008160601b9050919050565b600061447182614459565b9050919050565b600061448382614466565b9050919050565b61449b61449682613816565b614478565b82525050565b60006144ad828561448a565b6014820191506144bd828461448a565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061450e601c836144cd565b9150614519826144d8565b601c82019050919050565b6000819050919050565b61453f61453a82613b7a565b614524565b82525050565b600061455082614501565b915061455c828461452e565b60208201915081905092915050565b61457481613b7a565b82525050565b61458381613b41565b82525050565b600060808201905061459e600083018761456b565b6145ab602083018661457a565b6145b8604083018561456b565b6145c5606083018461456b565b95945050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614604601f83613947565b915061460f826145ce565b602082019050919050565b60006020820190508181036000830152614633816145f7565b9050919050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b6000614670601583613947565b915061467b8261463a565b602082019050919050565b6000602082019050818103600083015261469f81614663565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146e0826139f7565b91506146eb836139f7565b9250828210156146fe576146fd6146a6565b5b828203905092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614765602383613947565b915061477082614709565b604082019050919050565b6000602082019050818103600083015261479481614758565b9050919050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b60006147d1601183613947565b91506147dc8261479b565b602082019050919050565b60006020820190508181036000830152614800816147c4565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b600061483d601583613947565b915061484882614807565b602082019050919050565b6000602082019050818103600083015261486c81614830565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b60006148cf602a83613947565b91506148da82614873565b604082019050919050565b600060208201905081810360008301526148fe816148c2565b9050919050565b6000614910826139f7565b915061491b836139f7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149505761494f6146a6565b5b828201905092915050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000614991601e83613947565b915061499c8261495b565b602082019050919050565b600060208201905081810360008301526149c081614984565b9050919050565b7f4d6178696d756d204d696e74732070657220416464726573732065786365656460008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b6000614a23602383613947565b9150614a2e826149c7565b604082019050919050565b60006020820190508181036000830152614a5281614a16565b9050919050565b6000614a64826139f7565b9150614a6f836139f7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614aa857614aa76146a6565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303639206560208201527f746865722065616368204e465429000000000000000000000000000000000000604082015250565b6000614b35604e83613947565b9150614b4082614ab3565b606082019050919050565b60006020820190508181036000830152614b6481614b28565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614bc7602b83613947565b9150614bd282614b6b565b604082019050919050565b60006020820190508181036000830152614bf681614bba565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614c33601a83613947565b9150614c3e82614bfd565b602082019050919050565b60006020820190508181036000830152614c6281614c26565b9050919050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303839206560208201527f746865722065616368204e465429000000000000000000000000000000000000604082015250565b6000614ceb604e83613947565b9150614cf682614c69565b606082019050919050565b60006020820190508181036000830152614d1a81614cde565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614d7d603383613947565b9150614d8882614d21565b604082019050919050565b60006020820190508181036000830152614dac81614d70565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614e0f602f83613947565b9150614e1a82614db3565b604082019050919050565b60006020820190508181036000830152614e3e81614e02565b9050919050565b6000614e508261393c565b614e5a81856144cd565b9350614e6a818560208601613958565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614eac6005836144cd565b9150614eb782614e76565b600582019050919050565b6000614ece8285614e45565b9150614eda8284614e45565b9150614ee582614e9f565b91508190509392505050565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b6000614f27601b83613947565b9150614f3282614ef1565b602082019050919050565b60006020820190508181036000830152614f5681614f1a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fb9602683613947565b9150614fc482614f5d565b604082019050919050565b60006020820190508181036000830152614fe881614fac565b9050919050565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b6000615025601c83613947565b915061503082614fef565b602082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b60006150b7603d83613947565b91506150c28261505b565b604082019050919050565b600060208201905081810360008301526150e6816150aa565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615149603283613947565b9150615154826150ed565b604082019050919050565b600060208201905081810360008301526151788161513c565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006151db602683613947565b91506151e68261517f565b604082019050919050565b6000602082019050818103600083015261520a816151ce565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061526d602583613947565b915061527882615211565b604082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b600081905092915050565b50565b60006152be6000836152a3565b91506152c9826152ae565b600082019050919050565b60006152df826152b1565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061531f601483613947565b915061532a826152e9565b602082019050919050565b6000602082019050818103600083015261534e81615312565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006153b1602a83613947565b91506153bc82615355565b604082019050919050565b600060208201905081810360008301526153e0816153a4565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615443602f83613947565b915061544e826153e7565b604082019050919050565b6000602082019050818103600083015261547281615436565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006154a082615479565b6154aa8185615484565b93506154ba818560208601613958565b6154c38161398b565b840191505092915050565b60006080820190506154e36000830187613a5a565b6154f06020830186613a5a565b6154fd6040830185613ac4565b818103606083015261550f8184615495565b905095945050505050565b600081519050615529816138ad565b92915050565b600060208284031215615545576155446137ec565b5b60006155538482850161551a565b91505092915050565b6000615567826139f7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561559a576155996146a6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155df826139f7565b91506155ea836139f7565b9250826155fa576155f96155a5565b5b828204905092915050565b6000615610826139f7565b915061561b836139f7565b92508261562b5761562a6155a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006156c1602183613947565b91506156cc82615665565b604082019050919050565b600060208201905081810360008301526156f0816156b4565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615753602883613947565b915061575e826156f7565b604082019050919050565b6000602082019050818103600083015261578281615746565b905091905056fea2646970667358221220a4c29ae9df12ccf17266832a4459b260850876c4e06d2ae828b802f5b035060d64736f6c63430008090033697066733a2f2f516d657778555a595a4a4355336e47373755397563443150683442554366686f4252786d796f72345273385932692f

Deployed Bytecode

0x6080604052600436106102345760003560e01c80637035bf181161012e578063b88d4fde116100ab578063cd5fe7251161006f578063cd5fe7251461082c578063e985e9c514610857578063eab4178214610894578063f2fde38b146108ab578063ff984994146108d45761023b565b8063b88d4fde14610747578063ba829d7114610770578063bdb4b8481461079b578063c4d8b9df146107c6578063c87b56dd146107ef5761023b565b8063a22cb465116100f2578063a22cb46514610697578063a475b5dd146106c0578063b0a1c1c4146106d7578063b3ab66b014610702578063b620e9751461071e5761023b565b80637035bf18146105c257806370a08231146105ed578063715018a61461062a5780638da5cb5b1461064157806395d89b411461066c5761023b565b80633023eba6116101bc5780634520e916116101805780634520e916146104d65780634f6ccce714610501578063549863291461053e578063603f4d521461055a5780636352211e146105855761023b565b80633023eba6146103f3578063326241141461043057806339a0c6f91461046d5780633ccfd60b1461049657806342842e0e146104ad5761023b565b8063095ea7b311610203578063095ea7b31461030e57806318160ddd146103375780631a17fe5e1461036257806323b872dd1461038d5780632f745c59146103b65761023b565b80630191a6571461024057806301ffc9a71461026957806306fdde03146102a6578063081812fc146102d15761023b565b3661023b57005b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613854565b6108eb565b005b34801561027557600080fd5b50610290600480360381019061028b91906138d9565b6109ab565b60405161029d9190613921565b60405180910390f35b3480156102b257600080fd5b506102bb610af5565b6040516102c891906139d5565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190613a2d565b610b87565b6040516103059190613a69565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190613a84565b610c0c565b005b34801561034357600080fd5b5061034c610d25565b6040516103599190613ad3565b60405180910390f35b34801561036e57600080fd5b50610377610d2e565b6040516103849190613ad3565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613aee565b610d34565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190613a84565b610d44565b6040516103ea9190613ad3565b60405180910390f35b3480156103ff57600080fd5b5061041a60048036038101906104159190613854565b610f36565b6040516104279190613ad3565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613bb0565b610f4e565b6040516104649190613921565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613d4c565b61104c565b005b3480156104a257600080fd5b506104ab6110e2565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190613aee565b611217565b005b3480156104e257600080fd5b506104eb611237565b6040516104f89190613ad3565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190613a2d565b6112ca565b6040516105359190613ad3565b60405180910390f35b61055860048036038101906105539190613d95565b61131d565b005b34801561056657600080fd5b5061056f611640565b60405161057c9190613e87565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a79190613a2d565b611671565b6040516105b99190613a69565b60405180910390f35b3480156105ce57600080fd5b506105d7611687565b6040516105e491906139d5565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190613854565b611715565b6040516106219190613ad3565b60405180910390f35b34801561063657600080fd5b5061063f6117fe565b005b34801561064d57600080fd5b50610656611886565b6040516106639190613a69565b60405180910390f35b34801561067857600080fd5b506106816118b0565b60405161068e91906139d5565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190613ece565b611942565b005b3480156106cc57600080fd5b506106d5611ac3565b005b3480156106e357600080fd5b506106ec611b48565b6040516106f99190613ad3565b60405180910390f35b61071c60048036038101906107179190613a2d565b611bcc565b005b34801561072a57600080fd5b5061074560048036038101906107409190613f0e565b611e53565b005b34801561075357600080fd5b5061076e60048036038101906107699190613fef565b611f85565b005b34801561077c57600080fd5b50610785611fe1565b6040516107929190613ad3565b60405180910390f35b3480156107a757600080fd5b506107b0611fe7565b6040516107bd9190613ad3565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e89190613d4c565b612065565b005b3480156107fb57600080fd5b5061081660048036038101906108119190613a2d565b6120fb565b60405161082391906139d5565b60405180910390f35b34801561083857600080fd5b50610841612240565b60405161084e9190613ad3565b60405180910390f35b34801561086357600080fd5b5061087e60048036038101906108799190614072565b612246565b60405161088b9190613921565b60405180910390f35b3480156108a057600080fd5b506108a96122da565b005b3480156108b757600080fd5b506108d260048036038101906108cd9190613854565b6123d3565b005b3480156108e057600080fd5b506108e96124cb565b005b6108f361262c565b73ffffffffffffffffffffffffffffffffffffffff16610911611886565b73ffffffffffffffffffffffffffffffffffffffff1614610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e906140fe565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ade57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aee5750610aed82612634565b5b9050919050565b606060018054610b049061414d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b309061414d565b8015610b7d5780601f10610b5257610100808354040283529160200191610b7d565b820191906000526020600020905b815481529060010190602001808311610b6057829003601f168201915b5050505050905090565b6000610b928261269e565b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc8906141f1565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1782611671565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614283565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca761262c565b73ffffffffffffffffffffffffffffffffffffffff161480610cd65750610cd581610cd061262c565b612246565b5b610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c90614315565b60405180910390fd5b610d208383836126ab565b505050565b60008054905090565b60145481565b610d3f83838361275d565b505050565b6000610d4f83611715565b8210610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d87906143a7565b60405180910390fd5b6000610d9a610d25565b905060008060005b83811015610ef4576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e9457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ee65786841415610edd578195505050505050610f30565b83806001019450505b508080600101915050610da2565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2790614439565b60405180910390fd5b92915050565b60116020528060005260406000206000915090505481565b6000803086604051602001610f649291906144a1565b604051602081830303815290604052805190602001209050600181604051602001610f8f9190614545565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610fc59493929190614589565b6020604051602081039080840390855afa158015610fe7573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b61105461262c565b73ffffffffffffffffffffffffffffffffffffffff16611072611886565b73ffffffffffffffffffffffffffffffffffffffff16146110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf906140fe565b60405180910390fd5b80600c90805190602001906110de929190613705565b5050565b6110ea61262c565b73ffffffffffffffffffffffffffffffffffffffff16611108611886565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906140fe565b60405180910390fd5b600260085414156111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b9061461a565b60405180910390fd5b600260088190555060006111b6611b48565b9050600081116111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f290614686565b60405180910390fd5b61120c611206611886565b82612c9d565b506001600881905550565b61123283838360405180602001604052806000815250611f85565b505050565b600061124161262c565b73ffffffffffffffffffffffffffffffffffffffff1661125f611886565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906140fe565b60405180910390fd5b600a54600b546112c591906146d5565b905090565b60006112d4610d25565b8210611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c9061477b565b60405180910390fd5b819050919050565b82828261132c33848484610f4e565b61136b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611362906147e7565b60405180910390fd5b600260085414156113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a89061461a565b60405180910390fd5b600260088190555060006113c3611640565b9050600060028111156113d9576113d8613e10565b5b8160028111156113ec576113eb613e10565b5b141561142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490614853565b60405180910390fd5b6002808111156114405761143f613e10565b5b81600281111561145357611452613e10565b5b1415611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b906148e5565b60405180910390fd5b600954896114a0610d25565b6114aa9190614905565b11156114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e2906149a7565b60405180910390fd5b8789601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115379190614905565b1115611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f90614a39565b60405180910390fd5b88611581611fe7565b61158b9190614a59565b3410156115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c490614b4b565b60405180910390fd5b6115d7338a612d4e565b88601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116269190614905565b925050819055505060016008819055505050505050505050565b6000806013541415611655576000905061166e565b60006014541415611669576001905061166e565b600290505b90565b600061167c82612d6c565b600001519050919050565b601280546116949061414d565b80601f01602080910402602001604051908101604052809291908181526020018280546116c09061414d565b801561170d5780601f106116e25761010080835404028352916020019161170d565b820191906000526020600020905b8154815290600101906020018083116116f057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90614bdd565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61180661262c565b73ffffffffffffffffffffffffffffffffffffffff16611824611886565b73ffffffffffffffffffffffffffffffffffffffff161461187a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611871906140fe565b60405180910390fd5b6118846000612f06565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546118bf9061414d565b80601f01602080910402602001604051908101604052809291908181526020018280546118eb9061414d565b80156119385780601f1061190d57610100808354040283529160200191611938565b820191906000526020600020905b81548152906001019060200180831161191b57829003601f168201915b5050505050905090565b61194a61262c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90614c49565b60405180910390fd5b80600660006119c561262c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a7261262c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab79190613921565b60405180910390a35050565b611acb61262c565b73ffffffffffffffffffffffffffffffffffffffff16611ae9611886565b73ffffffffffffffffffffffffffffffffffffffff1614611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b36906140fe565b60405180910390fd5b42601581905550565b6000611b5261262c565b73ffffffffffffffffffffffffffffffffffffffff16611b70611886565b73ffffffffffffffffffffffffffffffffffffffff1614611bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbd906140fe565b60405180910390fd5b47905090565b60026008541415611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c099061461a565b60405180910390fd5b60026008819055506000611c24611640565b905060006002811115611c3a57611c39613e10565b5b816002811115611c4d57611c4c613e10565b5b1415611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8590614853565b60405180910390fd5b60016002811115611ca257611ca1613e10565b5b816002811115611cb557611cb4613e10565b5b1415611cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ced906148e5565b60405180910390fd5b60095482611d02610d25565b611d0c9190614905565b1115611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d44906149a7565b60405180910390fd5b600f54821115611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990614a39565b60405180910390fd5b81611d9b611fe7565b611da59190614a59565b341015611de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dde90614d01565b60405180910390fd5b611df13383612d4e565b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e409190614905565b9250508190555050600160088190555050565b611e5b61262c565b73ffffffffffffffffffffffffffffffffffffffff16611e79611886565b73ffffffffffffffffffffffffffffffffffffffff1614611ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec6906140fe565b60405180910390fd5b600b5482600a54611ee09190614905565b1115611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f18906149a7565b60405180910390fd5b611f2b8183612d4e565b81601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f7a9190614905565b925050819055505050565b611f9084848461275d565b611f9c84848484612fcc565b611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd290614d93565b60405180910390fd5b50505050565b60155481565b600080611ff2611640565b90506000600281111561200857612007613e10565b5b81600281111561201b5761201a613e10565b5b148061204b57506001600281111561203657612035613e10565b5b81600281111561204957612048613e10565b5b145b1561205b57600d54915050612062565b600e549150505b90565b61206d61262c565b73ffffffffffffffffffffffffffffffffffffffff1661208b611886565b73ffffffffffffffffffffffffffffffffffffffff16146120e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d8906140fe565b60405180910390fd5b80601290805190602001906120f7929190613705565b5050565b60606121068261269e565b612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90614e25565b60405180910390fd5b600060155414156121e2576012805461215d9061414d565b80601f01602080910402602001604051908101604052809291908181526020018280546121899061414d565b80156121d65780601f106121ab576101008083540402835291602001916121d6565b820191906000526020600020905b8154815290600101906020018083116121b957829003601f168201915b5050505050905061223b565b60006121ec613163565b9050600081511161220c5760405180602001604052806000815250612237565b80612216846131f5565b604051602001612227929190614ec2565b6040516020818303038152906040525b9150505b919050565b60135481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e261262c565b73ffffffffffffffffffffffffffffffffffffffff16612300611886565b73ffffffffffffffffffffffffffffffffffffffff1614612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d906140fe565b60405180910390fd5b6000612360611640565b90506000600281111561237657612375613e10565b5b81600281111561238957612388613e10565b5b146123c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c090614f3d565b60405180910390fd5b4260138190555050565b6123db61262c565b73ffffffffffffffffffffffffffffffffffffffff166123f9611886565b73ffffffffffffffffffffffffffffffffffffffff161461244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906140fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690614fcf565b60405180910390fd5b6124c881612f06565b50565b6124d361262c565b73ffffffffffffffffffffffffffffffffffffffff166124f1611886565b73ffffffffffffffffffffffffffffffffffffffff1614612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e906140fe565b60405180910390fd5b6000612551611640565b905060028081111561256657612565613e10565b5b81600281111561257957612578613e10565b5b14156125ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b19061503b565b60405180910390fd5b600060028111156125ce576125cd613e10565b5b8160028111156125e1576125e0613e10565b5b1415612622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612619906150cd565b60405180910390fd5b4260148190555050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061276882612d6c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661278f61262c565b73ffffffffffffffffffffffffffffffffffffffff1614806127eb57506127b461262c565b73ffffffffffffffffffffffffffffffffffffffff166127d384610b87565b73ffffffffffffffffffffffffffffffffffffffff16145b806128075750612806826000015161280161262c565b612246565b5b905080612849576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128409061515f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b2906151f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290615283565b60405180910390fd5b6129388585856001613356565b61294860008484600001516126ab565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c2d57612b8c8161269e565b15612c2c5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c96858585600161335c565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612cc3906152d4565b60006040518083038185875af1925050503d8060008114612d00576040519150601f19603f3d011682016040523d82523d6000602084013e612d05565b606091505b5050905080612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4090615335565b60405180910390fd5b505050565b612d68828260405180602001604052806000815250613362565b5050565b612d7461378b565b612d7d8261269e565b612dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db3906153c7565b60405180910390fd5b60008290505b60008110612ec5576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612eb6578092505050612f01565b50808060019003915050612dc2565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef890615459565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612fed8473ffffffffffffffffffffffffffffffffffffffff16613374565b15613156578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261301661262c565b8786866040518563ffffffff1660e01b815260040161303894939291906154ce565b602060405180830381600087803b15801561305257600080fd5b505af192505050801561308357506040513d601f19601f82011682018060405250810190613080919061552f565b60015b613106573d80600081146130b3576040519150601f19603f3d011682016040523d82523d6000602084013e6130b8565b606091505b506000815114156130fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f590614d93565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061315b565b600190505b949350505050565b6060600c80546131729061414d565b80601f016020809104026020016040519081016040528092919081815260200182805461319e9061414d565b80156131eb5780601f106131c0576101008083540402835291602001916131eb565b820191906000526020600020905b8154815290600101906020018083116131ce57829003601f168201915b5050505050905090565b6060600082141561323d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613351565b600082905060005b6000821461326f5780806132589061555c565b915050600a8261326891906155d4565b9150613245565b60008167ffffffffffffffff81111561328b5761328a613c21565b5b6040519080825280601f01601f1916602001820160405280156132bd5781602001600182028036833780820191505090505b5090505b6000851461334a576001826132d691906146d5565b9150600a856132e59190615605565b60306132f19190614905565b60f81b81838151811061330757613306615636565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561334391906155d4565b94506132c1565b8093505050505b919050565b50505050565b50505050565b61336f8383836001613387565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f4906156d7565b60405180910390fd5b6000841415613441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343890615769565b60405180910390fd5b61344e6000868387613356565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156136e857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156136d3576136936000888488612fcc565b6136d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c990614d93565b60405180910390fd5b5b8180600101925050808060010191505061361c565b5080600081905550506136fe600086838761335c565b5050505050565b8280546137119061414d565b90600052602060002090601f016020900481019282613733576000855561377a565b82601f1061374c57805160ff191683800117855561377a565b8280016001018555821561377a579182015b8281111561377957825182559160200191906001019061375e565b5b50905061378791906137c5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156137de5760008160009055506001016137c6565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613821826137f6565b9050919050565b61383181613816565b811461383c57600080fd5b50565b60008135905061384e81613828565b92915050565b60006020828403121561386a576138696137ec565b5b60006138788482850161383f565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138b681613881565b81146138c157600080fd5b50565b6000813590506138d3816138ad565b92915050565b6000602082840312156138ef576138ee6137ec565b5b60006138fd848285016138c4565b91505092915050565b60008115159050919050565b61391b81613906565b82525050565b60006020820190506139366000830184613912565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561397657808201518184015260208101905061395b565b83811115613985576000848401525b50505050565b6000601f19601f8301169050919050565b60006139a78261393c565b6139b18185613947565b93506139c1818560208601613958565b6139ca8161398b565b840191505092915050565b600060208201905081810360008301526139ef818461399c565b905092915050565b6000819050919050565b613a0a816139f7565b8114613a1557600080fd5b50565b600081359050613a2781613a01565b92915050565b600060208284031215613a4357613a426137ec565b5b6000613a5184828501613a18565b91505092915050565b613a6381613816565b82525050565b6000602082019050613a7e6000830184613a5a565b92915050565b60008060408385031215613a9b57613a9a6137ec565b5b6000613aa98582860161383f565b9250506020613aba85828601613a18565b9150509250929050565b613acd816139f7565b82525050565b6000602082019050613ae86000830184613ac4565b92915050565b600080600060608486031215613b0757613b066137ec565b5b6000613b158682870161383f565b9350506020613b268682870161383f565b9250506040613b3786828701613a18565b9150509250925092565b600060ff82169050919050565b613b5781613b41565b8114613b6257600080fd5b50565b600081359050613b7481613b4e565b92915050565b6000819050919050565b613b8d81613b7a565b8114613b9857600080fd5b50565b600081359050613baa81613b84565b92915050565b60008060008060808587031215613bca57613bc96137ec565b5b6000613bd88782880161383f565b9450506020613be987828801613b65565b9350506040613bfa87828801613b9b565b9250506060613c0b87828801613b9b565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c598261398b565b810181811067ffffffffffffffff82111715613c7857613c77613c21565b5b80604052505050565b6000613c8b6137e2565b9050613c978282613c50565b919050565b600067ffffffffffffffff821115613cb757613cb6613c21565b5b613cc08261398b565b9050602081019050919050565b82818337600083830152505050565b6000613cef613cea84613c9c565b613c81565b905082815260208101848484011115613d0b57613d0a613c1c565b5b613d16848285613ccd565b509392505050565b600082601f830112613d3357613d32613c17565b5b8135613d43848260208601613cdc565b91505092915050565b600060208284031215613d6257613d616137ec565b5b600082013567ffffffffffffffff811115613d8057613d7f6137f1565b5b613d8c84828501613d1e565b91505092915050565b600080600080600060a08688031215613db157613db06137ec565b5b6000613dbf88828901613a18565b9550506020613dd088828901613a18565b9450506040613de188828901613b65565b9350506060613df288828901613b9b565b9250506080613e0388828901613b9b565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613e5057613e4f613e10565b5b50565b6000819050613e6182613e3f565b919050565b6000613e7182613e53565b9050919050565b613e8181613e66565b82525050565b6000602082019050613e9c6000830184613e78565b92915050565b613eab81613906565b8114613eb657600080fd5b50565b600081359050613ec881613ea2565b92915050565b60008060408385031215613ee557613ee46137ec565b5b6000613ef38582860161383f565b9250506020613f0485828601613eb9565b9150509250929050565b60008060408385031215613f2557613f246137ec565b5b6000613f3385828601613a18565b9250506020613f448582860161383f565b9150509250929050565b600067ffffffffffffffff821115613f6957613f68613c21565b5b613f728261398b565b9050602081019050919050565b6000613f92613f8d84613f4e565b613c81565b905082815260208101848484011115613fae57613fad613c1c565b5b613fb9848285613ccd565b509392505050565b600082601f830112613fd657613fd5613c17565b5b8135613fe6848260208601613f7f565b91505092915050565b60008060008060808587031215614009576140086137ec565b5b60006140178782880161383f565b94505060206140288782880161383f565b935050604061403987828801613a18565b925050606085013567ffffffffffffffff81111561405a576140596137f1565b5b61406687828801613fc1565b91505092959194509250565b60008060408385031215614089576140886137ec565b5b60006140978582860161383f565b92505060206140a88582860161383f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140e8602083613947565b91506140f3826140b2565b602082019050919050565b60006020820190508181036000830152614117816140db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061416557607f821691505b602082108114156141795761417861411e565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006141db602d83613947565b91506141e68261417f565b604082019050919050565b6000602082019050818103600083015261420a816141ce565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061426d602283613947565b915061427882614211565b604082019050919050565b6000602082019050818103600083015261429c81614260565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006142ff603983613947565b915061430a826142a3565b604082019050919050565b6000602082019050818103600083015261432e816142f2565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614391602283613947565b915061439c82614335565b604082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614423602e83613947565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b60008160601b9050919050565b600061447182614459565b9050919050565b600061448382614466565b9050919050565b61449b61449682613816565b614478565b82525050565b60006144ad828561448a565b6014820191506144bd828461448a565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061450e601c836144cd565b9150614519826144d8565b601c82019050919050565b6000819050919050565b61453f61453a82613b7a565b614524565b82525050565b600061455082614501565b915061455c828461452e565b60208201915081905092915050565b61457481613b7a565b82525050565b61458381613b41565b82525050565b600060808201905061459e600083018761456b565b6145ab602083018661457a565b6145b8604083018561456b565b6145c5606083018461456b565b95945050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614604601f83613947565b915061460f826145ce565b602082019050919050565b60006020820190508181036000830152614633816145f7565b9050919050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b6000614670601583613947565b915061467b8261463a565b602082019050919050565b6000602082019050818103600083015261469f81614663565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146e0826139f7565b91506146eb836139f7565b9250828210156146fe576146fd6146a6565b5b828203905092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614765602383613947565b915061477082614709565b604082019050919050565b6000602082019050818103600083015261479481614758565b9050919050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b60006147d1601183613947565b91506147dc8261479b565b602082019050919050565b60006020820190508181036000830152614800816147c4565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b600061483d601583613947565b915061484882614807565b602082019050919050565b6000602082019050818103600083015261486c81614830565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b60006148cf602a83613947565b91506148da82614873565b604082019050919050565b600060208201905081810360008301526148fe816148c2565b9050919050565b6000614910826139f7565b915061491b836139f7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149505761494f6146a6565b5b828201905092915050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000614991601e83613947565b915061499c8261495b565b602082019050919050565b600060208201905081810360008301526149c081614984565b9050919050565b7f4d6178696d756d204d696e74732070657220416464726573732065786365656460008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b6000614a23602383613947565b9150614a2e826149c7565b604082019050919050565b60006020820190508181036000830152614a5281614a16565b9050919050565b6000614a64826139f7565b9150614a6f836139f7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614aa857614aa76146a6565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303639206560208201527f746865722065616368204e465429000000000000000000000000000000000000604082015250565b6000614b35604e83613947565b9150614b4082614ab3565b606082019050919050565b60006020820190508181036000830152614b6481614b28565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614bc7602b83613947565b9150614bd282614b6b565b604082019050919050565b60006020820190508181036000830152614bf681614bba565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614c33601a83613947565b9150614c3e82614bfd565b602082019050919050565b60006020820190508181036000830152614c6281614c26565b9050919050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303839206560208201527f746865722065616368204e465429000000000000000000000000000000000000604082015250565b6000614ceb604e83613947565b9150614cf682614c69565b606082019050919050565b60006020820190508181036000830152614d1a81614cde565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614d7d603383613947565b9150614d8882614d21565b604082019050919050565b60006020820190508181036000830152614dac81614d70565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614e0f602f83613947565b9150614e1a82614db3565b604082019050919050565b60006020820190508181036000830152614e3e81614e02565b9050919050565b6000614e508261393c565b614e5a81856144cd565b9350614e6a818560208601613958565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614eac6005836144cd565b9150614eb782614e76565b600582019050919050565b6000614ece8285614e45565b9150614eda8284614e45565b9150614ee582614e9f565b91508190509392505050565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b6000614f27601b83613947565b9150614f3282614ef1565b602082019050919050565b60006020820190508181036000830152614f5681614f1a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fb9602683613947565b9150614fc482614f5d565b604082019050919050565b60006020820190508181036000830152614fe881614fac565b9050919050565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b6000615025601c83613947565b915061503082614fef565b602082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b60006150b7603d83613947565b91506150c28261505b565b604082019050919050565b600060208201905081810360008301526150e6816150aa565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615149603283613947565b9150615154826150ed565b604082019050919050565b600060208201905081810360008301526151788161513c565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006151db602683613947565b91506151e68261517f565b604082019050919050565b6000602082019050818103600083015261520a816151ce565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061526d602583613947565b915061527882615211565b604082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b600081905092915050565b50565b60006152be6000836152a3565b91506152c9826152ae565b600082019050919050565b60006152df826152b1565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061531f601483613947565b915061532a826152e9565b602082019050919050565b6000602082019050818103600083015261534e81615312565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006153b1602a83613947565b91506153bc82615355565b604082019050919050565b600060208201905081810360008301526153e0816153a4565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615443602f83613947565b915061544e826153e7565b604082019050919050565b6000602082019050818103600083015261547281615436565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006154a082615479565b6154aa8185615484565b93506154ba818560208601613958565b6154c38161398b565b840191505092915050565b60006080820190506154e36000830187613a5a565b6154f06020830186613a5a565b6154fd6040830185613ac4565b818103606083015261550f8184615495565b905095945050505050565b600081519050615529816138ad565b92915050565b600060208284031215615545576155446137ec565b5b60006155538482850161551a565b91505092915050565b6000615567826139f7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561559a576155996146a6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006155df826139f7565b91506155ea836139f7565b9250826155fa576155f96155a5565b5b828204905092915050565b6000615610826139f7565b915061561b836139f7565b92508261562b5761562a6155a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006156c1602183613947565b91506156cc82615665565b604082019050919050565b600060208201905081810360008301526156f0816156b4565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615753602883613947565b915061575e826156f7565b604082019050919050565b6000602082019050818103600083015261578281615746565b905091905056fea2646970667358221220a4c29ae9df12ccf17266832a4459b260850876c4e06d2ae828b802f5b035060d64736f6c63430008090033

Deployed Bytecode Sourcemap

54976:8332:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56676:8;;;61742:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41710:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43596:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45158:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44679:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39959:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56245:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46034:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40631:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55897:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57897:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56903:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62082:237;;;;;;;;;;;;;:::i;:::-;;46275:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61896:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40144:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58258:877;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62559:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43405:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56105:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42146:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43765:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45444:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63221:82;;;;;;;;;;;;;:::i;:::-;;61559:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59194:773;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60012:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46531:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56287:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62901:289;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57024:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60286:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56206:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45803:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60904:215;;;;;;;;;;;;;:::i;:::-;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61161:348;;;;;;;;;;;;;:::i;:::-;;61742:87;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61815:6:::1;61807:5;;:14;;;;;;;;;;;;;;;;;;61742:87:::0;:::o;41710:372::-;41812:4;41864:25;41849:40;;;:11;:40;;;;:105;;;;41921:33;41906:48;;;:11;:48;;;;41849:105;:172;;;;41986:35;41971:50;;;:11;:50;;;;41849:172;:225;;;;42038:36;42062:11;42038:23;:36::i;:::-;41849:225;41829:245;;41710:372;;;:::o;43596:100::-;43650:13;43683:5;43676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43596:100;:::o;45158:214::-;45226:7;45254:16;45262:7;45254;:16::i;:::-;45246:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45340:15;:24;45356:7;45340:24;;;;;;;;;;;;;;;;;;;;;45333:31;;45158:214;;;:::o;44679:413::-;44752:13;44768:24;44784:7;44768:15;:24::i;:::-;44752:40;;44817:5;44811:11;;:2;:11;;;;44803:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44912:5;44896:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44921:37;44938:5;44945:12;:10;:12::i;:::-;44921:16;:37::i;:::-;44896:62;44874:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;45056:28;45065:2;45069:7;45078:5;45056:8;:28::i;:::-;44741:351;44679:413;;:::o;39959:108::-;40020:7;40047:12;;40040:19;;39959:108;:::o;56245:35::-;;;;:::o;46034:170::-;46168:28;46178:4;46184:2;46188:7;46168:9;:28::i;:::-;46034:170;;;:::o;40631:1007::-;40720:7;40756:16;40766:5;40756:9;:16::i;:::-;40748:5;:24;40740:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40822:22;40847:13;:11;:13::i;:::-;40822:38;;40871:19;40901:25;41090:9;41085:466;41105:14;41101:1;:18;41085:466;;;41145:31;41179:11;:14;41191:1;41179:14;;;;;;;;;;;41145:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41242:1;41216:28;;:9;:14;;;:28;;;41212:111;;41289:9;:14;;;41269:34;;41212:111;41366:5;41345:26;;:17;:26;;;41341:195;;;41415:5;41400:11;:20;41396:85;;;41456:1;41449:8;;;;;;;;;41396:85;41503:13;;;;;;;41341:195;41126:425;41121:3;;;;;;;41085:466;;;;41574:56;;;;;;;;;;:::i;:::-;;;;;;;;40631:1007;;;;;:::o;55897:50::-;;;;;;;;;;;;;;;;;:::o;57897:306::-;57996:4;58013:12;58063:4;58070;58038:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58028:48;;;;;;58013:63;;58103:92;58176:4;58123:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;58113:69;;;;;;58184:2;58188;58192;58103:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58094:101;;:5;;;;;;;;;;;:101;;;58087:108;;;57897:306;;;;;;:::o;56903:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56996:8:::1;56978:15;:26;;;;;;;;;;;;:::i;:::-;;56903:109:::0;:::o;62082:237::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1:::1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;62142:15:::2;62160:16;:14;:16::i;:::-;62142:34;;62205:1;62195:7;:11;62187:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;62245:36;62263:7;:5;:7::i;:::-;62273;62245:9;:36::i;:::-;62131:188;36308:1:::1;37262:7;:22;;;;62082:237::o:0;46275:185::-;46413:39;46430:4;46436:2;46440:7;46413:39;;;;;;;;;;;;:16;:39::i;:::-;46275:185;;;:::o;61896:124::-;61955:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61998:14:::1;;61979:16;;:33;;;;:::i;:::-;61972:40;;61896:124:::0;:::o;40144:187::-;40211:7;40247:13;:11;:13::i;:::-;40239:5;:21;40231:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40318:5;40311:12;;40144:187;;;:::o;58258:877::-;58359:2;58364;58368;57399:41;57420:10;57431:2;57434;57437;57399:20;:41::i;:::-;57390:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1:::1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;58411:16:::2;58430:11;:9;:11::i;:::-;58411:30;;58474:12;58460:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;58452:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58630:16;58616:30:::0;::::2;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;58608:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58738:14;;58728:6;58712:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;58704:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58846:7;58836:6;58806:15;:27;58822:10;58806:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;58798:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;58938:6;58925:10;:8;:10::i;:::-;:19;;;;:::i;:::-;58912:9;:32;;58904:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;59048:29;59058:10;59070:6;59048:9;:29::i;:::-;59119:6;59088:15;:27;59104:10;59088:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;58400:735;36308:1:::1;37262:7;:22;;;;58258:877:::0;;;;;;;;:::o;62559:297::-;62600:5;62642:1;62621:17;;:22;62617:232;;;62667:12;62660:19;;;;62617:232;62734:1;62710:20;;:25;62706:143;;;62759:13;62752:20;;;;62706:143;62821:16;62814:23;;62559:297;;:::o;43405:124::-;43469:7;43496:20;43508:7;43496:11;:20::i;:::-;:25;;;43489:32;;43405:124;;;:::o;56105:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42146:221::-;42210:7;42255:1;42238:19;;:5;:19;;;;42230:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;42331:12;:19;42344:5;42331:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42323:36;;42316:43;;42146:221;;;:::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;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;43765:104::-;43821:13;43854:7;43847:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43765:104;:::o;45444:288::-;45551:12;:10;:12::i;:::-;45539:24;;:8;:24;;;;45531:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;45652:8;45607:18;:32;45626:12;:10;:12::i;:::-;45607:32;;;;;;;;;;;;;;;:42;45640:8;45607:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;45705:8;45676:48;;45691:12;:10;:12::i;:::-;45676:48;;;45715:8;45676:48;;;;;;:::i;:::-;;;;;;;;45444:288;;:::o;63221:82::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63280:15:::1;63267:10;:28;;;;63221:82::o:0;61559:109::-;61615:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61639:21:::1;61632:28;;61559:109:::0;:::o;59194:773::-;36352:1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;59273:16:::1;59292:11;:9;:11::i;:::-;59273:30;;59336:12;59322:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;59314:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59492:13;59478:27;;;;;;;;:::i;:::-;;:10;:27;;;;;;;;:::i;:::-;;;;59470:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;59597:14;;59587:6;59571:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;59563:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;59675:12;;59665:6;:22;;59657:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59772:6;59759:10;:8;:10::i;:::-;:19;;;;:::i;:::-;59746:9;:32;;59738:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;59882:29;59892:10;59904:6;59882:9;:29::i;:::-;59953:6;59922:15;:27;59938:10;59922:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;59262:705;36308:1:::0;37262:7;:22;;;;59194:773;:::o;60012:266::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60133:16:::1;;60123:6;60106:14;;:23;;;;:::i;:::-;:43;;60098:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;60195:28;60205:9;60216:6;60195:9;:28::i;:::-;60264:6;60234:15;:26;60250:9;60234:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;60012:266:::0;;:::o;46531:355::-;46690:28;46700:4;46706:2;46710:7;46690:9;:28::i;:::-;46751:48;46774:4;46780:2;46784:7;46793:5;46751:22;:48::i;:::-;46729:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;46531:355;;;;:::o;56287:25::-;;;;:::o;62901:289::-;62941:7;62961:16;62980:11;:9;:11::i;:::-;62961:30;;63020:12;63006:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;:57;;;;63050:13;63036:27;;;;;;;;:::i;:::-;;:10;:27;;;;;;;;:::i;:::-;;;63006:57;63002:179;;;63087:15;;63080:22;;;;;63002:179;63151:18;;63144:25;;;62901:289;;:::o;57024:125::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57127:14:::1;57111:13;:30;;;;;;;;;;;;:::i;:::-;;57024:125:::0;:::o;60286:568::-;60360:13;60394:17;60402:8;60394:7;:17::i;:::-;60386:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;60589:1;60575:10;;:15;60571:272;;;60614:13;60607:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60571:272;60679:21;60703:10;:8;:10::i;:::-;60679:34;;60759:1;60741:7;60735:21;:25;:96;;;;;;;;;;;;;;;;;60787:7;60796:19;:8;:17;:19::i;:::-;60770:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60735:96;60728:103;;;60286:568;;;;:::o;56206:32::-;;;;:::o;45803:164::-;45900:4;45924:18;:25;45943:5;45924:25;;;;;;;;;;;;;;;:35;45950:8;45924:35;;;;;;;;;;;;;;;;;;;;;;;;;45917:42;;45803:164;;;;:::o;60904:215::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60958:16:::1;60977:11;:9;:11::i;:::-;60958:30;;61021:12;61007:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;60999:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61096:15;61076:17;:35;;;;60947:172;60904:215::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;61161:348::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61219:16:::1;61238:11;:9;:11::i;:::-;61219:30;;61282:16;61268:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;61260:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61364:12;61350:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;61342:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;61486:15;61463:20;:38;;;;61208:301;61161:348::o:0;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15922:157::-;16007:4;16046:25;16031:40;;;:11;:40;;;;16024:47;;15922:157;;;:::o;47141:111::-;47198:4;47232:12;;47222:7;:22;47215:29;;47141:111;;;:::o;52061:196::-;52203:2;52176:15;:24;52192:7;52176:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52241:7;52237:2;52221:28;;52230:5;52221:28;;;;;;;;;;;;52061:196;;;:::o;49941:2002::-;50056:35;50094:20;50106:7;50094:11;:20::i;:::-;50056:58;;50127:22;50169:13;:18;;;50153:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;50228:12;:10;:12::i;:::-;50204:36;;:20;50216:7;50204:11;:20::i;:::-;:36;;;50153:87;:154;;;;50257:50;50274:13;:18;;;50294:12;:10;:12::i;:::-;50257:16;:50::i;:::-;50153:154;50127:181;;50329:17;50321:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;50444:4;50422:26;;:13;:18;;;:26;;;50414:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50524:1;50510:16;;:2;:16;;;;50502:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50581:43;50603:4;50609:2;50613:7;50622:1;50581:21;:43::i;:::-;50689:49;50706:1;50710:7;50719:13;:18;;;50689:8;:49::i;:::-;51064:1;51034:12;:18;51047:4;51034:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51108:1;51080:12;:16;51093:2;51080:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51154:2;51126:11;:20;51138:7;51126:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;51216:15;51171:11;:20;51183:7;51171:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;51484:19;51516:1;51506:7;:11;51484:33;;51577:1;51536:43;;:11;:24;51548:11;51536:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;51532:295;;;51604:20;51612:11;51604:7;:20::i;:::-;51600:212;;;51681:13;:18;;;51649:11;:24;51661:11;51649:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;51764:13;:28;;;51722:11;:24;51734:11;51722:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;51600:212;51532:295;51009:829;51874:7;51870:2;51855:27;;51864:4;51855:27;;;;;;;;;;;;51893:42;51914:4;51920:2;51924:7;51933:1;51893:20;:42::i;:::-;50045:1898;;49941:2002;;;:::o;62327:183::-;62408:9;62423:7;:12;;62443:6;62423:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62407:47;;;62473:4;62465:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;62396:114;62327:183;;:::o;47260:104::-;47329:27;47339:2;47343:8;47329:27;;;;;;;;;;;;:9;:27::i;:::-;47260:104;;:::o;42806:537::-;42867:21;;:::i;:::-;42909:16;42917:7;42909;:16::i;:::-;42901:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43015:12;43030:7;43015:22;;43010:245;43047:1;43039:4;:9;43010:245;;43077:31;43111:11;:17;43123:4;43111:17;;;;;;;;;;;43077:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43177:1;43151:28;;:9;:14;;;:28;;;43147:93;;43211:9;43204:16;;;;;;43147:93;43058:197;43050:6;;;;;;;;43010:245;;;;43278:57;;;;;;;;;;:::i;:::-;;;;;;;;42806:537;;;;:::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;52822:804::-;52977:4;52998:15;:2;:13;;;:15::i;:::-;52994:625;;;53050:2;53034:36;;;53071:12;:10;:12::i;:::-;53085:4;53091:7;53100:5;53034:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53030:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53297:1;53280:6;:13;:18;53276:273;;;53323:61;;;;;;;;;;:::i;:::-;;;;;;;;53276:273;53499:6;53493:13;53484:6;53480:2;53476:15;53469:38;53030:534;53167:45;;;53157:55;;;:6;:55;;;;53150:62;;;;;52994:625;53603:4;53596:11;;52822:804;;;;;;;:::o;56729:116::-;56789:13;56822:15;56815:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56729: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;54114:159::-;;;;;:::o;54685:158::-;;;;;:::o;47727:163::-;47850:32;47856:2;47860:8;47870:5;47877:4;47850:5;:32::i;:::-;47727:163;;;:::o;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;48149:1538::-;48288:20;48311:12;;48288:35;;48356:1;48342:16;;:2;:16;;;;48334:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48427:1;48415:8;:13;;48407:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48486:61;48516:1;48520:2;48524:12;48538:8;48486:21;:61::i;:::-;48861:8;48825:12;:16;48838:2;48825:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48926:8;48885:12;:16;48898:2;48885:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48985:2;48952:11;:25;48964:12;48952:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;49052:15;49002:11;:25;49014:12;49002:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;49085:20;49108:12;49085:35;;49142:9;49137:415;49157:8;49153:1;:12;49137:415;;;49221:12;49217:2;49196:38;;49213:1;49196:38;;;;;;;;;;;;49257:4;49253:249;;;49320:59;49351:1;49355:2;49359:12;49373:5;49320:22;:59::i;:::-;49286:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;49253:249;49522:14;;;;;;;49167:3;;;;;;;49137:415;;;;49583:12;49568;:27;;;;48800:807;49619:60;49648:1;49652:2;49656:12;49670:8;49619:20;:60::i;:::-;48277:1410;48149:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:149::-;1212:7;1252:66;1245:5;1241:78;1230:89;;1176:149;;;:::o;1331:120::-;1403:23;1420:5;1403:23;:::i;:::-;1396:5;1393:34;1383:62;;1441:1;1438;1431:12;1383:62;1331:120;:::o;1457:137::-;1502:5;1540:6;1527:20;1518:29;;1556:32;1582:5;1556:32;:::i;:::-;1457:137;;;;:::o;1600:327::-;1658:6;1707:2;1695:9;1686:7;1682:23;1678:32;1675:119;;;1713:79;;:::i;:::-;1675:119;1833:1;1858:52;1902:7;1893:6;1882:9;1878:22;1858:52;:::i;:::-;1848:62;;1804:116;1600:327;;;;:::o;1933:90::-;1967:7;2010:5;2003:13;1996:21;1985:32;;1933:90;;;:::o;2029:109::-;2110:21;2125:5;2110:21;:::i;:::-;2105:3;2098:34;2029:109;;:::o;2144:210::-;2231:4;2269:2;2258:9;2254:18;2246:26;;2282:65;2344:1;2333:9;2329:17;2320:6;2282:65;:::i;:::-;2144:210;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:86::-;6285:7;6325:4;6318:5;6314:16;6303:27;;6250:86;;;:::o;6342:118::-;6413:22;6429:5;6413:22;:::i;:::-;6406:5;6403:33;6393:61;;6450:1;6447;6440:12;6393:61;6342:118;:::o;6466:135::-;6510:5;6548:6;6535:20;6526:29;;6564:31;6589:5;6564:31;:::i;:::-;6466:135;;;;:::o;6607:77::-;6644:7;6673:5;6662:16;;6607:77;;;:::o;6690:122::-;6763:24;6781:5;6763:24;:::i;:::-;6756:5;6753:35;6743:63;;6802:1;6799;6792:12;6743:63;6690:122;:::o;6818:139::-;6864:5;6902:6;6889:20;6880:29;;6918:33;6945:5;6918:33;:::i;:::-;6818:139;;;;:::o;6963:761::-;7047:6;7055;7063;7071;7120:3;7108:9;7099:7;7095:23;7091:33;7088:120;;;7127:79;;:::i;:::-;7088:120;7247:1;7272:53;7317:7;7308:6;7297:9;7293:22;7272:53;:::i;:::-;7262:63;;7218:117;7374:2;7400:51;7443:7;7434:6;7423:9;7419:22;7400:51;:::i;:::-;7390:61;;7345:116;7500:2;7526:53;7571:7;7562:6;7551:9;7547:22;7526:53;:::i;:::-;7516:63;;7471:118;7628:2;7654:53;7699:7;7690:6;7679:9;7675:22;7654:53;:::i;:::-;7644:63;;7599:118;6963:761;;;;;;;:::o;7730:117::-;7839:1;7836;7829:12;7853:117;7962:1;7959;7952:12;7976:180;8024:77;8021:1;8014:88;8121:4;8118:1;8111:15;8145:4;8142:1;8135:15;8162:281;8245:27;8267:4;8245:27;:::i;:::-;8237:6;8233:40;8375:6;8363:10;8360:22;8339:18;8327:10;8324:34;8321:62;8318:88;;;8386:18;;:::i;:::-;8318:88;8426:10;8422:2;8415:22;8205:238;8162:281;;:::o;8449:129::-;8483:6;8510:20;;:::i;:::-;8500:30;;8539:33;8567:4;8559:6;8539:33;:::i;:::-;8449:129;;;:::o;8584:308::-;8646:4;8736:18;8728:6;8725:30;8722:56;;;8758:18;;:::i;:::-;8722:56;8796:29;8818:6;8796:29;:::i;:::-;8788:37;;8880:4;8874;8870:15;8862:23;;8584:308;;;:::o;8898:154::-;8982:6;8977:3;8972;8959:30;9044:1;9035:6;9030:3;9026:16;9019:27;8898:154;;;:::o;9058:412::-;9136:5;9161:66;9177:49;9219:6;9177:49;:::i;:::-;9161:66;:::i;:::-;9152:75;;9250:6;9243:5;9236:21;9288:4;9281:5;9277:16;9326:3;9317:6;9312:3;9308:16;9305:25;9302:112;;;9333:79;;:::i;:::-;9302:112;9423:41;9457:6;9452:3;9447;9423:41;:::i;:::-;9142:328;9058:412;;;;;:::o;9490:340::-;9546:5;9595:3;9588:4;9580:6;9576:17;9572:27;9562:122;;9603:79;;:::i;:::-;9562:122;9720:6;9707:20;9745:79;9820:3;9812:6;9805:4;9797:6;9793:17;9745:79;:::i;:::-;9736:88;;9552:278;9490:340;;;;:::o;9836:509::-;9905:6;9954:2;9942:9;9933:7;9929:23;9925:32;9922:119;;;9960:79;;:::i;:::-;9922:119;10108:1;10097:9;10093:17;10080:31;10138:18;10130:6;10127:30;10124:117;;;10160:79;;:::i;:::-;10124:117;10265:63;10320:7;10311:6;10300:9;10296:22;10265:63;:::i;:::-;10255:73;;10051:287;9836:509;;;;:::o;10351:907::-;10444:6;10452;10460;10468;10476;10525:3;10513:9;10504:7;10500:23;10496:33;10493:120;;;10532:79;;:::i;:::-;10493:120;10652:1;10677:53;10722:7;10713:6;10702:9;10698:22;10677:53;:::i;:::-;10667:63;;10623:117;10779:2;10805:53;10850:7;10841:6;10830:9;10826:22;10805:53;:::i;:::-;10795:63;;10750:118;10907:2;10933:51;10976:7;10967:6;10956:9;10952:22;10933:51;:::i;:::-;10923:61;;10878:116;11033:2;11059:53;11104:7;11095:6;11084:9;11080:22;11059:53;:::i;:::-;11049:63;;11004:118;11161:3;11188:53;11233:7;11224:6;11213:9;11209:22;11188:53;:::i;:::-;11178:63;;11132:119;10351:907;;;;;;;;:::o;11264:180::-;11312:77;11309:1;11302:88;11409:4;11406:1;11399:15;11433:4;11430:1;11423:15;11450:115;11533:1;11526:5;11523:12;11513:46;;11539:18;;:::i;:::-;11513:46;11450:115;:::o;11571:131::-;11618:7;11647:5;11636:16;;11653:43;11690:5;11653:43;:::i;:::-;11571:131;;;:::o;11708:::-;11766:9;11799:34;11827:5;11799:34;:::i;:::-;11786:47;;11708:131;;;:::o;11845:147::-;11940:45;11979:5;11940:45;:::i;:::-;11935:3;11928:58;11845:147;;:::o;11998:238::-;12099:4;12137:2;12126:9;12122:18;12114:26;;12150:79;12226:1;12215:9;12211:17;12202:6;12150:79;:::i;:::-;11998:238;;;;:::o;12242:116::-;12312:21;12327:5;12312:21;:::i;:::-;12305:5;12302:32;12292:60;;12348:1;12345;12338:12;12292:60;12242:116;:::o;12364:133::-;12407:5;12445:6;12432:20;12423:29;;12461:30;12485:5;12461:30;:::i;:::-;12364:133;;;;:::o;12503:468::-;12568:6;12576;12625:2;12613:9;12604:7;12600:23;12596:32;12593:119;;;12631:79;;:::i;:::-;12593:119;12751:1;12776:53;12821:7;12812:6;12801:9;12797:22;12776:53;:::i;:::-;12766:63;;12722:117;12878:2;12904:50;12946:7;12937:6;12926:9;12922:22;12904:50;:::i;:::-;12894:60;;12849:115;12503:468;;;;;:::o;12977:474::-;13045:6;13053;13102:2;13090:9;13081:7;13077:23;13073:32;13070:119;;;13108:79;;:::i;:::-;13070:119;13228:1;13253:53;13298:7;13289:6;13278:9;13274:22;13253:53;:::i;:::-;13243:63;;13199:117;13355:2;13381:53;13426:7;13417:6;13406:9;13402:22;13381:53;:::i;:::-;13371:63;;13326:118;12977:474;;;;;:::o;13457:307::-;13518:4;13608:18;13600:6;13597:30;13594:56;;;13630:18;;:::i;:::-;13594:56;13668:29;13690:6;13668:29;:::i;:::-;13660:37;;13752:4;13746;13742:15;13734:23;;13457:307;;;:::o;13770:410::-;13847:5;13872:65;13888:48;13929:6;13888:48;:::i;:::-;13872:65;:::i;:::-;13863:74;;13960:6;13953:5;13946:21;13998:4;13991:5;13987:16;14036:3;14027:6;14022:3;14018:16;14015:25;14012:112;;;14043:79;;:::i;:::-;14012:112;14133:41;14167:6;14162:3;14157;14133:41;:::i;:::-;13853:327;13770:410;;;;;:::o;14199:338::-;14254:5;14303:3;14296:4;14288:6;14284:17;14280:27;14270:122;;14311:79;;:::i;:::-;14270:122;14428:6;14415:20;14453:78;14527:3;14519:6;14512:4;14504:6;14500:17;14453:78;:::i;:::-;14444:87;;14260:277;14199:338;;;;:::o;14543:943::-;14638:6;14646;14654;14662;14711:3;14699:9;14690:7;14686:23;14682:33;14679:120;;;14718:79;;:::i;:::-;14679:120;14838:1;14863:53;14908:7;14899:6;14888:9;14884:22;14863:53;:::i;:::-;14853:63;;14809:117;14965:2;14991:53;15036:7;15027:6;15016:9;15012:22;14991:53;:::i;:::-;14981:63;;14936:118;15093:2;15119:53;15164:7;15155:6;15144:9;15140:22;15119:53;:::i;:::-;15109:63;;15064:118;15249:2;15238:9;15234:18;15221:32;15280:18;15272:6;15269:30;15266:117;;;15302:79;;:::i;:::-;15266:117;15407:62;15461:7;15452:6;15441:9;15437:22;15407:62;:::i;:::-;15397:72;;15192:287;14543:943;;;;;;;:::o;15492:474::-;15560:6;15568;15617:2;15605:9;15596:7;15592:23;15588:32;15585:119;;;15623:79;;:::i;:::-;15585:119;15743:1;15768:53;15813:7;15804:6;15793:9;15789:22;15768:53;:::i;:::-;15758:63;;15714:117;15870:2;15896:53;15941:7;15932:6;15921:9;15917:22;15896:53;:::i;:::-;15886:63;;15841:118;15492:474;;;;;:::o;15972:182::-;16112:34;16108:1;16100:6;16096:14;16089:58;15972:182;:::o;16160:366::-;16302:3;16323:67;16387:2;16382:3;16323:67;:::i;:::-;16316:74;;16399:93;16488:3;16399:93;:::i;:::-;16517:2;16512:3;16508:12;16501:19;;16160:366;;;:::o;16532:419::-;16698:4;16736:2;16725:9;16721:18;16713:26;;16785:9;16779:4;16775:20;16771:1;16760:9;16756:17;16749:47;16813:131;16939:4;16813:131;:::i;:::-;16805:139;;16532:419;;;:::o;16957:180::-;17005:77;17002:1;16995:88;17102:4;17099:1;17092:15;17126:4;17123:1;17116:15;17143:320;17187:6;17224:1;17218:4;17214:12;17204:22;;17271:1;17265:4;17261:12;17292:18;17282:81;;17348:4;17340:6;17336:17;17326:27;;17282:81;17410:2;17402:6;17399:14;17379:18;17376:38;17373:84;;;17429:18;;:::i;:::-;17373:84;17194:269;17143:320;;;:::o;17469:232::-;17609:34;17605:1;17597:6;17593:14;17586:58;17678:15;17673:2;17665:6;17661:15;17654:40;17469:232;:::o;17707:366::-;17849:3;17870:67;17934:2;17929:3;17870:67;:::i;:::-;17863:74;;17946:93;18035:3;17946:93;:::i;:::-;18064:2;18059:3;18055:12;18048:19;;17707:366;;;:::o;18079:419::-;18245:4;18283:2;18272:9;18268:18;18260:26;;18332:9;18326:4;18322:20;18318:1;18307:9;18303:17;18296:47;18360:131;18486:4;18360:131;:::i;:::-;18352:139;;18079:419;;;:::o;18504:221::-;18644:34;18640:1;18632:6;18628:14;18621:58;18713:4;18708:2;18700:6;18696:15;18689:29;18504:221;:::o;18731:366::-;18873:3;18894:67;18958:2;18953:3;18894:67;:::i;:::-;18887:74;;18970:93;19059:3;18970:93;:::i;:::-;19088:2;19083:3;19079:12;19072:19;;18731:366;;;:::o;19103:419::-;19269:4;19307:2;19296:9;19292:18;19284:26;;19356:9;19350:4;19346:20;19342:1;19331:9;19327:17;19320:47;19384:131;19510:4;19384:131;:::i;:::-;19376:139;;19103:419;;;:::o;19528:244::-;19668:34;19664:1;19656:6;19652:14;19645:58;19737:27;19732:2;19724:6;19720:15;19713:52;19528:244;:::o;19778:366::-;19920:3;19941:67;20005:2;20000:3;19941:67;:::i;:::-;19934:74;;20017:93;20106:3;20017:93;:::i;:::-;20135:2;20130:3;20126:12;20119:19;;19778:366;;;:::o;20150:419::-;20316:4;20354:2;20343:9;20339:18;20331:26;;20403:9;20397:4;20393:20;20389:1;20378:9;20374:17;20367:47;20431:131;20557:4;20431:131;:::i;:::-;20423:139;;20150:419;;;:::o;20575:221::-;20715:34;20711:1;20703:6;20699:14;20692:58;20784:4;20779:2;20771:6;20767:15;20760:29;20575:221;:::o;20802:366::-;20944:3;20965:67;21029:2;21024:3;20965:67;:::i;:::-;20958:74;;21041:93;21130:3;21041:93;:::i;:::-;21159:2;21154:3;21150:12;21143:19;;20802:366;;;:::o;21174:419::-;21340:4;21378:2;21367:9;21363:18;21355:26;;21427:9;21421:4;21417:20;21413:1;21402:9;21398:17;21391:47;21455:131;21581:4;21455:131;:::i;:::-;21447:139;;21174:419;;;:::o;21599:233::-;21739:34;21735:1;21727:6;21723:14;21716:58;21808:16;21803:2;21795:6;21791:15;21784:41;21599:233;:::o;21838:366::-;21980:3;22001:67;22065:2;22060:3;22001:67;:::i;:::-;21994:74;;22077:93;22166:3;22077:93;:::i;:::-;22195:2;22190:3;22186:12;22179:19;;21838:366;;;:::o;22210:419::-;22376:4;22414:2;22403:9;22399:18;22391:26;;22463:9;22457:4;22453:20;22449:1;22438:9;22434:17;22427:47;22491:131;22617:4;22491:131;:::i;:::-;22483:139;;22210:419;;;:::o;22635:94::-;22668:8;22716:5;22712:2;22708:14;22687:35;;22635:94;;;:::o;22735:::-;22774:7;22803:20;22817:5;22803:20;:::i;:::-;22792:31;;22735:94;;;:::o;22835:100::-;22874:7;22903:26;22923:5;22903:26;:::i;:::-;22892:37;;22835:100;;;:::o;22941:157::-;23046:45;23066:24;23084:5;23066:24;:::i;:::-;23046:45;:::i;:::-;23041:3;23034:58;22941:157;;:::o;23104:397::-;23244:3;23259:75;23330:3;23321:6;23259:75;:::i;:::-;23359:2;23354:3;23350:12;23343:19;;23372:75;23443:3;23434:6;23372:75;:::i;:::-;23472:2;23467:3;23463:12;23456:19;;23492:3;23485:10;;23104:397;;;;;:::o;23507:148::-;23609:11;23646:3;23631:18;;23507:148;;;;:::o;23661:214::-;23801:66;23797:1;23789:6;23785:14;23778:90;23661:214;:::o;23881:402::-;24041:3;24062:85;24144:2;24139:3;24062:85;:::i;:::-;24055:92;;24156:93;24245:3;24156:93;:::i;:::-;24274:2;24269:3;24265:12;24258:19;;23881:402;;;:::o;24289:79::-;24328:7;24357:5;24346:16;;24289:79;;;:::o;24374:157::-;24479:45;24499:24;24517:5;24499:24;:::i;:::-;24479:45;:::i;:::-;24474:3;24467:58;24374:157;;:::o;24537:522::-;24750:3;24772:148;24916:3;24772:148;:::i;:::-;24765:155;;24930:75;25001:3;24992:6;24930:75;:::i;:::-;25030:2;25025:3;25021:12;25014:19;;25050:3;25043:10;;24537:522;;;;:::o;25065:118::-;25152:24;25170:5;25152:24;:::i;:::-;25147:3;25140:37;25065:118;;:::o;25189:112::-;25272:22;25288:5;25272:22;:::i;:::-;25267:3;25260:35;25189:112;;:::o;25307:545::-;25480:4;25518:3;25507:9;25503:19;25495:27;;25532:71;25600:1;25589:9;25585:17;25576:6;25532:71;:::i;:::-;25613:68;25677:2;25666:9;25662:18;25653:6;25613:68;:::i;:::-;25691:72;25759:2;25748:9;25744:18;25735:6;25691:72;:::i;:::-;25773;25841:2;25830:9;25826:18;25817:6;25773:72;:::i;:::-;25307:545;;;;;;;:::o;25858:181::-;25998:33;25994:1;25986:6;25982:14;25975:57;25858:181;:::o;26045:366::-;26187:3;26208:67;26272:2;26267:3;26208:67;:::i;:::-;26201:74;;26284:93;26373:3;26284:93;:::i;:::-;26402:2;26397:3;26393:12;26386:19;;26045:366;;;:::o;26417:419::-;26583:4;26621:2;26610:9;26606:18;26598:26;;26670:9;26664:4;26660:20;26656:1;26645:9;26641:17;26634:47;26698:131;26824:4;26698:131;:::i;:::-;26690:139;;26417:419;;;:::o;26842:171::-;26982:23;26978:1;26970:6;26966:14;26959:47;26842:171;:::o;27019:366::-;27161:3;27182:67;27246:2;27241:3;27182:67;:::i;:::-;27175:74;;27258:93;27347:3;27258:93;:::i;:::-;27376:2;27371:3;27367:12;27360:19;;27019:366;;;:::o;27391:419::-;27557:4;27595:2;27584:9;27580:18;27572:26;;27644:9;27638:4;27634:20;27630:1;27619:9;27615:17;27608:47;27672:131;27798:4;27672:131;:::i;:::-;27664:139;;27391:419;;;:::o;27816:180::-;27864:77;27861:1;27854:88;27961:4;27958:1;27951:15;27985:4;27982:1;27975:15;28002:191;28042:4;28062:20;28080:1;28062:20;:::i;:::-;28057:25;;28096:20;28114:1;28096:20;:::i;:::-;28091:25;;28135:1;28132;28129:8;28126:34;;;28140:18;;:::i;:::-;28126:34;28185:1;28182;28178:9;28170:17;;28002:191;;;;:::o;28199:222::-;28339:34;28335:1;28327:6;28323:14;28316:58;28408:5;28403:2;28395:6;28391:15;28384:30;28199:222;:::o;28427:366::-;28569:3;28590:67;28654:2;28649:3;28590:67;:::i;:::-;28583:74;;28666:93;28755:3;28666:93;:::i;:::-;28784:2;28779:3;28775:12;28768:19;;28427:366;;;:::o;28799:419::-;28965:4;29003:2;28992:9;28988:18;28980:26;;29052:9;29046:4;29042:20;29038:1;29027:9;29023:17;29016:47;29080:131;29206:4;29080:131;:::i;:::-;29072:139;;28799:419;;;:::o;29224:167::-;29364:19;29360:1;29352:6;29348:14;29341:43;29224:167;:::o;29397:366::-;29539:3;29560:67;29624:2;29619:3;29560:67;:::i;:::-;29553:74;;29636:93;29725:3;29636:93;:::i;:::-;29754:2;29749:3;29745:12;29738:19;;29397:366;;;:::o;29769:419::-;29935:4;29973:2;29962:9;29958:18;29950:26;;30022:9;30016:4;30012:20;30008:1;29997:9;29993:17;29986:47;30050:131;30176:4;30050:131;:::i;:::-;30042:139;;29769:419;;;:::o;30194:171::-;30334:23;30330:1;30322:6;30318:14;30311:47;30194:171;:::o;30371:366::-;30513:3;30534:67;30598:2;30593:3;30534:67;:::i;:::-;30527:74;;30610:93;30699:3;30610:93;:::i;:::-;30728:2;30723:3;30719:12;30712:19;;30371:366;;;:::o;30743:419::-;30909:4;30947:2;30936:9;30932:18;30924:26;;30996:9;30990:4;30986:20;30982:1;30971:9;30967:17;30960:47;31024:131;31150:4;31024:131;:::i;:::-;31016:139;;30743:419;;;:::o;31168:229::-;31308:34;31304:1;31296:6;31292:14;31285:58;31377:12;31372:2;31364:6;31360:15;31353:37;31168:229;:::o;31403:366::-;31545:3;31566:67;31630:2;31625:3;31566:67;:::i;:::-;31559:74;;31642:93;31731:3;31642:93;:::i;:::-;31760:2;31755:3;31751:12;31744:19;;31403:366;;;:::o;31775:419::-;31941:4;31979:2;31968:9;31964:18;31956:26;;32028:9;32022:4;32018:20;32014:1;32003:9;31999:17;31992:47;32056:131;32182:4;32056:131;:::i;:::-;32048:139;;31775:419;;;:::o;32200:305::-;32240:3;32259:20;32277:1;32259:20;:::i;:::-;32254:25;;32293:20;32311:1;32293:20;:::i;:::-;32288:25;;32447:1;32379:66;32375:74;32372:1;32369:81;32366:107;;;32453:18;;:::i;:::-;32366:107;32497:1;32494;32490:9;32483:16;;32200:305;;;;:::o;32511:180::-;32651:32;32647:1;32639:6;32635:14;32628:56;32511:180;:::o;32697:366::-;32839:3;32860:67;32924:2;32919:3;32860:67;:::i;:::-;32853:74;;32936:93;33025:3;32936:93;:::i;:::-;33054:2;33049:3;33045:12;33038:19;;32697:366;;;:::o;33069:419::-;33235:4;33273:2;33262:9;33258:18;33250:26;;33322:9;33316:4;33312:20;33308:1;33297:9;33293:17;33286:47;33350:131;33476:4;33350:131;:::i;:::-;33342:139;;33069:419;;;:::o;33494:222::-;33634:34;33630:1;33622:6;33618:14;33611:58;33703:5;33698:2;33690:6;33686:15;33679:30;33494:222;:::o;33722:366::-;33864:3;33885:67;33949:2;33944:3;33885:67;:::i;:::-;33878:74;;33961:93;34050:3;33961:93;:::i;:::-;34079:2;34074:3;34070:12;34063:19;;33722:366;;;:::o;34094:419::-;34260:4;34298:2;34287:9;34283:18;34275:26;;34347:9;34341:4;34337:20;34333:1;34322:9;34318:17;34311:47;34375:131;34501:4;34375:131;:::i;:::-;34367:139;;34094:419;;;:::o;34519:348::-;34559:7;34582:20;34600:1;34582:20;:::i;:::-;34577:25;;34616:20;34634:1;34616:20;:::i;:::-;34611:25;;34804:1;34736:66;34732:74;34729:1;34726:81;34721:1;34714:9;34707:17;34703:105;34700:131;;;34811:18;;:::i;:::-;34700:131;34859:1;34856;34852:9;34841:20;;34519:348;;;;:::o;34873:302::-;35013:34;35009:1;35001:6;34997:14;34990:58;35082:34;35077:2;35069:6;35065:15;35058:59;35151:16;35146:2;35138:6;35134:15;35127:41;34873:302;:::o;35181:366::-;35323:3;35344:67;35408:2;35403:3;35344:67;:::i;:::-;35337:74;;35420:93;35509:3;35420:93;:::i;:::-;35538:2;35533:3;35529:12;35522:19;;35181:366;;;:::o;35553:419::-;35719:4;35757:2;35746:9;35742:18;35734:26;;35806:9;35800:4;35796:20;35792:1;35781:9;35777:17;35770:47;35834:131;35960:4;35834:131;:::i;:::-;35826:139;;35553:419;;;:::o;35978:230::-;36118:34;36114:1;36106:6;36102:14;36095:58;36187:13;36182:2;36174:6;36170:15;36163:38;35978:230;:::o;36214:366::-;36356:3;36377:67;36441:2;36436:3;36377:67;:::i;:::-;36370:74;;36453:93;36542:3;36453:93;:::i;:::-;36571:2;36566:3;36562:12;36555:19;;36214:366;;;:::o;36586:419::-;36752:4;36790:2;36779:9;36775:18;36767:26;;36839:9;36833:4;36829:20;36825:1;36814:9;36810:17;36803:47;36867:131;36993:4;36867:131;:::i;:::-;36859:139;;36586:419;;;:::o;37011:176::-;37151:28;37147:1;37139:6;37135:14;37128:52;37011:176;:::o;37193:366::-;37335:3;37356:67;37420:2;37415:3;37356:67;:::i;:::-;37349:74;;37432:93;37521:3;37432:93;:::i;:::-;37550:2;37545:3;37541:12;37534:19;;37193:366;;;:::o;37565:419::-;37731:4;37769:2;37758:9;37754:18;37746:26;;37818:9;37812:4;37808:20;37804:1;37793:9;37789:17;37782:47;37846:131;37972:4;37846:131;:::i;:::-;37838:139;;37565:419;;;:::o;37990:302::-;38130:34;38126:1;38118:6;38114:14;38107:58;38199:34;38194:2;38186:6;38182:15;38175:59;38268:16;38263:2;38255:6;38251:15;38244:41;37990:302;:::o;38298:366::-;38440:3;38461:67;38525:2;38520:3;38461:67;:::i;:::-;38454:74;;38537:93;38626:3;38537:93;:::i;:::-;38655:2;38650:3;38646:12;38639:19;;38298:366;;;:::o;38670:419::-;38836:4;38874:2;38863:9;38859:18;38851:26;;38923:9;38917:4;38913:20;38909:1;38898:9;38894:17;38887:47;38951:131;39077:4;38951:131;:::i;:::-;38943:139;;38670:419;;;:::o;39095:238::-;39235:34;39231:1;39223:6;39219:14;39212:58;39304:21;39299:2;39291:6;39287:15;39280:46;39095:238;:::o;39339:366::-;39481:3;39502:67;39566:2;39561:3;39502:67;:::i;:::-;39495:74;;39578:93;39667:3;39578:93;:::i;:::-;39696:2;39691:3;39687:12;39680:19;;39339:366;;;:::o;39711:419::-;39877:4;39915:2;39904:9;39900:18;39892:26;;39964:9;39958:4;39954:20;39950:1;39939:9;39935:17;39928:47;39992:131;40118:4;39992:131;:::i;:::-;39984:139;;39711:419;;;:::o;40136:234::-;40276:34;40272:1;40264:6;40260:14;40253:58;40345:17;40340:2;40332:6;40328:15;40321:42;40136:234;:::o;40376:366::-;40518:3;40539:67;40603:2;40598:3;40539:67;:::i;:::-;40532:74;;40615:93;40704:3;40615:93;:::i;:::-;40733:2;40728:3;40724:12;40717:19;;40376:366;;;:::o;40748:419::-;40914:4;40952:2;40941:9;40937:18;40929:26;;41001:9;40995:4;40991:20;40987:1;40976:9;40972:17;40965:47;41029:131;41155:4;41029:131;:::i;:::-;41021:139;;40748:419;;;:::o;41173:377::-;41279:3;41307:39;41340:5;41307:39;:::i;:::-;41362:89;41444:6;41439:3;41362:89;:::i;:::-;41355:96;;41460:52;41505:6;41500:3;41493:4;41486:5;41482:16;41460:52;:::i;:::-;41537:6;41532:3;41528:16;41521:23;;41283:267;41173:377;;;;:::o;41556:155::-;41696:7;41692:1;41684:6;41680:14;41673:31;41556:155;:::o;41717:400::-;41877:3;41898:84;41980:1;41975:3;41898:84;:::i;:::-;41891:91;;41991:93;42080:3;41991:93;:::i;:::-;42109:1;42104:3;42100:11;42093:18;;41717:400;;;:::o;42123:701::-;42404:3;42426:95;42517:3;42508:6;42426:95;:::i;:::-;42419:102;;42538:95;42629:3;42620:6;42538:95;:::i;:::-;42531:102;;42650:148;42794:3;42650:148;:::i;:::-;42643:155;;42815:3;42808:10;;42123:701;;;;;:::o;42830:177::-;42970:29;42966:1;42958:6;42954:14;42947:53;42830:177;:::o;43013:366::-;43155:3;43176:67;43240:2;43235:3;43176:67;:::i;:::-;43169:74;;43252:93;43341:3;43252:93;:::i;:::-;43370:2;43365:3;43361:12;43354:19;;43013:366;;;:::o;43385:419::-;43551:4;43589:2;43578:9;43574:18;43566:26;;43638:9;43632:4;43628:20;43624:1;43613:9;43609:17;43602:47;43666:131;43792:4;43666:131;:::i;:::-;43658:139;;43385:419;;;:::o;43810:225::-;43950:34;43946:1;43938:6;43934:14;43927:58;44019:8;44014:2;44006:6;44002:15;43995:33;43810:225;:::o;44041:366::-;44183:3;44204:67;44268:2;44263:3;44204:67;:::i;:::-;44197:74;;44280:93;44369:3;44280:93;:::i;:::-;44398:2;44393:3;44389:12;44382:19;;44041:366;;;:::o;44413:419::-;44579:4;44617:2;44606:9;44602:18;44594:26;;44666:9;44660:4;44656:20;44652:1;44641:9;44637:17;44630:47;44694:131;44820:4;44694:131;:::i;:::-;44686:139;;44413:419;;;:::o;44838:178::-;44978:30;44974:1;44966:6;44962:14;44955:54;44838:178;:::o;45022:366::-;45164:3;45185:67;45249:2;45244:3;45185:67;:::i;:::-;45178:74;;45261:93;45350:3;45261:93;:::i;:::-;45379:2;45374:3;45370:12;45363:19;;45022:366;;;:::o;45394:419::-;45560:4;45598:2;45587:9;45583:18;45575:26;;45647:9;45641:4;45637:20;45633:1;45622:9;45618:17;45611:47;45675:131;45801:4;45675:131;:::i;:::-;45667:139;;45394:419;;;:::o;45819:248::-;45959:34;45955:1;45947:6;45943:14;45936:58;46028:31;46023:2;46015:6;46011:15;46004:56;45819:248;:::o;46073:366::-;46215:3;46236:67;46300:2;46295:3;46236:67;:::i;:::-;46229:74;;46312:93;46401:3;46312:93;:::i;:::-;46430:2;46425:3;46421:12;46414:19;;46073:366;;;:::o;46445:419::-;46611:4;46649:2;46638:9;46634:18;46626:26;;46698:9;46692:4;46688:20;46684:1;46673:9;46669:17;46662:47;46726:131;46852:4;46726:131;:::i;:::-;46718:139;;46445:419;;;:::o;46870:237::-;47010:34;47006:1;46998:6;46994:14;46987:58;47079:20;47074:2;47066:6;47062:15;47055:45;46870:237;:::o;47113:366::-;47255:3;47276:67;47340:2;47335:3;47276:67;:::i;:::-;47269:74;;47352:93;47441:3;47352:93;:::i;:::-;47470:2;47465:3;47461:12;47454:19;;47113:366;;;:::o;47485:419::-;47651:4;47689:2;47678:9;47674:18;47666:26;;47738:9;47732:4;47728:20;47724:1;47713:9;47709:17;47702:47;47766:131;47892:4;47766:131;:::i;:::-;47758:139;;47485:419;;;:::o;47910:225::-;48050:34;48046:1;48038:6;48034:14;48027:58;48119:8;48114:2;48106:6;48102:15;48095:33;47910:225;:::o;48141:366::-;48283:3;48304:67;48368:2;48363:3;48304:67;:::i;:::-;48297:74;;48380:93;48469:3;48380:93;:::i;:::-;48498:2;48493:3;48489:12;48482:19;;48141:366;;;:::o;48513:419::-;48679:4;48717:2;48706:9;48702:18;48694:26;;48766:9;48760:4;48756:20;48752:1;48741:9;48737:17;48730:47;48794:131;48920:4;48794:131;:::i;:::-;48786:139;;48513:419;;;:::o;48938:224::-;49078:34;49074:1;49066:6;49062:14;49055:58;49147:7;49142:2;49134:6;49130:15;49123:32;48938:224;:::o;49168:366::-;49310:3;49331:67;49395:2;49390:3;49331:67;:::i;:::-;49324:74;;49407:93;49496:3;49407:93;:::i;:::-;49525:2;49520:3;49516:12;49509:19;;49168:366;;;:::o;49540:419::-;49706:4;49744:2;49733:9;49729:18;49721:26;;49793:9;49787:4;49783:20;49779:1;49768:9;49764:17;49757:47;49821:131;49947:4;49821:131;:::i;:::-;49813:139;;49540:419;;;:::o;49965:147::-;50066:11;50103:3;50088:18;;49965:147;;;;:::o;50118:114::-;;:::o;50238:398::-;50397:3;50418:83;50499:1;50494:3;50418:83;:::i;:::-;50411:90;;50510:93;50599:3;50510:93;:::i;:::-;50628:1;50623:3;50619:11;50612:18;;50238:398;;;:::o;50642:379::-;50826:3;50848:147;50991:3;50848:147;:::i;:::-;50841:154;;51012:3;51005:10;;50642:379;;;:::o;51027:170::-;51167:22;51163:1;51155:6;51151:14;51144:46;51027:170;:::o;51203:366::-;51345:3;51366:67;51430:2;51425:3;51366:67;:::i;:::-;51359:74;;51442:93;51531:3;51442:93;:::i;:::-;51560:2;51555:3;51551:12;51544:19;;51203:366;;;:::o;51575:419::-;51741:4;51779:2;51768:9;51764:18;51756:26;;51828:9;51822:4;51818:20;51814:1;51803:9;51799:17;51792:47;51856:131;51982:4;51856:131;:::i;:::-;51848:139;;51575:419;;;:::o;52000:229::-;52140:34;52136:1;52128:6;52124:14;52117:58;52209:12;52204:2;52196:6;52192:15;52185:37;52000:229;:::o;52235:366::-;52377:3;52398:67;52462:2;52457:3;52398:67;:::i;:::-;52391:74;;52474:93;52563:3;52474:93;:::i;:::-;52592:2;52587:3;52583:12;52576:19;;52235:366;;;:::o;52607:419::-;52773:4;52811:2;52800:9;52796:18;52788:26;;52860:9;52854:4;52850:20;52846:1;52835:9;52831:17;52824:47;52888:131;53014:4;52888:131;:::i;:::-;52880:139;;52607:419;;;:::o;53032:234::-;53172:34;53168:1;53160:6;53156:14;53149:58;53241:17;53236:2;53228:6;53224:15;53217:42;53032:234;:::o;53272:366::-;53414:3;53435:67;53499:2;53494:3;53435:67;:::i;:::-;53428:74;;53511:93;53600:3;53511:93;:::i;:::-;53629:2;53624:3;53620:12;53613:19;;53272:366;;;:::o;53644:419::-;53810:4;53848:2;53837:9;53833:18;53825:26;;53897:9;53891:4;53887:20;53883:1;53872:9;53868:17;53861:47;53925:131;54051:4;53925:131;:::i;:::-;53917:139;;53644:419;;;:::o;54069:98::-;54120:6;54154:5;54148:12;54138:22;;54069:98;;;:::o;54173:168::-;54256:11;54290:6;54285:3;54278:19;54330:4;54325:3;54321:14;54306:29;;54173:168;;;;:::o;54347:360::-;54433:3;54461:38;54493:5;54461:38;:::i;:::-;54515:70;54578:6;54573:3;54515:70;:::i;:::-;54508:77;;54594:52;54639:6;54634:3;54627:4;54620:5;54616:16;54594:52;:::i;:::-;54671:29;54693:6;54671:29;:::i;:::-;54666:3;54662:39;54655:46;;54437:270;54347:360;;;;:::o;54713:640::-;54908:4;54946:3;54935:9;54931:19;54923:27;;54960:71;55028:1;55017:9;55013:17;55004:6;54960:71;:::i;:::-;55041:72;55109:2;55098:9;55094:18;55085:6;55041:72;:::i;:::-;55123;55191:2;55180:9;55176:18;55167:6;55123:72;:::i;:::-;55242:9;55236:4;55232:20;55227:2;55216:9;55212:18;55205:48;55270:76;55341:4;55332:6;55270:76;:::i;:::-;55262:84;;54713:640;;;;;;;:::o;55359:141::-;55415:5;55446:6;55440:13;55431:22;;55462:32;55488:5;55462:32;:::i;:::-;55359:141;;;;:::o;55506:349::-;55575:6;55624:2;55612:9;55603:7;55599:23;55595:32;55592:119;;;55630:79;;:::i;:::-;55592:119;55750:1;55775:63;55830:7;55821:6;55810:9;55806:22;55775:63;:::i;:::-;55765:73;;55721:127;55506:349;;;;:::o;55861:233::-;55900:3;55923:24;55941:5;55923:24;:::i;:::-;55914:33;;55969:66;55962:5;55959:77;55956:103;;;56039:18;;:::i;:::-;55956:103;56086:1;56079:5;56075:13;56068:20;;55861:233;;;:::o;56100:180::-;56148:77;56145:1;56138:88;56245:4;56242:1;56235:15;56269:4;56266:1;56259:15;56286:185;56326:1;56343:20;56361:1;56343:20;:::i;:::-;56338:25;;56377:20;56395:1;56377:20;:::i;:::-;56372:25;;56416:1;56406:35;;56421:18;;:::i;:::-;56406:35;56463:1;56460;56456:9;56451:14;;56286:185;;;;:::o;56477:176::-;56509:1;56526:20;56544:1;56526:20;:::i;:::-;56521:25;;56560:20;56578:1;56560:20;:::i;:::-;56555:25;;56599:1;56589:35;;56604:18;;:::i;:::-;56589:35;56645:1;56642;56638:9;56633:14;;56477:176;;;;:::o;56659:180::-;56707:77;56704:1;56697:88;56804:4;56801:1;56794:15;56828:4;56825:1;56818:15;56845:220;56985:34;56981:1;56973:6;56969:14;56962:58;57054:3;57049:2;57041:6;57037:15;57030:28;56845:220;:::o;57071:366::-;57213:3;57234:67;57298:2;57293:3;57234:67;:::i;:::-;57227:74;;57310:93;57399:3;57310:93;:::i;:::-;57428:2;57423:3;57419:12;57412:19;;57071:366;;;:::o;57443:419::-;57609:4;57647:2;57636:9;57632:18;57624:26;;57696:9;57690:4;57686:20;57682:1;57671:9;57667:17;57660:47;57724:131;57850:4;57724:131;:::i;:::-;57716:139;;57443:419;;;:::o;57868:227::-;58008:34;58004:1;57996:6;57992:14;57985:58;58077:10;58072:2;58064:6;58060:15;58053:35;57868:227;:::o;58101:366::-;58243:3;58264:67;58328:2;58323:3;58264:67;:::i;:::-;58257:74;;58340:93;58429:3;58340:93;:::i;:::-;58458:2;58453:3;58449:12;58442:19;;58101:366;;;:::o;58473:419::-;58639:4;58677:2;58666:9;58662:18;58654:26;;58726:9;58720:4;58716:20;58712:1;58701:9;58697:17;58690:47;58754:131;58880:4;58754:131;:::i;:::-;58746:139;;58473:419;;;:::o

Swarm Source

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