ETH Price: $3,109.30 (+1.55%)
Gas: 4 Gwei

Token

Moon Ape Lab Pass (MALPASS)
 

Overview

Max Total Supply

1,135 MALPASS

Holders

399

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 MALPASS
0xb3d7b7281ab554f568f4f7982e036945b78de9fc
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Moon Ape Lab Mint Passport collection. Each Mint Pass can be redeemed for a certain amount of Moon Apes. Have a chance to put your nickname on the board of contributors, which will be later coded and converted to NFT as an image and remain as a memorial of humanity act.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MALPass

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-29
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;



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


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


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


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


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


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


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


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


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


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


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


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


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


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

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

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

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

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

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

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

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


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


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


struct Team {
    uint256 balance;
    uint256 share;
    string name;
}

contract MALPass is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, ERC721Burnable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    uint256 public constant MAX_SUPPLY_GREEN =  1100;
    uint256 public constant RESERVED_GREEN = 100;
    uint256 public constant MAX_SUPPLY_BLUE =  100;
    uint256 public constant MAX_SUPPLY_GOLD =  10;

    uint256 public constant MAX_FOR_ONE_ADDRESS_GREEN = 20;
    uint256 public constant MAX_FOR_ONE_ADDRESS_BLUE = 4;
    uint256 public constant MAX_FOR_ONE_ADDRESS_GOLD = 1;

    uint256 public constant PASS_VALUE_IN_APES_GREEN = 1;
    uint256 public constant PASS_VALUE_IN_APES_BLUE = 5;
    uint256 public constant PASS_VALUE_IN_APES_GOLD = 10;

    uint256 public constant PASS_PRICE_GREEN = 0.09 ether;
    uint256 public constant PASS_PRICE_BLUE = 0.45 ether;
    uint256 public constant PASS_PRICE_GOLD = 0.9 ether;

    uint256 public MINTED_GREEN = 0;
    uint256 public MINTED_BLUE = 0;
    uint256 public MINTED_GOLD = 0;

    mapping(address=>uint256) OWNERS_GREEN;
    mapping(address=>uint256) OWNERS_BLUE;
    mapping(address=>uint256) OWNERS_GOLD;
    
    address public APE_CONTRACT; // for pause and burn
    
    uint256 total_teams;
    mapping(uint=>address) team_addresses;
    mapping(address=>Team) teams;

    mapping(uint=>uint) pass_types;
    
    constructor() ERC721("Moon Ape Lab Pass", "MALPASS") {
        total_teams = 0;
        
        team_addresses[total_teams] = 0x5966932Ae92fbE75280e0371cb3bC27B558115A8;
        teams[address(0x5966932Ae92fbE75280e0371cb3bC27B558115A8)] = Team(0, 30, "Pvl");
        total_teams = total_teams + 1;
        
        team_addresses[total_teams] = 0xA45845299bD26af707D0F3C902519b41D8aAefca;
        teams[address(0xA45845299bD26af707D0F3C902519b41D8aAefca)] = Team(0, 5, "Nkt");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x77FeB62f865365f4b81ef49901BC012d017509F3;
        teams[address(0x77FeB62f865365f4b81ef49901BC012d017509F3)] = Team(0, 20, "Sts");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0xc2a6035fB9200446f154cdce00EA6ff0160C2854;
        teams[address(0xc2a6035fB9200446f154cdce00EA6ff0160C2854)] = Team(0, 20, "Vld");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0xd44ac9eB549DCF1D47D47d81398182265C312232;
        teams[address(0xd44ac9eB549DCF1D47D47d81398182265C312232)] = Team(0, 5, "Nck");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x1eAC73484bcf66564D896213E06d6c5D013244A4;
        teams[address(0x1eAC73484bcf66564D896213E06d6c5D013244A4)] = Team(0, 20, "Andr");
        total_teams = total_teams + 1;
        
        _tokenIdCounter.increment();
    }
    
    function pause() public {
        require(msg.sender == owner() || msg.sender == APE_CONTRACT);
        _pause();
    }

    function reservePasses(uint256 quantity, uint256 _pass_type) public onlyOwner {
        require(_pass_type == 1 || _pass_type == 2 || _pass_type == 3, "Invalid pass type to be minted. Allowed are: 1=Green, 2=Blue, 3=Gold");
        if (_pass_type == 1){
            require(MINTED_GREEN + quantity < MAX_SUPPLY_GREEN + 1, "Too many passes are to be created.");
        } else if (_pass_type == 2){
            require(MINTED_BLUE + quantity < MAX_SUPPLY_BLUE + 1, "Too many passes are to be created.");
        } else {
            require(MINTED_GOLD + quantity < MAX_SUPPLY_GOLD + 1, "Too many passes are to be created.");
        }
        for (uint256 i = 0; i < quantity; i++) {
            _safeMint(msg.sender, _tokenIdCounter.current());
            pass_types[_tokenIdCounter.current()] = _pass_type;
            _tokenIdCounter.increment();
        }
        if (_pass_type == 1){
            MINTED_GREEN += quantity;
            OWNERS_GREEN[msg.sender] += quantity;
        } else if (_pass_type == 2){
            MINTED_BLUE += quantity;
            OWNERS_BLUE[msg.sender] += quantity;
        } else {
            MINTED_GOLD += quantity;
            OWNERS_GOLD[msg.sender] += quantity;
        }
    }

    function myBalance(uint256 _pass_type) public view returns (uint256){
        require(_pass_type == 1 || _pass_type == 2 || _pass_type == 3, "Invalid pass type. Allowed are: 1=Green, 2=Blue, 3=Gold");
        if (_pass_type == 1){
            return OWNERS_GREEN[msg.sender];
        } else if (_pass_type == 2){
            return OWNERS_BLUE[msg.sender];
        } else {
            return OWNERS_GOLD[msg.sender];
        }
    }

    function unpause() public onlyOwner {
        _unpause();
    }
    
    function setApeContract(address ape_contract_address) public onlyOwner{
        APE_CONTRACT = ape_contract_address;
    }
    
    function pass_value_in_apes(uint256 _tokenId) public view returns (uint256){
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent pass");
        uint256 token_pass_type = pass_types[_tokenId];
        if (token_pass_type == 1){
            return PASS_VALUE_IN_APES_GREEN;
        } else if (token_pass_type == 2){
            return PASS_VALUE_IN_APES_BLUE;
        } else {
            return PASS_VALUE_IN_APES_GOLD;
        }
    }
    
    function get_pass(uint256 quantity, uint256 _pass_type) public payable whenNotPaused{
        require(msg.sender != address(0) && msg.sender != address(this));
        require(_pass_type == 1 || _pass_type == 2 || _pass_type == 3, "Invalid pass type to be minted. Allowed are: 1=Green, 2=Blue, 3=Gold.");
        if (_pass_type == 1){
            require(quantity * PASS_PRICE_GREEN == msg.value, "Ether value sent is incorrect.");
            require(MINTED_GREEN + quantity < MAX_SUPPLY_GREEN - RESERVED_GREEN + 1, "Too many Green Passes are to be minted.");
            require(quantity + OWNERS_GREEN[msg.sender] <= MAX_FOR_ONE_ADDRESS_GREEN, "Maximum quantity of Green Passes to buy from 1 address is 20.");
        } else if (_pass_type == 2){
            require(quantity * PASS_PRICE_BLUE == msg.value, "Ether value sent is incorrect.");
            require(MINTED_BLUE + quantity < MAX_SUPPLY_BLUE + 1, "Too many Blue Passes are to be minted.");
            require(quantity + OWNERS_BLUE[msg.sender] <= MAX_FOR_ONE_ADDRESS_BLUE, "Maximum quantity of Blue Passes to buy from 1 address is 4.");
        } else {
            require(quantity * PASS_PRICE_GOLD == msg.value, "Ether value sent is incorrect.");
            require(MINTED_GOLD + quantity < MAX_SUPPLY_GOLD + 1, "Too many Gold Passes are to be minted.");
            require(quantity + OWNERS_GOLD[msg.sender] <= MAX_FOR_ONE_ADDRESS_GOLD, "Maximum quantity of Gold Passes to buy from 1 address is 1.");
        }
        
        for(uint256 i = 0; i < quantity; i++) {
            _safeMint(msg.sender, _tokenIdCounter.current());
            pass_types[_tokenIdCounter.current()] = _pass_type;
            _tokenIdCounter.increment();
        }

        if (_pass_type == 1){
            MINTED_GREEN += quantity;
            OWNERS_GREEN[msg.sender] += quantity;
        } else if (_pass_type == 2){
            MINTED_BLUE += quantity;
            OWNERS_BLUE[msg.sender] += quantity;
        } else {
            MINTED_GOLD += quantity;
            OWNERS_GOLD[msg.sender] += quantity;
        }

        for (uint256 i = 0; i < total_teams; i++){
            teams[team_addresses[i]].balance += msg.value * teams[team_addresses[i]].share / 100;
        }
    }
    
    function withdraw(address payable to_address) public returns (bool){
        require(teams[msg.sender].balance > 0, "Sorry! You have nothing to withdraw.");
        require(to_address != address(0) && to_address != address(this));
        require(msg.sender != address(0) && msg.sender != address(this));
        to_address.transfer(teams[msg.sender].balance);
        teams[msg.sender].balance = 0;
        return true;
    }

    function team_get_percentage(address my_address) public view returns (uint256){
        return teams[my_address].share;
    }

    function team_get_share_balance(address my_address) public view returns (uint256){
        return teams[my_address].balance;
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    
    function burn(uint256 tokenId) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId) || msg.sender == APE_CONTRACT, "Caller is not approved/owner nor the Ape contract");
        _burn(tokenId);
    }

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

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


    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent pass");
        string memory baseURI = _baseURI();
        uint256 token_pass_type = pass_types[tokenId];
        if (token_pass_type == 1){
            return string(abi.encodePacked(baseURI, "green_metadata.json"));
        } else if (token_pass_type == 2){
            return string(abi.encodePacked(baseURI, "blue_metadata.json"));
        } else {
            return string(abi.encodePacked(baseURI, "gold_metadata.json"));
        }
    }

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



contract MAL is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;
	
    bool teams_set;
    uint256 total_teams;
    mapping(uint=>address) team_addresses;
    mapping(address=>Team) teams;
    
    uint256 public constant MAX_SUPPLY = 12000;
    uint256 public constant APE_PRICE = 90000000000000000; //0.09 ETH
    uint256 public REVEAL_TIMESTAMP;
    
    bool public converted_passes;
    address public pass_contract_address;

    bool private revealed;
    string private base_url;
    
    
    constructor() ERC721("Moon Ape Lab", "MAL") {
        revealed = false;
		converted_passes = false;
		teams_set = false;
        total_teams = 0;
        
        team_addresses[total_teams] = 0x5966932Ae92fbE75280e0371cb3bC27B558115A8;
        teams[address(0x5966932Ae92fbE75280e0371cb3bC27B558115A8)] = Team(0, 206, "Pvl");
        total_teams = total_teams + 1;
        
        team_addresses[total_teams] = 0xA45845299bD26af707D0F3C902519b41D8aAefca;
        teams[address(0xA45845299bD26af707D0F3C902519b41D8aAefca)] = Team(0, 50, "Nkt");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x77FeB62f865365f4b81ef49901BC012d017509F3;
        teams[address(0x77FeB62f865365f4b81ef49901BC012d017509F3)] = Team(0, 200, "Sts");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0xc2a6035fB9200446f154cdce00EA6ff0160C2854;
        teams[address(0xc2a6035fB9200446f154cdce00EA6ff0160C2854)] = Team(0, 200, "Vld");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0xd44ac9eB549DCF1D47D47d81398182265C312232;
        teams[address(0xd44ac9eB549DCF1D47D47d81398182265C312232)] = Team(0, 50, "Nck");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x1eAC73484bcf66564D896213E06d6c5D013244A4;
        teams[address(0x1eAC73484bcf66564D896213E06d6c5D013244A4)] = Team(0, 200, "Andr");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x73aed65Fd5DDe7b2b7c15C9f80eA31F2a5BF789d;
        teams[address(0x73aed65Fd5DDe7b2b7c15C9f80eA31F2a5BF789d)] = Team(0, 20, "i1");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x667E1ac585d2BA20B66797eEe1a79305AE522632;
        teams[address(0x667E1ac585d2BA20B66797eEe1a79305AE522632)] = Team(0, 12, "i2");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x7eF73b47F248628256E810C947D835DB42F6dbDA;
        teams[address(0x7eF73b47F248628256E810C947D835DB42F6dbDA)] = Team(0, 3, "i3");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0xBcead7cDA42Ff85A29EF84D84Bc83784cd87100e;
        teams[address(0xBcead7cDA42Ff85A29EF84D84Bc83784cd87100e)] = Team(0, 6, "i4");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x6D1dfaaF3180E394370582fd6F52092d9a7b9F2b;
        teams[address(0x6D1dfaaF3180E394370582fd6F52092d9a7b9F2b)] = Team(0, 30, "i5");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0xe8d52708D3bC65C7f19Cf592BD70712614bD0f19;
        teams[address(0xe8d52708D3bC65C7f19Cf592BD70712614bD0f19)] = Team(0, 6, "i6");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x270a66028E4DdAA3dfa74Ba8e5BA1F6B0aD572DF;
        teams[address(0x270a66028E4DdAA3dfa74Ba8e5BA1F6B0aD572DF)] = Team(0, 6, "i7");
        total_teams = total_teams + 1;

        team_addresses[total_teams] = 0x90233B3494Ede2578Be1406B51aFa9C1641831e2;
        teams[address(0x90233B3494Ede2578Be1406B51aFa9C1641831e2)] = Team(0, 11, "i8");
        total_teams = total_teams + 1;

        base_url = "ipfs://QmNnuvrmSNeNivX5n7FbcJMFugEF5hU6TpVvQV8YueFNbg/unrevealed_metadata.json";
        
        pause();
        
        _tokenIdCounter.increment();
    }

    function setPassContract(address _pass_address) public onlyOwner{
        pass_contract_address = _pass_address;
    }

	
	function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
        if (converted_passes == false){
			MALPass pass_contract = MALPass(pass_contract_address);
            uint256 pass_contract_supply = pass_contract.totalSupply() + 1;
            if (pass_contract_supply > 1){
                for (uint256 i = 1; i < pass_contract_supply; i++){
                    for (uint256 j = 0; j < pass_contract.pass_value_in_apes(i); j++){
                        _safeMint(pass_contract.ownerOf(i), _tokenIdCounter.current());
                        _tokenIdCounter.increment();
                    }
                    pass_contract.burn(i);
                }
            }
			pass_contract.pause();
			converted_passes = true;
		}
    }
    
    function setRevealTimestamp(uint256 revealTimeStamp) public onlyOwner {
        REVEAL_TIMESTAMP = revealTimeStamp;
    }

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

    function revealApes(string memory baseURI) public onlyOwner {
        require(revealed == false, "Apes are already revealed");
        base_url = baseURI;
        revealed = true;
    }
    
    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (revealed == false){
            return base_url;
        }
        return string(abi.encodePacked(super.tokenURI(tokenId), ".json"));
    }
    
    function sendTo(address payable _payee, uint256 _amount) public onlyOwner {
        require(_payee != address(0) && _payee != address(this));
        require(_amount > 0 && _amount <= address(this).balance);
        _payee.transfer(_amount);
    }
    
    function mint_ape(uint256 number_of_tokens) payable public whenNotPaused returns (uint256){
        require(msg.sender != address(0) && msg.sender != address(this));
        require(APE_PRICE * number_of_tokens <= msg.value, "Ether value sent is not correct");
        require(totalSupply() + number_of_tokens < MAX_SUPPLY + 1, "Too many tokens are to be created. Max supply is 12000.");
        require(number_of_tokens + balanceOf(msg.sender) <= 20, "1 address can hold max 20 NFTs.");
        
        for(uint256 i = 0; i < number_of_tokens; i++) {
            _safeMint(msg.sender, _tokenIdCounter.current());
            _tokenIdCounter.increment();
        }
        for (uint256 i = 0; i < total_teams; i++){
            teams[team_addresses[i]].balance += msg.value * teams[team_addresses[i]].share / 1000;
        }
        
        return number_of_tokens;
    }
    
    function withdraw(address payable to_address) public returns (bool){
        require(teams[msg.sender].balance > 0, "Sorry! You have nothing to withdraw.");
        require(to_address != address(0) && to_address != address(this));
        require(msg.sender != address(0) && msg.sender != address(this));
        to_address.transfer(teams[msg.sender].balance);
        teams[msg.sender].balance = 0;
        return true;
    }

    function team_get_share_balance(address my_address) public view returns (uint256){
        return teams[my_address].balance;
    }
	
	function safeMint(address to) public onlyOwner {
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"APE_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FOR_ONE_ADDRESS_BLUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FOR_ONE_ADDRESS_GOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FOR_ONE_ADDRESS_GREEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_BLUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_GOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_GREEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTED_BLUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTED_GOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTED_GREEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PASS_PRICE_BLUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PASS_PRICE_GOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PASS_PRICE_GREEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PASS_VALUE_IN_APES_BLUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PASS_VALUE_IN_APES_GOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PASS_VALUE_IN_APES_GREEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_GREEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"_pass_type","type":"uint256"}],"name":"get_pass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pass_type","type":"uint256"}],"name":"myBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"pass_value_in_apes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"_pass_type","type":"uint256"}],"name":"reservePasses","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":"ape_contract_address","type":"address"}],"name":"setApeContract","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":"address","name":"my_address","type":"address"}],"name":"team_get_percentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"my_address","type":"address"}],"name":"team_get_share_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to_address","type":"address"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d556000600e556000600f553480156200002057600080fd5b506040518060400160405280601181526020017f4d6f6f6e20417065204c616220506173730000000000000000000000000000008152506040518060400160405280600781526020017f4d414c50415353000000000000000000000000000000000000000000000000008152508160009080519060200190620000a592919062000a21565b508060019080519060200190620000be92919062000a21565b5050506000600b60006101000a81548160ff021916908315150217905550620000fc620000f06200093d60201b60201c565b6200094560201b60201c565b6000601481905550735966932ae92fbe75280e0371cb3bc27b558115a860156000601454815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060008152602001601e81526020016040518060400160405280600381526020017f50766c000000000000000000000000000000000000000000000000000000000081525081525060166000735966932ae92fbe75280e0371cb3bc27b558115a873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906200024392919062000a21565b50905050600160145462000258919062000b0a565b60148190555073a45845299bd26af707d0f3c902519b41d8aaefca60156000601454815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060008152602001600581526020016040518060400160405280600381526020017f4e6b7400000000000000000000000000000000000000000000000000000000008152508152506016600073a45845299bd26af707d0f3c902519b41d8aaefca73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906200039d92919062000a21565b509050506001601454620003b2919062000b0a565b6014819055507377feb62f865365f4b81ef49901bc012d017509f360156000601454815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060008152602001601481526020016040518060400160405280600381526020017f5374730000000000000000000000000000000000000000000000000000000000815250815250601660007377feb62f865365f4b81ef49901bc012d017509f373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190620004f792919062000a21565b5090505060016014546200050c919062000b0a565b60148190555073c2a6035fb9200446f154cdce00ea6ff0160c285460156000601454815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060008152602001601481526020016040518060400160405280600381526020017f566c6400000000000000000000000000000000000000000000000000000000008152508152506016600073c2a6035fb9200446f154cdce00ea6ff0160c285473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906200065192919062000a21565b50905050600160145462000666919062000b0a565b60148190555073d44ac9eb549dcf1d47d47d81398182265c31223260156000601454815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060008152602001600581526020016040518060400160405280600381526020017f4e636b00000000000000000000000000000000000000000000000000000000008152508152506016600073d44ac9eb549dcf1d47d47d81398182265c31223273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190620007ab92919062000a21565b509050506001601454620007c0919062000b0a565b601481905550731eac73484bcf66564d896213e06d6c5d013244a460156000601454815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060008152602001601481526020016040518060400160405280600481526020017f416e64720000000000000000000000000000000000000000000000000000000081525081525060166000731eac73484bcf66564d896213e06d6c5d013244a473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906200090592919062000a21565b5090505060016014546200091a919062000b0a565b60148190555062000937600c62000a0b60201b620029f81760201c565b62000bcc565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b82805462000a2f9062000b96565b90600052602060002090601f01602090048101928262000a53576000855562000a9f565b82601f1062000a6e57805160ff191683800117855562000a9f565b8280016001018555821562000a9f579182015b8281111562000a9e57825182559160200191906001019062000a81565b5b50905062000aae919062000ab2565b5090565b5b8082111562000acd57600081600090555060010162000ab3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b178262000ad1565b915062000b248362000ad1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b5c5762000b5b62000adb565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000baf57607f821691505b6020821081141562000bc65762000bc562000b67565b5b50919050565b615ac88062000bdc6000396000f3fe6080604052600436106102925760003560e01c8063711792dd1161015a578063b88d4fde116100c1578063c87b56dd1161007a578063c87b56dd146109fe578063d90805ee14610a3b578063dd8edff714610a66578063e876b6f514610a91578063e985e9c514610ace578063f2fde38b14610b0b57610292565b8063b88d4fde14610902578063bae9acc11461092b578063bcd3ca6b14610954578063be63fb231461097d578063c115e535146109a8578063c6e864a8146109d357610292565b806395d89b411161011357806395d89b41146107f05780639c06a4971461081b578063a22cb46514610846578063aa1a92991461086f578063add1d0901461089a578063b81250ed146108c557610292565b8063711792dd14610713578063715018a6146107505780638456cb591461076757806384eebd3e1461077e578063854bd9c71461079a5780638da5cb5b146107c557610292565b806323b872dd116101fe5780634f6ccce7116101b75780634f6ccce7146105c957806351cff8d9146106065780635c975abb14610643578063618ae9801461066e5780636352211e1461069957806370a08231146106d657610292565b806323b872dd146104cf5780632f745c59146104f85780633f4ba83a1461053557806342842e0e1461054c57806342966c68146105755780634313be151461059e57610292565b8063081812fc11610250578063081812fc146103ab578063095ea7b3146103e85780630c866a04146104115780631029158b1461044e578063161a97681461047957806318160ddd146104a457610292565b80621c5c9e14610297578063016fd24e146102c257806301ffc9a7146102ed5780630588c4b51461032a57806305b0c3361461035557806306fdde0314610380575b600080fd5b3480156102a357600080fd5b506102ac610b34565b6040516102b99190613d0f565b60405180910390f35b3480156102ce57600080fd5b506102d7610b3a565b6040516102e49190613d0f565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190613d96565b610b3f565b6040516103219190613dde565b60405180910390f35b34801561033657600080fd5b5061033f610b51565b60405161034c9190613d0f565b60405180910390f35b34801561036157600080fd5b5061036a610b56565b6040516103779190613d0f565b60405180910390f35b34801561038c57600080fd5b50610395610b5b565b6040516103a29190613e92565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613ee0565b610bed565b6040516103df9190613f4e565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190613f95565b610c72565b005b34801561041d57600080fd5b5061043860048036038101906104339190613ee0565b610d8a565b6040516104459190613d0f565b60405180910390f35b34801561045a57600080fd5b50610463610ecd565b6040516104709190613d0f565b60405180910390f35b34801561048557600080fd5b5061048e610ed9565b60405161049b9190613d0f565b60405180910390f35b3480156104b057600080fd5b506104b9610ede565b6040516104c69190613d0f565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613fd5565b610eeb565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613f95565b610f4b565b60405161052c9190613d0f565b60405180910390f35b34801561054157600080fd5b5061054a610ff0565b005b34801561055857600080fd5b50610573600480360381019061056e9190613fd5565b611076565b005b34801561058157600080fd5b5061059c60048036038101906105979190613ee0565b611096565b005b3480156105aa57600080fd5b506105b361114a565b6040516105c09190613d0f565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190613ee0565b611150565b6040516105fd9190613d0f565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190614066565b6111c1565b60405161063a9190613dde565b60405180910390f35b34801561064f57600080fd5b50610658611405565b6040516106659190613dde565b60405180910390f35b34801561067a57600080fd5b5061068361141c565b6040516106909190613d0f565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190613ee0565b611422565b6040516106cd9190613f4e565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f89190614093565b6114d4565b60405161070a9190613d0f565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190614093565b61158c565b6040516107479190613d0f565b60405180910390f35b34801561075c57600080fd5b506107656115d8565b005b34801561077357600080fd5b5061077c611660565b005b610798600480360381019061079391906140c0565b611701565b005b3480156107a657600080fd5b506107af611f01565b6040516107bc9190613d0f565b60405180910390f35b3480156107d157600080fd5b506107da611f06565b6040516107e79190613f4e565b60405180910390f35b3480156107fc57600080fd5b50610805611f30565b6040516108129190613e92565b60405180910390f35b34801561082757600080fd5b50610830611fc2565b60405161083d9190613d0f565b60405180910390f35b34801561085257600080fd5b5061086d6004803603810190610868919061412c565b611fc7565b005b34801561087b57600080fd5b50610884612148565b6040516108919190613f4e565b60405180910390f35b3480156108a657600080fd5b506108af61216e565b6040516108bc9190613d0f565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e79190614093565b61217a565b6040516108f99190613d0f565b60405180910390f35b34801561090e57600080fd5b50610929600480360381019061092491906142a1565b6121c6565b005b34801561093757600080fd5b50610952600480360381019061094d9190614093565b612228565b005b34801561096057600080fd5b5061097b600480360381019061097691906140c0565b6122e8565b005b34801561098957600080fd5b506109926126bc565b60405161099f9190613d0f565b60405180910390f35b3480156109b457600080fd5b506109bd6126c1565b6040516109ca9190613d0f565b60405180910390f35b3480156109df57600080fd5b506109e86126c6565b6040516109f59190613d0f565b60405180910390f35b348015610a0a57600080fd5b50610a256004803603810190610a209190613ee0565b6126cc565b604051610a329190613e92565b60405180910390f35b348015610a4757600080fd5b50610a506127c8565b604051610a5d9190613d0f565b60405180910390f35b348015610a7257600080fd5b50610a7b6127cd565b604051610a889190613d0f565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab39190613ee0565b6127d9565b604051610ac59190613d0f565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af09190614324565b61286c565b604051610b029190613dde565b60405180910390f35b348015610b1757600080fd5b50610b326004803603810190610b2d9190614093565b612900565b005b61044c81565b606481565b6000610b4a82612a0e565b9050919050565b600181565b600481565b606060008054610b6a90614393565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9690614393565b8015610be35780601f10610bb857610100808354040283529160200191610be3565b820191906000526020600020905b815481529060010190602001808311610bc657829003601f168201915b5050505050905090565b6000610bf882612a88565b610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90614437565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7d82611422565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce5906144c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d0d612af4565b73ffffffffffffffffffffffffffffffffffffffff161480610d3c5750610d3b81610d36612af4565b61286c565b5b610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d729061455b565b60405180910390fd5b610d858383612afc565b505050565b60006001821480610d9b5750600282145b80610da65750600382145b610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc906145ed565b60405180910390fd5b6001821415610e3557601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610ec8565b6002821415610e8557601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610ec8565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b67013fbe85edc9000081565b600a81565b6000600880549050905090565b610efc610ef6612af4565b82612bb5565b610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f329061467f565b60405180910390fd5b610f46838383612c93565b505050565b6000610f56836114d4565b8210610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e90614711565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ff8612af4565b73ffffffffffffffffffffffffffffffffffffffff16611016611f06565b73ffffffffffffffffffffffffffffffffffffffff161461106c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110639061477d565b60405180910390fd5b611074612eef565b565b611091838383604051806020016040528060008152506121c6565b505050565b6110a76110a1612af4565b82612bb5565b806110ff5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61113e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111359061480f565b60405180910390fd5b61114781612f91565b50565b600f5481565b600061115a610ede565b821061119b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611192906148a1565b60405180910390fd5b600882815481106111af576111ae6148c1565b5b90600052602060002001549050919050565b600080601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90614962565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156112b057503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6112b957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561132257503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b61132b57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549081150290604051600060405180830381858888f193505050501580156113b3573d6000803e3d6000fd5b506000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555060019050919050565b6000600b60009054906101000a900460ff16905090565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c2906149f4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614a86565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6115e0612af4565b73ffffffffffffffffffffffffffffffffffffffff166115fe611f06565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b9061477d565b60405180910390fd5b61165e6000612f9d565b565b611668611f06565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116ee5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116f757600080fd5b6116ff613063565b565b611709611405565b15611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090614af2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156117b257503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b6117bb57600080fd5b60018114806117ca5750600281145b806117d55750600381145b611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614baa565b60405180910390fd5b600181141561196e573467013fbe85edc90000836118329190614bf9565b14611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186990614c9f565b60405180910390fd5b6001606461044c6118839190614cbf565b61188d9190614cf3565b82600d5461189b9190614cf3565b106118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290614dbb565b60405180910390fd5b6014601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836119289190614cf3565b1115611969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196090614e4d565b60405180910390fd5b611bfc565b6002811415611abb573467063eb89da4ed00008361198c9190614bf9565b146119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390614c9f565b60405180910390fd5b600160646119da9190614cf3565b82600e546119e89190614cf3565b10611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614edf565b60405180910390fd5b6004601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611a759190614cf3565b1115611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614f71565b60405180910390fd5b611bfb565b34670c7d713b49da000083611ad09190614bf9565b14611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790614c9f565b60405180910390fd5b6001600a611b1e9190614cf3565b82600f54611b2c9190614cf3565b10611b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6390615003565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611bb99190614cf3565b1115611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190615095565b60405180910390fd5b5b5b60005b82811015611c5857611c1a33611c15600c613106565b613114565b8160176000611c29600c613106565b815260200190815260200160002081905550611c45600c6129f8565b8080611c50906150b5565b915050611bff565b506001811415611cd65781600d6000828254611c749190614cf3565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cca9190614cf3565b92505081905550611dc4565b6002811415611d535781600e6000828254611cf19190614cf3565b9250508190555081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d479190614cf3565b92505081905550611dc3565b81600f6000828254611d659190614cf3565b9250508190555081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbb9190614cf3565b925050819055505b5b60005b601454811015611efc576064601660006015600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015434611e549190614bf9565b611e5e919061512d565b601660006015600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611ee29190614cf3565b925050819055508080611ef4906150b5565b915050611dc7565b505050565b606481565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611f3f90614393565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6b90614393565b8015611fb85780601f10611f8d57610100808354040283529160200191611fb8565b820191906000526020600020905b815481529060010190602001808311611f9b57829003601f168201915b5050505050905090565b600a81565b611fcf612af4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561203d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612034906151aa565b60405180910390fd5b806005600061204a612af4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120f7612af4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161213c9190613dde565b60405180910390a35050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b670c7d713b49da000081565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6121d76121d1612af4565b83612bb5565b612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d9061467f565b60405180910390fd5b61222284848484613132565b50505050565b612230612af4565b73ffffffffffffffffffffffffffffffffffffffff1661224e611f06565b73ffffffffffffffffffffffffffffffffffffffff16146122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b9061477d565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6122f0612af4565b73ffffffffffffffffffffffffffffffffffffffff1661230e611f06565b73ffffffffffffffffffffffffffffffffffffffff1614612364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235b9061477d565b60405180910390fd5b60018114806123735750600281145b8061237e5750600381145b6123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b490615262565b60405180910390fd5b600181141561242857600161044c6123d59190614cf3565b82600d546123e39190614cf3565b10612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a906152f4565b60405180910390fd5b6124f0565b6002811415612492576001606461243f9190614cf3565b82600e5461244d9190614cf3565b1061248d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612484906152f4565b60405180910390fd5b6124ef565b6001600a6124a09190614cf3565b82600f546124ae9190614cf3565b106124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e5906152f4565b60405180910390fd5b5b5b60005b8281101561254c5761250e33612509600c613106565b613114565b816017600061251d600c613106565b815260200190815260200160002081905550612539600c6129f8565b8080612544906150b5565b9150506124f3565b5060018114156125ca5781600d60008282546125689190614cf3565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125be9190614cf3565b925050819055506126b8565b60028114156126475781600e60008282546125e59190614cf3565b9250508190555081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461263b9190614cf3565b925050819055506126b7565b81600f60008282546126599190614cf3565b9250508190555081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126af9190614cf3565b925050819055505b5b5050565b601481565b600581565b600e5481565b60606126d782612a88565b612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d90615386565b60405180910390fd5b600061272061318e565b9050600060176000858152602001908152602001600020549050600181141561276c5781604051602001612754919061542e565b604051602081830303815290604052925050506127c3565b600281141561279e5781604051602001612786919061549c565b604051602081830303815290604052925050506127c3565b816040516020016127af919061550a565b604051602081830303815290604052925050505b919050565b600181565b67063eb89da4ed000081565b60006127e482612a88565b612823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281a90615386565b60405180910390fd5b600060176000848152602001908152602001600020549050600181141561284e576001915050612867565b6002811415612861576005915050612867565b600a9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612908612af4565b73ffffffffffffffffffffffffffffffffffffffff16612926611f06565b73ffffffffffffffffffffffffffffffffffffffff161461297c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129739061477d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e39061559e565b60405180910390fd5b6129f581612f9d565b50565b6001816000016000828254019250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a815750612a80826131ae565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b6f83611422565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bc082612a88565b612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf690615630565b60405180910390fd5b6000612c0a83611422565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c7957508373ffffffffffffffffffffffffffffffffffffffff16612c6184610bed565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c8a5750612c89818561286c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb382611422565b73ffffffffffffffffffffffffffffffffffffffff1614612d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d00906156c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7090615754565b60405180910390fd5b612d84838383613290565b612d8f600082612afc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ddf9190614cbf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e369190614cf3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612ef7611405565b612f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2d906157c0565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612f7a612af4565b604051612f879190613f4e565b60405180910390a1565b612f9a816132e8565b50565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61306b611405565b156130ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a290614af2565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130ef612af4565b6040516130fc9190613f4e565b60405180910390a1565b600081600001549050919050565b61312e82826040518060200160405280600081525061333b565b5050565b61313d848484612c93565b61314984848484613396565b613188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317f90615852565b60405180910390fd5b50505050565b6060604051806060016040528060368152602001615a5d60369139905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061327957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061328957506132888261351e565b5b9050919050565b613298611405565b156132d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132cf90614af2565b60405180910390fd5b6132e3838383613588565b505050565b6132f18161369c565b6000600a6000838152602001908152602001600020805461331190614393565b90501461333857600a600082815260200190815260200160002060006133379190613c99565b5b50565b61334583836137ad565b6133526000848484613396565b613391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338890615852565b60405180910390fd5b505050565b60006133b78473ffffffffffffffffffffffffffffffffffffffff1661397b565b15613511578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133e0612af4565b8786866040518563ffffffff1660e01b815260040161340294939291906158c7565b6020604051808303816000875af192505050801561343e57506040513d601f19601f8201168201806040525081019061343b9190615928565b60015b6134c1573d806000811461346e576040519150601f19603f3d011682016040523d82523d6000602084013e613473565b606091505b506000815114156134b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b090615852565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613516565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61359383838361398e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135d6576135d181613993565b613615565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136145761361383826139dc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136585761365381613b49565b613697565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613696576136958282613c1a565b5b5b505050565b60006136a782611422565b90506136b581600084613290565b6136c0600083612afc565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137109190614cbf565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561381d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613814906159a1565b60405180910390fd5b61382681612a88565b15613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385d90615a0d565b60405180910390fd5b61387260008383613290565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138c29190614cf3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016139e9846114d4565b6139f39190614cbf565b9050600060076000848152602001908152602001600020549050818114613ad8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b5d9190614cbf565b9050600060096000848152602001908152602001600020549050600060088381548110613b8d57613b8c6148c1565b5b906000526020600020015490508060088381548110613baf57613bae6148c1565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613bfe57613bfd615a2d565b5b6001900381819060005260206000200160009055905550505050565b6000613c25836114d4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b508054613ca590614393565b6000825580601f10613cb75750613cd6565b601f016020900490600052602060002090810190613cd59190613cd9565b5b50565b5b80821115613cf2576000816000905550600101613cda565b5090565b6000819050919050565b613d0981613cf6565b82525050565b6000602082019050613d246000830184613d00565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d7381613d3e565b8114613d7e57600080fd5b50565b600081359050613d9081613d6a565b92915050565b600060208284031215613dac57613dab613d34565b5b6000613dba84828501613d81565b91505092915050565b60008115159050919050565b613dd881613dc3565b82525050565b6000602082019050613df36000830184613dcf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e33578082015181840152602081019050613e18565b83811115613e42576000848401525b50505050565b6000601f19601f8301169050919050565b6000613e6482613df9565b613e6e8185613e04565b9350613e7e818560208601613e15565b613e8781613e48565b840191505092915050565b60006020820190508181036000830152613eac8184613e59565b905092915050565b613ebd81613cf6565b8114613ec857600080fd5b50565b600081359050613eda81613eb4565b92915050565b600060208284031215613ef657613ef5613d34565b5b6000613f0484828501613ecb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f3882613f0d565b9050919050565b613f4881613f2d565b82525050565b6000602082019050613f636000830184613f3f565b92915050565b613f7281613f2d565b8114613f7d57600080fd5b50565b600081359050613f8f81613f69565b92915050565b60008060408385031215613fac57613fab613d34565b5b6000613fba85828601613f80565b9250506020613fcb85828601613ecb565b9150509250929050565b600080600060608486031215613fee57613fed613d34565b5b6000613ffc86828701613f80565b935050602061400d86828701613f80565b925050604061401e86828701613ecb565b9150509250925092565b600061403382613f0d565b9050919050565b61404381614028565b811461404e57600080fd5b50565b6000813590506140608161403a565b92915050565b60006020828403121561407c5761407b613d34565b5b600061408a84828501614051565b91505092915050565b6000602082840312156140a9576140a8613d34565b5b60006140b784828501613f80565b91505092915050565b600080604083850312156140d7576140d6613d34565b5b60006140e585828601613ecb565b92505060206140f685828601613ecb565b9150509250929050565b61410981613dc3565b811461411457600080fd5b50565b60008135905061412681614100565b92915050565b6000806040838503121561414357614142613d34565b5b600061415185828601613f80565b925050602061416285828601614117565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141ae82613e48565b810181811067ffffffffffffffff821117156141cd576141cc614176565b5b80604052505050565b60006141e0613d2a565b90506141ec82826141a5565b919050565b600067ffffffffffffffff82111561420c5761420b614176565b5b61421582613e48565b9050602081019050919050565b82818337600083830152505050565b600061424461423f846141f1565b6141d6565b9050828152602081018484840111156142605761425f614171565b5b61426b848285614222565b509392505050565b600082601f8301126142885761428761416c565b5b8135614298848260208601614231565b91505092915050565b600080600080608085870312156142bb576142ba613d34565b5b60006142c987828801613f80565b94505060206142da87828801613f80565b93505060406142eb87828801613ecb565b925050606085013567ffffffffffffffff81111561430c5761430b613d39565b5b61431887828801614273565b91505092959194509250565b6000806040838503121561433b5761433a613d34565b5b600061434985828601613f80565b925050602061435a85828601613f80565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143ab57607f821691505b602082108114156143bf576143be614364565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614421602c83613e04565b915061442c826143c5565b604082019050919050565b6000602082019050818103600083015261445081614414565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006144b3602183613e04565b91506144be82614457565b604082019050919050565b600060208201905081810360008301526144e2816144a6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614545603883613e04565b9150614550826144e9565b604082019050919050565b6000602082019050818103600083015261457481614538565b9050919050565b7f496e76616c6964207061737320747970652e20416c6c6f776564206172653a2060008201527f313d477265656e2c20323d426c75652c20333d476f6c64000000000000000000602082015250565b60006145d7603783613e04565b91506145e28261457b565b604082019050919050565b60006020820190508181036000830152614606816145ca565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614669603183613e04565b91506146748261460d565b604082019050919050565b600060208201905081810360008301526146988161465c565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006146fb602b83613e04565b91506147068261469f565b604082019050919050565b6000602082019050818103600083015261472a816146ee565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614767602083613e04565b915061477282614731565b602082019050919050565b600060208201905081810360008301526147968161475a565b9050919050565b7f43616c6c6572206973206e6f7420617070726f7665642f6f776e6572206e6f7260008201527f207468652041706520636f6e7472616374000000000000000000000000000000602082015250565b60006147f9603183613e04565b91506148048261479d565b604082019050919050565b60006020820190508181036000830152614828816147ec565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061488b602c83613e04565b91506148968261482f565b604082019050919050565b600060208201905081810360008301526148ba8161487e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f536f7272792120596f752068617665206e6f7468696e6720746f20776974686460008201527f7261772e00000000000000000000000000000000000000000000000000000000602082015250565b600061494c602483613e04565b9150614957826148f0565b604082019050919050565b6000602082019050818103600083015261497b8161493f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006149de602983613e04565b91506149e982614982565b604082019050919050565b60006020820190508181036000830152614a0d816149d1565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a70602a83613e04565b9150614a7b82614a14565b604082019050919050565b60006020820190508181036000830152614a9f81614a63565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614adc601083613e04565b9150614ae782614aa6565b602082019050919050565b60006020820190508181036000830152614b0b81614acf565b9050919050565b7f496e76616c69642070617373207479706520746f206265206d696e7465642e2060008201527f416c6c6f776564206172653a20313d477265656e2c20323d426c75652c20333d60208201527f476f6c642e000000000000000000000000000000000000000000000000000000604082015250565b6000614b94604583613e04565b9150614b9f82614b12565b606082019050919050565b60006020820190508181036000830152614bc381614b87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c0482613cf6565b9150614c0f83613cf6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4857614c47614bca565b5b828202905092915050565b7f45746865722076616c75652073656e7420697320696e636f72726563742e0000600082015250565b6000614c89601e83613e04565b9150614c9482614c53565b602082019050919050565b60006020820190508181036000830152614cb881614c7c565b9050919050565b6000614cca82613cf6565b9150614cd583613cf6565b925082821015614ce857614ce7614bca565b5b828203905092915050565b6000614cfe82613cf6565b9150614d0983613cf6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3e57614d3d614bca565b5b828201905092915050565b7f546f6f206d616e7920477265656e205061737365732061726520746f2062652060008201527f6d696e7465642e00000000000000000000000000000000000000000000000000602082015250565b6000614da5602783613e04565b9150614db082614d49565b604082019050919050565b60006020820190508181036000830152614dd481614d98565b9050919050565b7f4d6178696d756d207175616e74697479206f6620477265656e2050617373657360008201527f20746f206275792066726f6d203120616464726573732069732032302e000000602082015250565b6000614e37603d83613e04565b9150614e4282614ddb565b604082019050919050565b60006020820190508181036000830152614e6681614e2a565b9050919050565b7f546f6f206d616e7920426c7565205061737365732061726520746f206265206d60008201527f696e7465642e0000000000000000000000000000000000000000000000000000602082015250565b6000614ec9602683613e04565b9150614ed482614e6d565b604082019050919050565b60006020820190508181036000830152614ef881614ebc565b9050919050565b7f4d6178696d756d207175616e74697479206f6620426c7565205061737365732060008201527f746f206275792066726f6d2031206164647265737320697320342e0000000000602082015250565b6000614f5b603b83613e04565b9150614f6682614eff565b604082019050919050565b60006020820190508181036000830152614f8a81614f4e565b9050919050565b7f546f6f206d616e7920476f6c64205061737365732061726520746f206265206d60008201527f696e7465642e0000000000000000000000000000000000000000000000000000602082015250565b6000614fed602683613e04565b9150614ff882614f91565b604082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b7f4d6178696d756d207175616e74697479206f6620476f6c64205061737365732060008201527f746f206275792066726f6d2031206164647265737320697320312e0000000000602082015250565b600061507f603b83613e04565b915061508a82615023565b604082019050919050565b600060208201905081810360008301526150ae81615072565b9050919050565b60006150c082613cf6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150f3576150f2614bca565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061513882613cf6565b915061514383613cf6565b925082615153576151526150fe565b5b828204905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615194601983613e04565b915061519f8261515e565b602082019050919050565b600060208201905081810360008301526151c381615187565b9050919050565b7f496e76616c69642070617373207479706520746f206265206d696e7465642e2060008201527f416c6c6f776564206172653a20313d477265656e2c20323d426c75652c20333d60208201527f476f6c6400000000000000000000000000000000000000000000000000000000604082015250565b600061524c604483613e04565b9150615257826151ca565b606082019050919050565b6000602082019050818103600083015261527b8161523f565b9050919050565b7f546f6f206d616e79207061737365732061726520746f2062652063726561746560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b60006152de602283613e04565b91506152e982615282565b604082019050919050565b6000602082019050818103600083015261530d816152d1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e742070617373000000000000000000000000000000000000602082015250565b6000615370602e83613e04565b915061537b82615314565b604082019050919050565b6000602082019050818103600083015261539f81615363565b9050919050565b600081905092915050565b60006153bc82613df9565b6153c681856153a6565b93506153d6818560208601613e15565b80840191505092915050565b7f677265656e5f6d657461646174612e6a736f6e00000000000000000000000000600082015250565b60006154186013836153a6565b9150615423826153e2565b601382019050919050565b600061543a82846153b1565b91506154458261540b565b915081905092915050565b7f626c75655f6d657461646174612e6a736f6e0000000000000000000000000000600082015250565b60006154866012836153a6565b915061549182615450565b601282019050919050565b60006154a882846153b1565b91506154b382615479565b915081905092915050565b7f676f6c645f6d657461646174612e6a736f6e0000000000000000000000000000600082015250565b60006154f46012836153a6565b91506154ff826154be565b601282019050919050565b600061551682846153b1565b9150615521826154e7565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615588602683613e04565b91506155938261552c565b604082019050919050565b600060208201905081810360008301526155b78161557b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061561a602c83613e04565b9150615625826155be565b604082019050919050565b600060208201905081810360008301526156498161560d565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006156ac602983613e04565b91506156b782615650565b604082019050919050565b600060208201905081810360008301526156db8161569f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061573e602483613e04565b9150615749826156e2565b604082019050919050565b6000602082019050818103600083015261576d81615731565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006157aa601483613e04565b91506157b582615774565b602082019050919050565b600060208201905081810360008301526157d98161579d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061583c603283613e04565b9150615847826157e0565b604082019050919050565b6000602082019050818103600083015261586b8161582f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061589982615872565b6158a3818561587d565b93506158b3818560208601613e15565b6158bc81613e48565b840191505092915050565b60006080820190506158dc6000830187613f3f565b6158e96020830186613f3f565b6158f66040830185613d00565b8181036060830152615908818461588e565b905095945050505050565b60008151905061592281613d6a565b92915050565b60006020828403121561593e5761593d613d34565b5b600061594c84828501615913565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061598b602083613e04565b915061599682615955565b602082019050919050565b600060208201905081810360008301526159ba8161597e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006159f7601c83613e04565b9150615a02826159c1565b602082019050919050565b60006020820190508181036000830152615a26816159ea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe697066733a2f2f516d575458696f7566764e6a526b576f6434645947563638354344315a44657346503564657a554d526f4a6b45632fa2646970667358221220550cd333707f2444a05dfc1705505959ddf63c477ad8051145aec7759f45924e64736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106102925760003560e01c8063711792dd1161015a578063b88d4fde116100c1578063c87b56dd1161007a578063c87b56dd146109fe578063d90805ee14610a3b578063dd8edff714610a66578063e876b6f514610a91578063e985e9c514610ace578063f2fde38b14610b0b57610292565b8063b88d4fde14610902578063bae9acc11461092b578063bcd3ca6b14610954578063be63fb231461097d578063c115e535146109a8578063c6e864a8146109d357610292565b806395d89b411161011357806395d89b41146107f05780639c06a4971461081b578063a22cb46514610846578063aa1a92991461086f578063add1d0901461089a578063b81250ed146108c557610292565b8063711792dd14610713578063715018a6146107505780638456cb591461076757806384eebd3e1461077e578063854bd9c71461079a5780638da5cb5b146107c557610292565b806323b872dd116101fe5780634f6ccce7116101b75780634f6ccce7146105c957806351cff8d9146106065780635c975abb14610643578063618ae9801461066e5780636352211e1461069957806370a08231146106d657610292565b806323b872dd146104cf5780632f745c59146104f85780633f4ba83a1461053557806342842e0e1461054c57806342966c68146105755780634313be151461059e57610292565b8063081812fc11610250578063081812fc146103ab578063095ea7b3146103e85780630c866a04146104115780631029158b1461044e578063161a97681461047957806318160ddd146104a457610292565b80621c5c9e14610297578063016fd24e146102c257806301ffc9a7146102ed5780630588c4b51461032a57806305b0c3361461035557806306fdde0314610380575b600080fd5b3480156102a357600080fd5b506102ac610b34565b6040516102b99190613d0f565b60405180910390f35b3480156102ce57600080fd5b506102d7610b3a565b6040516102e49190613d0f565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190613d96565b610b3f565b6040516103219190613dde565b60405180910390f35b34801561033657600080fd5b5061033f610b51565b60405161034c9190613d0f565b60405180910390f35b34801561036157600080fd5b5061036a610b56565b6040516103779190613d0f565b60405180910390f35b34801561038c57600080fd5b50610395610b5b565b6040516103a29190613e92565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613ee0565b610bed565b6040516103df9190613f4e565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190613f95565b610c72565b005b34801561041d57600080fd5b5061043860048036038101906104339190613ee0565b610d8a565b6040516104459190613d0f565b60405180910390f35b34801561045a57600080fd5b50610463610ecd565b6040516104709190613d0f565b60405180910390f35b34801561048557600080fd5b5061048e610ed9565b60405161049b9190613d0f565b60405180910390f35b3480156104b057600080fd5b506104b9610ede565b6040516104c69190613d0f565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613fd5565b610eeb565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613f95565b610f4b565b60405161052c9190613d0f565b60405180910390f35b34801561054157600080fd5b5061054a610ff0565b005b34801561055857600080fd5b50610573600480360381019061056e9190613fd5565b611076565b005b34801561058157600080fd5b5061059c60048036038101906105979190613ee0565b611096565b005b3480156105aa57600080fd5b506105b361114a565b6040516105c09190613d0f565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190613ee0565b611150565b6040516105fd9190613d0f565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190614066565b6111c1565b60405161063a9190613dde565b60405180910390f35b34801561064f57600080fd5b50610658611405565b6040516106659190613dde565b60405180910390f35b34801561067a57600080fd5b5061068361141c565b6040516106909190613d0f565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190613ee0565b611422565b6040516106cd9190613f4e565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f89190614093565b6114d4565b60405161070a9190613d0f565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190614093565b61158c565b6040516107479190613d0f565b60405180910390f35b34801561075c57600080fd5b506107656115d8565b005b34801561077357600080fd5b5061077c611660565b005b610798600480360381019061079391906140c0565b611701565b005b3480156107a657600080fd5b506107af611f01565b6040516107bc9190613d0f565b60405180910390f35b3480156107d157600080fd5b506107da611f06565b6040516107e79190613f4e565b60405180910390f35b3480156107fc57600080fd5b50610805611f30565b6040516108129190613e92565b60405180910390f35b34801561082757600080fd5b50610830611fc2565b60405161083d9190613d0f565b60405180910390f35b34801561085257600080fd5b5061086d6004803603810190610868919061412c565b611fc7565b005b34801561087b57600080fd5b50610884612148565b6040516108919190613f4e565b60405180910390f35b3480156108a657600080fd5b506108af61216e565b6040516108bc9190613d0f565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e79190614093565b61217a565b6040516108f99190613d0f565b60405180910390f35b34801561090e57600080fd5b50610929600480360381019061092491906142a1565b6121c6565b005b34801561093757600080fd5b50610952600480360381019061094d9190614093565b612228565b005b34801561096057600080fd5b5061097b600480360381019061097691906140c0565b6122e8565b005b34801561098957600080fd5b506109926126bc565b60405161099f9190613d0f565b60405180910390f35b3480156109b457600080fd5b506109bd6126c1565b6040516109ca9190613d0f565b60405180910390f35b3480156109df57600080fd5b506109e86126c6565b6040516109f59190613d0f565b60405180910390f35b348015610a0a57600080fd5b50610a256004803603810190610a209190613ee0565b6126cc565b604051610a329190613e92565b60405180910390f35b348015610a4757600080fd5b50610a506127c8565b604051610a5d9190613d0f565b60405180910390f35b348015610a7257600080fd5b50610a7b6127cd565b604051610a889190613d0f565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab39190613ee0565b6127d9565b604051610ac59190613d0f565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af09190614324565b61286c565b604051610b029190613dde565b60405180910390f35b348015610b1757600080fd5b50610b326004803603810190610b2d9190614093565b612900565b005b61044c81565b606481565b6000610b4a82612a0e565b9050919050565b600181565b600481565b606060008054610b6a90614393565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9690614393565b8015610be35780601f10610bb857610100808354040283529160200191610be3565b820191906000526020600020905b815481529060010190602001808311610bc657829003601f168201915b5050505050905090565b6000610bf882612a88565b610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90614437565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7d82611422565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce5906144c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d0d612af4565b73ffffffffffffffffffffffffffffffffffffffff161480610d3c5750610d3b81610d36612af4565b61286c565b5b610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d729061455b565b60405180910390fd5b610d858383612afc565b505050565b60006001821480610d9b5750600282145b80610da65750600382145b610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc906145ed565b60405180910390fd5b6001821415610e3557601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610ec8565b6002821415610e8557601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610ec8565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b67013fbe85edc9000081565b600a81565b6000600880549050905090565b610efc610ef6612af4565b82612bb5565b610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f329061467f565b60405180910390fd5b610f46838383612c93565b505050565b6000610f56836114d4565b8210610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e90614711565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ff8612af4565b73ffffffffffffffffffffffffffffffffffffffff16611016611f06565b73ffffffffffffffffffffffffffffffffffffffff161461106c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110639061477d565b60405180910390fd5b611074612eef565b565b611091838383604051806020016040528060008152506121c6565b505050565b6110a76110a1612af4565b82612bb5565b806110ff5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61113e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111359061480f565b60405180910390fd5b61114781612f91565b50565b600f5481565b600061115a610ede565b821061119b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611192906148a1565b60405180910390fd5b600882815481106111af576111ae6148c1565b5b90600052602060002001549050919050565b600080601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90614962565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156112b057503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6112b957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561132257503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b61132b57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549081150290604051600060405180830381858888f193505050501580156113b3573d6000803e3d6000fd5b506000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555060019050919050565b6000600b60009054906101000a900460ff16905090565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c2906149f4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614a86565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6115e0612af4565b73ffffffffffffffffffffffffffffffffffffffff166115fe611f06565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b9061477d565b60405180910390fd5b61165e6000612f9d565b565b611668611f06565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116ee5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116f757600080fd5b6116ff613063565b565b611709611405565b15611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090614af2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156117b257503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b6117bb57600080fd5b60018114806117ca5750600281145b806117d55750600381145b611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614baa565b60405180910390fd5b600181141561196e573467013fbe85edc90000836118329190614bf9565b14611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186990614c9f565b60405180910390fd5b6001606461044c6118839190614cbf565b61188d9190614cf3565b82600d5461189b9190614cf3565b106118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290614dbb565b60405180910390fd5b6014601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836119289190614cf3565b1115611969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196090614e4d565b60405180910390fd5b611bfc565b6002811415611abb573467063eb89da4ed00008361198c9190614bf9565b146119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390614c9f565b60405180910390fd5b600160646119da9190614cf3565b82600e546119e89190614cf3565b10611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614edf565b60405180910390fd5b6004601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611a759190614cf3565b1115611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614f71565b60405180910390fd5b611bfb565b34670c7d713b49da000083611ad09190614bf9565b14611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790614c9f565b60405180910390fd5b6001600a611b1e9190614cf3565b82600f54611b2c9190614cf3565b10611b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6390615003565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611bb99190614cf3565b1115611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190615095565b60405180910390fd5b5b5b60005b82811015611c5857611c1a33611c15600c613106565b613114565b8160176000611c29600c613106565b815260200190815260200160002081905550611c45600c6129f8565b8080611c50906150b5565b915050611bff565b506001811415611cd65781600d6000828254611c749190614cf3565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cca9190614cf3565b92505081905550611dc4565b6002811415611d535781600e6000828254611cf19190614cf3565b9250508190555081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d479190614cf3565b92505081905550611dc3565b81600f6000828254611d659190614cf3565b9250508190555081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbb9190614cf3565b925050819055505b5b60005b601454811015611efc576064601660006015600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015434611e549190614bf9565b611e5e919061512d565b601660006015600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611ee29190614cf3565b925050819055508080611ef4906150b5565b915050611dc7565b505050565b606481565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611f3f90614393565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6b90614393565b8015611fb85780601f10611f8d57610100808354040283529160200191611fb8565b820191906000526020600020905b815481529060010190602001808311611f9b57829003601f168201915b5050505050905090565b600a81565b611fcf612af4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561203d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612034906151aa565b60405180910390fd5b806005600061204a612af4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120f7612af4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161213c9190613dde565b60405180910390a35050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b670c7d713b49da000081565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6121d76121d1612af4565b83612bb5565b612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d9061467f565b60405180910390fd5b61222284848484613132565b50505050565b612230612af4565b73ffffffffffffffffffffffffffffffffffffffff1661224e611f06565b73ffffffffffffffffffffffffffffffffffffffff16146122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b9061477d565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6122f0612af4565b73ffffffffffffffffffffffffffffffffffffffff1661230e611f06565b73ffffffffffffffffffffffffffffffffffffffff1614612364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235b9061477d565b60405180910390fd5b60018114806123735750600281145b8061237e5750600381145b6123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b490615262565b60405180910390fd5b600181141561242857600161044c6123d59190614cf3565b82600d546123e39190614cf3565b10612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a906152f4565b60405180910390fd5b6124f0565b6002811415612492576001606461243f9190614cf3565b82600e5461244d9190614cf3565b1061248d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612484906152f4565b60405180910390fd5b6124ef565b6001600a6124a09190614cf3565b82600f546124ae9190614cf3565b106124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e5906152f4565b60405180910390fd5b5b5b60005b8281101561254c5761250e33612509600c613106565b613114565b816017600061251d600c613106565b815260200190815260200160002081905550612539600c6129f8565b8080612544906150b5565b9150506124f3565b5060018114156125ca5781600d60008282546125689190614cf3565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125be9190614cf3565b925050819055506126b8565b60028114156126475781600e60008282546125e59190614cf3565b9250508190555081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461263b9190614cf3565b925050819055506126b7565b81600f60008282546126599190614cf3565b9250508190555081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126af9190614cf3565b925050819055505b5b5050565b601481565b600581565b600e5481565b60606126d782612a88565b612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d90615386565b60405180910390fd5b600061272061318e565b9050600060176000858152602001908152602001600020549050600181141561276c5781604051602001612754919061542e565b604051602081830303815290604052925050506127c3565b600281141561279e5781604051602001612786919061549c565b604051602081830303815290604052925050506127c3565b816040516020016127af919061550a565b604051602081830303815290604052925050505b919050565b600181565b67063eb89da4ed000081565b60006127e482612a88565b612823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281a90615386565b60405180910390fd5b600060176000848152602001908152602001600020549050600181141561284e576001915050612867565b6002811415612861576005915050612867565b600a9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612908612af4565b73ffffffffffffffffffffffffffffffffffffffff16612926611f06565b73ffffffffffffffffffffffffffffffffffffffff161461297c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129739061477d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e39061559e565b60405180910390fd5b6129f581612f9d565b50565b6001816000016000828254019250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a815750612a80826131ae565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b6f83611422565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bc082612a88565b612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf690615630565b60405180910390fd5b6000612c0a83611422565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c7957508373ffffffffffffffffffffffffffffffffffffffff16612c6184610bed565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c8a5750612c89818561286c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb382611422565b73ffffffffffffffffffffffffffffffffffffffff1614612d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d00906156c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7090615754565b60405180910390fd5b612d84838383613290565b612d8f600082612afc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ddf9190614cbf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e369190614cf3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612ef7611405565b612f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2d906157c0565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612f7a612af4565b604051612f879190613f4e565b60405180910390a1565b612f9a816132e8565b50565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61306b611405565b156130ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a290614af2565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130ef612af4565b6040516130fc9190613f4e565b60405180910390a1565b600081600001549050919050565b61312e82826040518060200160405280600081525061333b565b5050565b61313d848484612c93565b61314984848484613396565b613188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317f90615852565b60405180910390fd5b50505050565b6060604051806060016040528060368152602001615a5d60369139905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061327957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061328957506132888261351e565b5b9050919050565b613298611405565b156132d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132cf90614af2565b60405180910390fd5b6132e3838383613588565b505050565b6132f18161369c565b6000600a6000838152602001908152602001600020805461331190614393565b90501461333857600a600082815260200190815260200160002060006133379190613c99565b5b50565b61334583836137ad565b6133526000848484613396565b613391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338890615852565b60405180910390fd5b505050565b60006133b78473ffffffffffffffffffffffffffffffffffffffff1661397b565b15613511578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133e0612af4565b8786866040518563ffffffff1660e01b815260040161340294939291906158c7565b6020604051808303816000875af192505050801561343e57506040513d601f19601f8201168201806040525081019061343b9190615928565b60015b6134c1573d806000811461346e576040519150601f19603f3d011682016040523d82523d6000602084013e613473565b606091505b506000815114156134b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b090615852565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613516565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61359383838361398e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135d6576135d181613993565b613615565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136145761361383826139dc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136585761365381613b49565b613697565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613696576136958282613c1a565b5b5b505050565b60006136a782611422565b90506136b581600084613290565b6136c0600083612afc565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137109190614cbf565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561381d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613814906159a1565b60405180910390fd5b61382681612a88565b15613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385d90615a0d565b60405180910390fd5b61387260008383613290565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138c29190614cf3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016139e9846114d4565b6139f39190614cbf565b9050600060076000848152602001908152602001600020549050818114613ad8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b5d9190614cbf565b9050600060096000848152602001908152602001600020549050600060088381548110613b8d57613b8c6148c1565b5b906000526020600020015490508060088381548110613baf57613bae6148c1565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613bfe57613bfd615a2d565b5b6001900381819060005260206000200160009055905550505050565b6000613c25836114d4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b508054613ca590614393565b6000825580601f10613cb75750613cd6565b601f016020900490600052602060002090810190613cd59190613cd9565b5b50565b5b80821115613cf2576000816000905550600101613cda565b5090565b6000819050919050565b613d0981613cf6565b82525050565b6000602082019050613d246000830184613d00565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d7381613d3e565b8114613d7e57600080fd5b50565b600081359050613d9081613d6a565b92915050565b600060208284031215613dac57613dab613d34565b5b6000613dba84828501613d81565b91505092915050565b60008115159050919050565b613dd881613dc3565b82525050565b6000602082019050613df36000830184613dcf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e33578082015181840152602081019050613e18565b83811115613e42576000848401525b50505050565b6000601f19601f8301169050919050565b6000613e6482613df9565b613e6e8185613e04565b9350613e7e818560208601613e15565b613e8781613e48565b840191505092915050565b60006020820190508181036000830152613eac8184613e59565b905092915050565b613ebd81613cf6565b8114613ec857600080fd5b50565b600081359050613eda81613eb4565b92915050565b600060208284031215613ef657613ef5613d34565b5b6000613f0484828501613ecb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f3882613f0d565b9050919050565b613f4881613f2d565b82525050565b6000602082019050613f636000830184613f3f565b92915050565b613f7281613f2d565b8114613f7d57600080fd5b50565b600081359050613f8f81613f69565b92915050565b60008060408385031215613fac57613fab613d34565b5b6000613fba85828601613f80565b9250506020613fcb85828601613ecb565b9150509250929050565b600080600060608486031215613fee57613fed613d34565b5b6000613ffc86828701613f80565b935050602061400d86828701613f80565b925050604061401e86828701613ecb565b9150509250925092565b600061403382613f0d565b9050919050565b61404381614028565b811461404e57600080fd5b50565b6000813590506140608161403a565b92915050565b60006020828403121561407c5761407b613d34565b5b600061408a84828501614051565b91505092915050565b6000602082840312156140a9576140a8613d34565b5b60006140b784828501613f80565b91505092915050565b600080604083850312156140d7576140d6613d34565b5b60006140e585828601613ecb565b92505060206140f685828601613ecb565b9150509250929050565b61410981613dc3565b811461411457600080fd5b50565b60008135905061412681614100565b92915050565b6000806040838503121561414357614142613d34565b5b600061415185828601613f80565b925050602061416285828601614117565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141ae82613e48565b810181811067ffffffffffffffff821117156141cd576141cc614176565b5b80604052505050565b60006141e0613d2a565b90506141ec82826141a5565b919050565b600067ffffffffffffffff82111561420c5761420b614176565b5b61421582613e48565b9050602081019050919050565b82818337600083830152505050565b600061424461423f846141f1565b6141d6565b9050828152602081018484840111156142605761425f614171565b5b61426b848285614222565b509392505050565b600082601f8301126142885761428761416c565b5b8135614298848260208601614231565b91505092915050565b600080600080608085870312156142bb576142ba613d34565b5b60006142c987828801613f80565b94505060206142da87828801613f80565b93505060406142eb87828801613ecb565b925050606085013567ffffffffffffffff81111561430c5761430b613d39565b5b61431887828801614273565b91505092959194509250565b6000806040838503121561433b5761433a613d34565b5b600061434985828601613f80565b925050602061435a85828601613f80565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143ab57607f821691505b602082108114156143bf576143be614364565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614421602c83613e04565b915061442c826143c5565b604082019050919050565b6000602082019050818103600083015261445081614414565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006144b3602183613e04565b91506144be82614457565b604082019050919050565b600060208201905081810360008301526144e2816144a6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614545603883613e04565b9150614550826144e9565b604082019050919050565b6000602082019050818103600083015261457481614538565b9050919050565b7f496e76616c6964207061737320747970652e20416c6c6f776564206172653a2060008201527f313d477265656e2c20323d426c75652c20333d476f6c64000000000000000000602082015250565b60006145d7603783613e04565b91506145e28261457b565b604082019050919050565b60006020820190508181036000830152614606816145ca565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614669603183613e04565b91506146748261460d565b604082019050919050565b600060208201905081810360008301526146988161465c565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006146fb602b83613e04565b91506147068261469f565b604082019050919050565b6000602082019050818103600083015261472a816146ee565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614767602083613e04565b915061477282614731565b602082019050919050565b600060208201905081810360008301526147968161475a565b9050919050565b7f43616c6c6572206973206e6f7420617070726f7665642f6f776e6572206e6f7260008201527f207468652041706520636f6e7472616374000000000000000000000000000000602082015250565b60006147f9603183613e04565b91506148048261479d565b604082019050919050565b60006020820190508181036000830152614828816147ec565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061488b602c83613e04565b91506148968261482f565b604082019050919050565b600060208201905081810360008301526148ba8161487e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f536f7272792120596f752068617665206e6f7468696e6720746f20776974686460008201527f7261772e00000000000000000000000000000000000000000000000000000000602082015250565b600061494c602483613e04565b9150614957826148f0565b604082019050919050565b6000602082019050818103600083015261497b8161493f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006149de602983613e04565b91506149e982614982565b604082019050919050565b60006020820190508181036000830152614a0d816149d1565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614a70602a83613e04565b9150614a7b82614a14565b604082019050919050565b60006020820190508181036000830152614a9f81614a63565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614adc601083613e04565b9150614ae782614aa6565b602082019050919050565b60006020820190508181036000830152614b0b81614acf565b9050919050565b7f496e76616c69642070617373207479706520746f206265206d696e7465642e2060008201527f416c6c6f776564206172653a20313d477265656e2c20323d426c75652c20333d60208201527f476f6c642e000000000000000000000000000000000000000000000000000000604082015250565b6000614b94604583613e04565b9150614b9f82614b12565b606082019050919050565b60006020820190508181036000830152614bc381614b87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c0482613cf6565b9150614c0f83613cf6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4857614c47614bca565b5b828202905092915050565b7f45746865722076616c75652073656e7420697320696e636f72726563742e0000600082015250565b6000614c89601e83613e04565b9150614c9482614c53565b602082019050919050565b60006020820190508181036000830152614cb881614c7c565b9050919050565b6000614cca82613cf6565b9150614cd583613cf6565b925082821015614ce857614ce7614bca565b5b828203905092915050565b6000614cfe82613cf6565b9150614d0983613cf6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3e57614d3d614bca565b5b828201905092915050565b7f546f6f206d616e7920477265656e205061737365732061726520746f2062652060008201527f6d696e7465642e00000000000000000000000000000000000000000000000000602082015250565b6000614da5602783613e04565b9150614db082614d49565b604082019050919050565b60006020820190508181036000830152614dd481614d98565b9050919050565b7f4d6178696d756d207175616e74697479206f6620477265656e2050617373657360008201527f20746f206275792066726f6d203120616464726573732069732032302e000000602082015250565b6000614e37603d83613e04565b9150614e4282614ddb565b604082019050919050565b60006020820190508181036000830152614e6681614e2a565b9050919050565b7f546f6f206d616e7920426c7565205061737365732061726520746f206265206d60008201527f696e7465642e0000000000000000000000000000000000000000000000000000602082015250565b6000614ec9602683613e04565b9150614ed482614e6d565b604082019050919050565b60006020820190508181036000830152614ef881614ebc565b9050919050565b7f4d6178696d756d207175616e74697479206f6620426c7565205061737365732060008201527f746f206275792066726f6d2031206164647265737320697320342e0000000000602082015250565b6000614f5b603b83613e04565b9150614f6682614eff565b604082019050919050565b60006020820190508181036000830152614f8a81614f4e565b9050919050565b7f546f6f206d616e7920476f6c64205061737365732061726520746f206265206d60008201527f696e7465642e0000000000000000000000000000000000000000000000000000602082015250565b6000614fed602683613e04565b9150614ff882614f91565b604082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b7f4d6178696d756d207175616e74697479206f6620476f6c64205061737365732060008201527f746f206275792066726f6d2031206164647265737320697320312e0000000000602082015250565b600061507f603b83613e04565b915061508a82615023565b604082019050919050565b600060208201905081810360008301526150ae81615072565b9050919050565b60006150c082613cf6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150f3576150f2614bca565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061513882613cf6565b915061514383613cf6565b925082615153576151526150fe565b5b828204905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615194601983613e04565b915061519f8261515e565b602082019050919050565b600060208201905081810360008301526151c381615187565b9050919050565b7f496e76616c69642070617373207479706520746f206265206d696e7465642e2060008201527f416c6c6f776564206172653a20313d477265656e2c20323d426c75652c20333d60208201527f476f6c6400000000000000000000000000000000000000000000000000000000604082015250565b600061524c604483613e04565b9150615257826151ca565b606082019050919050565b6000602082019050818103600083015261527b8161523f565b9050919050565b7f546f6f206d616e79207061737365732061726520746f2062652063726561746560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b60006152de602283613e04565b91506152e982615282565b604082019050919050565b6000602082019050818103600083015261530d816152d1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e742070617373000000000000000000000000000000000000602082015250565b6000615370602e83613e04565b915061537b82615314565b604082019050919050565b6000602082019050818103600083015261539f81615363565b9050919050565b600081905092915050565b60006153bc82613df9565b6153c681856153a6565b93506153d6818560208601613e15565b80840191505092915050565b7f677265656e5f6d657461646174612e6a736f6e00000000000000000000000000600082015250565b60006154186013836153a6565b9150615423826153e2565b601382019050919050565b600061543a82846153b1565b91506154458261540b565b915081905092915050565b7f626c75655f6d657461646174612e6a736f6e0000000000000000000000000000600082015250565b60006154866012836153a6565b915061549182615450565b601282019050919050565b60006154a882846153b1565b91506154b382615479565b915081905092915050565b7f676f6c645f6d657461646174612e6a736f6e0000000000000000000000000000600082015250565b60006154f46012836153a6565b91506154ff826154be565b601282019050919050565b600061551682846153b1565b9150615521826154e7565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615588602683613e04565b91506155938261552c565b604082019050919050565b600060208201905081810360008301526155b78161557b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061561a602c83613e04565b9150615625826155be565b604082019050919050565b600060208201905081810360008301526156498161560d565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006156ac602983613e04565b91506156b782615650565b604082019050919050565b600060208201905081810360008301526156db8161569f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061573e602483613e04565b9150615749826156e2565b604082019050919050565b6000602082019050818103600083015261576d81615731565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006157aa601483613e04565b91506157b582615774565b602082019050919050565b600060208201905081810360008301526157d98161579d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061583c603283613e04565b9150615847826157e0565b604082019050919050565b6000602082019050818103600083015261586b8161582f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061589982615872565b6158a3818561587d565b93506158b3818560208601613e15565b6158bc81613e48565b840191505092915050565b60006080820190506158dc6000830187613f3f565b6158e96020830186613f3f565b6158f66040830185613d00565b8181036060830152615908818461588e565b905095945050505050565b60008151905061592281613d6a565b92915050565b60006020828403121561593e5761593d613d34565b5b600061594c84828501615913565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061598b602083613e04565b915061599682615955565b602082019050919050565b600060208201905081810360008301526159ba8161597e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006159f7601c83613e04565b9150615a02826159c1565b602082019050919050565b60006020820190508181036000830152615a26816159ea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe697066733a2f2f516d575458696f7566764e6a526b576f6434645947563638354344315a44657346503564657a554d526f4a6b45632fa2646970667358221220550cd333707f2444a05dfc1705505959ddf63c477ad8051145aec7759f45924e64736f6c634300080a0033

Deployed Bytecode Sourcemap

48004:10011:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48200:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48306:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57800:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48594:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48474;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20804:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22363:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21886:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52250:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48772:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48359:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34316:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23253:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33984:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52700:65;;;;;;;;;;;;;:::i;:::-;;23663:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56637:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49026:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34506:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55682:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42621:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48951:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20498:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20228:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56123:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45370:94;;;;;;;;;;;;;:::i;:::-;;50868:122;;;;;;;;;;;;;:::i;:::-;;53396:2274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48255:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44719:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20973:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48711:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22656:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49204:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48891:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56258:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23919:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52777:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50998:1244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48413:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48653:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48989:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57151:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48533:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48832;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52913:471;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23022:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45619:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48200:48;48244:4;48200:48;:::o;48306:46::-;48349:3;48306:46;:::o;57800:212::-;57939:4;57968:36;57992:11;57968:23;:36::i;:::-;57961:43;;57800:212;;;:::o;48594:52::-;48645:1;48594:52;:::o;48474:::-;48525:1;48474:52;:::o;20804:100::-;20858:13;20891:5;20884:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20804:100;:::o;22363:221::-;22439:7;22467:16;22475:7;22467;:16::i;:::-;22459:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22552:15;:24;22568:7;22552:24;;;;;;;;;;;;;;;;;;;;;22545:31;;22363:221;;;:::o;21886:411::-;21967:13;21983:23;21998:7;21983:14;:23::i;:::-;21967:39;;22031:5;22025:11;;:2;:11;;;;22017:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22125:5;22109:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22134:37;22151:5;22158:12;:10;:12::i;:::-;22134:16;:37::i;:::-;22109:62;22087:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22268:21;22277:2;22281:7;22268:8;:21::i;:::-;21956:341;21886:411;;:::o;52250:442::-;52310:7;52351:1;52337:10;:15;:34;;;;52370:1;52356:10;:15;52337:34;:53;;;;52389:1;52375:10;:15;52337:53;52329:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;52479:1;52465:10;:15;52461:224;;;52503:12;:24;52516:10;52503:24;;;;;;;;;;;;;;;;52496:31;;;;52461:224;52563:1;52549:10;:15;52545:140;;;52587:11;:23;52599:10;52587:23;;;;;;;;;;;;;;;;52580:30;;;;52545:140;52650:11;:23;52662:10;52650:23;;;;;;;;;;;;;;;;52643:30;;52250:442;;;;:::o;48772:53::-;48815:10;48772:53;:::o;48359:45::-;48402:2;48359:45;:::o;34316:113::-;34377:7;34404:10;:17;;;;34397:24;;34316:113;:::o;23253:339::-;23448:41;23467:12;:10;:12::i;:::-;23481:7;23448:18;:41::i;:::-;23440:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23556:28;23566:4;23572:2;23576:7;23556:9;:28::i;:::-;23253:339;;;:::o;33984:256::-;34081:7;34117:23;34134:5;34117:16;:23::i;:::-;34109:5;:31;34101:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34206:12;:19;34219:5;34206:19;;;;;;;;;;;;;;;:26;34226:5;34206:26;;;;;;;;;;;;34199:33;;33984:256;;;;:::o;52700:65::-;44950:12;:10;:12::i;:::-;44939:23;;:7;:5;:7::i;:::-;:23;;;44931:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52747:10:::1;:8;:10::i;:::-;52700:65::o:0;23663:185::-;23801:39;23818:4;23824:2;23828:7;23801:39;;;;;;;;;;;;:16;:39::i;:::-;23663:185;;;:::o;56637:224::-;56703:41;56722:12;:10;:12::i;:::-;56736:7;56703:18;:41::i;:::-;:71;;;;56762:12;;;;;;;;;;;56748:26;;:10;:26;;;56703:71;56695:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;56839:14;56845:7;56839:5;:14::i;:::-;56637:224;:::o;49026:30::-;;;;:::o;34506:233::-;34581:7;34617:30;:28;:30::i;:::-;34609:5;:38;34601:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34714:10;34725:5;34714:17;;;;;;;;:::i;:::-;;;;;;;;;;34707:24;;34506:233;;;:::o;55682:433::-;55744:4;55796:1;55768:5;:17;55774:10;55768:17;;;;;;;;;;;;;;;:25;;;:29;55760:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;55879:1;55857:24;;:10;:24;;;;:55;;;;;55907:4;55885:27;;:10;:27;;;;55857:55;55849:64;;;;;;55954:1;55932:24;;:10;:24;;;;:55;;;;;55982:4;55960:27;;:10;:27;;;;55932:55;55924:64;;;;;;55999:10;:19;;:46;56019:5;:17;56025:10;56019:17;;;;;;;;;;;;;;;:25;;;55999:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56084:1;56056:5;:17;56062:10;56056:17;;;;;;;;;;;;;;;:25;;:29;;;;56103:4;56096:11;;55682:433;;;:::o;42621:86::-;42668:4;42692:7;;;;;;;;;;;42685:14;;42621:86;:::o;48951:31::-;;;;:::o;20498:239::-;20570:7;20590:13;20606:7;:16;20614:7;20606:16;;;;;;;;;;;;;;;;;;;;;20590:32;;20658:1;20641:19;;:5;:19;;;;20633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20724:5;20717:12;;;20498:239;;;:::o;20228:208::-;20300:7;20345:1;20328:19;;:5;:19;;;;20320:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20412:9;:16;20422:5;20412:16;;;;;;;;;;;;;;;;20405:23;;20228:208;;;:::o;56123:127::-;56193:7;56219:5;:17;56225:10;56219:17;;;;;;;;;;;;;;;:23;;;56212:30;;56123:127;;;:::o;45370:94::-;44950:12;:10;:12::i;:::-;44939:23;;:7;:5;:7::i;:::-;:23;;;44931:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45435:21:::1;45453:1;45435:9;:21::i;:::-;45370:94::o:0;50868:122::-;50925:7;:5;:7::i;:::-;50911:21;;:10;:21;;;:51;;;;50950:12;;;;;;;;;;;50936:26;;:10;:26;;;50911:51;50903:60;;;;;;50974:8;:6;:8::i;:::-;50868:122::o;53396:2274::-;42947:8;:6;:8::i;:::-;42946:9;42938:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;53521:1:::1;53499:24;;:10;:24;;;;:55;;;;;53549:4;53527:27;;:10;:27;;;;53499:55;53491:64;;;::::0;::::1;;53588:1;53574:10;:15;:34;;;;53607:1;53593:10;:15;53574:34;:53;;;;53626:1;53612:10;:15;53574:53;53566:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;53730:1;53716:10;:15;53712:1181;;;53786:9;48815:10;53755:8;:27;;;;:::i;:::-;:40;53747:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53915:1;48296:3;48244:4;53879:33;;;;:::i;:::-;:37;;;;:::i;:::-;53868:8;53853:12;;:23;;;;:::i;:::-;:63;53845:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;48465:2;53994:12;:24;54007:10;53994:24;;;;;;;;;;;;;;;;53983:8;:35;;;;:::i;:::-;:64;;53975:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;53712:1181;;;54149:1;54135:10;:15;54131:762;;;54204:9;48874:10;54174:8;:26;;;;:::i;:::-;:39;54166:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;54314:1;48349:3;54296:19;;;;:::i;:::-;54285:8;54271:11;;:22;;;;:::i;:::-;:44;54263:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48525:1;54392:11;:23;54404:10;54392:23;;;;;;;;;;;;;;;;54381:8;:34;;;;:::i;:::-;:62;;54373:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;54131:762;;;54578:9;48933;54548:8;:26;;;;:::i;:::-;:39;54540:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;54688:1;48402:2;54670:19;;;;:::i;:::-;54659:8;54645:11;;:22;;;;:::i;:::-;:44;54637:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48584:1;54766:11;:23;54778:10;54766:23;;;;;;;;;;;;;;;;54755:8;:34;;;;:::i;:::-;:62;;54747:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;54131:762;53712:1181;54917:9;54913:220;54936:8;54932:1;:12;54913:220;;;54966:48;54976:10;54988:25;:15;:23;:25::i;:::-;54966:9;:48::i;:::-;55069:10;55029;:37;55040:25;:15;:23;:25::i;:::-;55029:37;;;;;;;;;;;:50;;;;55094:27;:15;:25;:27::i;:::-;54946:3;;;;;:::i;:::-;;;;54913:220;;;;55163:1;55149:10;:15;55145:354;;;55196:8;55180:12;;:24;;;;;;;:::i;:::-;;;;;;;;55247:8;55219:12;:24;55232:10;55219:24;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;55145:354;;;55291:1;55277:10;:15;55273:226;;;55323:8;55308:11;;:23;;;;;;;:::i;:::-;;;;;;;;55373:8;55346:11;:23;55358:10;55346:23;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;55273:226;;;55429:8;55414:11;;:23;;;;;;;:::i;:::-;;;;;;;;55479:8;55452:11;:23;55464:10;55452:23;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;55273:226;55145:354;55516:9;55511:152;55535:11;;55531:1;:15;55511:152;;;55648:3;55615:5;:24;55621:14;:17;55636:1;55621:17;;;;;;;;;;;;;;;;;;;;;55615:24;;;;;;;;;;;;;;;:30;;;55603:9;:42;;;;:::i;:::-;:48;;;;:::i;:::-;55567:5;:24;55573:14;:17;55588:1;55573:17;;;;;;;;;;;;;;;;;;;;;55567:24;;;;;;;;;;;;;;;:32;;;:84;;;;;;;:::i;:::-;;;;;;;;55548:3;;;;;:::i;:::-;;;;55511:152;;;;53396:2274:::0;;:::o;48255:44::-;48296:3;48255:44;:::o;44719:87::-;44765:7;44792:6;;;;;;;;;;;44785:13;;44719:87;:::o;20973:104::-;21029:13;21062:7;21055:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20973:104;:::o;48711:52::-;48761:2;48711:52;:::o;22656:295::-;22771:12;:10;:12::i;:::-;22759:24;;:8;:24;;;;22751:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22871:8;22826:18;:32;22845:12;:10;:12::i;:::-;22826:32;;;;;;;;;;;;;;;:42;22859:8;22826:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22924:8;22895:48;;22910:12;:10;:12::i;:::-;22895:48;;;22934:8;22895:48;;;;;;:::i;:::-;;;;;;;;22656:295;;:::o;49204:27::-;;;;;;;;;;;;;:::o;48891:51::-;48933:9;48891:51;:::o;56258:132::-;56331:7;56357:5;:17;56363:10;56357:17;;;;;;;;;;;;;;;:25;;;56350:32;;56258:132;;;:::o;23919:328::-;24094:41;24113:12;:10;:12::i;:::-;24127:7;24094:18;:41::i;:::-;24086:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24200:39;24214:4;24220:2;24224:7;24233:5;24200:13;:39::i;:::-;23919:328;;;;:::o;52777:124::-;44950:12;:10;:12::i;:::-;44939:23;;:7;:5;:7::i;:::-;:23;;;44931:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52873:20:::1;52858:12;;:35;;;;;;;;;;;;;;;;;;52777:124:::0;:::o;50998:1244::-;44950:12;:10;:12::i;:::-;44939:23;;:7;:5;:7::i;:::-;:23;;;44931:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51109:1:::1;51095:10;:15;:34;;;;51128:1;51114:10;:15;51095:34;:53;;;;51147:1;51133:10;:15;51095:53;51087:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;51250:1;51236:10;:15;51232:408;;;51320:1;48244:4;51301:20;;;;:::i;:::-;51290:8;51275:12;;:23;;;;:::i;:::-;:46;51267:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;51232:408;;;51396:1;51382:10;:15;51378:262;;;51464:1;48349:3;51446:19;;;;:::i;:::-;51435:8;51421:11;;:22;;;;:::i;:::-;:44;51413:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;51378:262;;;51588:1;48402:2;51570:19;;;;:::i;:::-;51559:8;51545:11;;:22;;;;:::i;:::-;:44;51537:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;51378:262;51232:408;51655:9;51650:221;51674:8;51670:1;:12;51650:221;;;51704:48;51714:10;51726:25;:15;:23;:25::i;:::-;51704:9;:48::i;:::-;51807:10;51767;:37;51778:25;:15;:23;:25::i;:::-;51767:37;;;;;;;;;;;:50;;;;51832:27;:15;:25;:27::i;:::-;51684:3;;;;;:::i;:::-;;;;51650:221;;;;51899:1;51885:10;:15;51881:354;;;51932:8;51916:12;;:24;;;;;;;:::i;:::-;;;;;;;;51983:8;51955:12;:24;51968:10;51955:24;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;51881:354;;;52027:1;52013:10;:15;52009:226;;;52059:8;52044:11;;:23;;;;;;;:::i;:::-;;;;;;;;52109:8;52082:11;:23;52094:10;52082:23;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;52009:226;;;52165:8;52150:11;;:23;;;;;;;:::i;:::-;;;;;;;;52215:8;52188:11;:23;52200:10;52188:23;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;52009:226;51881:354;50998:1244:::0;;:::o;48413:54::-;48465:2;48413:54;:::o;48653:51::-;48703:1;48653:51;:::o;48989:30::-;;;;:::o;57151:641::-;57242:13;57276:16;57284:7;57276;:16::i;:::-;57268:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57354:21;57378:10;:8;:10::i;:::-;57354:34;;57399:23;57425:10;:19;57436:7;57425:19;;;;;;;;;;;;57399:45;;57478:1;57459:15;:20;57455:330;;;57526:7;57509:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;57495:63;;;;;;57455:330;57599:1;57580:15;:20;57576:209;;;57647:7;57630:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;57616:62;;;;;;57576:209;57742:7;57725:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;57711:62;;;;57151:641;;;;:::o;48533:52::-;48584:1;48533:52;:::o;48832:::-;48874:10;48832:52;:::o;52913:471::-;52980:7;53007:17;53015:8;53007:7;:17::i;:::-;52999:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53086:23;53112:10;:20;53123:8;53112:20;;;;;;;;;;;;53086:46;;53166:1;53147:15;:20;53143:234;;;48645:1;53183:31;;;;;53143:234;53255:1;53236:15;:20;53232:145;;;48703:1;53272:30;;;;;53232:145;48761:2;53335:30;;;52913:471;;;;:::o;23022:164::-;23119:4;23143:18;:25;23162:5;23143:25;;;;;;;;;;;;;;;:35;23169:8;23143:35;;;;;;;;;;;;;;;;;;;;;;;;;23136:42;;23022:164;;;;:::o;45619:192::-;44950:12;:10;:12::i;:::-;44939:23;;:7;:5;:7::i;:::-;:23;;;44931:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45728:1:::1;45708:22;;:8;:22;;;;45700:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45784:19;45794:8;45784:9;:19::i;:::-;45619:192:::0;:::o;47451:127::-;47558:1;47540:7;:14;;;:19;;;;;;;;;;;47451:127;:::o;33676:224::-;33778:4;33817:35;33802:50;;;:11;:50;;;;:90;;;;33856:36;33880:11;33856:23;:36::i;:::-;33802:90;33795:97;;33676:224;;;:::o;25757:127::-;25822:4;25874:1;25846:30;;:7;:16;25854:7;25846:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25839:37;;25757:127;;;:::o;15565:98::-;15618:7;15645:10;15638:17;;15565:98;:::o;29739:174::-;29841:2;29814:15;:24;29830:7;29814:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29897:7;29893:2;29859:46;;29868:23;29883:7;29868:14;:23::i;:::-;29859:46;;;;;;;;;;;;29739:174;;:::o;26051:348::-;26144:4;26169:16;26177:7;26169;:16::i;:::-;26161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26245:13;26261:23;26276:7;26261:14;:23::i;:::-;26245:39;;26314:5;26303:16;;:7;:16;;;:51;;;;26347:7;26323:31;;:20;26335:7;26323:11;:20::i;:::-;:31;;;26303:51;:87;;;;26358:32;26375:5;26382:7;26358:16;:32::i;:::-;26303:87;26295:96;;;26051:348;;;;:::o;29043:578::-;29202:4;29175:31;;:23;29190:7;29175:14;:23::i;:::-;:31;;;29167:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29285:1;29271:16;;:2;:16;;;;29263:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29341:39;29362:4;29368:2;29372:7;29341:20;:39::i;:::-;29445:29;29462:1;29466:7;29445:8;:29::i;:::-;29506:1;29487:9;:15;29497:4;29487:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29535:1;29518:9;:13;29528:2;29518:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29566:2;29547:7;:16;29555:7;29547:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29605:7;29601:2;29586:27;;29595:4;29586:27;;;;;;;;;;;;29043:578;;;:::o;43680:120::-;43224:8;:6;:8::i;:::-;43216:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;43749:5:::1;43739:7;;:15;;;;;;;;;;;;;;;;;;43770:22;43779:12;:10;:12::i;:::-;43770:22;;;;;;:::i;:::-;;;;;;;;43680:120::o:0;56869:115::-;56956:20;56968:7;56956:11;:20::i;:::-;56869:115;:::o;45819:173::-;45875:16;45894:6;;;;;;;;;;;45875:25;;45920:8;45911:6;;:17;;;;;;;;;;;;;;;;;;45975:8;45944:40;;45965:8;45944:40;;;;;;;;;;;;45864:128;45819:173;:::o;43421:118::-;42947:8;:6;:8::i;:::-;42946:9;42938:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43491:4:::1;43481:7;;:14;;;;;;;;;;;;;;;;;;43511:20;43518:12;:10;:12::i;:::-;43511:20;;;;;;:::i;:::-;;;;;;;;43421:118::o:0;47329:114::-;47394:7;47421;:14;;;47414:21;;47329:114;;;:::o;26741:110::-;26817:26;26827:2;26831:7;26817:26;;;;;;;;;;;;:9;:26::i;:::-;26741:110;;:::o;25129:315::-;25286:28;25296:4;25302:2;25306:7;25286:9;:28::i;:::-;25333:48;25356:4;25362:2;25366:7;25375:5;25333:22;:48::i;:::-;25325:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25129:315;;;;:::o;56992:149::-;57044:13;57070:63;;;;;;;;;;;;;;;;;;;56992:149;:::o;19859:305::-;19961:4;20013:25;19998:40;;;:11;:40;;;;:105;;;;20070:33;20055:48;;;:11;:48;;;;19998:105;:158;;;;20120:36;20144:11;20120:23;:36::i;:::-;19998:158;19978:178;;19859:305;;;:::o;56398:227::-;42947:8;:6;:8::i;:::-;42946:9;42938:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56572:45:::1;56599:4;56605:2;56609:7;56572:26;:45::i;:::-;56398:227:::0;;;:::o;41423:206::-;41492:20;41504:7;41492:11;:20::i;:::-;41566:1;41535:10;:19;41546:7;41535:19;;;;;;;;;;;41529:33;;;;;:::i;:::-;;;:38;41525:97;;41591:10;:19;41602:7;41591:19;;;;;;;;;;;;41584:26;;;;:::i;:::-;41525:97;41423:206;:::o;27078:321::-;27208:18;27214:2;27218:7;27208:5;:18::i;:::-;27259:54;27290:1;27294:2;27298:7;27307:5;27259:22;:54::i;:::-;27237:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27078:321;;;:::o;30478:799::-;30633:4;30654:15;:2;:13;;;:15::i;:::-;30650:620;;;30706:2;30690:36;;;30727:12;:10;:12::i;:::-;30741:4;30747:7;30756:5;30690:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30686:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30949:1;30932:6;:13;:18;30928:272;;;30975:60;;;;;;;;;;:::i;:::-;;;;;;;;30928:272;31150:6;31144:13;31135:6;31131:2;31127:15;31120:38;30686:529;30823:41;;;30813:51;;;:6;:51;;;;30806:58;;;;;30650:620;31254:4;31247:11;;30478:799;;;;;;;:::o;18466:157::-;18551:4;18590:25;18575:40;;;:11;:40;;;;18568:47;;18466:157;;;:::o;35352:589::-;35496:45;35523:4;35529:2;35533:7;35496:26;:45::i;:::-;35574:1;35558:18;;:4;:18;;;35554:187;;;35593:40;35625:7;35593:31;:40::i;:::-;35554:187;;;35663:2;35655:10;;:4;:10;;;35651:90;;35682:47;35715:4;35721:7;35682:32;:47::i;:::-;35651:90;35554:187;35769:1;35755:16;;:2;:16;;;35751:183;;;35788:45;35825:7;35788:36;:45::i;:::-;35751:183;;;35861:4;35855:10;;:2;:10;;;35851:83;;35882:40;35910:2;35914:7;35882:27;:40::i;:::-;35851:83;35751:183;35352:589;;;:::o;28346:360::-;28406:13;28422:23;28437:7;28422:14;:23::i;:::-;28406:39;;28458:48;28479:5;28494:1;28498:7;28458:20;:48::i;:::-;28547:29;28564:1;28568:7;28547:8;:29::i;:::-;28609:1;28589:9;:16;28599:5;28589:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28628:7;:16;28636:7;28628:16;;;;;;;;;;;;28621:23;;;;;;;;;;;28690:7;28686:1;28662:36;;28671:5;28662:36;;;;;;;;;;;;28395:311;28346:360;:::o;27735:382::-;27829:1;27815:16;;:2;:16;;;;27807:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27888:16;27896:7;27888;:16::i;:::-;27887:17;27879:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27950:45;27979:1;27983:2;27987:7;27950:20;:45::i;:::-;28025:1;28008:9;:13;28018:2;28008:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28056:2;28037:7;:16;28045:7;28037:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28101:7;28097:2;28076:33;;28093:1;28076:33;;;;;;;;;;;;27735:382;;:::o;7692:387::-;7752:4;7960:12;8027:7;8015:20;8007:28;;8070:1;8063:4;:8;8056:15;;;7692:387;;;:::o;31849:126::-;;;;:::o;36664:164::-;36768:10;:17;;;;36741:15;:24;36757:7;36741:24;;;;;;;;;;;:44;;;;36796:10;36812:7;36796:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36664:164;:::o;37455:988::-;37721:22;37771:1;37746:22;37763:4;37746:16;:22::i;:::-;:26;;;;:::i;:::-;37721:51;;37783:18;37804:17;:26;37822:7;37804:26;;;;;;;;;;;;37783:47;;37951:14;37937:10;:28;37933:328;;37982:19;38004:12;:18;38017:4;38004:18;;;;;;;;;;;;;;;:34;38023:14;38004:34;;;;;;;;;;;;37982:56;;38088:11;38055:12;:18;38068:4;38055:18;;;;;;;;;;;;;;;:30;38074:10;38055:30;;;;;;;;;;;:44;;;;38205:10;38172:17;:30;38190:11;38172:30;;;;;;;;;;;:43;;;;37967:294;37933:328;38357:17;:26;38375:7;38357:26;;;;;;;;;;;38350:33;;;38401:12;:18;38414:4;38401:18;;;;;;;;;;;;;;;:34;38420:14;38401:34;;;;;;;;;;;38394:41;;;37536:907;;37455:988;;:::o;38738:1079::-;38991:22;39036:1;39016:10;:17;;;;:21;;;;:::i;:::-;38991:46;;39048:18;39069:15;:24;39085:7;39069:24;;;;;;;;;;;;39048:45;;39420:19;39442:10;39453:14;39442:26;;;;;;;;:::i;:::-;;;;;;;;;;39420:48;;39506:11;39481:10;39492;39481:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39617:10;39586:15;:28;39602:11;39586:28;;;;;;;;;;;:41;;;;39758:15;:24;39774:7;39758:24;;;;;;;;;;;39751:31;;;39793:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38809:1008;;;38738:1079;:::o;36242:221::-;36327:14;36344:20;36361:2;36344:16;:20::i;:::-;36327:37;;36402:7;36375:12;:16;36388:2;36375:16;;;;;;;;;;;;;;;:24;36392:6;36375:24;;;;;;;;;;;:34;;;;36449:6;36420:17;:26;36438:7;36420:26;;;;;;;;;;;:35;;;;36316:147;36242:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:104::-;5960:7;5989:24;6007:5;5989:24;:::i;:::-;5978:35;;5915:104;;;:::o;6025:138::-;6106:32;6132:5;6106:32;:::i;:::-;6099:5;6096:43;6086:71;;6153:1;6150;6143:12;6086:71;6025:138;:::o;6169:155::-;6223:5;6261:6;6248:20;6239:29;;6277:41;6312:5;6277:41;:::i;:::-;6169:155;;;;:::o;6330:345::-;6397:6;6446:2;6434:9;6425:7;6421:23;6417:32;6414:119;;;6452:79;;:::i;:::-;6414:119;6572:1;6597:61;6650:7;6641:6;6630:9;6626:22;6597:61;:::i;:::-;6587:71;;6543:125;6330:345;;;;:::o;6681:329::-;6740:6;6789:2;6777:9;6768:7;6764:23;6760:32;6757:119;;;6795:79;;:::i;:::-;6757:119;6915:1;6940:53;6985:7;6976:6;6965:9;6961:22;6940:53;:::i;:::-;6930:63;;6886:117;6681:329;;;;:::o;7016:474::-;7084:6;7092;7141:2;7129:9;7120:7;7116:23;7112:32;7109:119;;;7147:79;;:::i;:::-;7109:119;7267:1;7292:53;7337:7;7328:6;7317:9;7313:22;7292:53;:::i;:::-;7282:63;;7238:117;7394:2;7420:53;7465:7;7456:6;7445:9;7441:22;7420:53;:::i;:::-;7410:63;;7365:118;7016:474;;;;;:::o;7496:116::-;7566:21;7581:5;7566:21;:::i;:::-;7559:5;7556:32;7546:60;;7602:1;7599;7592:12;7546:60;7496:116;:::o;7618:133::-;7661:5;7699:6;7686:20;7677:29;;7715:30;7739:5;7715:30;:::i;:::-;7618:133;;;;:::o;7757:468::-;7822:6;7830;7879:2;7867:9;7858:7;7854:23;7850:32;7847:119;;;7885:79;;:::i;:::-;7847:119;8005:1;8030:53;8075:7;8066:6;8055:9;8051:22;8030:53;:::i;:::-;8020:63;;7976:117;8132:2;8158:50;8200:7;8191:6;8180:9;8176:22;8158:50;:::i;:::-;8148:60;;8103:115;7757:468;;;;;:::o;8231:117::-;8340:1;8337;8330:12;8354:117;8463:1;8460;8453:12;8477:180;8525:77;8522:1;8515:88;8622:4;8619:1;8612:15;8646:4;8643:1;8636:15;8663:281;8746:27;8768:4;8746:27;:::i;:::-;8738:6;8734:40;8876:6;8864:10;8861:22;8840:18;8828:10;8825:34;8822:62;8819:88;;;8887:18;;:::i;:::-;8819:88;8927:10;8923:2;8916:22;8706:238;8663:281;;:::o;8950:129::-;8984:6;9011:20;;:::i;:::-;9001:30;;9040:33;9068:4;9060:6;9040:33;:::i;:::-;8950:129;;;:::o;9085:307::-;9146:4;9236:18;9228:6;9225:30;9222:56;;;9258:18;;:::i;:::-;9222:56;9296:29;9318:6;9296:29;:::i;:::-;9288:37;;9380:4;9374;9370:15;9362:23;;9085:307;;;:::o;9398:154::-;9482:6;9477:3;9472;9459:30;9544:1;9535:6;9530:3;9526:16;9519:27;9398:154;;;:::o;9558:410::-;9635:5;9660:65;9676:48;9717:6;9676:48;:::i;:::-;9660:65;:::i;:::-;9651:74;;9748:6;9741:5;9734:21;9786:4;9779:5;9775:16;9824:3;9815:6;9810:3;9806:16;9803:25;9800:112;;;9831:79;;:::i;:::-;9800:112;9921:41;9955:6;9950:3;9945;9921:41;:::i;:::-;9641:327;9558:410;;;;;:::o;9987:338::-;10042:5;10091:3;10084:4;10076:6;10072:17;10068:27;10058:122;;10099:79;;:::i;:::-;10058:122;10216:6;10203:20;10241:78;10315:3;10307:6;10300:4;10292:6;10288:17;10241:78;:::i;:::-;10232:87;;10048:277;9987:338;;;;:::o;10331:943::-;10426:6;10434;10442;10450;10499:3;10487:9;10478:7;10474:23;10470:33;10467:120;;;10506:79;;:::i;:::-;10467:120;10626:1;10651:53;10696:7;10687:6;10676:9;10672:22;10651:53;:::i;:::-;10641:63;;10597:117;10753:2;10779:53;10824:7;10815:6;10804:9;10800:22;10779:53;:::i;:::-;10769:63;;10724:118;10881:2;10907:53;10952:7;10943:6;10932:9;10928:22;10907:53;:::i;:::-;10897:63;;10852:118;11037:2;11026:9;11022:18;11009:32;11068:18;11060:6;11057:30;11054:117;;;11090:79;;:::i;:::-;11054:117;11195:62;11249:7;11240:6;11229:9;11225:22;11195:62;:::i;:::-;11185:72;;10980:287;10331:943;;;;;;;:::o;11280:474::-;11348:6;11356;11405:2;11393:9;11384:7;11380:23;11376:32;11373:119;;;11411:79;;:::i;:::-;11373:119;11531:1;11556:53;11601:7;11592:6;11581:9;11577:22;11556:53;:::i;:::-;11546:63;;11502:117;11658:2;11684:53;11729:7;11720:6;11709:9;11705:22;11684:53;:::i;:::-;11674:63;;11629:118;11280:474;;;;;:::o;11760:180::-;11808:77;11805:1;11798:88;11905:4;11902:1;11895:15;11929:4;11926:1;11919:15;11946:320;11990:6;12027:1;12021:4;12017:12;12007:22;;12074:1;12068:4;12064:12;12095:18;12085:81;;12151:4;12143:6;12139:17;12129:27;;12085:81;12213:2;12205:6;12202:14;12182:18;12179:38;12176:84;;;12232:18;;:::i;:::-;12176:84;11997:269;11946:320;;;:::o;12272:231::-;12412:34;12408:1;12400:6;12396:14;12389:58;12481:14;12476:2;12468:6;12464:15;12457:39;12272:231;:::o;12509:366::-;12651:3;12672:67;12736:2;12731:3;12672:67;:::i;:::-;12665:74;;12748:93;12837:3;12748:93;:::i;:::-;12866:2;12861:3;12857:12;12850:19;;12509:366;;;:::o;12881:419::-;13047:4;13085:2;13074:9;13070:18;13062:26;;13134:9;13128:4;13124:20;13120:1;13109:9;13105:17;13098:47;13162:131;13288:4;13162:131;:::i;:::-;13154:139;;12881:419;;;:::o;13306:220::-;13446:34;13442:1;13434:6;13430:14;13423:58;13515:3;13510:2;13502:6;13498:15;13491:28;13306:220;:::o;13532:366::-;13674:3;13695:67;13759:2;13754:3;13695:67;:::i;:::-;13688:74;;13771:93;13860:3;13771:93;:::i;:::-;13889:2;13884:3;13880:12;13873:19;;13532:366;;;:::o;13904:419::-;14070:4;14108:2;14097:9;14093:18;14085:26;;14157:9;14151:4;14147:20;14143:1;14132:9;14128:17;14121:47;14185:131;14311:4;14185:131;:::i;:::-;14177:139;;13904:419;;;:::o;14329:243::-;14469:34;14465:1;14457:6;14453:14;14446:58;14538:26;14533:2;14525:6;14521:15;14514:51;14329:243;:::o;14578:366::-;14720:3;14741:67;14805:2;14800:3;14741:67;:::i;:::-;14734:74;;14817:93;14906:3;14817:93;:::i;:::-;14935:2;14930:3;14926:12;14919:19;;14578:366;;;:::o;14950:419::-;15116:4;15154:2;15143:9;15139:18;15131:26;;15203:9;15197:4;15193:20;15189:1;15178:9;15174:17;15167:47;15231:131;15357:4;15231:131;:::i;:::-;15223:139;;14950:419;;;:::o;15375:242::-;15515:34;15511:1;15503:6;15499:14;15492:58;15584:25;15579:2;15571:6;15567:15;15560:50;15375:242;:::o;15623:366::-;15765:3;15786:67;15850:2;15845:3;15786:67;:::i;:::-;15779:74;;15862:93;15951:3;15862:93;:::i;:::-;15980:2;15975:3;15971:12;15964:19;;15623:366;;;:::o;15995:419::-;16161:4;16199:2;16188:9;16184:18;16176:26;;16248:9;16242:4;16238:20;16234:1;16223:9;16219:17;16212:47;16276:131;16402:4;16276:131;:::i;:::-;16268:139;;15995:419;;;:::o;16420:236::-;16560:34;16556:1;16548:6;16544:14;16537:58;16629:19;16624:2;16616:6;16612:15;16605:44;16420:236;:::o;16662:366::-;16804:3;16825:67;16889:2;16884:3;16825:67;:::i;:::-;16818:74;;16901:93;16990:3;16901:93;:::i;:::-;17019:2;17014:3;17010:12;17003:19;;16662:366;;;:::o;17034:419::-;17200:4;17238:2;17227:9;17223:18;17215:26;;17287:9;17281:4;17277:20;17273:1;17262:9;17258:17;17251:47;17315:131;17441:4;17315:131;:::i;:::-;17307:139;;17034:419;;;:::o;17459:230::-;17599:34;17595:1;17587:6;17583:14;17576:58;17668:13;17663:2;17655:6;17651:15;17644:38;17459:230;:::o;17695:366::-;17837:3;17858:67;17922:2;17917:3;17858:67;:::i;:::-;17851:74;;17934:93;18023:3;17934:93;:::i;:::-;18052:2;18047:3;18043:12;18036:19;;17695:366;;;:::o;18067:419::-;18233:4;18271:2;18260:9;18256:18;18248:26;;18320:9;18314:4;18310:20;18306:1;18295:9;18291:17;18284:47;18348:131;18474:4;18348:131;:::i;:::-;18340:139;;18067:419;;;:::o;18492:182::-;18632:34;18628:1;18620:6;18616:14;18609:58;18492:182;:::o;18680:366::-;18822:3;18843:67;18907:2;18902:3;18843:67;:::i;:::-;18836:74;;18919:93;19008:3;18919:93;:::i;:::-;19037:2;19032:3;19028:12;19021:19;;18680:366;;;:::o;19052:419::-;19218:4;19256:2;19245:9;19241:18;19233:26;;19305:9;19299:4;19295:20;19291:1;19280:9;19276:17;19269:47;19333:131;19459:4;19333:131;:::i;:::-;19325:139;;19052:419;;;:::o;19477:236::-;19617:34;19613:1;19605:6;19601:14;19594:58;19686:19;19681:2;19673:6;19669:15;19662:44;19477:236;:::o;19719:366::-;19861:3;19882:67;19946:2;19941:3;19882:67;:::i;:::-;19875:74;;19958:93;20047:3;19958:93;:::i;:::-;20076:2;20071:3;20067:12;20060:19;;19719:366;;;:::o;20091:419::-;20257:4;20295:2;20284:9;20280:18;20272:26;;20344:9;20338:4;20334:20;20330:1;20319:9;20315:17;20308:47;20372:131;20498:4;20372:131;:::i;:::-;20364:139;;20091:419;;;:::o;20516:231::-;20656:34;20652:1;20644:6;20640:14;20633:58;20725:14;20720:2;20712:6;20708:15;20701:39;20516:231;:::o;20753:366::-;20895:3;20916:67;20980:2;20975:3;20916:67;:::i;:::-;20909:74;;20992:93;21081:3;20992:93;:::i;:::-;21110:2;21105:3;21101:12;21094:19;;20753:366;;;:::o;21125:419::-;21291:4;21329:2;21318:9;21314:18;21306:26;;21378:9;21372:4;21368:20;21364:1;21353:9;21349:17;21342:47;21406:131;21532:4;21406:131;:::i;:::-;21398:139;;21125:419;;;:::o;21550:180::-;21598:77;21595:1;21588:88;21695:4;21692:1;21685:15;21719:4;21716:1;21709:15;21736:223;21876:34;21872:1;21864:6;21860:14;21853:58;21945:6;21940:2;21932:6;21928:15;21921:31;21736:223;:::o;21965:366::-;22107:3;22128:67;22192:2;22187:3;22128:67;:::i;:::-;22121:74;;22204:93;22293:3;22204:93;:::i;:::-;22322:2;22317:3;22313:12;22306:19;;21965:366;;;:::o;22337:419::-;22503:4;22541:2;22530:9;22526:18;22518:26;;22590:9;22584:4;22580:20;22576:1;22565:9;22561:17;22554:47;22618:131;22744:4;22618:131;:::i;:::-;22610:139;;22337:419;;;:::o;22762:228::-;22902:34;22898:1;22890:6;22886:14;22879:58;22971:11;22966:2;22958:6;22954:15;22947:36;22762:228;:::o;22996:366::-;23138:3;23159:67;23223:2;23218:3;23159:67;:::i;:::-;23152:74;;23235:93;23324:3;23235:93;:::i;:::-;23353:2;23348:3;23344:12;23337:19;;22996:366;;;:::o;23368:419::-;23534:4;23572:2;23561:9;23557:18;23549:26;;23621:9;23615:4;23611:20;23607:1;23596:9;23592:17;23585:47;23649:131;23775:4;23649:131;:::i;:::-;23641:139;;23368:419;;;:::o;23793:229::-;23933:34;23929:1;23921:6;23917:14;23910:58;24002:12;23997:2;23989:6;23985:15;23978:37;23793:229;:::o;24028:366::-;24170:3;24191:67;24255:2;24250:3;24191:67;:::i;:::-;24184:74;;24267:93;24356:3;24267:93;:::i;:::-;24385:2;24380:3;24376:12;24369:19;;24028:366;;;:::o;24400:419::-;24566:4;24604:2;24593:9;24589:18;24581:26;;24653:9;24647:4;24643:20;24639:1;24628:9;24624:17;24617:47;24681:131;24807:4;24681:131;:::i;:::-;24673:139;;24400:419;;;:::o;24825:166::-;24965:18;24961:1;24953:6;24949:14;24942:42;24825:166;:::o;24997:366::-;25139:3;25160:67;25224:2;25219:3;25160:67;:::i;:::-;25153:74;;25236:93;25325:3;25236:93;:::i;:::-;25354:2;25349:3;25345:12;25338:19;;24997:366;;;:::o;25369:419::-;25535:4;25573:2;25562:9;25558:18;25550:26;;25622:9;25616:4;25612:20;25608:1;25597:9;25593:17;25586:47;25650:131;25776:4;25650:131;:::i;:::-;25642:139;;25369:419;;;:::o;25794:293::-;25934:34;25930:1;25922:6;25918:14;25911:58;26003:34;25998:2;25990:6;25986:15;25979:59;26072:7;26067:2;26059:6;26055:15;26048:32;25794:293;:::o;26093:366::-;26235:3;26256:67;26320:2;26315:3;26256:67;:::i;:::-;26249:74;;26332:93;26421:3;26332:93;:::i;:::-;26450:2;26445:3;26441:12;26434:19;;26093:366;;;:::o;26465:419::-;26631:4;26669:2;26658:9;26654:18;26646:26;;26718:9;26712:4;26708:20;26704:1;26693:9;26689:17;26682:47;26746:131;26872:4;26746:131;:::i;:::-;26738:139;;26465:419;;;:::o;26890:180::-;26938:77;26935:1;26928:88;27035:4;27032:1;27025:15;27059:4;27056:1;27049:15;27076:348;27116:7;27139:20;27157:1;27139:20;:::i;:::-;27134:25;;27173:20;27191:1;27173:20;:::i;:::-;27168:25;;27361:1;27293:66;27289:74;27286:1;27283:81;27278:1;27271:9;27264:17;27260:105;27257:131;;;27368:18;;:::i;:::-;27257:131;27416:1;27413;27409:9;27398:20;;27076:348;;;;:::o;27430:180::-;27570:32;27566:1;27558:6;27554:14;27547:56;27430:180;:::o;27616:366::-;27758:3;27779:67;27843:2;27838:3;27779:67;:::i;:::-;27772:74;;27855:93;27944:3;27855:93;:::i;:::-;27973:2;27968:3;27964:12;27957:19;;27616:366;;;:::o;27988:419::-;28154:4;28192:2;28181:9;28177:18;28169:26;;28241:9;28235:4;28231:20;28227:1;28216:9;28212:17;28205:47;28269:131;28395:4;28269:131;:::i;:::-;28261:139;;27988:419;;;:::o;28413:191::-;28453:4;28473:20;28491:1;28473:20;:::i;:::-;28468:25;;28507:20;28525:1;28507:20;:::i;:::-;28502:25;;28546:1;28543;28540:8;28537:34;;;28551:18;;:::i;:::-;28537:34;28596:1;28593;28589:9;28581:17;;28413:191;;;;:::o;28610:305::-;28650:3;28669:20;28687:1;28669:20;:::i;:::-;28664:25;;28703:20;28721:1;28703:20;:::i;:::-;28698:25;;28857:1;28789:66;28785:74;28782:1;28779:81;28776:107;;;28863:18;;:::i;:::-;28776:107;28907:1;28904;28900:9;28893:16;;28610:305;;;;:::o;28921:226::-;29061:34;29057:1;29049:6;29045:14;29038:58;29130:9;29125:2;29117:6;29113:15;29106:34;28921:226;:::o;29153:366::-;29295:3;29316:67;29380:2;29375:3;29316:67;:::i;:::-;29309:74;;29392:93;29481:3;29392:93;:::i;:::-;29510:2;29505:3;29501:12;29494:19;;29153:366;;;:::o;29525:419::-;29691:4;29729:2;29718:9;29714:18;29706:26;;29778:9;29772:4;29768:20;29764:1;29753:9;29749:17;29742:47;29806:131;29932:4;29806:131;:::i;:::-;29798:139;;29525:419;;;:::o;29950:248::-;30090:34;30086:1;30078:6;30074:14;30067:58;30159:31;30154:2;30146:6;30142:15;30135:56;29950:248;:::o;30204:366::-;30346:3;30367:67;30431:2;30426:3;30367:67;:::i;:::-;30360:74;;30443:93;30532:3;30443:93;:::i;:::-;30561:2;30556:3;30552:12;30545:19;;30204:366;;;:::o;30576:419::-;30742:4;30780:2;30769:9;30765:18;30757:26;;30829:9;30823:4;30819:20;30815:1;30804:9;30800:17;30793:47;30857:131;30983:4;30857:131;:::i;:::-;30849:139;;30576:419;;;:::o;31001:225::-;31141:34;31137:1;31129:6;31125:14;31118:58;31210:8;31205:2;31197:6;31193:15;31186:33;31001:225;:::o;31232:366::-;31374:3;31395:67;31459:2;31454:3;31395:67;:::i;:::-;31388:74;;31471:93;31560:3;31471:93;:::i;:::-;31589:2;31584:3;31580:12;31573:19;;31232:366;;;:::o;31604:419::-;31770:4;31808:2;31797:9;31793:18;31785:26;;31857:9;31851:4;31847:20;31843:1;31832:9;31828:17;31821:47;31885:131;32011:4;31885:131;:::i;:::-;31877:139;;31604:419;;;:::o;32029:246::-;32169:34;32165:1;32157:6;32153:14;32146:58;32238:29;32233:2;32225:6;32221:15;32214:54;32029:246;:::o;32281:366::-;32423:3;32444:67;32508:2;32503:3;32444:67;:::i;:::-;32437:74;;32520:93;32609:3;32520:93;:::i;:::-;32638:2;32633:3;32629:12;32622:19;;32281:366;;;:::o;32653:419::-;32819:4;32857:2;32846:9;32842:18;32834:26;;32906:9;32900:4;32896:20;32892:1;32881:9;32877:17;32870:47;32934:131;33060:4;32934:131;:::i;:::-;32926:139;;32653:419;;;:::o;33078:225::-;33218:34;33214:1;33206:6;33202:14;33195:58;33287:8;33282:2;33274:6;33270:15;33263:33;33078:225;:::o;33309:366::-;33451:3;33472:67;33536:2;33531:3;33472:67;:::i;:::-;33465:74;;33548:93;33637:3;33548:93;:::i;:::-;33666:2;33661:3;33657:12;33650:19;;33309:366;;;:::o;33681:419::-;33847:4;33885:2;33874:9;33870:18;33862:26;;33934:9;33928:4;33924:20;33920:1;33909:9;33905:17;33898:47;33962:131;34088:4;33962:131;:::i;:::-;33954:139;;33681:419;;;:::o;34106:246::-;34246:34;34242:1;34234:6;34230:14;34223:58;34315:29;34310:2;34302:6;34298:15;34291:54;34106:246;:::o;34358:366::-;34500:3;34521:67;34585:2;34580:3;34521:67;:::i;:::-;34514:74;;34597:93;34686:3;34597:93;:::i;:::-;34715:2;34710:3;34706:12;34699:19;;34358:366;;;:::o;34730:419::-;34896:4;34934:2;34923:9;34919:18;34911:26;;34983:9;34977:4;34973:20;34969:1;34958:9;34954:17;34947:47;35011:131;35137:4;35011:131;:::i;:::-;35003:139;;34730:419;;;:::o;35155:233::-;35194:3;35217:24;35235:5;35217:24;:::i;:::-;35208:33;;35263:66;35256:5;35253:77;35250:103;;;35333:18;;:::i;:::-;35250:103;35380:1;35373:5;35369:13;35362:20;;35155:233;;;:::o;35394:180::-;35442:77;35439:1;35432:88;35539:4;35536:1;35529:15;35563:4;35560:1;35553:15;35580:185;35620:1;35637:20;35655:1;35637:20;:::i;:::-;35632:25;;35671:20;35689:1;35671:20;:::i;:::-;35666:25;;35710:1;35700:35;;35715:18;;:::i;:::-;35700:35;35757:1;35754;35750:9;35745:14;;35580:185;;;;:::o;35771:175::-;35911:27;35907:1;35899:6;35895:14;35888:51;35771:175;:::o;35952:366::-;36094:3;36115:67;36179:2;36174:3;36115:67;:::i;:::-;36108:74;;36191:93;36280:3;36191:93;:::i;:::-;36309:2;36304:3;36300:12;36293:19;;35952:366;;;:::o;36324:419::-;36490:4;36528:2;36517:9;36513:18;36505:26;;36577:9;36571:4;36567:20;36563:1;36552:9;36548:17;36541:47;36605:131;36731:4;36605:131;:::i;:::-;36597:139;;36324:419;;;:::o;36749:292::-;36889:34;36885:1;36877:6;36873:14;36866:58;36958:34;36953:2;36945:6;36941:15;36934:59;37027:6;37022:2;37014:6;37010:15;37003:31;36749:292;:::o;37047:366::-;37189:3;37210:67;37274:2;37269:3;37210:67;:::i;:::-;37203:74;;37286:93;37375:3;37286:93;:::i;:::-;37404:2;37399:3;37395:12;37388:19;;37047:366;;;:::o;37419:419::-;37585:4;37623:2;37612:9;37608:18;37600:26;;37672:9;37666:4;37662:20;37658:1;37647:9;37643:17;37636:47;37700:131;37826:4;37700:131;:::i;:::-;37692:139;;37419:419;;;:::o;37844:221::-;37984:34;37980:1;37972:6;37968:14;37961:58;38053:4;38048:2;38040:6;38036:15;38029:29;37844:221;:::o;38071:366::-;38213:3;38234:67;38298:2;38293:3;38234:67;:::i;:::-;38227:74;;38310:93;38399:3;38310:93;:::i;:::-;38428:2;38423:3;38419:12;38412:19;;38071:366;;;:::o;38443:419::-;38609:4;38647:2;38636:9;38632:18;38624:26;;38696:9;38690:4;38686:20;38682:1;38671:9;38667:17;38660:47;38724:131;38850:4;38724:131;:::i;:::-;38716:139;;38443:419;;;:::o;38868:233::-;39008:34;39004:1;38996:6;38992:14;38985:58;39077:16;39072:2;39064:6;39060:15;39053:41;38868:233;:::o;39107:366::-;39249:3;39270:67;39334:2;39329:3;39270:67;:::i;:::-;39263:74;;39346:93;39435:3;39346:93;:::i;:::-;39464:2;39459:3;39455:12;39448:19;;39107:366;;;:::o;39479:419::-;39645:4;39683:2;39672:9;39668:18;39660:26;;39732:9;39726:4;39722:20;39718:1;39707:9;39703:17;39696:47;39760:131;39886:4;39760:131;:::i;:::-;39752:139;;39479:419;;;:::o;39904:148::-;40006:11;40043:3;40028:18;;39904:148;;;;:::o;40058:377::-;40164:3;40192:39;40225:5;40192:39;:::i;:::-;40247:89;40329:6;40324:3;40247:89;:::i;:::-;40240:96;;40345:52;40390:6;40385:3;40378:4;40371:5;40367:16;40345:52;:::i;:::-;40422:6;40417:3;40413:16;40406:23;;40168:267;40058:377;;;;:::o;40441:169::-;40581:21;40577:1;40569:6;40565:14;40558:45;40441:169;:::o;40616:402::-;40776:3;40797:85;40879:2;40874:3;40797:85;:::i;:::-;40790:92;;40891:93;40980:3;40891:93;:::i;:::-;41009:2;41004:3;41000:12;40993:19;;40616:402;;;:::o;41024:541::-;41257:3;41279:95;41370:3;41361:6;41279:95;:::i;:::-;41272:102;;41391:148;41535:3;41391:148;:::i;:::-;41384:155;;41556:3;41549:10;;41024:541;;;;:::o;41571:168::-;41711:20;41707:1;41699:6;41695:14;41688:44;41571:168;:::o;41745:402::-;41905:3;41926:85;42008:2;42003:3;41926:85;:::i;:::-;41919:92;;42020:93;42109:3;42020:93;:::i;:::-;42138:2;42133:3;42129:12;42122:19;;41745:402;;;:::o;42153:541::-;42386:3;42408:95;42499:3;42490:6;42408:95;:::i;:::-;42401:102;;42520:148;42664:3;42520:148;:::i;:::-;42513:155;;42685:3;42678:10;;42153:541;;;;:::o;42700:168::-;42840:20;42836:1;42828:6;42824:14;42817:44;42700:168;:::o;42874:402::-;43034:3;43055:85;43137:2;43132:3;43055:85;:::i;:::-;43048:92;;43149:93;43238:3;43149:93;:::i;:::-;43267:2;43262:3;43258:12;43251:19;;42874:402;;;:::o;43282:541::-;43515:3;43537:95;43628:3;43619:6;43537:95;:::i;:::-;43530:102;;43649:148;43793:3;43649:148;:::i;:::-;43642:155;;43814:3;43807:10;;43282:541;;;;:::o;43829:225::-;43969:34;43965:1;43957:6;43953:14;43946:58;44038:8;44033:2;44025:6;44021:15;44014:33;43829:225;:::o;44060:366::-;44202:3;44223:67;44287:2;44282:3;44223:67;:::i;:::-;44216:74;;44299:93;44388:3;44299:93;:::i;:::-;44417:2;44412:3;44408:12;44401:19;;44060:366;;;:::o;44432:419::-;44598:4;44636:2;44625:9;44621:18;44613:26;;44685:9;44679:4;44675:20;44671:1;44660:9;44656:17;44649:47;44713:131;44839:4;44713:131;:::i;:::-;44705:139;;44432:419;;;:::o;44857:231::-;44997:34;44993:1;44985:6;44981:14;44974:58;45066:14;45061:2;45053:6;45049:15;45042:39;44857:231;:::o;45094:366::-;45236:3;45257:67;45321:2;45316:3;45257:67;:::i;:::-;45250:74;;45333:93;45422:3;45333:93;:::i;:::-;45451:2;45446:3;45442:12;45435:19;;45094:366;;;:::o;45466:419::-;45632:4;45670:2;45659:9;45655:18;45647:26;;45719:9;45713:4;45709:20;45705:1;45694:9;45690:17;45683:47;45747:131;45873:4;45747:131;:::i;:::-;45739:139;;45466:419;;;:::o;45891:228::-;46031:34;46027:1;46019:6;46015:14;46008:58;46100:11;46095:2;46087:6;46083:15;46076:36;45891:228;:::o;46125:366::-;46267:3;46288:67;46352:2;46347:3;46288:67;:::i;:::-;46281:74;;46364:93;46453:3;46364:93;:::i;:::-;46482:2;46477:3;46473:12;46466:19;;46125:366;;;:::o;46497:419::-;46663:4;46701:2;46690:9;46686:18;46678:26;;46750:9;46744:4;46740:20;46736:1;46725:9;46721:17;46714:47;46778:131;46904:4;46778:131;:::i;:::-;46770:139;;46497:419;;;:::o;46922:223::-;47062:34;47058:1;47050:6;47046:14;47039:58;47131:6;47126:2;47118:6;47114:15;47107:31;46922:223;:::o;47151:366::-;47293:3;47314:67;47378:2;47373:3;47314:67;:::i;:::-;47307:74;;47390:93;47479:3;47390:93;:::i;:::-;47508:2;47503:3;47499:12;47492:19;;47151:366;;;:::o;47523:419::-;47689:4;47727:2;47716:9;47712:18;47704:26;;47776:9;47770:4;47766:20;47762:1;47751:9;47747:17;47740:47;47804:131;47930:4;47804:131;:::i;:::-;47796:139;;47523:419;;;:::o;47948:170::-;48088:22;48084:1;48076:6;48072:14;48065:46;47948:170;:::o;48124:366::-;48266:3;48287:67;48351:2;48346:3;48287:67;:::i;:::-;48280:74;;48363:93;48452:3;48363:93;:::i;:::-;48481:2;48476:3;48472:12;48465:19;;48124:366;;;:::o;48496:419::-;48662:4;48700:2;48689:9;48685:18;48677:26;;48749:9;48743:4;48739:20;48735:1;48724:9;48720:17;48713:47;48777:131;48903:4;48777:131;:::i;:::-;48769:139;;48496:419;;;:::o;48921:237::-;49061:34;49057:1;49049:6;49045:14;49038:58;49130:20;49125:2;49117:6;49113:15;49106:45;48921:237;:::o;49164:366::-;49306:3;49327:67;49391:2;49386:3;49327:67;:::i;:::-;49320:74;;49403:93;49492:3;49403:93;:::i;:::-;49521:2;49516:3;49512:12;49505:19;;49164:366;;;:::o;49536:419::-;49702:4;49740:2;49729:9;49725:18;49717:26;;49789:9;49783:4;49779:20;49775:1;49764:9;49760:17;49753:47;49817:131;49943:4;49817:131;:::i;:::-;49809:139;;49536:419;;;:::o;49961:98::-;50012:6;50046:5;50040:12;50030:22;;49961:98;;;:::o;50065:168::-;50148:11;50182:6;50177:3;50170:19;50222:4;50217:3;50213:14;50198:29;;50065:168;;;;:::o;50239:360::-;50325:3;50353:38;50385:5;50353:38;:::i;:::-;50407:70;50470:6;50465:3;50407:70;:::i;:::-;50400:77;;50486:52;50531:6;50526:3;50519:4;50512:5;50508:16;50486:52;:::i;:::-;50563:29;50585:6;50563:29;:::i;:::-;50558:3;50554:39;50547:46;;50329:270;50239:360;;;;:::o;50605:640::-;50800:4;50838:3;50827:9;50823:19;50815:27;;50852:71;50920:1;50909:9;50905:17;50896:6;50852:71;:::i;:::-;50933:72;51001:2;50990:9;50986:18;50977:6;50933:72;:::i;:::-;51015;51083:2;51072:9;51068:18;51059:6;51015:72;:::i;:::-;51134:9;51128:4;51124:20;51119:2;51108:9;51104:18;51097:48;51162:76;51233:4;51224:6;51162:76;:::i;:::-;51154:84;;50605:640;;;;;;;:::o;51251:141::-;51307:5;51338:6;51332:13;51323:22;;51354:32;51380:5;51354:32;:::i;:::-;51251:141;;;;:::o;51398:349::-;51467:6;51516:2;51504:9;51495:7;51491:23;51487:32;51484:119;;;51522:79;;:::i;:::-;51484:119;51642:1;51667:63;51722:7;51713:6;51702:9;51698:22;51667:63;:::i;:::-;51657:73;;51613:127;51398:349;;;;:::o;51753:182::-;51893:34;51889:1;51881:6;51877:14;51870:58;51753:182;:::o;51941:366::-;52083:3;52104:67;52168:2;52163:3;52104:67;:::i;:::-;52097:74;;52180:93;52269:3;52180:93;:::i;:::-;52298:2;52293:3;52289:12;52282:19;;51941:366;;;:::o;52313:419::-;52479:4;52517:2;52506:9;52502:18;52494:26;;52566:9;52560:4;52556:20;52552:1;52541:9;52537:17;52530:47;52594:131;52720:4;52594:131;:::i;:::-;52586:139;;52313:419;;;:::o;52738:178::-;52878:30;52874:1;52866:6;52862:14;52855:54;52738:178;:::o;52922:366::-;53064:3;53085:67;53149:2;53144:3;53085:67;:::i;:::-;53078:74;;53161:93;53250:3;53161:93;:::i;:::-;53279:2;53274:3;53270:12;53263:19;;52922:366;;;:::o;53294:419::-;53460:4;53498:2;53487:9;53483:18;53475:26;;53547:9;53541:4;53537:20;53533:1;53522:9;53518:17;53511:47;53575:131;53701:4;53575:131;:::i;:::-;53567:139;;53294:419;;;:::o;53719:180::-;53767:77;53764:1;53757:88;53864:4;53861:1;53854:15;53888:4;53885:1;53878:15

Swarm Source

ipfs://550cd333707f2444a05dfc1705505959ddf63c477ad8051145aec7759f45924e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.