Token BabyChimpGang-Tickets 1

 

Overview ERC-721

Total Supply:
9 BCGT1

Holders:
3 addresses
Balance
0 BCGT1
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Test

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-05
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

//

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;


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

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

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


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;


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


pragma solidity ^0.8.0;



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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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


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

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

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


pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

//

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

//

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}




pragma solidity ^0.8.0;



/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


pragma solidity ^0.8.0;


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

pragma solidity ^0.8.0;

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

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

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

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

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


pragma solidity ^0.8.2;



// set contract name
contract Test is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, AccessControl, ERC721Burnable {
    using Counters for Counters.Counter;

    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    Counters.Counter private _tokenIdCounter;
    bool private mintable = false;
    bool private claimable = false;
    uint256 public constant MAX_TICKET = 11;   //set (exclusive)
    uint256 public constant MINT_PRICE = 1 ether; //set

    bool[1112] chimpsBCG;
    bool[864] chimpsBCGX;

    constructor() ERC721("BabyChimpGang-Tickets 1", "BCGT1") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(PAUSER_ROLE, msg.sender);
        _setupRole(MINTER_ROLE, msg.sender);

    }

    function _baseURI() internal pure override returns (string memory) {
        return "ipfs://ToDo/";
    }

    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        }
        uint256[] memory result = new uint256[](tokenCount);
        uint256 index;
        for (index = 0; index < tokenCount; index++) {
            result[index] = tokenOfOwnerByIndex(_owner, index);
        }
        return result;
    }


    function safeMint(address to) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(_tokenIdCounter.current() < MAX_TICKET, 'All the tickets are minted.');
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function MintTicket() public payable {
        require(mintable, 'Tickets are not mintable yet.');
        require(_tokenIdCounter.current() < MAX_TICKET, 'All the Tickets are minted.');
        require(msg.value >= MINT_PRICE, 'Not the right payment.');
        _safeMint(msg.sender, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function MintTenTickets() public payable {
        require(mintable, 'Tickets are not mintable yet.');
        require(_tokenIdCounter.current() + 9 < MAX_TICKET, 'All the Tickets are minted.');
        require(msg.value >= MINT_PRICE * 10, 'Not the right payment.');
        uint256 index;
        for (index = 0; index < 10; index++) {
          _safeMint(msg.sender, _tokenIdCounter.current());
          _tokenIdCounter.increment();
        }

    }

    function MintFiftyTickets() public payable {
        require(mintable, 'Tickets are not mintable yet.');
        require(_tokenIdCounter.current() + 49 < MAX_TICKET, 'All the Tickets are minted.');
        require(msg.value >= MINT_PRICE * 50, 'Not the right payment.');
        uint256 index;
        for (index = 0; index < 50; index++) {
          _safeMint(msg.sender, _tokenIdCounter.current());
          _tokenIdCounter.increment();
        }
    }

    function MintAmountTickets(uint256 amount) public payable {
        require(mintable, 'Tickets are not mintable yet.');
        require(_tokenIdCounter.current() + amount - 1 < MAX_TICKET, 'All the Tickets are minted.');
        require(msg.value >= MINT_PRICE * amount, 'Not the right payment.');
        uint256 index;
        for (index = 0; index < amount; index++) {
          _safeMint(msg.sender, _tokenIdCounter.current());
          _tokenIdCounter.increment();
        }
    }

    function claimTickets() public {
        require(claimable, 'Tickets are not claimable yet.');

        address adress_bcg = 0x7f9893ef9726D23e249518EaA1424677b7FED6a9;
        BabyChimpGang bcg = BabyChimpGang(adress_bcg);
        uint256[] memory tokensBCG = bcg.tokensOfOwner(msg.sender);
        uint256 tokenCountBCG = tokensBCG.length;

        uint256 index;
        uint256 amountBCG = 0;
        for (index = 0; index < tokenCountBCG; index++) {
            if (tokensBCG[index] % 5 == 0 ) {
              amountBCG = amountBCG + 1;
            }
        }

        address adress_bcgx = 0x207a1521Aa373a9bd44C17fAf9e77397195B77f9;
        BabyChimpGangXmas bcgx = BabyChimpGangXmas(adress_bcgx);
        uint256[] memory tokensBCGX = bcgx.tokensOfOwner(msg.sender);
        uint256 tokenCountBCGX = tokensBCGX.length;

        uint256 amountBCGX = 0;
        for (index = 0; index < tokenCountBCGX; index++) {
            if (tokensBCGX[index] % 5 == 0 ) {
              amountBCGX = amountBCGX + 1;
            }
        }
      require(_tokenIdCounter.current() + amountBCG + amountBCGX - 1 < MAX_TICKET, 'All the Tickets are minted.');

      for (index = 0; index < tokenCountBCG; index++) {
          //mint
          uint256 id = tokensBCG[index];
          if (id % 5 == 0 ) {
              if (chimpsBCG[id] == false){
                  _safeMint(msg.sender, _tokenIdCounter.current());
                  _tokenIdCounter.increment();
                  chimpsBCG[id] = true;
              }
          }
      }

      for (index = 0; index < tokenCountBCGX; index++) {
          //mint
          uint256 id = tokensBCGX[index];
          if (id % 5 == 0 ) {
              if (chimpsBCGX[id] == false){
                  _safeMint(msg.sender, _tokenIdCounter.current());
                  _tokenIdCounter.increment();
                  chimpsBCGX[id] = true;
              }
          }
      }

    }



    ///Set the mintable state
    function enableMinting() public onlyRole(DEFAULT_ADMIN_ROLE) {
        mintable = true;
    }

    function disableMinting() public onlyRole(DEFAULT_ADMIN_ROLE) {
        mintable = false;
    }

    ///Set the claimable state
    function enableClaiming() public onlyRole(DEFAULT_ADMIN_ROLE) {
        claimable = true;
    }

    function disableClaiming() public onlyRole(DEFAULT_ADMIN_ROLE) {
        claimable = false;
    }

    //withdraw functions
    function withdraw() public onlyRole(DEFAULT_ADMIN_ROLE) {
        Address.sendValue(payable(msg.sender),address(this).balance);
    }



    // The following functions are overrides required by Solidity.

        function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, AccessControl)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

interface BabyChimpGang {
    function tokensOfOwner(address _owner) external view returns (uint256[] memory);
}

interface BabyChimpGangXmas {
    function tokensOfOwner(address _owner) external view returns (uint256[] memory);
}

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TICKET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintAmountTickets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MintFiftyTickets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MintTenTickets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MintTicket","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableClaiming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableClaiming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMinting","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280601781526020017f426162794368696d7047616e672d5469636b65747320310000000000000000008152506040518060400160405280600581526020017f42434754310000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620002fd565b508060019080519060200190620000e5929190620002fd565b5050506000600b60006101000a81548160ff021916908315150217905550620001186000801b336200018260201b60201c565b6200014a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336200018260201b60201c565b6200017c7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200018260201b60201c565b62000412565b6200019482826200019860201b60201c565b5050565b620001aa82826200028a60201b60201c565b62000286576001600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200022b620002f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b8280546200030b90620003ad565b90600052602060002090601f0160209004810192826200032f57600085556200037b565b82601f106200034a57805160ff19168380011785556200037b565b828001600101855582156200037b579182015b828111156200037a5782518255916020019190600101906200035d565b5b5090506200038a91906200038e565b5090565b5b80821115620003a95760008160009055506001016200038f565b5090565b60006002820490506001821680620003c657607f821691505b60208210811415620003dd57620003dc620003e3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61563780620004226000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063b88d4fde116100ab578063d547741f1161006f578063d547741f146107fc578063e63ab1e914610825578063e797ec1b14610850578063e985e9c514610867578063fee0088b146108a45761023b565b8063b88d4fde14610715578063c002d23d1461073e578063c87b56dd14610769578063d20871a2146107a6578063d5391393146107d15761023b565b80638db543b6116100f25780638db543b61461064f57806391d148541461065957806395d89b4114610696578063a217fddf146106c1578063a22cb465146106ec5761023b565b806370a082311461059d5780637df5dca8146105da5780637e5cd5c1146105e457806381fe4c61146105fb5780638462151c146106125761023b565b806336568abe116101bc5780634f6ccce7116101805780634f6ccce7146104d75780635b8dee6a146105145780635c975abb1461051e5780635ff692cb146105495780636352211e146105605761023b565b806336568abe1461041c5780633ccfd60b1461044557806340d097c31461045c57806342842e0e1461048557806342966c68146104ae5761023b565b80632081a88c116102035780632081a88c1461033957806323b872dd14610350578063248a9ca3146103795780632f2ff15d146103b65780632f745c59146103df5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806318160ddd1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613df7565b6108c0565b604051610274919061451b565b60405180910390f35b34801561028957600080fd5b506102926108d2565b60405161029f9190614551565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613e51565b610964565b6040516102dc9190614492565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613d01565b6109e9565b005b34801561031a57600080fd5b50610323610b01565b60405161033091906148f3565b60405180910390f35b34801561034557600080fd5b5061034e610b0e565b005b34801561035c57600080fd5b5061037760048036038101906103729190613beb565b610b41565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613d8a565b610ba1565b6040516103ad9190614536565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190613db7565b610bc1565b005b3480156103eb57600080fd5b5061040660048036038101906104019190613d01565b610bea565b60405161041391906148f3565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190613db7565b610c8f565b005b34801561045157600080fd5b5061045a610d12565b005b34801561046857600080fd5b50610483600480360381019061047e9190613b7e565b610d34565b005b34801561049157600080fd5b506104ac60048036038101906104a79190613beb565b610db6565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190613e51565b610dd6565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190613e51565b610e32565b60405161050b91906148f3565b60405180910390f35b61051c610ea3565b005b34801561052a57600080fd5b50610533610fa8565b604051610540919061451b565b60405180910390f35b34801561055557600080fd5b5061055e610fbf565b005b34801561056c57600080fd5b5061058760048036038101906105829190613e51565b610ff2565b6040516105949190614492565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613b7e565b6110a4565b6040516105d191906148f3565b60405180910390f35b6105e261115c565b005b3480156105f057600080fd5b506105f9611299565b005b34801561060757600080fd5b506106106112cc565b005b34801561061e57600080fd5b5061063960048036038101906106349190613b7e565b61178a565b60405161064691906144f9565b60405180910390f35b610657611894565b005b34801561066557600080fd5b50610680600480360381019061067b9190613db7565b6119d1565b60405161068d919061451b565b60405180910390f35b3480156106a257600080fd5b506106ab611a3c565b6040516106b89190614551565b60405180910390f35b3480156106cd57600080fd5b506106d6611ace565b6040516106e39190614536565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613cc1565b611ad5565b005b34801561072157600080fd5b5061073c60048036038101906107379190613c3e565b611c56565b005b34801561074a57600080fd5b50610753611cb8565b60405161076091906148f3565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613e51565b611cc4565b60405161079d9190614551565b60405180910390f35b3480156107b257600080fd5b506107bb611cd6565b6040516107c891906148f3565b60405180910390f35b3480156107dd57600080fd5b506107e6611cdb565b6040516107f39190614536565b60405180910390f35b34801561080857600080fd5b50610823600480360381019061081e9190613db7565b611cff565b005b34801561083157600080fd5b5061083a611d28565b6040516108479190614536565b60405180910390f35b34801561085c57600080fd5b50610865611d4c565b005b34801561087357600080fd5b5061088e60048036038101906108899190613bab565b611d7f565b60405161089b919061451b565b60405180910390f35b6108be60048036038101906108b99190613e51565b611e13565b005b60006108cb82611f5a565b9050919050565b6060600080546108e190614c16565b80601f016020809104026020016040519081016040528092919081815260200182805461090d90614c16565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b600061096f82611fd4565b6109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a5906147b3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f482610ff2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90614853565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a84612040565b73ffffffffffffffffffffffffffffffffffffffff161480610ab35750610ab281610aad612040565b611d7f565b5b610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae9906146d3565b60405180910390fd5b610afc8383612048565b505050565b6000600880549050905090565b6000801b610b2381610b1e612040565b612101565b6001600e60016101000a81548160ff02191690831515021790555050565b610b52610b4c612040565b8261219e565b610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890614873565b60405180910390fd5b610b9c83838361227c565b505050565b6000600c6000838152602001908152602001600020600101549050919050565b610bca82610ba1565b610bdb81610bd6612040565b612101565b610be583836124d8565b505050565b6000610bf5836110a4565b8210610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90614593565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c97612040565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb906148d3565b60405180910390fd5b610d0e82826125b9565b5050565b6000801b610d2781610d22612040565b612101565b610d31334761269b565b50565b6000801b610d4981610d44612040565b612101565b600b610d55600d61278f565b10610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614793565b60405180910390fd5b610da882610da3600d61278f565b61279d565b610db2600d6127bb565b5050565b610dd183838360405180602001604052806000815250611c56565b505050565b610de7610de1612040565b8261219e565b610e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1d906148b3565b60405180910390fd5b610e2f816127d1565b50565b6000610e3c610b01565b8210610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7490614893565b60405180910390fd5b60088281548110610e9157610e90614daf565b5b90600052602060002001549050919050565b600e60009054906101000a900460ff16610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee990614733565b60405180910390fd5b600b610efe600d61278f565b10610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614693565b60405180910390fd5b670de0b6b3a7640000341015610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8090614833565b60405180910390fd5b610f9c33610f97600d61278f565b61279d565b610fa6600d6127bb565b565b6000600b60009054906101000a900460ff16905090565b6000801b610fd481610fcf612040565b612101565b6000600e60016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614713565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c906146f3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e60009054906101000a900460ff166111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290614733565b60405180910390fd5b600b60096111b9600d61278f565b6111c39190614a17565b10611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614693565b60405180910390fd5b600a670de0b6b3a76400006112189190614a9e565b34101561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190614833565b60405180910390fd5b60005b600a8110156112965761127933611274600d61278f565b61279d565b611283600d6127bb565b808061128e90614c79565b91505061125d565b50565b6000801b6112ae816112a9612040565b612101565b6000600e60006101000a81548160ff02191690831515021790555050565b600e60019054906101000a900460ff1661131b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611312906147d3565b60405180910390fd5b6000737f9893ef9726d23e249518eaa1424677b7fed6a99050600081905060008173ffffffffffffffffffffffffffffffffffffffff16638462151c336040518263ffffffff1660e01b81526004016113749190614492565b60006040518083038186803b15801561138c57600080fd5b505afa1580156113a0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113c99190613d41565b905060008151905060008060009050600091505b8282101561143757600060058584815181106113fc576113fb614daf565b5b602002602001015161140e9190614cc2565b1415611424576001816114219190614a17565b90505b818061142f90614c79565b9250506113dd565b600073207a1521aa373a9bd44c17faf9e77397195b77f99050600081905060008173ffffffffffffffffffffffffffffffffffffffff16638462151c336040518263ffffffff1660e01b81526004016114909190614492565b60006040518083038186803b1580156114a857600080fd5b505afa1580156114bc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114e59190613d41565b905060008151905060008096505b8187101561154d576000600584898151811061151257611511614daf565b5b60200260200101516115249190614cc2565b141561153a576001816115379190614a17565b90505b868061154590614c79565b9750506114f3565b600b6001828861155d600d61278f565b6115679190614a17565b6115719190614a17565b61157b9190614af8565b106115bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b290614693565b60405180910390fd5b600096505b8787101561169c5760008988815181106115dd576115dc614daf565b5b6020026020010151905060006005826115f69190614cc2565b14156116885760001515600f82610458811061161557611614614daf565b5b602091828204019190069054906101000a900460ff16151514156116875761164633611641600d61278f565b61279d565b611650600d6127bb565b6001600f82610458811061166757611666614daf565b5b602091828204019190066101000a81548160ff0219169083151502179055505b5b50868061169490614c79565b9750506115c0565b600096505b8187101561177d5760008388815181106116be576116bd614daf565b5b6020026020010151905060006005826116d79190614cc2565b1415611769576000151560328261036081106116f6576116f5614daf565b5b602091828204019190069054906101000a900460ff16151514156117685761172733611722600d61278f565b61279d565b611731600d6127bb565b6001603282610360811061174857611747614daf565b5b602091828204019190066101000a81548160ff0219169083151502179055505b5b50868061177590614c79565b9750506116a1565b5050505050505050505050565b60606000611797836110a4565b905060008114156117f457600067ffffffffffffffff8111156117bd576117bc614dde565b5b6040519080825280602002602001820160405280156117eb5781602001602082028036833780820191505090505b5091505061188f565b60008167ffffffffffffffff8111156118105761180f614dde565b5b60405190808252806020026020018201604052801561183e5781602001602082028036833780820191505090505b50905060005b82811015611888576118568582610bea565b82828151811061186957611868614daf565b5b602002602001018181525050808061188090614c79565b915050611844565b8193505050505b919050565b600e60009054906101000a900460ff166118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90614733565b60405180910390fd5b600b60316118f1600d61278f565b6118fb9190614a17565b1061193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290614693565b60405180910390fd5b6032670de0b6b3a76400006119509190614a9e565b341015611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990614833565b60405180910390fd5b60005b60328110156119ce576119b1336119ac600d61278f565b61279d565b6119bb600d6127bb565b80806119c690614c79565b915050611995565b50565b6000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054611a4b90614c16565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7790614c16565b8015611ac45780601f10611a9957610100808354040283529160200191611ac4565b820191906000526020600020905b815481529060010190602001808311611aa757829003601f168201915b5050505050905090565b6000801b81565b611add612040565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4290614613565b60405180910390fd5b8060056000611b58612040565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c05612040565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c4a919061451b565b60405180910390a35050565b611c67611c61612040565b8361219e565b611ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9d90614873565b60405180910390fd5b611cb2848484846127dd565b50505050565b670de0b6b3a764000081565b6060611ccf82612839565b9050919050565b600b81565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611d0882610ba1565b611d1981611d14612040565b612101565b611d2383836125b9565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000801b611d6181611d5c612040565b612101565b6001600e60006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff16611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990614733565b60405180910390fd5b600b600182611e71600d61278f565b611e7b9190614a17565b611e859190614af8565b10611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc90614693565b60405180910390fd5b80670de0b6b3a7640000611ed99190614a9e565b341015611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1290614833565b60405180910390fd5b60005b81811015611f5657611f3933611f34600d61278f565b61279d565b611f43600d6127bb565b8080611f4e90614c79565b915050611f1e565b5050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fcd5750611fcc8261298b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120bb83610ff2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61210b82826119d1565b61219a576121308173ffffffffffffffffffffffffffffffffffffffff166014612a05565b61213e8360001c6020612a05565b60405160200161214f929190614458565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121919190614551565b60405180910390fd5b5050565b60006121a982611fd4565b6121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90614673565b60405180910390fd5b60006121f383610ff2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061226257508373ffffffffffffffffffffffffffffffffffffffff1661224a84610964565b73ffffffffffffffffffffffffffffffffffffffff16145b8061227357506122728185611d7f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661229c82610ff2565b73ffffffffffffffffffffffffffffffffffffffff16146122f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e9906147f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612359906145f3565b60405180910390fd5b61236d838383612c41565b612378600082612048565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123c89190614af8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461241f9190614a17565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6124e282826119d1565b6125b5576001600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061255a612040565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6125c382826119d1565b15612697576000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061263c612040565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b804710156126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590614653565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161270490614443565b60006040518083038185875af1925050503d8060008114612741576040519150601f19603f3d011682016040523d82523d6000602084013e612746565b606091505b505090508061278a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278190614633565b60405180910390fd5b505050565b600081600001549050919050565b6127b7828260405180602001604052806000815250612c99565b5050565b6001816000016000828254019250508190555050565b6127da81612cf4565b50565b6127e884848461227c565b6127f484848484612d47565b612833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282a906145b3565b60405180910390fd5b50505050565b606061284482611fd4565b612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a90614773565b60405180910390fd5b6000600a600084815260200190815260200160002080546128a390614c16565b80601f01602080910402602001604051908101604052809291908181526020018280546128cf90614c16565b801561291c5780601f106128f15761010080835404028352916020019161291c565b820191906000526020600020905b8154815290600101906020018083116128ff57829003601f168201915b50505050509050600061292d612ede565b9050600081511415612943578192505050612986565b60008251111561297857808260405160200161296092919061441f565b60405160208183030381529060405292505050612986565b61298184612f1b565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129fe57506129fd82612fc2565b5b9050919050565b606060006002836002612a189190614a9e565b612a229190614a17565b67ffffffffffffffff811115612a3b57612a3a614dde565b5b6040519080825280601f01601f191660200182016040528015612a6d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612aa557612aa4614daf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b0957612b08614daf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612b499190614a9e565b612b539190614a17565b90505b6001811115612bf3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b9557612b94614daf565b5b1a60f81b828281518110612bac57612bab614daf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612bec90614bec565b9050612b56565b5060008414612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e90614573565b60405180910390fd5b8091505092915050565b612c49610fa8565b15612c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c80906146b3565b60405180910390fd5b612c948383836130a4565b505050565b612ca383836131b8565b612cb06000848484612d47565b612cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce6906145b3565b60405180910390fd5b505050565b612cfd81613386565b6000600a60008381526020019081526020016000208054612d1d90614c16565b905014612d4457600a60008281526020019081526020016000206000612d439190613980565b5b50565b6000612d688473ffffffffffffffffffffffffffffffffffffffff16613497565b15612ed1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d91612040565b8786866040518563ffffffff1660e01b8152600401612db394939291906144ad565b602060405180830381600087803b158015612dcd57600080fd5b505af1925050508015612dfe57506040513d601f19601f82011682018060405250810190612dfb9190613e24565b60015b612e81573d8060008114612e2e576040519150601f19603f3d011682016040523d82523d6000602084013e612e33565b606091505b50600081511415612e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e70906145b3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ed6565b600190505b949350505050565b60606040518060400160405280600c81526020017f697066733a2f2f546f446f2f0000000000000000000000000000000000000000815250905090565b6060612f2682611fd4565b612f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5c90614813565b60405180910390fd5b6000612f6f612ede565b90506000815111612f8f5760405180602001604052806000815250612fba565b80612f99846134aa565b604051602001612faa92919061441f565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061308d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061309d575061309c8261360b565b5b9050919050565b6130af838383613675565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130f2576130ed8161367a565b613131565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131305761312f83826136c3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131745761316f81613830565b6131b3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131b2576131b18282613901565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321f90614753565b60405180910390fd5b61323181611fd4565b15613271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613268906145d3565b60405180910390fd5b61327d60008383612c41565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132cd9190614a17565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061339182610ff2565b905061339f81600084612c41565b6133aa600083612048565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133fa9190614af8565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606060008214156134f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613606565b600082905060005b6000821461352457808061350d90614c79565b915050600a8261351d9190614a6d565b91506134fa565b60008167ffffffffffffffff8111156135405761353f614dde565b5b6040519080825280601f01601f1916602001820160405280156135725781602001600182028036833780820191505090505b5090505b600085146135ff5760018261358b9190614af8565b9150600a8561359a9190614cc2565b60306135a69190614a17565b60f81b8183815181106135bc576135bb614daf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135f89190614a6d565b9450613576565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136d0846110a4565b6136da9190614af8565b90506000600760008481526020019081526020016000205490508181146137bf576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138449190614af8565b905060006009600084815260200190815260200160002054905060006008838154811061387457613873614daf565b5b90600052602060002001549050806008838154811061389657613895614daf565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138e5576138e4614d80565b5b6001900381819060005260206000200160009055905550505050565b600061390c836110a4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b50805461398c90614c16565b6000825580601f1061399e57506139bd565b601f0160209004906000526020600020908101906139bc91906139c0565b5b50565b5b808211156139d95760008160009055506001016139c1565b5090565b60006139f06139eb84614933565b61490e565b90508083825260208201905082856020860282011115613a1357613a12614e12565b5b60005b85811015613a435781613a298882613b69565b845260208401935060208301925050600181019050613a16565b5050509392505050565b6000613a60613a5b8461495f565b61490e565b905082815260208101848484011115613a7c57613a7b614e17565b5b613a87848285614baa565b509392505050565b600081359050613a9e8161558e565b92915050565b600082601f830112613ab957613ab8614e0d565b5b8151613ac98482602086016139dd565b91505092915050565b600081359050613ae1816155a5565b92915050565b600081359050613af6816155bc565b92915050565b600081359050613b0b816155d3565b92915050565b600081519050613b20816155d3565b92915050565b600082601f830112613b3b57613b3a614e0d565b5b8135613b4b848260208601613a4d565b91505092915050565b600081359050613b63816155ea565b92915050565b600081519050613b78816155ea565b92915050565b600060208284031215613b9457613b93614e21565b5b6000613ba284828501613a8f565b91505092915050565b60008060408385031215613bc257613bc1614e21565b5b6000613bd085828601613a8f565b9250506020613be185828601613a8f565b9150509250929050565b600080600060608486031215613c0457613c03614e21565b5b6000613c1286828701613a8f565b9350506020613c2386828701613a8f565b9250506040613c3486828701613b54565b9150509250925092565b60008060008060808587031215613c5857613c57614e21565b5b6000613c6687828801613a8f565b9450506020613c7787828801613a8f565b9350506040613c8887828801613b54565b925050606085013567ffffffffffffffff811115613ca957613ca8614e1c565b5b613cb587828801613b26565b91505092959194509250565b60008060408385031215613cd857613cd7614e21565b5b6000613ce685828601613a8f565b9250506020613cf785828601613ad2565b9150509250929050565b60008060408385031215613d1857613d17614e21565b5b6000613d2685828601613a8f565b9250506020613d3785828601613b54565b9150509250929050565b600060208284031215613d5757613d56614e21565b5b600082015167ffffffffffffffff811115613d7557613d74614e1c565b5b613d8184828501613aa4565b91505092915050565b600060208284031215613da057613d9f614e21565b5b6000613dae84828501613ae7565b91505092915050565b60008060408385031215613dce57613dcd614e21565b5b6000613ddc85828601613ae7565b9250506020613ded85828601613a8f565b9150509250929050565b600060208284031215613e0d57613e0c614e21565b5b6000613e1b84828501613afc565b91505092915050565b600060208284031215613e3a57613e39614e21565b5b6000613e4884828501613b11565b91505092915050565b600060208284031215613e6757613e66614e21565b5b6000613e7584828501613b54565b91505092915050565b6000613e8a8383614401565b60208301905092915050565b613e9f81614b2c565b82525050565b6000613eb0826149a0565b613eba81856149ce565b9350613ec583614990565b8060005b83811015613ef6578151613edd8882613e7e565b9750613ee8836149c1565b925050600181019050613ec9565b5085935050505092915050565b613f0c81614b3e565b82525050565b613f1b81614b4a565b82525050565b6000613f2c826149ab565b613f3681856149df565b9350613f46818560208601614bb9565b613f4f81614e26565b840191505092915050565b6000613f65826149b6565b613f6f81856149fb565b9350613f7f818560208601614bb9565b613f8881614e26565b840191505092915050565b6000613f9e826149b6565b613fa88185614a0c565b9350613fb8818560208601614bb9565b80840191505092915050565b6000613fd16020836149fb565b9150613fdc82614e37565b602082019050919050565b6000613ff4602b836149fb565b9150613fff82614e60565b604082019050919050565b60006140176032836149fb565b915061402282614eaf565b604082019050919050565b600061403a601c836149fb565b915061404582614efe565b602082019050919050565b600061405d6024836149fb565b915061406882614f27565b604082019050919050565b60006140806019836149fb565b915061408b82614f76565b602082019050919050565b60006140a3603a836149fb565b91506140ae82614f9f565b604082019050919050565b60006140c6601d836149fb565b91506140d182614fee565b602082019050919050565b60006140e9602c836149fb565b91506140f482615017565b604082019050919050565b600061410c601b836149fb565b915061411782615066565b602082019050919050565b600061412f6010836149fb565b915061413a8261508f565b602082019050919050565b60006141526038836149fb565b915061415d826150b8565b604082019050919050565b6000614175602a836149fb565b915061418082615107565b604082019050919050565b60006141986029836149fb565b91506141a382615156565b604082019050919050565b60006141bb601d836149fb565b91506141c6826151a5565b602082019050919050565b60006141de6020836149fb565b91506141e9826151ce565b602082019050919050565b60006142016031836149fb565b915061420c826151f7565b604082019050919050565b6000614224601b836149fb565b915061422f82615246565b602082019050919050565b6000614247602c836149fb565b91506142528261526f565b604082019050919050565b600061426a601e836149fb565b9150614275826152be565b602082019050919050565b600061428d6029836149fb565b9150614298826152e7565b604082019050919050565b60006142b0602f836149fb565b91506142bb82615336565b604082019050919050565b60006142d36016836149fb565b91506142de82615385565b602082019050919050565b60006142f66021836149fb565b9150614301826153ae565b604082019050919050565b60006143196000836149f0565b9150614324826153fd565b600082019050919050565b600061433c6031836149fb565b915061434782615400565b604082019050919050565b600061435f602c836149fb565b915061436a8261544f565b604082019050919050565b6000614382601783614a0c565b915061438d8261549e565b601782019050919050565b60006143a56030836149fb565b91506143b0826154c7565b604082019050919050565b60006143c8601183614a0c565b91506143d382615516565b601182019050919050565b60006143eb602f836149fb565b91506143f68261553f565b604082019050919050565b61440a81614ba0565b82525050565b61441981614ba0565b82525050565b600061442b8285613f93565b91506144378284613f93565b91508190509392505050565b600061444e8261430c565b9150819050919050565b600061446382614375565b915061446f8285613f93565b915061447a826143bb565b91506144868284613f93565b91508190509392505050565b60006020820190506144a76000830184613e96565b92915050565b60006080820190506144c26000830187613e96565b6144cf6020830186613e96565b6144dc6040830185614410565b81810360608301526144ee8184613f21565b905095945050505050565b600060208201905081810360008301526145138184613ea5565b905092915050565b60006020820190506145306000830184613f03565b92915050565b600060208201905061454b6000830184613f12565b92915050565b6000602082019050818103600083015261456b8184613f5a565b905092915050565b6000602082019050818103600083015261458c81613fc4565b9050919050565b600060208201905081810360008301526145ac81613fe7565b9050919050565b600060208201905081810360008301526145cc8161400a565b9050919050565b600060208201905081810360008301526145ec8161402d565b9050919050565b6000602082019050818103600083015261460c81614050565b9050919050565b6000602082019050818103600083015261462c81614073565b9050919050565b6000602082019050818103600083015261464c81614096565b9050919050565b6000602082019050818103600083015261466c816140b9565b9050919050565b6000602082019050818103600083015261468c816140dc565b9050919050565b600060208201905081810360008301526146ac816140ff565b9050919050565b600060208201905081810360008301526146cc81614122565b9050919050565b600060208201905081810360008301526146ec81614145565b9050919050565b6000602082019050818103600083015261470c81614168565b9050919050565b6000602082019050818103600083015261472c8161418b565b9050919050565b6000602082019050818103600083015261474c816141ae565b9050919050565b6000602082019050818103600083015261476c816141d1565b9050919050565b6000602082019050818103600083015261478c816141f4565b9050919050565b600060208201905081810360008301526147ac81614217565b9050919050565b600060208201905081810360008301526147cc8161423a565b9050919050565b600060208201905081810360008301526147ec8161425d565b9050919050565b6000602082019050818103600083015261480c81614280565b9050919050565b6000602082019050818103600083015261482c816142a3565b9050919050565b6000602082019050818103600083015261484c816142c6565b9050919050565b6000602082019050818103600083015261486c816142e9565b9050919050565b6000602082019050818103600083015261488c8161432f565b9050919050565b600060208201905081810360008301526148ac81614352565b9050919050565b600060208201905081810360008301526148cc81614398565b9050919050565b600060208201905081810360008301526148ec816143de565b9050919050565b60006020820190506149086000830184614410565b92915050565b6000614918614929565b90506149248282614c48565b919050565b6000604051905090565b600067ffffffffffffffff82111561494e5761494d614dde565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561497a57614979614dde565b5b61498382614e26565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a2282614ba0565b9150614a2d83614ba0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a6257614a61614cf3565b5b828201905092915050565b6000614a7882614ba0565b9150614a8383614ba0565b925082614a9357614a92614d22565b5b828204905092915050565b6000614aa982614ba0565b9150614ab483614ba0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614aed57614aec614cf3565b5b828202905092915050565b6000614b0382614ba0565b9150614b0e83614ba0565b925082821015614b2157614b20614cf3565b5b828203905092915050565b6000614b3782614b80565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614bd7578082015181840152602081019050614bbc565b83811115614be6576000848401525b50505050565b6000614bf782614ba0565b91506000821415614c0b57614c0a614cf3565b5b600182039050919050565b60006002820490506001821680614c2e57607f821691505b60208210811415614c4257614c41614d51565b5b50919050565b614c5182614e26565b810181811067ffffffffffffffff82111715614c7057614c6f614dde565b5b80604052505050565b6000614c8482614ba0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cb757614cb6614cf3565b5b600182019050919050565b6000614ccd82614ba0565b9150614cd883614ba0565b925082614ce857614ce7614d22565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f416c6c20746865205469636b65747320617265206d696e7465642e0000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5469636b65747320617265206e6f74206d696e7461626c65207965742e000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f416c6c20746865207469636b65747320617265206d696e7465642e0000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5469636b65747320617265206e6f7420636c61696d61626c65207965742e0000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f7420746865207269676874207061796d656e742e00000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61559781614b2c565b81146155a257600080fd5b50565b6155ae81614b3e565b81146155b957600080fd5b50565b6155c581614b4a565b81146155d057600080fd5b50565b6155dc81614b54565b81146155e757600080fd5b50565b6155f381614ba0565b81146155fe57600080fd5b5056fea26469706673582212204f0996abf3d7ce8618cdc5bad9d4e07646d73645dad0d58e2ea070b158b8fb0764736f6c63430008070033

Deployed ByteCode Sourcemap

56186:7083:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63039:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21028:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22587:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22110:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34604:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61948:97;;;;;;;;;;;;;:::i;:::-;;23477:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50943:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51328:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34272:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52376:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62186:135;;;;;;;;;;;;;:::i;:::-;;57620:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23887:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54528:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34794:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57880:361;;;:::i;:::-;;42975:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62053:99;;;;;;;;;;;;;:::i;:::-;;20722:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20452:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58249:463;;;:::i;:::-;;61811:97;;;;;;;;;;;;;:::i;:::-;;59695:1970;;;;;;;;;;;;;:::i;:::-;;57112:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58720:464;;;:::i;:::-;;49828:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21197:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48919:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22880:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24143:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56662:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62835:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56596:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56407:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51720:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56338:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61708:95;;;;;;;;;;;;;:::i;:::-;;23246:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59192:495;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63039:227;63193:4;63222:36;63246:11;63222:23;:36::i;:::-;63215:43;;63039:227;;;:::o;21028:100::-;21082:13;21115:5;21108:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21028:100;:::o;22587:221::-;22663:7;22691:16;22699:7;22691;:16::i;:::-;22683:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22776:15;:24;22792:7;22776:24;;;;;;;;;;;;;;;;;;;;;22769:31;;22587:221;;;:::o;22110:411::-;22191:13;22207:23;22222:7;22207:14;:23::i;:::-;22191:39;;22255:5;22249:11;;:2;:11;;;;22241:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22349:5;22333:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22358:37;22375:5;22382:12;:10;:12::i;:::-;22358:16;:37::i;:::-;22333:62;22311:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22492:21;22501:2;22505:7;22492:8;:21::i;:::-;22180:341;22110:411;;:::o;34604:113::-;34665:7;34692:10;:17;;;;34685:24;;34604:113;:::o;61948:97::-;48964:4;61990:18;;49410:30;49421:4;49427:12;:10;:12::i;:::-;49410:10;:30::i;:::-;62033:4:::1;62021:9;;:16;;;;;;;;;;;;;;;;;;61948:97:::0;:::o;23477:339::-;23672:41;23691:12;:10;:12::i;:::-;23705:7;23672:18;:41::i;:::-;23664:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23780:28;23790:4;23796:2;23800:7;23780:9;:28::i;:::-;23477:339;;;:::o;50943:123::-;51009:7;51036:6;:12;51043:4;51036:12;;;;;;;;;;;:22;;;51029:29;;50943:123;;;:::o;51328:147::-;51411:18;51424:4;51411:12;:18::i;:::-;49410:30;49421:4;49427:12;:10;:12::i;:::-;49410:10;:30::i;:::-;51442:25:::1;51453:4;51459:7;51442:10;:25::i;:::-;51328:147:::0;;;:::o;34272:256::-;34369:7;34405:23;34422:5;34405:16;:23::i;:::-;34397:5;:31;34389:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34494:12;:19;34507:5;34494:19;;;;;;;;;;;;;;;:26;34514:5;34494:26;;;;;;;;;;;;34487:33;;34272:256;;;;:::o;52376:218::-;52483:12;:10;:12::i;:::-;52472:23;;:7;:23;;;52464:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52560:26;52572:4;52578:7;52560:11;:26::i;:::-;52376:218;;:::o;62186:135::-;48964:4;62222:18;;49410:30;49421:4;49427:12;:10;:12::i;:::-;49410:10;:30::i;:::-;62253:60:::1;62279:10;62291:21;62253:17;:60::i;:::-;62186:135:::0;:::o;57620:252::-;48964:4;57666:18;;49410:30;49421:4;49427:12;:10;:12::i;:::-;49410:10;:30::i;:::-;56633:2:::1;57705:25;:15;:23;:25::i;:::-;:38;57697:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;57786:40;57796:2;57800:25;:15;:23;:25::i;:::-;57786:9;:40::i;:::-;57837:27;:15;:25;:27::i;:::-;57620:252:::0;;:::o;23887:185::-;24025:39;24042:4;24048:2;24052:7;24025:39;;;;;;;;;;;;:16;:39::i;:::-;23887:185;;;:::o;54528:245::-;54646:41;54665:12;:10;:12::i;:::-;54679:7;54646:18;:41::i;:::-;54638:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;54751:14;54757:7;54751:5;:14::i;:::-;54528:245;:::o;34794:233::-;34869:7;34905:30;:28;:30::i;:::-;34897:5;:38;34889:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35002:10;35013:5;35002:17;;;;;;;;:::i;:::-;;;;;;;;;;34995:24;;34794:233;;;:::o;57880:361::-;57936:8;;;;;;;;;;;57928:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56633:2;57997:25;:15;:23;:25::i;:::-;:38;57989:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;56699:7;58086:9;:23;;58078:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58147:48;58157:10;58169:25;:15;:23;:25::i;:::-;58147:9;:48::i;:::-;58206:27;:15;:25;:27::i;:::-;57880:361::o;42975:86::-;43022:4;43046:7;;;;;;;;;;;43039:14;;42975:86;:::o;62053:99::-;48964:4;62096:18;;49410:30;49421:4;49427:12;:10;:12::i;:::-;49410:10;:30::i;:::-;62139:5:::1;62127:9;;:17;;;;;;;;;;;;;;;;;;62053:99:::0;:::o;20722:239::-;20794:7;20814:13;20830:7;:16;20838:7;20830:16;;;;;;;;;;;;;;;;;;;;;20814:32;;20882:1;20865:19;;:5;:19;;;;20857:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20948:5;20941:12;;;20722:239;;;:::o;20452:208::-;20524:7;20569:1;20552:19;;:5;:19;;;;20544:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20636:9;:16;20646:5;20636:16;;;;;;;;;;;;;;;;20629:23;;20452:208;;;:::o;58249:463::-;58309:8;;;;;;;;;;;58301:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56633:2;58398:1;58370:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;:42;58362:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;58489:2;56699:7;58476:15;;;;:::i;:::-;58463:9;:28;;58455:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;58529:13;58553:150;58577:2;58569:5;:10;58553:150;;;58603:48;58613:10;58625:25;:15;:23;:25::i;:::-;58603:9;:48::i;:::-;58664:27;:15;:25;:27::i;:::-;58581:7;;;;;:::i;:::-;;;;58553:150;;;58290:422;58249:463::o;61811:97::-;48964:4;61853:18;;49410:30;49421:4;49427:12;:10;:12::i;:::-;49410:10;:30::i;:::-;61895:5:::1;61884:8;;:16;;;;;;;;;;;;;;;;;;61811:97:::0;:::o;59695:1970::-;59745:9;;;;;;;;;;;59737:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;59802:18;59823:42;59802:63;;59876:17;59910:10;59876:45;;59932:26;59961:3;:17;;;59979:10;59961:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59932:58;;60001:21;60025:9;:16;60001:40;;60054:13;60078:17;60098:1;60078:21;;60123:1;60115:9;;60110:164;60134:13;60126:5;:21;60110:164;;;60201:1;60196;60177:9;60187:5;60177:16;;;;;;;;:::i;:::-;;;;;;;;:20;;;;:::i;:::-;:25;60173:90;;;60246:1;60234:9;:13;;;;:::i;:::-;60222:25;;60173:90;60149:7;;;;;:::i;:::-;;;;60110:164;;;60286:19;60308:42;60286:64;;60361:22;60404:11;60361:55;;60427:27;60457:4;:18;;;60476:10;60457:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60427:60;;60498:22;60523:10;:17;60498:42;;60553:18;60599:1;60591:9;;60586:168;60610:14;60602:5;:22;60586:168;;;60679:1;60674;60654:10;60665:5;60654:17;;;;;;;;:::i;:::-;;;;;;;;:21;;;;:::i;:::-;:26;60650:93;;;60726:1;60713:10;:14;;;;:::i;:::-;60700:27;;60650:93;60626:7;;;;;:::i;:::-;;;;60586:168;;;56633:2;60823:1;60810:10;60798:9;60770:25;:15;:23;:25::i;:::-;:37;;;;:::i;:::-;:50;;;;:::i;:::-;:54;;;;:::i;:::-;:67;60762:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;60893:1;60885:9;;60880:381;60904:13;60896:5;:21;60880:381;;;60959:10;60972:9;60982:5;60972:16;;;;;;;;:::i;:::-;;;;;;;;60959:29;;61015:1;61010;61005:2;:6;;;;:::i;:::-;:11;61001:251;;;61057:5;61040:22;;:9;61050:2;61040:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:22;;;61036:203;;;61084:48;61094:10;61106:25;:15;:23;:25::i;:::-;61084:9;:48::i;:::-;61153:27;:15;:25;:27::i;:::-;61217:4;61201:9;61211:2;61201:13;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;61036:203;61001:251;60928:333;60919:7;;;;;:::i;:::-;;;;60880:381;;;61284:1;61276:9;;61271:385;61295:14;61287:5;:22;61271:385;;;61351:10;61364;61375:5;61364:17;;;;;;;;:::i;:::-;;;;;;;;61351:30;;61408:1;61403;61398:2;:6;;;;:::i;:::-;:11;61394:253;;;61451:5;61433:23;;:10;61444:2;61433:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:23;;;61429:205;;;61478:48;61488:10;61500:25;:15;:23;:25::i;:::-;61478:9;:48::i;:::-;61547:27;:15;:25;:27::i;:::-;61612:4;61595:10;61606:2;61595:14;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;61429:205;61394:253;61320:336;61311:7;;;;;:::i;:::-;;;;61271:385;;;59726:1939;;;;;;;;;;;59695:1970::o;57112:498::-;57174:16;57203:18;57224:17;57234:6;57224:9;:17::i;:::-;57203:38;;57270:1;57256:10;:15;57252:109;;;57347:1;57333:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57326:23;;;;;57252:109;57371:23;57411:10;57397:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57371:51;;57433:13;57457:122;57481:10;57473:5;:18;57457:122;;;57533:34;57553:6;57561:5;57533:19;:34::i;:::-;57517:6;57524:5;57517:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;57493:7;;;;;:::i;:::-;;;;57457:122;;;57596:6;57589:13;;;;;57112:498;;;;:::o;58720:464::-;58782:8;;;;;;;;;;;58774:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56633:2;58871;58843:25;:15;:23;:25::i;:::-;:30;;;;:::i;:::-;:43;58835:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58963:2;56699:7;58950:15;;;;:::i;:::-;58937:9;:28;;58929:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;59003:13;59027:150;59051:2;59043:5;:10;59027:150;;;59077:48;59087:10;59099:25;:15;:23;:25::i;:::-;59077:9;:48::i;:::-;59138:27;:15;:25;:27::i;:::-;59055:7;;;;;:::i;:::-;;;;59027:150;;;58763:421;58720:464::o;49828:139::-;49906:4;49930:6;:12;49937:4;49930:12;;;;;;;;;;;:20;;:29;49951:7;49930:29;;;;;;;;;;;;;;;;;;;;;;;;;49923:36;;49828:139;;;;:::o;21197:104::-;21253:13;21286:7;21279:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21197:104;:::o;48919:49::-;48964:4;48919:49;;;:::o;22880:295::-;22995:12;:10;:12::i;:::-;22983:24;;:8;:24;;;;22975:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23095:8;23050:18;:32;23069:12;:10;:12::i;:::-;23050:32;;;;;;;;;;;;;;;:42;23083:8;23050:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23148:8;23119:48;;23134:12;:10;:12::i;:::-;23119:48;;;23158:8;23119:48;;;;;;:::i;:::-;;;;;;;;22880:295;;:::o;24143:328::-;24318:41;24337:12;:10;:12::i;:::-;24351:7;24318:18;:41::i;:::-;24310:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24424:39;24438:4;24444:2;24448:7;24457:5;24424:13;:39::i;:::-;24143:328;;;;:::o;56662:44::-;56699:7;56662:44;:::o;62835:196::-;62962:13;63000:23;63015:7;63000:14;:23::i;:::-;62993:30;;62835:196;;;:::o;56596:39::-;56633:2;56596:39;:::o;56407:62::-;56445:24;56407:62;:::o;51720:149::-;51804:18;51817:4;51804:12;:18::i;:::-;49410:30;49421:4;49427:12;:10;:12::i;:::-;49410:10;:30::i;:::-;51835:26:::1;51847:4;51853:7;51835:11;:26::i;:::-;51720:149:::0;;;:::o;56338:62::-;56376:24;56338:62;:::o;61708:95::-;48964:4;61749:18;;49410:30;49421:4;49427:12;:10;:12::i;:::-;49410:10;:30::i;:::-;61791:4:::1;61780:8;;:15;;;;;;;;;;;;;;;;;;61708:95:::0;:::o;23246:164::-;23343:4;23367:18;:25;23386:5;23367:25;;;;;;;;;;;;;;;:35;23393:8;23367:35;;;;;;;;;;;;;;;;;;;;;;;;;23360:42;;23246:164;;;;:::o;59192:495::-;59269:8;;;;;;;;;;;59261:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56633:2;59367:1;59358:6;59330:25;:15;:23;:25::i;:::-;:34;;;;:::i;:::-;:38;;;;:::i;:::-;:51;59322:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;59458:6;56699:7;59445:19;;;;:::i;:::-;59432:9;:32;;59424:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59502:13;59526:154;59550:6;59542:5;:14;59526:154;;;59580:48;59590:10;59602:25;:15;:23;:25::i;:::-;59580:9;:48::i;:::-;59641:27;:15;:25;:27::i;:::-;59558:7;;;;;:::i;:::-;;;;59526:154;;;59250:437;59192:495;:::o;49532:204::-;49617:4;49656:32;49641:47;;;:11;:47;;;;:87;;;;49692:36;49716:11;49692:23;:36::i;:::-;49641:87;49634:94;;49532:204;;;:::o;25981:127::-;26046:4;26098:1;26070:30;;:7;:16;26078:7;26070:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26063:37;;25981:127;;;:::o;15706:98::-;15759:7;15786:10;15779:17;;15706:98;:::o;29963:174::-;30065:2;30038:15;:24;30054:7;30038:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30121:7;30117:2;30083:46;;30092:23;30107:7;30092:14;:23::i;:::-;30083:46;;;;;;;;;;;;29963:174;;:::o;50257:497::-;50338:22;50346:4;50352:7;50338;:22::i;:::-;50333:414;;50526:41;50554:7;50526:41;;50564:2;50526:19;:41::i;:::-;50640:38;50668:4;50660:13;;50675:2;50640:19;:38::i;:::-;50431:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50377:358;;;;;;;;;;;:::i;:::-;;;;;;;;50333:414;50257:497;;:::o;26275:348::-;26368:4;26393:16;26401:7;26393;:16::i;:::-;26385:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26469:13;26485:23;26500:7;26485:14;:23::i;:::-;26469:39;;26538:5;26527:16;;:7;:16;;;:51;;;;26571:7;26547:31;;:20;26559:7;26547:11;:20::i;:::-;:31;;;26527:51;:87;;;;26582:32;26599:5;26606:7;26582:16;:32::i;:::-;26527:87;26519:96;;;26275:348;;;;:::o;29267:578::-;29426:4;29399:31;;:23;29414:7;29399:14;:23::i;:::-;:31;;;29391:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29509:1;29495:16;;:2;:16;;;;29487:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29565:39;29586:4;29592:2;29596:7;29565:20;:39::i;:::-;29669:29;29686:1;29690:7;29669:8;:29::i;:::-;29730:1;29711:9;:15;29721:4;29711:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29759:1;29742:9;:13;29752:2;29742:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29790:2;29771:7;:16;29779:7;29771:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29829:7;29825:2;29810:27;;29819:4;29810:27;;;;;;;;;;;;29267:578;;;:::o;53680:229::-;53755:22;53763:4;53769:7;53755;:22::i;:::-;53750:152;;53826:4;53794:6;:12;53801:4;53794:12;;;;;;;;;;;:20;;:29;53815:7;53794:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;53877:12;:10;:12::i;:::-;53850:40;;53868:7;53850:40;;53862:4;53850:40;;;;;;;;;;53750:152;53680:229;;:::o;53917:230::-;53992:22;54000:4;54006:7;53992;:22::i;:::-;53988:152;;;54063:5;54031:6;:12;54038:4;54031:12;;;;;;;;;;;:20;;:29;54052:7;54031:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;54115:12;:10;:12::i;:::-;54088:40;;54106:7;54088:40;;54100:4;54088:40;;;;;;;;;;53988:152;53917:230;;:::o;9128:317::-;9243:6;9218:21;:31;;9210:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9297:12;9315:9;:14;;9337:6;9315:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9296:52;;;9367:7;9359:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9199:246;9128:317;;:::o;55538:114::-;55603:7;55630;:14;;;55623:21;;55538:114;;;:::o;26965:110::-;27041:26;27051:2;27055:7;27041:26;;;;;;;;;;;;:9;:26::i;:::-;26965:110;;:::o;55660:127::-;55767:1;55749:7;:14;;;:19;;;;;;;;;;;55660:127;:::o;62712:115::-;62799:20;62811:7;62799:11;:20::i;:::-;62712:115;:::o;25353:315::-;25510:28;25520:4;25526:2;25530:7;25510:9;:28::i;:::-;25557:48;25580:4;25586:2;25590:7;25599:5;25557:22;:48::i;:::-;25549:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25353:315;;;;:::o;40463:679::-;40536:13;40570:16;40578:7;40570;:16::i;:::-;40562:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;40653:23;40679:10;:19;40690:7;40679:19;;;;;;;;;;;40653:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40709:18;40730:10;:8;:10::i;:::-;40709:31;;40838:1;40822:4;40816:18;:23;40812:72;;;40863:9;40856:16;;;;;;40812:72;41014:1;40994:9;40988:23;:27;40984:108;;;41063:4;41069:9;41046:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41032:48;;;;;;40984:108;41111:23;41126:7;41111:14;:23::i;:::-;41104:30;;;;40463:679;;;;:::o;33964:224::-;34066:4;34105:35;34090:50;;;:11;:50;;;;:90;;;;34144:36;34168:11;34144:23;:36::i;:::-;34090:90;34083:97;;33964:224;;;:::o;17474:451::-;17549:13;17575:19;17620:1;17611:6;17607:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17597:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17575:47;;17633:15;:6;17640:1;17633:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17659;:6;17666:1;17659:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17690:9;17715:1;17706:6;17702:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17690:26;;17685:135;17722:1;17718;:5;17685:135;;;17757:12;17778:3;17770:5;:11;17757:25;;;;;;;:::i;:::-;;;;;17745:6;17752:1;17745:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;17807:1;17797:11;;;;;17725:3;;;;:::i;:::-;;;17685:135;;;;17847:1;17838:5;:10;17830:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17910:6;17896:21;;;17474:451;;;;:::o;62407:227::-;43301:8;:6;:8::i;:::-;43300:9;43292:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;62581:45:::1;62608:4;62614:2;62618:7;62581:26;:45::i;:::-;62407:227:::0;;;:::o;27302:321::-;27432:18;27438:2;27442:7;27432:5;:18::i;:::-;27483:54;27514:1;27518:2;27522:7;27531:5;27483:22;:54::i;:::-;27461:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27302:321;;;:::o;41744:206::-;41813:20;41825:7;41813:11;:20::i;:::-;41887:1;41856:10;:19;41867:7;41856:19;;;;;;;;;;;41850:33;;;;;:::i;:::-;;;:38;41846:97;;41912:10;:19;41923:7;41912:19;;;;;;;;;;;;41905:26;;;;:::i;:::-;41846:97;41744:206;:::o;30702:799::-;30857:4;30878:15;:2;:13;;;:15::i;:::-;30874:620;;;30930:2;30914:36;;;30951:12;:10;:12::i;:::-;30965:4;30971:7;30980:5;30914:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30910:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31173:1;31156:6;:13;:18;31152:272;;;31199:60;;;;;;;;;;:::i;:::-;;;;;;;;31152:272;31374:6;31368:13;31359:6;31355:2;31351:15;31344:38;30910:529;31047:41;;;31037:51;;;:6;:51;;;;31030:58;;;;;30874:620;31478:4;31471:11;;30702:799;;;;;;;:::o;56997:107::-;57049:13;57075:21;;;;;;;;;;;;;;;;;;;56997:107;:::o;21372:334::-;21445:13;21479:16;21487:7;21479;:16::i;:::-;21471:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21560:21;21584:10;:8;:10::i;:::-;21560:34;;21636:1;21618:7;21612:21;:25;:86;;;;;;;;;;;;;;;;;21664:7;21673:18;:7;:16;:18::i;:::-;21647:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21612:86;21605:93;;;21372:334;;;:::o;20083:305::-;20185:4;20237:25;20222:40;;;:11;:40;;;;:105;;;;20294:33;20279:48;;;:11;:48;;;;20222:105;:158;;;;20344:36;20368:11;20344:23;:36::i;:::-;20222:158;20202:178;;20083:305;;;:::o;35640:589::-;35784:45;35811:4;35817:2;35821:7;35784:26;:45::i;:::-;35862:1;35846:18;;:4;:18;;;35842:187;;;35881:40;35913:7;35881:31;:40::i;:::-;35842:187;;;35951:2;35943:10;;:4;:10;;;35939:90;;35970:47;36003:4;36009:7;35970:32;:47::i;:::-;35939:90;35842:187;36057:1;36043:16;;:2;:16;;;36039:183;;;36076:45;36113:7;36076:36;:45::i;:::-;36039:183;;;36149:4;36143:10;;:2;:10;;;36139:83;;36170:40;36198:2;36202:7;36170:27;:40::i;:::-;36139:83;36039:183;35640:589;;;:::o;27959:382::-;28053:1;28039:16;;:2;:16;;;;28031:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28112:16;28120:7;28112;:16::i;:::-;28111:17;28103:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28174:45;28203:1;28207:2;28211:7;28174:20;:45::i;:::-;28249:1;28232:9;:13;28242:2;28232:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28280:2;28261:7;:16;28269:7;28261:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28325:7;28321:2;28300:33;;28317:1;28300:33;;;;;;;;;;;;27959:382;;:::o;28570:360::-;28630:13;28646:23;28661:7;28646:14;:23::i;:::-;28630:39;;28682:48;28703:5;28718:1;28722:7;28682:20;:48::i;:::-;28771:29;28788:1;28792:7;28771:8;:29::i;:::-;28833:1;28813:9;:16;28823:5;28813:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28852:7;:16;28860:7;28852:16;;;;;;;;;;;;28845:23;;;;;;;;;;;28914:7;28910:1;28886:36;;28895:5;28886:36;;;;;;;;;;;;28619:311;28570:360;:::o;7806:387::-;7866:4;8074:12;8141:7;8129:20;8121:28;;8184:1;8177:4;:8;8170:15;;;7806:387;;;:::o;16173:723::-;16229:13;16459:1;16450:5;:10;16446:53;;;16477:10;;;;;;;;;;;;;;;;;;;;;16446:53;16509:12;16524:5;16509:20;;16540:14;16565:78;16580:1;16572:4;:9;16565:78;;16598:8;;;;;:::i;:::-;;;;16629:2;16621:10;;;;;:::i;:::-;;;16565:78;;;16653:19;16685:6;16675:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16653:39;;16703:154;16719:1;16710:5;:10;16703:154;;16747:1;16737:11;;;;;:::i;:::-;;;16814:2;16806:5;:10;;;;:::i;:::-;16793:2;:24;;;;:::i;:::-;16780:39;;16763:6;16770;16763:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16843:2;16834:11;;;;;:::i;:::-;;;16703:154;;;16881:6;16867:21;;;;;16173:723;;;;:::o;18659:157::-;18744:4;18783:25;18768:40;;;:11;:40;;;;18761:47;;18659:157;;;:::o;32073:126::-;;;;:::o;36952:164::-;37056:10;:17;;;;37029:15;:24;37045:7;37029:24;;;;;;;;;;;:44;;;;37084:10;37100:7;37084:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36952:164;:::o;37743:988::-;38009:22;38059:1;38034:22;38051:4;38034:16;:22::i;:::-;:26;;;;:::i;:::-;38009:51;;38071:18;38092:17;:26;38110:7;38092:26;;;;;;;;;;;;38071:47;;38239:14;38225:10;:28;38221:328;;38270:19;38292:12;:18;38305:4;38292:18;;;;;;;;;;;;;;;:34;38311:14;38292:34;;;;;;;;;;;;38270:56;;38376:11;38343:12;:18;38356:4;38343:18;;;;;;;;;;;;;;;:30;38362:10;38343:30;;;;;;;;;;;:44;;;;38493:10;38460:17;:30;38478:11;38460:30;;;;;;;;;;;:43;;;;38255:294;38221:328;38645:17;:26;38663:7;38645:26;;;;;;;;;;;38638:33;;;38689:12;:18;38702:4;38689:18;;;;;;;;;;;;;;;:34;38708:14;38689:34;;;;;;;;;;;38682:41;;;37824:907;;37743:988;;:::o;39026:1079::-;39279:22;39324:1;39304:10;:17;;;;:21;;;;:::i;:::-;39279:46;;39336:18;39357:15;:24;39373:7;39357:24;;;;;;;;;;;;39336:45;;39708:19;39730:10;39741:14;39730:26;;;;;;;;:::i;:::-;;;;;;;;;;39708:48;;39794:11;39769:10;39780;39769:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39905:10;39874:15;:28;39890:11;39874:28;;;;;;;;;;;:41;;;;40046:15;:24;40062:7;40046:24;;;;;;;;;;;40039:31;;;40081:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39097:1008;;;39026:1079;:::o;36530:221::-;36615:14;36632:20;36649:2;36632:16;:20::i;:::-;36615:37;;36690:7;36663:12;:16;36676:2;36663:16;;;;;;;;;;;;;;;:24;36680:6;36663:24;;;;;;;;;;;:34;;;;36737:6;36708:17;:26;36726:7;36708:26;;;;;;;;;;;:35;;;;36604:147;36530:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:744:1:-;131:5;156:81;172:64;229:6;172:64;:::i;:::-;156:81;:::i;:::-;147:90;;257:5;286:6;279:5;272:21;320:4;313:5;309:16;302:23;;346:6;396:3;388:4;380:6;376:17;371:3;367:27;364:36;361:143;;;415:79;;:::i;:::-;361:143;528:1;513:249;538:6;535:1;532:13;513:249;;;606:3;635:48;679:3;667:10;635:48;:::i;:::-;630:3;623:61;713:4;708:3;704:14;697:21;;747:4;742:3;738:14;731:21;;573:189;560:1;557;553:9;548:14;;513:249;;;517:14;137:631;;24:744;;;;;:::o;774:410::-;851:5;876:65;892:48;933:6;892:48;:::i;:::-;876:65;:::i;:::-;867:74;;964:6;957:5;950:21;1002:4;995:5;991:16;1040:3;1031:6;1026:3;1022:16;1019:25;1016:112;;;1047:79;;:::i;:::-;1016:112;1137:41;1171:6;1166:3;1161;1137:41;:::i;:::-;857:327;774:410;;;;;:::o;1190:139::-;1236:5;1274:6;1261:20;1252:29;;1290:33;1317:5;1290:33;:::i;:::-;1190:139;;;;:::o;1352:385::-;1434:5;1483:3;1476:4;1468:6;1464:17;1460:27;1450:122;;1491:79;;:::i;:::-;1450:122;1601:6;1595:13;1626:105;1727:3;1719:6;1712:4;1704:6;1700:17;1626:105;:::i;:::-;1617:114;;1440:297;1352:385;;;;:::o;1743:133::-;1786:5;1824:6;1811:20;1802:29;;1840:30;1864:5;1840:30;:::i;:::-;1743:133;;;;:::o;1882:139::-;1928:5;1966:6;1953:20;1944:29;;1982:33;2009:5;1982:33;:::i;:::-;1882:139;;;;:::o;2027:137::-;2072:5;2110:6;2097:20;2088:29;;2126:32;2152:5;2126:32;:::i;:::-;2027:137;;;;:::o;2170:141::-;2226:5;2257:6;2251:13;2242:22;;2273:32;2299:5;2273:32;:::i;:::-;2170:141;;;;:::o;2330:338::-;2385:5;2434:3;2427:4;2419:6;2415:17;2411:27;2401:122;;2442:79;;:::i;:::-;2401:122;2559:6;2546:20;2584:78;2658:3;2650:6;2643:4;2635:6;2631:17;2584:78;:::i;:::-;2575:87;;2391:277;2330:338;;;;:::o;2674:139::-;2720:5;2758:6;2745:20;2736:29;;2774:33;2801:5;2774:33;:::i;:::-;2674:139;;;;:::o;2819:143::-;2876:5;2907:6;2901:13;2892:22;;2923:33;2950:5;2923:33;:::i;:::-;2819:143;;;;:::o;2968:329::-;3027:6;3076:2;3064:9;3055:7;3051:23;3047:32;3044:119;;;3082:79;;:::i;:::-;3044:119;3202:1;3227:53;3272:7;3263:6;3252:9;3248:22;3227:53;:::i;:::-;3217:63;;3173:117;2968:329;;;;:::o;3303:474::-;3371:6;3379;3428:2;3416:9;3407:7;3403:23;3399:32;3396:119;;;3434:79;;:::i;:::-;3396:119;3554:1;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3525:117;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3303:474;;;;;:::o;3783:619::-;3860:6;3868;3876;3925:2;3913:9;3904:7;3900:23;3896:32;3893:119;;;3931:79;;:::i;:::-;3893:119;4051:1;4076:53;4121:7;4112:6;4101:9;4097:22;4076:53;:::i;:::-;4066:63;;4022:117;4178:2;4204:53;4249:7;4240:6;4229:9;4225:22;4204:53;:::i;:::-;4194:63;;4149:118;4306:2;4332:53;4377:7;4368:6;4357:9;4353:22;4332:53;:::i;:::-;4322:63;;4277:118;3783:619;;;;;:::o;4408:943::-;4503:6;4511;4519;4527;4576:3;4564:9;4555:7;4551:23;4547:33;4544:120;;;4583:79;;:::i;:::-;4544:120;4703:1;4728:53;4773:7;4764:6;4753:9;4749:22;4728:53;:::i;:::-;4718:63;;4674:117;4830:2;4856:53;4901:7;4892:6;4881:9;4877:22;4856:53;:::i;:::-;4846:63;;4801:118;4958:2;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4929:118;5114:2;5103:9;5099:18;5086:32;5145:18;5137:6;5134:30;5131:117;;;5167:79;;:::i;:::-;5131:117;5272:62;5326:7;5317:6;5306:9;5302:22;5272:62;:::i;:::-;5262:72;;5057:287;4408:943;;;;;;;:::o;5357:468::-;5422:6;5430;5479:2;5467:9;5458:7;5454:23;5450:32;5447:119;;;5485:79;;:::i;:::-;5447:119;5605:1;5630:53;5675:7;5666:6;5655:9;5651:22;5630:53;:::i;:::-;5620:63;;5576:117;5732:2;5758:50;5800:7;5791:6;5780:9;5776:22;5758:50;:::i;:::-;5748:60;;5703:115;5357:468;;;;;:::o;5831:474::-;5899:6;5907;5956:2;5944:9;5935:7;5931:23;5927:32;5924:119;;;5962:79;;:::i;:::-;5924:119;6082:1;6107:53;6152:7;6143:6;6132:9;6128:22;6107:53;:::i;:::-;6097:63;;6053:117;6209:2;6235:53;6280:7;6271:6;6260:9;6256:22;6235:53;:::i;:::-;6225:63;;6180:118;5831:474;;;;;:::o;6311:554::-;6406:6;6455:2;6443:9;6434:7;6430:23;6426:32;6423:119;;;6461:79;;:::i;:::-;6423:119;6602:1;6591:9;6587:17;6581:24;6632:18;6624:6;6621:30;6618:117;;;6654:79;;:::i;:::-;6618:117;6759:89;6840:7;6831:6;6820:9;6816:22;6759:89;:::i;:::-;6749:99;;6552:306;6311:554;;;;:::o;6871:329::-;6930:6;6979:2;6967:9;6958:7;6954:23;6950:32;6947:119;;;6985:79;;:::i;:::-;6947:119;7105:1;7130:53;7175:7;7166:6;7155:9;7151:22;7130:53;:::i;:::-;7120:63;;7076:117;6871:329;;;;:::o;7206:474::-;7274:6;7282;7331:2;7319:9;7310:7;7306:23;7302:32;7299:119;;;7337:79;;:::i;:::-;7299:119;7457:1;7482:53;7527:7;7518:6;7507:9;7503:22;7482:53;:::i;:::-;7472:63;;7428:117;7584:2;7610:53;7655:7;7646:6;7635:9;7631:22;7610:53;:::i;:::-;7600:63;;7555:118;7206:474;;;;;:::o;7686:327::-;7744:6;7793:2;7781:9;7772:7;7768:23;7764:32;7761:119;;;7799:79;;:::i;:::-;7761:119;7919:1;7944:52;7988:7;7979:6;7968:9;7964:22;7944:52;:::i;:::-;7934:62;;7890:116;7686:327;;;;:::o;8019:349::-;8088:6;8137:2;8125:9;8116:7;8112:23;8108:32;8105:119;;;8143:79;;:::i;:::-;8105:119;8263:1;8288:63;8343:7;8334:6;8323:9;8319:22;8288:63;:::i;:::-;8278:73;;8234:127;8019:349;;;;:::o;8374:329::-;8433:6;8482:2;8470:9;8461:7;8457:23;8453:32;8450:119;;;8488:79;;:::i;:::-;8450:119;8608:1;8633:53;8678:7;8669:6;8658:9;8654:22;8633:53;:::i;:::-;8623:63;;8579:117;8374:329;;;;:::o;8709:179::-;8778:10;8799:46;8841:3;8833:6;8799:46;:::i;:::-;8877:4;8872:3;8868:14;8854:28;;8709:179;;;;:::o;8894:118::-;8981:24;8999:5;8981:24;:::i;:::-;8976:3;8969:37;8894:118;;:::o;9048:732::-;9167:3;9196:54;9244:5;9196:54;:::i;:::-;9266:86;9345:6;9340:3;9266:86;:::i;:::-;9259:93;;9376:56;9426:5;9376:56;:::i;:::-;9455:7;9486:1;9471:284;9496:6;9493:1;9490:13;9471:284;;;9572:6;9566:13;9599:63;9658:3;9643:13;9599:63;:::i;:::-;9592:70;;9685:60;9738:6;9685:60;:::i;:::-;9675:70;;9531:224;9518:1;9515;9511:9;9506:14;;9471:284;;;9475:14;9771:3;9764:10;;9172:608;;;9048:732;;;;:::o;9786:109::-;9867:21;9882:5;9867:21;:::i;:::-;9862:3;9855:34;9786:109;;:::o;9901:118::-;9988:24;10006:5;9988:24;:::i;:::-;9983:3;9976:37;9901:118;;:::o;10025:360::-;10111:3;10139:38;10171:5;10139:38;:::i;:::-;10193:70;10256:6;10251:3;10193:70;:::i;:::-;10186:77;;10272:52;10317:6;10312:3;10305:4;10298:5;10294:16;10272:52;:::i;:::-;10349:29;10371:6;10349:29;:::i;:::-;10344:3;10340:39;10333:46;;10115:270;10025:360;;;;:::o;10391:364::-;10479:3;10507:39;10540:5;10507:39;:::i;:::-;10562:71;10626:6;10621:3;10562:71;:::i;:::-;10555:78;;10642:52;10687:6;10682:3;10675:4;10668:5;10664:16;10642:52;:::i;:::-;10719:29;10741:6;10719:29;:::i;:::-;10714:3;10710:39;10703:46;;10483:272;10391:364;;;;:::o;10761:377::-;10867:3;10895:39;10928:5;10895:39;:::i;:::-;10950:89;11032:6;11027:3;10950:89;:::i;:::-;10943:96;;11048:52;11093:6;11088:3;11081:4;11074:5;11070:16;11048:52;:::i;:::-;11125:6;11120:3;11116:16;11109:23;;10871:267;10761:377;;;;:::o;11144:366::-;11286:3;11307:67;11371:2;11366:3;11307:67;:::i;:::-;11300:74;;11383:93;11472:3;11383:93;:::i;:::-;11501:2;11496:3;11492:12;11485:19;;11144:366;;;:::o;11516:::-;11658:3;11679:67;11743:2;11738:3;11679:67;:::i;:::-;11672:74;;11755:93;11844:3;11755:93;:::i;:::-;11873:2;11868:3;11864:12;11857:19;;11516:366;;;:::o;11888:::-;12030:3;12051:67;12115:2;12110:3;12051:67;:::i;:::-;12044:74;;12127:93;12216:3;12127:93;:::i;:::-;12245:2;12240:3;12236:12;12229:19;;11888:366;;;:::o;12260:::-;12402:3;12423:67;12487:2;12482:3;12423:67;:::i;:::-;12416:74;;12499:93;12588:3;12499:93;:::i;:::-;12617:2;12612:3;12608:12;12601:19;;12260:366;;;:::o;12632:::-;12774:3;12795:67;12859:2;12854:3;12795:67;:::i;:::-;12788:74;;12871:93;12960:3;12871:93;:::i;:::-;12989:2;12984:3;12980:12;12973:19;;12632:366;;;:::o;13004:::-;13146:3;13167:67;13231:2;13226:3;13167:67;:::i;:::-;13160:74;;13243:93;13332:3;13243:93;:::i;:::-;13361:2;13356:3;13352:12;13345:19;;13004:366;;;:::o;13376:::-;13518:3;13539:67;13603:2;13598:3;13539:67;:::i;:::-;13532:74;;13615:93;13704:3;13615:93;:::i;:::-;13733:2;13728:3;13724:12;13717:19;;13376:366;;;:::o;13748:::-;13890:3;13911:67;13975:2;13970:3;13911:67;:::i;:::-;13904:74;;13987:93;14076:3;13987:93;:::i;:::-;14105:2;14100:3;14096:12;14089:19;;13748:366;;;:::o;14120:::-;14262:3;14283:67;14347:2;14342:3;14283:67;:::i;:::-;14276:74;;14359:93;14448:3;14359:93;:::i;:::-;14477:2;14472:3;14468:12;14461:19;;14120:366;;;:::o;14492:::-;14634:3;14655:67;14719:2;14714:3;14655:67;:::i;:::-;14648:74;;14731:93;14820:3;14731:93;:::i;:::-;14849:2;14844:3;14840:12;14833:19;;14492:366;;;:::o;14864:::-;15006:3;15027:67;15091:2;15086:3;15027:67;:::i;:::-;15020:74;;15103:93;15192:3;15103:93;:::i;:::-;15221:2;15216:3;15212:12;15205:19;;14864:366;;;:::o;15236:::-;15378:3;15399:67;15463:2;15458:3;15399:67;:::i;:::-;15392:74;;15475:93;15564:3;15475:93;:::i;:::-;15593:2;15588:3;15584:12;15577:19;;15236:366;;;:::o;15608:::-;15750:3;15771:67;15835:2;15830:3;15771:67;:::i;:::-;15764:74;;15847:93;15936:3;15847:93;:::i;:::-;15965:2;15960:3;15956:12;15949:19;;15608:366;;;:::o;15980:::-;16122:3;16143:67;16207:2;16202:3;16143:67;:::i;:::-;16136:74;;16219:93;16308:3;16219:93;:::i;:::-;16337:2;16332:3;16328:12;16321:19;;15980:366;;;:::o;16352:::-;16494:3;16515:67;16579:2;16574:3;16515:67;:::i;:::-;16508:74;;16591:93;16680:3;16591:93;:::i;:::-;16709:2;16704:3;16700:12;16693:19;;16352:366;;;:::o;16724:::-;16866:3;16887:67;16951:2;16946:3;16887:67;:::i;:::-;16880:74;;16963:93;17052:3;16963:93;:::i;:::-;17081:2;17076:3;17072:12;17065:19;;16724:366;;;:::o;17096:::-;17238:3;17259:67;17323:2;17318:3;17259:67;:::i;:::-;17252:74;;17335:93;17424:3;17335:93;:::i;:::-;17453:2;17448:3;17444:12;17437:19;;17096:366;;;:::o;17468:::-;17610:3;17631:67;17695:2;17690:3;17631:67;:::i;:::-;17624:74;;17707:93;17796:3;17707:93;:::i;:::-;17825:2;17820:3;17816:12;17809:19;;17468:366;;;:::o;17840:::-;17982:3;18003:67;18067:2;18062:3;18003:67;:::i;:::-;17996:74;;18079:93;18168:3;18079:93;:::i;:::-;18197:2;18192:3;18188:12;18181:19;;17840:366;;;:::o;18212:::-;18354:3;18375:67;18439:2;18434:3;18375:67;:::i;:::-;18368:74;;18451:93;18540:3;18451:93;:::i;:::-;18569:2;18564:3;18560:12;18553:19;;18212:366;;;:::o;18584:::-;18726:3;18747:67;18811:2;18806:3;18747:67;:::i;:::-;18740:74;;18823:93;18912:3;18823:93;:::i;:::-;18941:2;18936:3;18932:12;18925:19;;18584:366;;;:::o;18956:::-;19098:3;19119:67;19183:2;19178:3;19119:67;:::i;:::-;19112:74;;19195:93;19284:3;19195:93;:::i;:::-;19313:2;19308:3;19304:12;19297:19;;18956:366;;;:::o;19328:::-;19470:3;19491:67;19555:2;19550:3;19491:67;:::i;:::-;19484:74;;19567:93;19656:3;19567:93;:::i;:::-;19685:2;19680:3;19676:12;19669:19;;19328:366;;;:::o;19700:::-;19842:3;19863:67;19927:2;19922:3;19863:67;:::i;:::-;19856:74;;19939:93;20028:3;19939:93;:::i;:::-;20057:2;20052:3;20048:12;20041:19;;19700:366;;;:::o;20072:398::-;20231:3;20252:83;20333:1;20328:3;20252:83;:::i;:::-;20245:90;;20344:93;20433:3;20344:93;:::i;:::-;20462:1;20457:3;20453:11;20446:18;;20072:398;;;:::o;20476:366::-;20618:3;20639:67;20703:2;20698:3;20639:67;:::i;:::-;20632:74;;20715:93;20804:3;20715:93;:::i;:::-;20833:2;20828:3;20824:12;20817:19;;20476:366;;;:::o;20848:::-;20990:3;21011:67;21075:2;21070:3;21011:67;:::i;:::-;21004:74;;21087:93;21176:3;21087:93;:::i;:::-;21205:2;21200:3;21196:12;21189:19;;20848:366;;;:::o;21220:402::-;21380:3;21401:85;21483:2;21478:3;21401:85;:::i;:::-;21394:92;;21495:93;21584:3;21495:93;:::i;:::-;21613:2;21608:3;21604:12;21597:19;;21220:402;;;:::o;21628:366::-;21770:3;21791:67;21855:2;21850:3;21791:67;:::i;:::-;21784:74;;21867:93;21956:3;21867:93;:::i;:::-;21985:2;21980:3;21976:12;21969:19;;21628:366;;;:::o;22000:402::-;22160:3;22181:85;22263:2;22258:3;22181:85;:::i;:::-;22174:92;;22275:93;22364:3;22275:93;:::i;:::-;22393:2;22388:3;22384:12;22377:19;;22000:402;;;:::o;22408:366::-;22550:3;22571:67;22635:2;22630:3;22571:67;:::i;:::-;22564:74;;22647:93;22736:3;22647:93;:::i;:::-;22765:2;22760:3;22756:12;22749:19;;22408:366;;;:::o;22780:108::-;22857:24;22875:5;22857:24;:::i;:::-;22852:3;22845:37;22780:108;;:::o;22894:118::-;22981:24;22999:5;22981:24;:::i;:::-;22976:3;22969:37;22894:118;;:::o;23018:435::-;23198:3;23220:95;23311:3;23302:6;23220:95;:::i;:::-;23213:102;;23332:95;23423:3;23414:6;23332:95;:::i;:::-;23325:102;;23444:3;23437:10;;23018:435;;;;;:::o;23459:379::-;23643:3;23665:147;23808:3;23665:147;:::i;:::-;23658:154;;23829:3;23822:10;;23459:379;;;:::o;23844:967::-;24226:3;24248:148;24392:3;24248:148;:::i;:::-;24241:155;;24413:95;24504:3;24495:6;24413:95;:::i;:::-;24406:102;;24525:148;24669:3;24525:148;:::i;:::-;24518:155;;24690:95;24781:3;24772:6;24690:95;:::i;:::-;24683:102;;24802:3;24795:10;;23844:967;;;;;:::o;24817:222::-;24910:4;24948:2;24937:9;24933:18;24925:26;;24961:71;25029:1;25018:9;25014:17;25005:6;24961:71;:::i;:::-;24817:222;;;;:::o;25045:640::-;25240:4;25278:3;25267:9;25263:19;25255:27;;25292:71;25360:1;25349:9;25345:17;25336:6;25292:71;:::i;:::-;25373:72;25441:2;25430:9;25426:18;25417:6;25373:72;:::i;:::-;25455;25523:2;25512:9;25508:18;25499:6;25455:72;:::i;:::-;25574:9;25568:4;25564:20;25559:2;25548:9;25544:18;25537:48;25602:76;25673:4;25664:6;25602:76;:::i;:::-;25594:84;;25045:640;;;;;;;:::o;25691:373::-;25834:4;25872:2;25861:9;25857:18;25849:26;;25921:9;25915:4;25911:20;25907:1;25896:9;25892:17;25885:47;25949:108;26052:4;26043:6;25949:108;:::i;:::-;25941:116;;25691:373;;;;:::o;26070:210::-;26157:4;26195:2;26184:9;26180:18;26172:26;;26208:65;26270:1;26259:9;26255:17;26246:6;26208:65;:::i;:::-;26070:210;;;;:::o;26286:222::-;26379:4;26417:2;26406:9;26402:18;26394:26;;26430:71;26498:1;26487:9;26483:17;26474:6;26430:71;:::i;:::-;26286:222;;;;:::o;26514:313::-;26627:4;26665:2;26654:9;26650:18;26642:26;;26714:9;26708:4;26704:20;26700:1;26689:9;26685:17;26678:47;26742:78;26815:4;26806:6;26742:78;:::i;:::-;26734:86;;26514:313;;;;:::o;26833:419::-;26999:4;27037:2;27026:9;27022:18;27014:26;;27086:9;27080:4;27076:20;27072:1;27061:9;27057:17;27050:47;27114:131;27240:4;27114:131;:::i;:::-;27106:139;;26833:419;;;:::o;27258:::-;27424:4;27462:2;27451:9;27447:18;27439:26;;27511:9;27505:4;27501:20;27497:1;27486:9;27482:17;27475:47;27539:131;27665:4;27539:131;:::i;:::-;27531:139;;27258:419;;;:::o;27683:::-;27849:4;27887:2;27876:9;27872:18;27864:26;;27936:9;27930:4;27926:20;27922:1;27911:9;27907:17;27900:47;27964:131;28090:4;27964:131;:::i;:::-;27956:139;;27683:419;;;:::o;28108:::-;28274:4;28312:2;28301:9;28297:18;28289:26;;28361:9;28355:4;28351:20;28347:1;28336:9;28332:17;28325:47;28389:131;28515:4;28389:131;:::i;:::-;28381:139;;28108:419;;;:::o;28533:::-;28699:4;28737:2;28726:9;28722:18;28714:26;;28786:9;28780:4;28776:20;28772:1;28761:9;28757:17;28750:47;28814:131;28940:4;28814:131;:::i;:::-;28806:139;;28533:419;;;:::o;28958:::-;29124:4;29162:2;29151:9;29147:18;29139:26;;29211:9;29205:4;29201:20;29197:1;29186:9;29182:17;29175:47;29239:131;29365:4;29239:131;:::i;:::-;29231:139;;28958:419;;;:::o;29383:::-;29549:4;29587:2;29576:9;29572:18;29564:26;;29636:9;29630:4;29626:20;29622:1;29611:9;29607:17;29600:47;29664:131;29790:4;29664:131;:::i;:::-;29656:139;;29383:419;;;:::o;29808:::-;29974:4;30012:2;30001:9;29997:18;29989:26;;30061:9;30055:4;30051:20;30047:1;30036:9;30032:17;30025:47;30089:131;30215:4;30089:131;:::i;:::-;30081:139;;29808:419;;;:::o;30233:::-;30399:4;30437:2;30426:9;30422:18;30414:26;;30486:9;30480:4;30476:20;30472:1;30461:9;30457:17;30450:47;30514:131;30640:4;30514:131;:::i;:::-;30506:139;;30233:419;;;:::o;30658:::-;30824:4;30862:2;30851:9;30847:18;30839:26;;30911:9;30905:4;30901:20;30897:1;30886:9;30882:17;30875:47;30939:131;31065:4;30939:131;:::i;:::-;30931:139;;30658:419;;;:::o;31083:::-;31249:4;31287:2;31276:9;31272:18;31264:26;;31336:9;31330:4;31326:20;31322:1;31311:9;31307:17;31300:47;31364:131;31490:4;31364:131;:::i;:::-;31356:139;;31083:419;;;:::o;31508:::-;31674:4;31712:2;31701:9;31697:18;31689:26;;31761:9;31755:4;31751:20;31747:1;31736:9;31732:17;31725:47;31789:131;31915:4;31789:131;:::i;:::-;31781:139;;31508:419;;;:::o;31933:::-;32099:4;32137:2;32126:9;32122:18;32114:26;;32186:9;32180:4;32176:20;32172:1;32161:9;32157:17;32150:47;32214:131;32340:4;32214:131;:::i;:::-;32206:139;;31933:419;;;:::o;32358:::-;32524:4;32562:2;32551:9;32547:18;32539:26;;32611:9;32605:4;32601:20;32597:1;32586:9;32582:17;32575:47;32639:131;32765:4;32639:131;:::i;:::-;32631:139;;32358:419;;;:::o;32783:::-;32949:4;32987:2;32976:9;32972:18;32964:26;;33036:9;33030:4;33026:20;33022:1;33011:9;33007:17;33000:47;33064:131;33190:4;33064:131;:::i;:::-;33056:139;;32783:419;;;:::o;33208:::-;33374:4;33412:2;33401:9;33397:18;33389:26;;33461:9;33455:4;33451:20;33447:1;33436:9;33432:17;33425:47;33489:131;33615:4;33489:131;:::i;:::-;33481:139;;33208:419;;;:::o;33633:::-;33799:4;33837:2;33826:9;33822:18;33814:26;;33886:9;33880:4;33876:20;33872:1;33861:9;33857:17;33850:47;33914:131;34040:4;33914:131;:::i;:::-;33906:139;;33633:419;;;:::o;34058:::-;34224:4;34262:2;34251:9;34247:18;34239:26;;34311:9;34305:4;34301:20;34297:1;34286:9;34282:17;34275:47;34339:131;34465:4;34339:131;:::i;:::-;34331:139;;34058:419;;;:::o;34483:::-;34649:4;34687:2;34676:9;34672:18;34664:26;;34736:9;34730:4;34726:20;34722:1;34711:9;34707:17;34700:47;34764:131;34890:4;34764:131;:::i;:::-;34756:139;;34483:419;;;:::o;34908:::-;35074:4;35112:2;35101:9;35097:18;35089:26;;35161:9;35155:4;35151:20;35147:1;35136:9;35132:17;35125:47;35189:131;35315:4;35189:131;:::i;:::-;35181:139;;34908:419;;;:::o;35333:::-;35499:4;35537:2;35526:9;35522:18;35514:26;;35586:9;35580:4;35576:20;35572:1;35561:9;35557:17;35550:47;35614:131;35740:4;35614:131;:::i;:::-;35606:139;;35333:419;;;:::o;35758:::-;35924:4;35962:2;35951:9;35947:18;35939:26;;36011:9;36005:4;36001:20;35997:1;35986:9;35982:17;35975:47;36039:131;36165:4;36039:131;:::i;:::-;36031:139;;35758:419;;;:::o;36183:::-;36349:4;36387:2;36376:9;36372:18;36364:26;;36436:9;36430:4;36426:20;36422:1;36411:9;36407:17;36400:47;36464:131;36590:4;36464:131;:::i;:::-;36456:139;;36183:419;;;:::o;36608:::-;36774:4;36812:2;36801:9;36797:18;36789:26;;36861:9;36855:4;36851:20;36847:1;36836:9;36832:17;36825:47;36889:131;37015:4;36889:131;:::i;:::-;36881:139;;36608:419;;;:::o;37033:::-;37199:4;37237:2;37226:9;37222:18;37214:26;;37286:9;37280:4;37276:20;37272:1;37261:9;37257:17;37250:47;37314:131;37440:4;37314:131;:::i;:::-;37306:139;;37033:419;;;:::o;37458:::-;37624:4;37662:2;37651:9;37647:18;37639:26;;37711:9;37705:4;37701:20;37697:1;37686:9;37682:17;37675:47;37739:131;37865:4;37739:131;:::i;:::-;37731:139;;37458:419;;;:::o;37883:::-;38049:4;38087:2;38076:9;38072:18;38064:26;;38136:9;38130:4;38126:20;38122:1;38111:9;38107:17;38100:47;38164:131;38290:4;38164:131;:::i;:::-;38156:139;;37883:419;;;:::o;38308:::-;38474:4;38512:2;38501:9;38497:18;38489:26;;38561:9;38555:4;38551:20;38547:1;38536:9;38532:17;38525:47;38589:131;38715:4;38589:131;:::i;:::-;38581:139;;38308:419;;;:::o;38733:222::-;38826:4;38864:2;38853:9;38849:18;38841:26;;38877:71;38945:1;38934:9;38930:17;38921:6;38877:71;:::i;:::-;38733:222;;;;:::o;38961:129::-;38995:6;39022:20;;:::i;:::-;39012:30;;39051:33;39079:4;39071:6;39051:33;:::i;:::-;38961:129;;;:::o;39096:75::-;39129:6;39162:2;39156:9;39146:19;;39096:75;:::o;39177:311::-;39254:4;39344:18;39336:6;39333:30;39330:56;;;39366:18;;:::i;:::-;39330:56;39416:4;39408:6;39404:17;39396:25;;39476:4;39470;39466:15;39458:23;;39177:311;;;:::o;39494:307::-;39555:4;39645:18;39637:6;39634:30;39631:56;;;39667:18;;:::i;:::-;39631:56;39705:29;39727:6;39705:29;:::i;:::-;39697:37;;39789:4;39783;39779:15;39771:23;;39494:307;;;:::o;39807:132::-;39874:4;39897:3;39889:11;;39927:4;39922:3;39918:14;39910:22;;39807:132;;;:::o;39945:114::-;40012:6;40046:5;40040:12;40030:22;;39945:114;;;:::o;40065:98::-;40116:6;40150:5;40144:12;40134:22;;40065:98;;;:::o;40169:99::-;40221:6;40255:5;40249:12;40239:22;;40169:99;;;:::o;40274:113::-;40344:4;40376;40371:3;40367:14;40359:22;;40274:113;;;:::o;40393:184::-;40492:11;40526:6;40521:3;40514:19;40566:4;40561:3;40557:14;40542:29;;40393:184;;;;:::o;40583:168::-;40666:11;40700:6;40695:3;40688:19;40740:4;40735:3;40731:14;40716:29;;40583:168;;;;:::o;40757:147::-;40858:11;40895:3;40880:18;;40757:147;;;;:::o;40910:169::-;40994:11;41028:6;41023:3;41016:19;41068:4;41063:3;41059:14;41044:29;;40910:169;;;;:::o;41085:148::-;41187:11;41224:3;41209:18;;41085:148;;;;:::o;41239:305::-;41279:3;41298:20;41316:1;41298:20;:::i;:::-;41293:25;;41332:20;41350:1;41332:20;:::i;:::-;41327:25;;41486:1;41418:66;41414:74;41411:1;41408:81;41405:107;;;41492:18;;:::i;:::-;41405:107;41536:1;41533;41529:9;41522:16;;41239:305;;;;:::o;41550:185::-;41590:1;41607:20;41625:1;41607:20;:::i;:::-;41602:25;;41641:20;41659:1;41641:20;:::i;:::-;41636:25;;41680:1;41670:35;;41685:18;;:::i;:::-;41670:35;41727:1;41724;41720:9;41715:14;;41550:185;;;;:::o;41741:348::-;41781:7;41804:20;41822:1;41804:20;:::i;:::-;41799:25;;41838:20;41856:1;41838:20;:::i;:::-;41833:25;;42026:1;41958:66;41954:74;41951:1;41948:81;41943:1;41936:9;41929:17;41925:105;41922:131;;;42033:18;;:::i;:::-;41922:131;42081:1;42078;42074:9;42063:20;;41741:348;;;;:::o;42095:191::-;42135:4;42155:20;42173:1;42155:20;:::i;:::-;42150:25;;42189:20;42207:1;42189:20;:::i;:::-;42184:25;;42228:1;42225;42222:8;42219:34;;;42233:18;;:::i;:::-;42219:34;42278:1;42275;42271:9;42263:17;;42095:191;;;;:::o;42292:96::-;42329:7;42358:24;42376:5;42358:24;:::i;:::-;42347:35;;42292:96;;;:::o;42394:90::-;42428:7;42471:5;42464:13;42457:21;42446:32;;42394:90;;;:::o;42490:77::-;42527:7;42556:5;42545:16;;42490:77;;;:::o;42573:149::-;42609:7;42649:66;42642:5;42638:78;42627:89;;42573:149;;;:::o;42728:126::-;42765:7;42805:42;42798:5;42794:54;42783:65;;42728:126;;;:::o;42860:77::-;42897:7;42926:5;42915:16;;42860:77;;;:::o;42943:154::-;43027:6;43022:3;43017;43004:30;43089:1;43080:6;43075:3;43071:16;43064:27;42943:154;;;:::o;43103:307::-;43171:1;43181:113;43195:6;43192:1;43189:13;43181:113;;;43280:1;43275:3;43271:11;43265:18;43261:1;43256:3;43252:11;43245:39;43217:2;43214:1;43210:10;43205:15;;43181:113;;;43312:6;43309:1;43306:13;43303:101;;;43392:1;43383:6;43378:3;43374:16;43367:27;43303:101;43152:258;43103:307;;;:::o;43416:171::-;43455:3;43478:24;43496:5;43478:24;:::i;:::-;43469:33;;43524:4;43517:5;43514:15;43511:41;;;43532:18;;:::i;:::-;43511:41;43579:1;43572:5;43568:13;43561:20;;43416:171;;;:::o;43593:320::-;43637:6;43674:1;43668:4;43664:12;43654:22;;43721:1;43715:4;43711:12;43742:18;43732:81;;43798:4;43790:6;43786:17;43776:27;;43732:81;43860:2;43852:6;43849:14;43829:18;43826:38;43823:84;;;43879:18;;:::i;:::-;43823:84;43644:269;43593:320;;;:::o;43919:281::-;44002:27;44024:4;44002:27;:::i;:::-;43994:6;43990:40;44132:6;44120:10;44117:22;44096:18;44084:10;44081:34;44078:62;44075:88;;;44143:18;;:::i;:::-;44075:88;44183:10;44179:2;44172:22;43962:238;43919:281;;:::o;44206:233::-;44245:3;44268:24;44286:5;44268:24;:::i;:::-;44259:33;;44314:66;44307:5;44304:77;44301:103;;;44384:18;;:::i;:::-;44301:103;44431:1;44424:5;44420:13;44413:20;;44206:233;;;:::o;44445:176::-;44477:1;44494:20;44512:1;44494:20;:::i;:::-;44489:25;;44528:20;44546:1;44528:20;:::i;:::-;44523:25;;44567:1;44557:35;;44572:18;;:::i;:::-;44557:35;44613:1;44610;44606:9;44601:14;;44445:176;;;;:::o;44627:180::-;44675:77;44672:1;44665:88;44772:4;44769:1;44762:15;44796:4;44793:1;44786:15;44813:180;44861:77;44858:1;44851:88;44958:4;44955:1;44948:15;44982:4;44979:1;44972:15;44999:180;45047:77;45044:1;45037:88;45144:4;45141:1;45134:15;45168:4;45165:1;45158:15;45185:180;45233:77;45230:1;45223:88;45330:4;45327:1;45320:15;45354:4;45351:1;45344:15;45371:180;45419:77;45416:1;45409:88;45516:4;45513:1;45506:15;45540:4;45537:1;45530:15;45557:180;45605:77;45602:1;45595:88;45702:4;45699:1;45692:15;45726:4;45723:1;45716:15;45743:117;45852:1;45849;45842:12;45866:117;45975:1;45972;45965:12;45989:117;46098:1;46095;46088:12;46112:117;46221:1;46218;46211:12;46235:117;46344:1;46341;46334:12;46358:102;46399:6;46450:2;46446:7;46441:2;46434:5;46430:14;46426:28;46416:38;;46358:102;;;:::o;46466:182::-;46606:34;46602:1;46594:6;46590:14;46583:58;46466:182;:::o;46654:230::-;46794:34;46790:1;46782:6;46778:14;46771:58;46863:13;46858:2;46850:6;46846:15;46839:38;46654:230;:::o;46890:237::-;47030:34;47026:1;47018:6;47014:14;47007:58;47099:20;47094:2;47086:6;47082:15;47075:45;46890:237;:::o;47133:178::-;47273:30;47269:1;47261:6;47257:14;47250:54;47133:178;:::o;47317:223::-;47457:34;47453:1;47445:6;47441:14;47434:58;47526:6;47521:2;47513:6;47509:15;47502:31;47317:223;:::o;47546:175::-;47686:27;47682:1;47674:6;47670:14;47663:51;47546:175;:::o;47727:245::-;47867:34;47863:1;47855:6;47851:14;47844:58;47936:28;47931:2;47923:6;47919:15;47912:53;47727:245;:::o;47978:179::-;48118:31;48114:1;48106:6;48102:14;48095:55;47978:179;:::o;48163:231::-;48303:34;48299:1;48291:6;48287:14;48280:58;48372:14;48367:2;48359:6;48355:15;48348:39;48163:231;:::o;48400:177::-;48540:29;48536:1;48528:6;48524:14;48517:53;48400:177;:::o;48583:166::-;48723:18;48719:1;48711:6;48707:14;48700:42;48583:166;:::o;48755:243::-;48895:34;48891:1;48883:6;48879:14;48872:58;48964:26;48959:2;48951:6;48947:15;48940:51;48755:243;:::o;49004:229::-;49144:34;49140:1;49132:6;49128:14;49121:58;49213:12;49208:2;49200:6;49196:15;49189:37;49004:229;:::o;49239:228::-;49379:34;49375:1;49367:6;49363:14;49356:58;49448:11;49443:2;49435:6;49431:15;49424:36;49239:228;:::o;49473:179::-;49613:31;49609:1;49601:6;49597:14;49590:55;49473:179;:::o;49658:182::-;49798:34;49794:1;49786:6;49782:14;49775:58;49658:182;:::o;49846:236::-;49986:34;49982:1;49974:6;49970:14;49963:58;50055:19;50050:2;50042:6;50038:15;50031:44;49846:236;:::o;50088:177::-;50228:29;50224:1;50216:6;50212:14;50205:53;50088:177;:::o;50271:231::-;50411:34;50407:1;50399:6;50395:14;50388:58;50480:14;50475:2;50467:6;50463:15;50456:39;50271:231;:::o;50508:180::-;50648:32;50644:1;50636:6;50632:14;50625:56;50508:180;:::o;50694:228::-;50834:34;50830:1;50822:6;50818:14;50811:58;50903:11;50898:2;50890:6;50886:15;50879:36;50694:228;:::o;50928:234::-;51068:34;51064:1;51056:6;51052:14;51045:58;51137:17;51132:2;51124:6;51120:15;51113:42;50928:234;:::o;51168:172::-;51308:24;51304:1;51296:6;51292:14;51285:48;51168:172;:::o;51346:220::-;51486:34;51482:1;51474:6;51470:14;51463:58;51555:3;51550:2;51542:6;51538:15;51531:28;51346:220;:::o;51572:114::-;;:::o;51692:236::-;51832:34;51828:1;51820:6;51816:14;51809:58;51901:19;51896:2;51888:6;51884:15;51877:44;51692:236;:::o;51934:231::-;52074:34;52070:1;52062:6;52058:14;52051:58;52143:14;52138:2;52130:6;52126:15;52119:39;51934:231;:::o;52171:173::-;52311:25;52307:1;52299:6;52295:14;52288:49;52171:173;:::o;52350:235::-;52490:34;52486:1;52478:6;52474:14;52467:58;52559:18;52554:2;52546:6;52542:15;52535:43;52350:235;:::o;52591:167::-;52731:19;52727:1;52719:6;52715:14;52708:43;52591:167;:::o;52764:234::-;52904:34;52900:1;52892:6;52888:14;52881:58;52973:17;52968:2;52960:6;52956:15;52949:42;52764:234;:::o;53004:122::-;53077:24;53095:5;53077:24;:::i;:::-;53070:5;53067:35;53057:63;;53116:1;53113;53106:12;53057:63;53004:122;:::o;53132:116::-;53202:21;53217:5;53202:21;:::i;:::-;53195:5;53192:32;53182:60;;53238:1;53235;53228:12;53182:60;53132:116;:::o;53254:122::-;53327:24;53345:5;53327:24;:::i;:::-;53320:5;53317:35;53307:63;;53366:1;53363;53356:12;53307:63;53254:122;:::o;53382:120::-;53454:23;53471:5;53454:23;:::i;:::-;53447:5;53444:34;53434:62;;53492:1;53489;53482:12;53434:62;53382:120;:::o;53508:122::-;53581:24;53599:5;53581:24;:::i;:::-;53574:5;53571:35;53561:63;;53620:1;53617;53610:12;53561:63;53508:122;:::o

Swarm Source

ipfs://4f0996abf3d7ce8618cdc5bad9d4e07646d73645dad0d58e2ea070b158b8fb07
Loading