ETH Price: $3,213.71 (+1.61%)

Token

postcards from paradise (PFP)
 

Overview

Max Total Supply

676 PFP

Holders

586

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
danizord.eth
Balance
1 PFP
0xaa55b756cc30eebb2728fe5d43d334625e0a0b4c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PFP

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-04
*/

// SPDX-License-Identifier: Unlicense

/*                                                                                          
PPPPPPPPPPPPPPPPP   FFFFFFFFFFFFFFFFFFFFFFPPPPPPPPPPPPPPPPP                   
P::::::::::::::::P  F::::::::::::::::::::FP::::::::::::::::P                  
P::::::PPPPPP:::::P F::::::::::::::::::::FP::::::PPPPPP:::::P                 
PP:::::P     P:::::PFF::::::FFFFFFFFF::::FPP:::::P     P:::::P                
  P::::P     P:::::P  F:::::F       FFFFFF  P::::P     P:::::P   ssssssssss   
  P::::P     P:::::P  F:::::F               P::::P     P:::::P ss::::::::::s  
  P::::PPPPPP:::::P   F::::::FFFFFFFFFF     P::::PPPPPP:::::Pss:::::::::::::s 
  P:::::::::::::PP    F:::::::::::::::F     P:::::::::::::PP s::::::ssss:::::s
  P::::PPPPPPPPP      F:::::::::::::::F     P::::PPPPPPPPP    s:::::s  ssssss 
  P::::P              F::::::FFFFFFFFFF     P::::P              s::::::s      
  P::::P              F:::::F               P::::P                 s::::::s   
  P::::P              F:::::F               P::::P           ssssss   s:::::s 
PP::::::PP          FF:::::::FF           PP::::::PP         s:::::ssss::::::s
P::::::::P          F::::::::FF           P::::::::P         s::::::::::::::s 
P::::::::P          F::::::::FF           P::::::::P          s:::::::::::ss  
PPPPPPPPPP          FFFFFFFFFFF           PPPPPPPPPP           sssssssssss by dom
*/  

pragma solidity ^0.8.0;

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

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




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





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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







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

interface Wagmigotchi {
    function love(address) external view returns (uint256);
}

contract PFP is ERC721Enumerable, ReentrancyGuard, Ownable {
    Wagmigotchi wagmi = Wagmigotchi(address(0xeCB504D39723b0be0e3a9Aa33D646642D1051EE1));
    Wagmigotchi wagmiOne = Wagmigotchi(address(0x57268ec83C8983D6907553A36072f737Eab67475));

    bool enabled = false;

    string constant header = '<svg width="400" height="400" viewBox="50 50 300 300" fill="none" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="gradient-fill" x1="0" y1="0" x2="800" y2="0" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1f005c" /><stop offset="0.14285714285714285" stop-color="#5b0060" /><stop offset="0.2857142857142857" stop-color="#870160" /><stop offset="0.42857142857142855" stop-color="#ac255e" /><stop offset="0.5714285714285714" stop-color="#ca485c" /><stop offset="0.7142857142857142" stop-color="#e16b5c" /><stop offset="0.8571428571428571" stop-color="#f39060" /><stop offset="1" stop-color="#ffb56b" /></linearGradient></defs>';

    string constant footer = '<g transform="translate(160 150)"><path d="M2 37C5.33333 42.3333 16.9 52.2 36.5 49C56.1 45.8 64 39.6667 65.5 37" stroke="black" stroke-width="5"/><path d="M3 12C3.73491 7.77554 6.28504 -0.0397118 10.6063 2.49496C14.9276 5.02964 16.6693 9.88777 17 12" stroke="black" stroke-width="5"/><path d="M42 12C42.7349 7.77554 45.285 -0.0397118 49.6063 2.49496C53.9276 5.02964 55.6693 9.88777 56 12" stroke="black" stroke-width="5"/></g></svg>';

    string constant halo = '<g transform="translate(161 76)"><path d="M36.7717 25.35C17.0173 28.6787 5.35958 18.4151 2 12.8671C2 8.78797 8.4 0.928144 34 2.12204C59.6 3.31594 66 9.78289 66 12.8671C64.4882 15.6411 56.526 22.0212 36.7717 25.35Z" stroke="black" stroke-width="10"/><path d="M36.7717 25.35C17.0173 28.6787 5.35958 18.4151 2 12.8671C2 8.78797 8.4 0.928144 34 2.12204C59.6 3.31594 66 9.78289 66 12.8671C64.4882 15.6411 56.526 22.0212 36.7717 25.35Z" stroke="#FFE600" stroke-width="5"/></g>';
    
    mapping (uint256 => address) internal _mints;
    mapping (address => bool) internal _claims;
    mapping (address => uint256) internal _love;

    function toggle() public onlyOwner nonReentrant {
        enabled = !enabled;
    }
    
    function random(bytes memory input, uint256 range) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input))) % range;
    }

    function draw(string memory color, string memory ox, string memory oy, string memory r, string memory scale, string memory opacity, bool stroke) internal pure returns (string memory) {
        string[17] memory parts;
        if (!stroke) {
            parts[0] = '<g opacity="';
        } else {
            parts[0] = '<g stroke-width="5" stroke="black" opacity="';
        }
        parts[1] = opacity;
        parts[2] = '" fill="';
        parts[3] = color;
        parts[4] = '" transform="translate(';
        parts[5] = ox;
        parts[6] = ' ';
        parts[7] = oy;
        parts[8] = ') rotate(';
        parts[9] = r;
        parts[10] = ' 81.5 110) scale(';
        parts[11] = scale;
        parts[12] = ')"><path d="M52.2262 2.0318C20.6262 9.2318 5.39287 69.0318 1.72621 98.0318C-3.77379 133.365 0.726208 206.932 62.7262 218.532C140.226 233.032 162.726 112.032 162.726 63.0318C162.726 14.0318 91.7262 -6.9682 52.2262 2.0318Z"/></g>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7]));
        output = string(abi.encodePacked(output, parts[8], parts[9], parts[10], parts[11], parts[12]));
        return output;
    }

    function getLove(uint256 tokenId) public view returns (uint256) {
        address creator = _mints[tokenId];
        return _love[creator];
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        address creator = _mints[tokenId];

        string memory output;

        string[7] memory colors = [
            "#59B9FF",
            "#51FFD5",
            "#FFD159",
            "#FFA3A3",
            "#CA59FF",
            "#597EFF",
            "#FFDBDB"
        ];

        output = header;
        
        output = string(abi.encodePacked(output,
            '<rect width="400" height="400" fill="',
            colors[random(abi.encodePacked("BACKGROUND", creator), colors.length)],
            '" opacity="0.2" />'
        ));

        uint256 love = _love[creator];
        uint256 count = random(abi.encodePacked("BASECOUNT", creator), 3) + love;

        if (count >= 5) {
            count = 5;
        }
  
        for (uint256 i = 0; i < count; ++i) {
            string memory color = colors[random(abi.encodePacked("COLOR", creator, i), colors.length)];
            uint256 ox = uint256(random(abi.encodePacked("ox", creator, i), 80)) + 119 - 40;
            uint256 oy = uint256(random(abi.encodePacked("oy", creator, i), 80)) + 90 - 40;
            uint256 r = uint256(random(abi.encodePacked("r", creator, i), 360));
            string memory opacity = "0.3";
            string memory scale = string(abi.encodePacked(
                "0.", 
                toString(79 + random(abi.encodePacked("SCALE", creator, i), 20))
            ));
            if (i == count - 1) {
                ox = 119;
                oy = 90;
                r = uint256(random(abi.encodePacked("r", creator, i), 14));
                scale = "1";
                opacity = "1";
                if (love < 7) color = "clear";
            }
            bool stroke = i == count - 1;
            string memory ds = draw(color, toString(ox), toString(oy), maybeNegateString(r), scale, opacity, stroke);
            output = string(abi.encodePacked(output, ds));
        }

        if (love >= 14) {
            output = string(abi.encodePacked(output, halo));
        }

        output = string(abi.encodePacked(output, footer));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "pfp #', toString(tokenId), '", "description": "dear caretaker, thank u for a great time in ur world! miss u lots and hope to see u soon", "attributes": [{"trait_type": "LOVE", "value":', toString(love), '}], "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function mint() public nonReentrant {
        require(enabled || _msgSender() == owner(), "Not allowed");
        require(wagmi.love(_msgSender()) > 0, "Not enough love");
        require(_claims[_msgSender()] == false, "Already minted from this address");
        _mints[totalSupply()] = _msgSender();
        _claims[_msgSender()] = true;
        _love[_msgSender()] = wagmi.love(_msgSender());
        _safeMint(_msgSender(), totalSupply());
    }

    function mintForWagmiOne() public nonReentrant {
        require(enabled || _msgSender() == owner(), "Not allowed");
        require(wagmiOne.love(_msgSender()) > 0, "Not enough love");
        require(_claims[_msgSender()] == false, "Already minted from this address");
        _mints[totalSupply()] = _msgSender();
        _claims[_msgSender()] = true;
        _love[_msgSender()] = wagmiOne.love(_msgSender());
        _safeMint(_msgSender(), totalSupply());
    }

    function maybeNegateString(uint256 value) internal pure returns (string memory) {
        if (value % 2 == 0) {
            return string(abi.encodePacked('-', toString(value)));
        }
        return toString(value);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("postcards from paradise", "PFP") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLove","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintForWagmiOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":[],"name":"toggle","outputs":[],"stateMutability":"nonpayable","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"}]

608060405273ecb504d39723b0be0e3a9aa33d646642d1051ee1600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507357268ec83c8983d6907553a36072f737eab67475600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60146101000a81548160ff021916908315150217905550348015620000d657600080fd5b506040518060400160405280601781526020017f706f737463617264732066726f6d2070617261646973650000000000000000008152506040518060400160405280600381526020017f504650000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200015b92919062000273565b5080600190805190602001906200017492919062000273565b5050506001600a819055506200019f62000193620001a560201b60201c565b620001ad60201b60201c565b62000388565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002819062000323565b90600052602060002090601f016020900481019282620002a55760008555620002f1565b82601f10620002c057805160ff1916838001178555620002f1565b82800160010185558215620002f1579182015b82811115620002f0578251825591602001919060010190620002d3565b5b50905062000300919062000304565b5090565b5b808211156200031f57600081600090555060010162000305565b5090565b600060028204905060018216806200033c57607f821691505b6020821081141562000353576200035262000359565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615d1a80620003986000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80635db2f142116100c357806395d89b411161007c57806395d89b4114610378578063a22cb46514610396578063b88d4fde146103b2578063c87b56dd146103ce578063e985e9c5146103fe578063f2fde38b1461042e5761014d565b80635db2f142146102b65780636352211e146102e657806370a0823114610316578063715018a61461034657806377be0f68146103505780638da5cb5b1461035a5761014d565b806318160ddd1161011557806318160ddd146101f657806323b872dd146102145780632f745c591461023057806340a3d2461461026057806342842e0e1461026a5780634f6ccce7146102865761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d05780631249c58b146101ec575b600080fd5b61016c600480360381019061016791906139f1565b61044a565b60405161017991906144ab565b60405180910390f35b61018a6104c4565b60405161019791906144c6565b60405180910390f35b6101ba60048036038101906101b59190613a4b565b610556565b6040516101c79190614444565b60405180910390f35b6101ea60048036038101906101e591906139b1565b6105db565b005b6101f46106f3565b005b6101fe610b3f565b60405161020b9190614788565b60405180910390f35b61022e6004803603810190610229919061389b565b610b4c565b005b61024a600480360381019061024591906139b1565b610bac565b6040516102579190614788565b60405180910390f35b610268610c51565b005b610284600480360381019061027f919061389b565b610d4f565b005b6102a0600480360381019061029b9190613a4b565b610d6f565b6040516102ad9190614788565b60405180910390f35b6102d060048036038101906102cb9190613a4b565b610de0565b6040516102dd9190614788565b60405180910390f35b61030060048036038101906102fb9190613a4b565b610e61565b60405161030d9190614444565b60405180910390f35b610330600480360381019061032b919061382e565b610f13565b60405161033d9190614788565b60405180910390f35b61034e610fcb565b005b610358611053565b005b61036261149f565b60405161036f9190614444565b60405180910390f35b6103806114c9565b60405161038d91906144c6565b60405180910390f35b6103b060048036038101906103ab9190613971565b61155b565b005b6103cc60048036038101906103c791906138ee565b6116dc565b005b6103e860048036038101906103e39190613a4b565b61173e565b6040516103f591906144c6565b60405180910390f35b6104186004803603810190610413919061385b565b611e58565b60405161042591906144ab565b60405180910390f35b6104486004803603810190610443919061382e565b611eec565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104bd57506104bc82611fe4565b5b9050919050565b6060600080546104d390614a12565b80601f01602080910402602001604051908101604052809291908181526020018280546104ff90614a12565b801561054c5780601f106105215761010080835404028352916020019161054c565b820191906000526020600020905b81548152906001019060200180831161052f57829003601f168201915b5050505050905090565b6000610561826120c6565b6105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790614688565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105e682610e61565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e90614708565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610676612132565b73ffffffffffffffffffffffffffffffffffffffff1614806106a557506106a48161069f612132565b611e58565b5b6106e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106db906145e8565b60405180910390fd5b6106ee838361213a565b505050565b6002600a541415610739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073090614768565b60405180910390fd5b6002600a81905550600d60149054906101000a900460ff1680610795575061075f61149f565b73ffffffffffffffffffffffffffffffffffffffff1661077d612132565b73ffffffffffffffffffffffffffffffffffffffff16145b6107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb906146a8565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633684b4a661081c612132565b6040518263ffffffff1660e01b81526004016108389190614444565b60206040518083038186803b15801561085057600080fd5b505afa158015610864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108889190613a78565b116108c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bf90614548565b60405180910390fd5b60001515600f60006108d8612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095990614648565b60405180910390fd5b61096a612132565b600e6000610976610b3f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f60006109d0612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633684b4a6610a67612132565b6040518263ffffffff1660e01b8152600401610a839190614444565b60206040518083038186803b158015610a9b57600080fd5b505afa158015610aaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad39190613a78565b60106000610adf612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b35610b28612132565b610b30610b3f565b6121f3565b6001600a81905550565b6000600880549050905090565b610b5d610b57612132565b82612211565b610b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9390614728565b60405180910390fd5b610ba78383836122ef565b505050565b6000610bb783610f13565b8210610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef906144e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c59612132565b73ffffffffffffffffffffffffffffffffffffffff16610c7761149f565b73ffffffffffffffffffffffffffffffffffffffff1614610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc4906146c8565b60405180910390fd5b6002600a541415610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a90614768565b60405180910390fd5b6002600a81905550600d60149054906101000a900460ff1615600d60146101000a81548160ff0219169083151502179055506001600a81905550565b610d6a838383604051806020016040528060008152506116dc565b505050565b6000610d79610b3f565b8210610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190614748565b60405180910390fd5b60088281548110610dce57610dcd614bd9565b5b90600052602060002001549050919050565b600080600e600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0190614628565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614608565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fd3612132565b73ffffffffffffffffffffffffffffffffffffffff16610ff161149f565b73ffffffffffffffffffffffffffffffffffffffff1614611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906146c8565b60405180910390fd5b611051600061254b565b565b6002600a541415611099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109090614768565b60405180910390fd5b6002600a81905550600d60149054906101000a900460ff16806110f557506110bf61149f565b73ffffffffffffffffffffffffffffffffffffffff166110dd612132565b73ffffffffffffffffffffffffffffffffffffffff16145b611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b906146a8565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633684b4a661117c612132565b6040518263ffffffff1660e01b81526004016111989190614444565b60206040518083038186803b1580156111b057600080fd5b505afa1580156111c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e89190613a78565b11611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f90614548565b60405180910390fd5b60001515600f6000611238612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990614648565b60405180910390fd5b6112ca612132565b600e60006112d6610b3f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f6000611330612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633684b4a66113c7612132565b6040518263ffffffff1660e01b81526004016113e39190614444565b60206040518083038186803b1580156113fb57600080fd5b505afa15801561140f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114339190613a78565b6010600061143f612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611495611488612132565b611490610b3f565b6121f3565b6001600a81905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114d890614a12565b80601f016020809104026020016040519081016040528092919081815260200182805461150490614a12565b80156115515780601f1061152657610100808354040283529160200191611551565b820191906000526020600020905b81548152906001019060200180831161153457829003601f168201915b5050505050905090565b611563612132565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c8906145a8565b60405180910390fd5b80600560006115de612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168b612132565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d091906144ab565b60405180910390a35050565b6116ed6116e7612132565b83612211565b61172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390614728565b60405180910390fd5b61173884848484612611565b50505050565b60606000600e600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050606060006040518060e001604052806040518060400160405280600781526020017f233539423946460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233531464644350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646443135390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646413341330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234341353946460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233539374546460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f23464644424442000000000000000000000000000000000000000000000000008152508152509050604051806102c0016040528061028b8152602001615a5a61028b91399150818161196e8560405160200161195891906143e7565b604051602081830303815290604052600761266d565b6007811061197f5761197e614bd9565b5b60200201516040516020016119959291906141e8565b60405160208183030381529060405291506000601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081611a1786604051602001611a01919061430f565b604051602081830303815290604052600361266d565b611a219190614847565b905060058110611a3057600590505b60005b81811015611d5857600084611a6a8884604051602001611a549291906143b0565b604051602081830303815290604052600761266d565b60078110611a7b57611a7a614bd9565b5b60200201519050600060286077611ab48a86604051602001611a9e929190614357565b604051602081830303815290604052605061266d565b611abe9190614847565b611ac89190614928565b905060006028605a611afc8b87604051602001611ae692919061440d565b604051602081830303815290604052605061266d565b611b069190614847565b611b109190614928565b90506000611b418a86604051602001611b2a9291906142b6565b60405160208183030381529060405261016861266d565b905060006040518060400160405280600381526020017f302e33000000000000000000000000000000000000000000000000000000000081525090506000611bbf611bae8d89604051602001611b98929190614222565b604051602081830303815290604052601461266d565b604f611bba9190614847565b6126ac565b604051602001611bcf91906142ed565b6040516020818303038152906040529050600188611bed9190614928565b871415611cdd5760779450605a9350611c288c88604051602001611c129291906142b6565b604051602081830303815290604052600e61266d565b92506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525090506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525091506007891015611cdc576040518060400160405280600581526020017f636c65617200000000000000000000000000000000000000000000000000000081525095505b5b6000600189611cec9190614928565b881490506000611d1988611cff896126ac565b611d08896126ac565b611d118961280d565b878988612864565b90508c81604051602001611d2e9291906140fa565b6040516020818303038152906040529c50505050505050505080611d5190614a75565b9050611a33565b50600e8210611da157836040518061020001604052806101d681526020016158846101d69139604051602001611d8f9291906140fa565b60405160208183030381529060405293505b83604051806101e001604052806101b081526020016156a86101b09139604051602001611dcf9291906140fa565b60405160208183030381529060405293506000611e26611dee896126ac565b611df7856126ac565b611e0088612d24565b604051602001611e1293929190614259565b604051602081830303815290604052612d24565b905080604051602001611e399190614335565b6040516020818303038152906040529450849650505050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ef4612132565b73ffffffffffffffffffffffffffffffffffffffff16611f1261149f565b73ffffffffffffffffffffffffffffffffffffffff1614611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f906146c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf90614528565b60405180910390fd5b611fe18161254b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120af57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120bf57506120be82612ebc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166121ad83610e61565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61220d828260405180602001604052806000815250612f26565b5050565b600061221c826120c6565b61225b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612252906145c8565b60405180910390fd5b600061226683610e61565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122d557508373ffffffffffffffffffffffffffffffffffffffff166122bd84610556565b73ffffffffffffffffffffffffffffffffffffffff16145b806122e657506122e58185611e58565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661230f82610e61565b73ffffffffffffffffffffffffffffffffffffffff1614612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c906146e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90614588565b60405180910390fd5b6123e0838383612f81565b6123eb60008261213a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243b9190614928565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124929190614847565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61261c8484846122ef565b61262884848484613095565b612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90614508565b60405180910390fd5b50505050565b6000818360405160200161268191906140e3565b6040516020818303038152906040528051906020012060001c6126a49190614aec565b905092915050565b606060008214156126f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612808565b600082905060005b6000821461272657808061270f90614a75565b915050600a8261271f919061489d565b91506126fc565b60008167ffffffffffffffff81111561274257612741614c08565b5b6040519080825280601f01601f1916602001820160405280156127745781602001600182028036833780820191505090505b5090505b600085146128015760018261278d9190614928565b9150600a8561279c9190614aec565b60306127a89190614847565b60f81b8183815181106127be576127bd614bd9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127fa919061489d565b9450612778565b8093505050505b919050565b6060600060028361281e9190614aec565b14156128535761282d826126ac565b60405160200161283d919061438e565b604051602081830303815290604052905061285f565b61285c826126ac565b90505b919050565b606061286e613718565b826128ca576040518060400160405280600c81526020017f3c67206f7061636974793d220000000000000000000000000000000000000000815250816000601181106128bd576128bc614bd9565b5b6020020181905250612900565b6040518060600160405280602c8152602001615858602c9139816000601181106128f7576128f6614bd9565b5b60200201819052505b838160016011811061291557612914614bd9565b5b60200201819052506040518060400160405280600881526020017f222066696c6c3d220000000000000000000000000000000000000000000000008152508160026011811061296757612966614bd9565b5b6020020181905250888160036011811061298457612983614bd9565b5b60200201819052506040518060400160405280601781526020017f22207472616e73666f726d3d227472616e736c61746528000000000000000000815250816004601181106129d6576129d5614bd9565b5b602002018190525087816005601181106129f3576129f2614bd9565b5b60200201819052506040518060400160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525081600660118110612a4557612a44614bd9565b5b60200201819052508681600760118110612a6257612a61614bd9565b5b60200201819052506040518060400160405280600981526020017f2920726f7461746528000000000000000000000000000000000000000000000081525081600860118110612ab457612ab3614bd9565b5b60200201819052508581600960118110612ad157612ad0614bd9565b5b60200201819052506040518060400160405280601181526020017f2038312e352031313029207363616c652800000000000000000000000000000081525081600a60118110612b2357612b22614bd9565b5b60200201819052508481600b60118110612b4057612b3f614bd9565b5b602002018190525060405180610120016040528060e3815260200161558560e3913981600c60118110612b7657612b75614bd9565b5b6020020181905250600081600060118110612b9457612b93614bd9565b5b602002015182600160118110612bad57612bac614bd9565b5b602002015183600260118110612bc657612bc5614bd9565b5b602002015184600360118110612bdf57612bde614bd9565b5b602002015185600460118110612bf857612bf7614bd9565b5b602002015186600560118110612c1157612c10614bd9565b5b602002015187600660118110612c2a57612c29614bd9565b5b602002015188600760118110612c4357612c42614bd9565b5b6020020151604051602001612c5f989796959493929190614176565b60405160208183030381529060405290508082600860118110612c8557612c84614bd9565b5b602002015183600960118110612c9e57612c9d614bd9565b5b602002015184600a60118110612cb757612cb6614bd9565b5b602002015185600b60118110612cd057612ccf614bd9565b5b602002015186600c60118110612ce957612ce8614bd9565b5b6020020151604051602001612d039695949392919061411e565b60405160208183030381529060405290508092505050979650505050505050565b60606000825190506000811415612d4d5760405180602001604052806000815250915050612eb7565b60006003600283612d5e9190614847565b612d68919061489d565b6004612d7491906148ce565b90506000602082612d859190614847565b67ffffffffffffffff811115612d9e57612d9d614c08565b5b6040519080825280601f01601f191660200182016040528015612dd05781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615668604091399050600181016020830160005b86811015612e745760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612dfb565b506003860660018114612e8e5760028114612e9e57612ea9565b613d3d60f01b6002830352612ea9565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f30838361322c565b612f3d6000848484613095565b612f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7390614508565b60405180910390fd5b505050565b612f8c8383836133fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fcf57612fca816133ff565b61300e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461300d5761300c8382613448565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130515761304c816135b5565b613090565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461308f5761308e8282613686565b5b5b505050565b60006130b68473ffffffffffffffffffffffffffffffffffffffff16613705565b1561321f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130df612132565b8786866040518563ffffffff1660e01b8152600401613101949392919061445f565b602060405180830381600087803b15801561311b57600080fd5b505af192505050801561314c57506040513d601f19601f820116820180604052508101906131499190613a1e565b60015b6131cf573d806000811461317c576040519150601f19603f3d011682016040523d82523d6000602084013e613181565b606091505b506000815114156131c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131be90614508565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613224565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561329c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329390614668565b60405180910390fd5b6132a5816120c6565b156132e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132dc90614568565b60405180910390fd5b6132f160008383612f81565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133419190614847565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161345584610f13565b61345f9190614928565b9050600060076000848152602001908152602001600020549050818114613544576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135c99190614928565b90506000600960008481526020019081526020016000205490506000600883815481106135f9576135f8614bd9565b5b90600052602060002001549050806008838154811061361b5761361a614bd9565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061366a57613669614baa565b5b6001900381819060005260206000200160009055905550505050565b600061369183610f13565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816137285790505090565b600061375361374e846147c8565b6147a3565b90508281526020810184848401111561376f5761376e614c3c565b5b61377a8482856149d0565b509392505050565b60008135905061379181615528565b92915050565b6000813590506137a68161553f565b92915050565b6000813590506137bb81615556565b92915050565b6000815190506137d081615556565b92915050565b600082601f8301126137eb576137ea614c37565b5b81356137fb848260208601613740565b91505092915050565b6000813590506138138161556d565b92915050565b6000815190506138288161556d565b92915050565b60006020828403121561384457613843614c46565b5b600061385284828501613782565b91505092915050565b6000806040838503121561387257613871614c46565b5b600061388085828601613782565b925050602061389185828601613782565b9150509250929050565b6000806000606084860312156138b4576138b3614c46565b5b60006138c286828701613782565b93505060206138d386828701613782565b92505060406138e486828701613804565b9150509250925092565b6000806000806080858703121561390857613907614c46565b5b600061391687828801613782565b945050602061392787828801613782565b935050604061393887828801613804565b925050606085013567ffffffffffffffff81111561395957613958614c41565b5b613965878288016137d6565b91505092959194509250565b6000806040838503121561398857613987614c46565b5b600061399685828601613782565b92505060206139a785828601613797565b9150509250929050565b600080604083850312156139c8576139c7614c46565b5b60006139d685828601613782565b92505060206139e785828601613804565b9150509250929050565b600060208284031215613a0757613a06614c46565b5b6000613a15848285016137ac565b91505092915050565b600060208284031215613a3457613a33614c46565b5b6000613a42848285016137c1565b91505092915050565b600060208284031215613a6157613a60614c46565b5b6000613a6f84828501613804565b91505092915050565b600060208284031215613a8e57613a8d614c46565b5b6000613a9c84828501613819565b91505092915050565b613aae8161495c565b82525050565b613ac5613ac08261495c565b614abe565b82525050565b613ad48161496e565b82525050565b6000613ae5826147f9565b613aef818561480f565b9350613aff8185602086016149df565b613b0881614c4b565b840191505092915050565b6000613b1e826147f9565b613b288185614820565b9350613b388185602086016149df565b80840191505092915050565b6000613b4f82614804565b613b59818561482b565b9350613b698185602086016149df565b613b7281614c4b565b840191505092915050565b6000613b8882614804565b613b92818561483c565b9350613ba28185602086016149df565b80840191505092915050565b6000613bbb60058361483c565b9150613bc682614c69565b600582019050919050565b6000613bde602b8361482b565b9150613be982614c92565b604082019050919050565b6000613c0160328361482b565b9150613c0c82614ce1565b604082019050919050565b6000613c2460268361482b565b9150613c2f82614d30565b604082019050919050565b6000613c47600f8361482b565b9150613c5282614d7f565b602082019050919050565b6000613c6a601c8361482b565b9150613c7582614da8565b602082019050919050565b6000613c8d600f8361483c565b9150613c9882614dd1565b600f82019050919050565b6000613cb060018361483c565b9150613cbb82614dfa565b600182019050919050565b6000613cd360028361483c565b9150613cde82614e23565b600282019050919050565b6000613cf660248361482b565b9150613d0182614e4c565b604082019050919050565b6000613d1960198361482b565b9150613d2482614e9b565b602082019050919050565b6000613d3c602c8361482b565b9150613d4782614ec4565b604082019050919050565b6000613d5f60128361483c565b9150613d6a82614f13565b601282019050919050565b6000613d8260258361483c565b9150613d8d82614f3c565b602582019050919050565b6000613da560388361482b565b9150613db082614f8b565b604082019050919050565b6000613dc8602a8361482b565b9150613dd382614fda565b604082019050919050565b6000613deb60298361482b565b9150613df682615029565b604082019050919050565b6000613e0e60028361483c565b9150613e1982615078565b600282019050919050565b6000613e3160208361482b565b9150613e3c826150a1565b602082019050919050565b6000613e5460208361482b565b9150613e5f826150ca565b602082019050919050565b6000613e7760288361483c565b9150613e82826150f3565b602882019050919050565b6000613e9a609c8361483c565b9150613ea582615142565b609c82019050919050565b6000613ebd602c8361482b565b9150613ec882615203565b604082019050919050565b6000613ee0600b8361482b565b9150613eeb82615252565b602082019050919050565b6000613f0360208361482b565b9150613f0e8261527b565b602082019050919050565b6000613f2660298361482b565b9150613f31826152a4565b604082019050919050565b6000613f4960098361483c565b9150613f54826152f3565b600982019050919050565b6000613f6c60218361482b565b9150613f778261531c565b604082019050919050565b6000613f8f601d8361483c565b9150613f9a8261536b565b601d82019050919050565b6000613fb260318361482b565b9150613fbd82615394565b604082019050919050565b6000613fd560028361483c565b9150613fe0826153e3565b600282019050919050565b6000613ff8602c8361482b565b91506140038261540c565b604082019050919050565b600061401b60018361483c565b91506140268261545b565b600182019050919050565b600061403e60058361483c565b915061404982615484565b600582019050919050565b6000614061600a8361483c565b915061406c826154ad565b600a82019050919050565b600061408460028361483c565b915061408f826154d6565b600282019050919050565b60006140a7601f8361482b565b91506140b2826154ff565b602082019050919050565b6140c6816149c6565b82525050565b6140dd6140d8826149c6565b614ae2565b82525050565b60006140ef8284613b13565b915081905092915050565b60006141068285613b7d565b91506141128284613b7d565b91508190509392505050565b600061412a8289613b7d565b91506141368288613b7d565b91506141428287613b7d565b915061414e8286613b7d565b915061415a8285613b7d565b91506141668284613b7d565b9150819050979650505050505050565b6000614182828b613b7d565b915061418e828a613b7d565b915061419a8289613b7d565b91506141a68288613b7d565b91506141b28287613b7d565b91506141be8286613b7d565b91506141ca8285613b7d565b91506141d68284613b7d565b91508190509998505050505050505050565b60006141f48285613b7d565b91506141ff82613d75565b915061420b8284613b7d565b915061421682613d52565b91508190509392505050565b600061422d82613bae565b91506142398285613ab4565b60148201915061424982846140cc565b6020820191508190509392505050565b600061426482613c80565b91506142708286613b7d565b915061427b82613e8d565b91506142878285613b7d565b915061429282613e6a565b915061429e8284613b7d565b91506142a982613e01565b9150819050949350505050565b60006142c182613ca3565b91506142cd8285613ab4565b6014820191506142dd82846140cc565b6020820191508190509392505050565b60006142f882613cc6565b91506143048284613b7d565b915081905092915050565b600061431a82613f3c565b91506143268284613ab4565b60148201915081905092915050565b600061434082613f82565b915061434c8284613b7d565b915081905092915050565b600061436282613fc8565b915061436e8285613ab4565b60148201915061437e82846140cc565b6020820191508190509392505050565b60006143998261400e565b91506143a58284613b7d565b915081905092915050565b60006143bb82614031565b91506143c78285613ab4565b6014820191506143d782846140cc565b6020820191508190509392505050565b60006143f282614054565b91506143fe8284613ab4565b60148201915081905092915050565b600061441882614077565b91506144248285613ab4565b60148201915061443482846140cc565b6020820191508190509392505050565b60006020820190506144596000830184613aa5565b92915050565b60006080820190506144746000830187613aa5565b6144816020830186613aa5565b61448e60408301856140bd565b81810360608301526144a08184613ada565b905095945050505050565b60006020820190506144c06000830184613acb565b92915050565b600060208201905081810360008301526144e08184613b44565b905092915050565b6000602082019050818103600083015261450181613bd1565b9050919050565b6000602082019050818103600083015261452181613bf4565b9050919050565b6000602082019050818103600083015261454181613c17565b9050919050565b6000602082019050818103600083015261456181613c3a565b9050919050565b6000602082019050818103600083015261458181613c5d565b9050919050565b600060208201905081810360008301526145a181613ce9565b9050919050565b600060208201905081810360008301526145c181613d0c565b9050919050565b600060208201905081810360008301526145e181613d2f565b9050919050565b6000602082019050818103600083015261460181613d98565b9050919050565b6000602082019050818103600083015261462181613dbb565b9050919050565b6000602082019050818103600083015261464181613dde565b9050919050565b6000602082019050818103600083015261466181613e24565b9050919050565b6000602082019050818103600083015261468181613e47565b9050919050565b600060208201905081810360008301526146a181613eb0565b9050919050565b600060208201905081810360008301526146c181613ed3565b9050919050565b600060208201905081810360008301526146e181613ef6565b9050919050565b6000602082019050818103600083015261470181613f19565b9050919050565b6000602082019050818103600083015261472181613f5f565b9050919050565b6000602082019050818103600083015261474181613fa5565b9050919050565b6000602082019050818103600083015261476181613feb565b9050919050565b600060208201905081810360008301526147818161409a565b9050919050565b600060208201905061479d60008301846140bd565b92915050565b60006147ad6147be565b90506147b98282614a44565b919050565b6000604051905090565b600067ffffffffffffffff8211156147e3576147e2614c08565b5b6147ec82614c4b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614852826149c6565b915061485d836149c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561489257614891614b1d565b5b828201905092915050565b60006148a8826149c6565b91506148b3836149c6565b9250826148c3576148c2614b4c565b5b828204905092915050565b60006148d9826149c6565b91506148e4836149c6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561491d5761491c614b1d565b5b828202905092915050565b6000614933826149c6565b915061493e836149c6565b92508282101561495157614950614b1d565b5b828203905092915050565b6000614967826149a6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149fd5780820151818401526020810190506149e2565b83811115614a0c576000848401525b50505050565b60006002820490506001821680614a2a57607f821691505b60208210811415614a3e57614a3d614b7b565b5b50919050565b614a4d82614c4b565b810181811067ffffffffffffffff82111715614a6c57614a6b614c08565b5b80604052505050565b6000614a80826149c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ab357614ab2614b1d565b5b600182019050919050565b6000614ac982614ad0565b9050919050565b6000614adb82614c5c565b9050919050565b6000819050919050565b6000614af7826149c6565b9150614b02836149c6565b925082614b1257614b11614b4c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5343414c45000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206c6f76650000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f7b226e616d65223a202270667020230000000000000000000000000000000000600082015250565b7f7200000000000000000000000000000000000000000000000000000000000000600082015250565b7f302e000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f22206f7061636974793d22302e3222202f3e0000000000000000000000000000600082015250565b7f3c726563742077696474683d2234303022206865696768743d2234303022206660008201527f696c6c3d22000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f416c7265616479206d696e7465642066726f6d20746869732061646472657373600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60008201527f3b6261736536342c000000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a202264656172206361726574616b6560008201527f722c207468616e6b207520666f7220612067726561742074696d6520696e207560208201527f7220776f726c6421206d6973732075206c6f747320616e6420686f706520746f60408201527f20736565207520736f6f6e222c202261747472696275746573223a205b7b227460608201527f726169745f74797065223a20224c4f5645222c202276616c7565223a00000000608082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f42415345434f554e540000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6f78000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f2d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f434f4c4f52000000000000000000000000000000000000000000000000000000600082015250565b7f4241434b47524f554e4400000000000000000000000000000000000000000000600082015250565b7f6f79000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6155318161495c565b811461553c57600080fd5b50565b6155488161496e565b811461555357600080fd5b50565b61555f8161497a565b811461556a57600080fd5b50565b615576816149c6565b811461558157600080fd5b5056fe29223e3c7061746820643d224d35322e3232363220322e303331384332302e3632363220392e3233313820352e33393238372036392e3033313820312e37323632312039382e30333138432d332e3737333739203133332e33363520302e373236323038203230362e3933322036322e37323632203231382e353332433134302e323236203233332e303332203136322e373236203131322e303332203136322e3732362036332e30333138433136322e3732362031342e303331382039312e37323632202d362e393638322035322e3232363220322e303331385a222f3e3c2f673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c67207472616e73666f726d3d227472616e736c617465283136302031353029223e3c7061746820643d224d3220333743352e33333333332034322e333333332031362e392035322e322033362e352034394335362e312034352e382036342033392e363636372036352e3520333722207374726f6b653d22626c61636b22207374726f6b652d77696474683d2235222f3e3c7061746820643d224d3320313243332e373334393120372e373735353420362e3238353034202d302e303339373131382031302e3630363320322e34393439364331342e3932373620352e30323936342031362e3636393320392e383837373720313720313222207374726f6b653d22626c61636b22207374726f6b652d77696474683d2235222f3e3c7061746820643d224d34322031324334322e3733343920372e37373535342034352e323835202d302e303339373131382034392e3630363320322e34393439364335332e3932373620352e30323936342035352e3636393320392e383837373720353620313222207374726f6b653d22626c61636b22207374726f6b652d77696474683d2235222f3e3c2f673e3c2f7376673e3c67207374726f6b652d77696474683d223522207374726f6b653d22626c61636b22206f7061636974793d223c67207472616e73666f726d3d227472616e736c6174652831363120373629223e3c7061746820643d224d33362e373731372032352e33354331372e303137332032382e3637383720352e33353935382031382e3431353120322031322e38363731433220382e373837393720382e3420302e39323831343420333420322e31323230344335392e3620332e333135393420363620392e37383238392036362031322e383637314336342e343838322031352e363431312035362e3532362032322e303231322033362e373731372032352e33355a22207374726f6b653d22626c61636b22207374726f6b652d77696474683d223130222f3e3c7061746820643d224d33362e373731372032352e33354331372e303137332032382e3637383720352e33353935382031382e3431353120322031322e38363731433220382e373837393720382e3420302e39323831343420333420322e31323230344335392e3620332e333135393420363620392e37383238392036362031322e383637314336342e343838322031352e363431312035362e3532362032322e303231322033362e373731372032352e33355a22207374726f6b653d222346464536303022207374726f6b652d77696474683d2235222f3e3c2f673e3c7376672077696474683d2234303022206865696768743d22343030222076696577426f783d2235302035302033303020333030222066696c6c3d226e6f6e652220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c646566733e3c6c696e6561724772616469656e742069643d226772616469656e742d66696c6c222078313d2230222079313d2230222078323d22383030222079323d223022206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f70206f66667365743d2230222073746f702d636f6c6f723d222331663030356322202f3e3c73746f70206f66667365743d22302e3134323835373134323835373134323835222073746f702d636f6c6f723d222335623030363022202f3e3c73746f70206f66667365743d22302e32383537313432383537313432383537222073746f702d636f6c6f723d222338373031363022202f3e3c73746f70206f66667365743d22302e3432383537313432383537313432383535222073746f702d636f6c6f723d222361633235356522202f3e3c73746f70206f66667365743d22302e35373134323835373134323835373134222073746f702d636f6c6f723d222363613438356322202f3e3c73746f70206f66667365743d22302e37313432383537313432383537313432222073746f702d636f6c6f723d222365313662356322202f3e3c73746f70206f66667365743d22302e38353731343238353731343238353731222073746f702d636f6c6f723d222366333930363022202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d222366666235366222202f3e3c2f6c696e6561724772616469656e743e3c2f646566733ea26469706673582212207c054fec25a4a5f074f90659e94f17c62ba7b35992d25720dacf79001a286ec364736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80635db2f142116100c357806395d89b411161007c57806395d89b4114610378578063a22cb46514610396578063b88d4fde146103b2578063c87b56dd146103ce578063e985e9c5146103fe578063f2fde38b1461042e5761014d565b80635db2f142146102b65780636352211e146102e657806370a0823114610316578063715018a61461034657806377be0f68146103505780638da5cb5b1461035a5761014d565b806318160ddd1161011557806318160ddd146101f657806323b872dd146102145780632f745c591461023057806340a3d2461461026057806342842e0e1461026a5780634f6ccce7146102865761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d05780631249c58b146101ec575b600080fd5b61016c600480360381019061016791906139f1565b61044a565b60405161017991906144ab565b60405180910390f35b61018a6104c4565b60405161019791906144c6565b60405180910390f35b6101ba60048036038101906101b59190613a4b565b610556565b6040516101c79190614444565b60405180910390f35b6101ea60048036038101906101e591906139b1565b6105db565b005b6101f46106f3565b005b6101fe610b3f565b60405161020b9190614788565b60405180910390f35b61022e6004803603810190610229919061389b565b610b4c565b005b61024a600480360381019061024591906139b1565b610bac565b6040516102579190614788565b60405180910390f35b610268610c51565b005b610284600480360381019061027f919061389b565b610d4f565b005b6102a0600480360381019061029b9190613a4b565b610d6f565b6040516102ad9190614788565b60405180910390f35b6102d060048036038101906102cb9190613a4b565b610de0565b6040516102dd9190614788565b60405180910390f35b61030060048036038101906102fb9190613a4b565b610e61565b60405161030d9190614444565b60405180910390f35b610330600480360381019061032b919061382e565b610f13565b60405161033d9190614788565b60405180910390f35b61034e610fcb565b005b610358611053565b005b61036261149f565b60405161036f9190614444565b60405180910390f35b6103806114c9565b60405161038d91906144c6565b60405180910390f35b6103b060048036038101906103ab9190613971565b61155b565b005b6103cc60048036038101906103c791906138ee565b6116dc565b005b6103e860048036038101906103e39190613a4b565b61173e565b6040516103f591906144c6565b60405180910390f35b6104186004803603810190610413919061385b565b611e58565b60405161042591906144ab565b60405180910390f35b6104486004803603810190610443919061382e565b611eec565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104bd57506104bc82611fe4565b5b9050919050565b6060600080546104d390614a12565b80601f01602080910402602001604051908101604052809291908181526020018280546104ff90614a12565b801561054c5780601f106105215761010080835404028352916020019161054c565b820191906000526020600020905b81548152906001019060200180831161052f57829003601f168201915b5050505050905090565b6000610561826120c6565b6105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790614688565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105e682610e61565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e90614708565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610676612132565b73ffffffffffffffffffffffffffffffffffffffff1614806106a557506106a48161069f612132565b611e58565b5b6106e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106db906145e8565b60405180910390fd5b6106ee838361213a565b505050565b6002600a541415610739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073090614768565b60405180910390fd5b6002600a81905550600d60149054906101000a900460ff1680610795575061075f61149f565b73ffffffffffffffffffffffffffffffffffffffff1661077d612132565b73ffffffffffffffffffffffffffffffffffffffff16145b6107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb906146a8565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633684b4a661081c612132565b6040518263ffffffff1660e01b81526004016108389190614444565b60206040518083038186803b15801561085057600080fd5b505afa158015610864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108889190613a78565b116108c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bf90614548565b60405180910390fd5b60001515600f60006108d8612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095990614648565b60405180910390fd5b61096a612132565b600e6000610976610b3f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f60006109d0612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633684b4a6610a67612132565b6040518263ffffffff1660e01b8152600401610a839190614444565b60206040518083038186803b158015610a9b57600080fd5b505afa158015610aaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad39190613a78565b60106000610adf612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b35610b28612132565b610b30610b3f565b6121f3565b6001600a81905550565b6000600880549050905090565b610b5d610b57612132565b82612211565b610b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9390614728565b60405180910390fd5b610ba78383836122ef565b505050565b6000610bb783610f13565b8210610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef906144e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c59612132565b73ffffffffffffffffffffffffffffffffffffffff16610c7761149f565b73ffffffffffffffffffffffffffffffffffffffff1614610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc4906146c8565b60405180910390fd5b6002600a541415610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a90614768565b60405180910390fd5b6002600a81905550600d60149054906101000a900460ff1615600d60146101000a81548160ff0219169083151502179055506001600a81905550565b610d6a838383604051806020016040528060008152506116dc565b505050565b6000610d79610b3f565b8210610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190614748565b60405180910390fd5b60088281548110610dce57610dcd614bd9565b5b90600052602060002001549050919050565b600080600e600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0190614628565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614608565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fd3612132565b73ffffffffffffffffffffffffffffffffffffffff16610ff161149f565b73ffffffffffffffffffffffffffffffffffffffff1614611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906146c8565b60405180910390fd5b611051600061254b565b565b6002600a541415611099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109090614768565b60405180910390fd5b6002600a81905550600d60149054906101000a900460ff16806110f557506110bf61149f565b73ffffffffffffffffffffffffffffffffffffffff166110dd612132565b73ffffffffffffffffffffffffffffffffffffffff16145b611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b906146a8565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633684b4a661117c612132565b6040518263ffffffff1660e01b81526004016111989190614444565b60206040518083038186803b1580156111b057600080fd5b505afa1580156111c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e89190613a78565b11611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f90614548565b60405180910390fd5b60001515600f6000611238612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990614648565b60405180910390fd5b6112ca612132565b600e60006112d6610b3f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f6000611330612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633684b4a66113c7612132565b6040518263ffffffff1660e01b81526004016113e39190614444565b60206040518083038186803b1580156113fb57600080fd5b505afa15801561140f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114339190613a78565b6010600061143f612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611495611488612132565b611490610b3f565b6121f3565b6001600a81905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114d890614a12565b80601f016020809104026020016040519081016040528092919081815260200182805461150490614a12565b80156115515780601f1061152657610100808354040283529160200191611551565b820191906000526020600020905b81548152906001019060200180831161153457829003601f168201915b5050505050905090565b611563612132565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c8906145a8565b60405180910390fd5b80600560006115de612132565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168b612132565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d091906144ab565b60405180910390a35050565b6116ed6116e7612132565b83612211565b61172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390614728565b60405180910390fd5b61173884848484612611565b50505050565b60606000600e600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050606060006040518060e001604052806040518060400160405280600781526020017f233539423946460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233531464644350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646443135390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646413341330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234341353946460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233539374546460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f23464644424442000000000000000000000000000000000000000000000000008152508152509050604051806102c0016040528061028b8152602001615a5a61028b91399150818161196e8560405160200161195891906143e7565b604051602081830303815290604052600761266d565b6007811061197f5761197e614bd9565b5b60200201516040516020016119959291906141e8565b60405160208183030381529060405291506000601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081611a1786604051602001611a01919061430f565b604051602081830303815290604052600361266d565b611a219190614847565b905060058110611a3057600590505b60005b81811015611d5857600084611a6a8884604051602001611a549291906143b0565b604051602081830303815290604052600761266d565b60078110611a7b57611a7a614bd9565b5b60200201519050600060286077611ab48a86604051602001611a9e929190614357565b604051602081830303815290604052605061266d565b611abe9190614847565b611ac89190614928565b905060006028605a611afc8b87604051602001611ae692919061440d565b604051602081830303815290604052605061266d565b611b069190614847565b611b109190614928565b90506000611b418a86604051602001611b2a9291906142b6565b60405160208183030381529060405261016861266d565b905060006040518060400160405280600381526020017f302e33000000000000000000000000000000000000000000000000000000000081525090506000611bbf611bae8d89604051602001611b98929190614222565b604051602081830303815290604052601461266d565b604f611bba9190614847565b6126ac565b604051602001611bcf91906142ed565b6040516020818303038152906040529050600188611bed9190614928565b871415611cdd5760779450605a9350611c288c88604051602001611c129291906142b6565b604051602081830303815290604052600e61266d565b92506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525090506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525091506007891015611cdc576040518060400160405280600581526020017f636c65617200000000000000000000000000000000000000000000000000000081525095505b5b6000600189611cec9190614928565b881490506000611d1988611cff896126ac565b611d08896126ac565b611d118961280d565b878988612864565b90508c81604051602001611d2e9291906140fa565b6040516020818303038152906040529c50505050505050505080611d5190614a75565b9050611a33565b50600e8210611da157836040518061020001604052806101d681526020016158846101d69139604051602001611d8f9291906140fa565b60405160208183030381529060405293505b83604051806101e001604052806101b081526020016156a86101b09139604051602001611dcf9291906140fa565b60405160208183030381529060405293506000611e26611dee896126ac565b611df7856126ac565b611e0088612d24565b604051602001611e1293929190614259565b604051602081830303815290604052612d24565b905080604051602001611e399190614335565b6040516020818303038152906040529450849650505050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ef4612132565b73ffffffffffffffffffffffffffffffffffffffff16611f1261149f565b73ffffffffffffffffffffffffffffffffffffffff1614611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f906146c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf90614528565b60405180910390fd5b611fe18161254b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120af57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120bf57506120be82612ebc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166121ad83610e61565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61220d828260405180602001604052806000815250612f26565b5050565b600061221c826120c6565b61225b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612252906145c8565b60405180910390fd5b600061226683610e61565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122d557508373ffffffffffffffffffffffffffffffffffffffff166122bd84610556565b73ffffffffffffffffffffffffffffffffffffffff16145b806122e657506122e58185611e58565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661230f82610e61565b73ffffffffffffffffffffffffffffffffffffffff1614612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c906146e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90614588565b60405180910390fd5b6123e0838383612f81565b6123eb60008261213a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243b9190614928565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124929190614847565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61261c8484846122ef565b61262884848484613095565b612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90614508565b60405180910390fd5b50505050565b6000818360405160200161268191906140e3565b6040516020818303038152906040528051906020012060001c6126a49190614aec565b905092915050565b606060008214156126f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612808565b600082905060005b6000821461272657808061270f90614a75565b915050600a8261271f919061489d565b91506126fc565b60008167ffffffffffffffff81111561274257612741614c08565b5b6040519080825280601f01601f1916602001820160405280156127745781602001600182028036833780820191505090505b5090505b600085146128015760018261278d9190614928565b9150600a8561279c9190614aec565b60306127a89190614847565b60f81b8183815181106127be576127bd614bd9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127fa919061489d565b9450612778565b8093505050505b919050565b6060600060028361281e9190614aec565b14156128535761282d826126ac565b60405160200161283d919061438e565b604051602081830303815290604052905061285f565b61285c826126ac565b90505b919050565b606061286e613718565b826128ca576040518060400160405280600c81526020017f3c67206f7061636974793d220000000000000000000000000000000000000000815250816000601181106128bd576128bc614bd9565b5b6020020181905250612900565b6040518060600160405280602c8152602001615858602c9139816000601181106128f7576128f6614bd9565b5b60200201819052505b838160016011811061291557612914614bd9565b5b60200201819052506040518060400160405280600881526020017f222066696c6c3d220000000000000000000000000000000000000000000000008152508160026011811061296757612966614bd9565b5b6020020181905250888160036011811061298457612983614bd9565b5b60200201819052506040518060400160405280601781526020017f22207472616e73666f726d3d227472616e736c61746528000000000000000000815250816004601181106129d6576129d5614bd9565b5b602002018190525087816005601181106129f3576129f2614bd9565b5b60200201819052506040518060400160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525081600660118110612a4557612a44614bd9565b5b60200201819052508681600760118110612a6257612a61614bd9565b5b60200201819052506040518060400160405280600981526020017f2920726f7461746528000000000000000000000000000000000000000000000081525081600860118110612ab457612ab3614bd9565b5b60200201819052508581600960118110612ad157612ad0614bd9565b5b60200201819052506040518060400160405280601181526020017f2038312e352031313029207363616c652800000000000000000000000000000081525081600a60118110612b2357612b22614bd9565b5b60200201819052508481600b60118110612b4057612b3f614bd9565b5b602002018190525060405180610120016040528060e3815260200161558560e3913981600c60118110612b7657612b75614bd9565b5b6020020181905250600081600060118110612b9457612b93614bd9565b5b602002015182600160118110612bad57612bac614bd9565b5b602002015183600260118110612bc657612bc5614bd9565b5b602002015184600360118110612bdf57612bde614bd9565b5b602002015185600460118110612bf857612bf7614bd9565b5b602002015186600560118110612c1157612c10614bd9565b5b602002015187600660118110612c2a57612c29614bd9565b5b602002015188600760118110612c4357612c42614bd9565b5b6020020151604051602001612c5f989796959493929190614176565b60405160208183030381529060405290508082600860118110612c8557612c84614bd9565b5b602002015183600960118110612c9e57612c9d614bd9565b5b602002015184600a60118110612cb757612cb6614bd9565b5b602002015185600b60118110612cd057612ccf614bd9565b5b602002015186600c60118110612ce957612ce8614bd9565b5b6020020151604051602001612d039695949392919061411e565b60405160208183030381529060405290508092505050979650505050505050565b60606000825190506000811415612d4d5760405180602001604052806000815250915050612eb7565b60006003600283612d5e9190614847565b612d68919061489d565b6004612d7491906148ce565b90506000602082612d859190614847565b67ffffffffffffffff811115612d9e57612d9d614c08565b5b6040519080825280601f01601f191660200182016040528015612dd05781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615668604091399050600181016020830160005b86811015612e745760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612dfb565b506003860660018114612e8e5760028114612e9e57612ea9565b613d3d60f01b6002830352612ea9565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f30838361322c565b612f3d6000848484613095565b612f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7390614508565b60405180910390fd5b505050565b612f8c8383836133fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fcf57612fca816133ff565b61300e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461300d5761300c8382613448565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130515761304c816135b5565b613090565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461308f5761308e8282613686565b5b5b505050565b60006130b68473ffffffffffffffffffffffffffffffffffffffff16613705565b1561321f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130df612132565b8786866040518563ffffffff1660e01b8152600401613101949392919061445f565b602060405180830381600087803b15801561311b57600080fd5b505af192505050801561314c57506040513d601f19601f820116820180604052508101906131499190613a1e565b60015b6131cf573d806000811461317c576040519150601f19603f3d011682016040523d82523d6000602084013e613181565b606091505b506000815114156131c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131be90614508565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613224565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561329c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329390614668565b60405180910390fd5b6132a5816120c6565b156132e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132dc90614568565b60405180910390fd5b6132f160008383612f81565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133419190614847565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161345584610f13565b61345f9190614928565b9050600060076000848152602001908152602001600020549050818114613544576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135c99190614928565b90506000600960008481526020019081526020016000205490506000600883815481106135f9576135f8614bd9565b5b90600052602060002001549050806008838154811061361b5761361a614bd9565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061366a57613669614baa565b5b6001900381819060005260206000200160009055905550505050565b600061369183610f13565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816137285790505090565b600061375361374e846147c8565b6147a3565b90508281526020810184848401111561376f5761376e614c3c565b5b61377a8482856149d0565b509392505050565b60008135905061379181615528565b92915050565b6000813590506137a68161553f565b92915050565b6000813590506137bb81615556565b92915050565b6000815190506137d081615556565b92915050565b600082601f8301126137eb576137ea614c37565b5b81356137fb848260208601613740565b91505092915050565b6000813590506138138161556d565b92915050565b6000815190506138288161556d565b92915050565b60006020828403121561384457613843614c46565b5b600061385284828501613782565b91505092915050565b6000806040838503121561387257613871614c46565b5b600061388085828601613782565b925050602061389185828601613782565b9150509250929050565b6000806000606084860312156138b4576138b3614c46565b5b60006138c286828701613782565b93505060206138d386828701613782565b92505060406138e486828701613804565b9150509250925092565b6000806000806080858703121561390857613907614c46565b5b600061391687828801613782565b945050602061392787828801613782565b935050604061393887828801613804565b925050606085013567ffffffffffffffff81111561395957613958614c41565b5b613965878288016137d6565b91505092959194509250565b6000806040838503121561398857613987614c46565b5b600061399685828601613782565b92505060206139a785828601613797565b9150509250929050565b600080604083850312156139c8576139c7614c46565b5b60006139d685828601613782565b92505060206139e785828601613804565b9150509250929050565b600060208284031215613a0757613a06614c46565b5b6000613a15848285016137ac565b91505092915050565b600060208284031215613a3457613a33614c46565b5b6000613a42848285016137c1565b91505092915050565b600060208284031215613a6157613a60614c46565b5b6000613a6f84828501613804565b91505092915050565b600060208284031215613a8e57613a8d614c46565b5b6000613a9c84828501613819565b91505092915050565b613aae8161495c565b82525050565b613ac5613ac08261495c565b614abe565b82525050565b613ad48161496e565b82525050565b6000613ae5826147f9565b613aef818561480f565b9350613aff8185602086016149df565b613b0881614c4b565b840191505092915050565b6000613b1e826147f9565b613b288185614820565b9350613b388185602086016149df565b80840191505092915050565b6000613b4f82614804565b613b59818561482b565b9350613b698185602086016149df565b613b7281614c4b565b840191505092915050565b6000613b8882614804565b613b92818561483c565b9350613ba28185602086016149df565b80840191505092915050565b6000613bbb60058361483c565b9150613bc682614c69565b600582019050919050565b6000613bde602b8361482b565b9150613be982614c92565b604082019050919050565b6000613c0160328361482b565b9150613c0c82614ce1565b604082019050919050565b6000613c2460268361482b565b9150613c2f82614d30565b604082019050919050565b6000613c47600f8361482b565b9150613c5282614d7f565b602082019050919050565b6000613c6a601c8361482b565b9150613c7582614da8565b602082019050919050565b6000613c8d600f8361483c565b9150613c9882614dd1565b600f82019050919050565b6000613cb060018361483c565b9150613cbb82614dfa565b600182019050919050565b6000613cd360028361483c565b9150613cde82614e23565b600282019050919050565b6000613cf660248361482b565b9150613d0182614e4c565b604082019050919050565b6000613d1960198361482b565b9150613d2482614e9b565b602082019050919050565b6000613d3c602c8361482b565b9150613d4782614ec4565b604082019050919050565b6000613d5f60128361483c565b9150613d6a82614f13565b601282019050919050565b6000613d8260258361483c565b9150613d8d82614f3c565b602582019050919050565b6000613da560388361482b565b9150613db082614f8b565b604082019050919050565b6000613dc8602a8361482b565b9150613dd382614fda565b604082019050919050565b6000613deb60298361482b565b9150613df682615029565b604082019050919050565b6000613e0e60028361483c565b9150613e1982615078565b600282019050919050565b6000613e3160208361482b565b9150613e3c826150a1565b602082019050919050565b6000613e5460208361482b565b9150613e5f826150ca565b602082019050919050565b6000613e7760288361483c565b9150613e82826150f3565b602882019050919050565b6000613e9a609c8361483c565b9150613ea582615142565b609c82019050919050565b6000613ebd602c8361482b565b9150613ec882615203565b604082019050919050565b6000613ee0600b8361482b565b9150613eeb82615252565b602082019050919050565b6000613f0360208361482b565b9150613f0e8261527b565b602082019050919050565b6000613f2660298361482b565b9150613f31826152a4565b604082019050919050565b6000613f4960098361483c565b9150613f54826152f3565b600982019050919050565b6000613f6c60218361482b565b9150613f778261531c565b604082019050919050565b6000613f8f601d8361483c565b9150613f9a8261536b565b601d82019050919050565b6000613fb260318361482b565b9150613fbd82615394565b604082019050919050565b6000613fd560028361483c565b9150613fe0826153e3565b600282019050919050565b6000613ff8602c8361482b565b91506140038261540c565b604082019050919050565b600061401b60018361483c565b91506140268261545b565b600182019050919050565b600061403e60058361483c565b915061404982615484565b600582019050919050565b6000614061600a8361483c565b915061406c826154ad565b600a82019050919050565b600061408460028361483c565b915061408f826154d6565b600282019050919050565b60006140a7601f8361482b565b91506140b2826154ff565b602082019050919050565b6140c6816149c6565b82525050565b6140dd6140d8826149c6565b614ae2565b82525050565b60006140ef8284613b13565b915081905092915050565b60006141068285613b7d565b91506141128284613b7d565b91508190509392505050565b600061412a8289613b7d565b91506141368288613b7d565b91506141428287613b7d565b915061414e8286613b7d565b915061415a8285613b7d565b91506141668284613b7d565b9150819050979650505050505050565b6000614182828b613b7d565b915061418e828a613b7d565b915061419a8289613b7d565b91506141a68288613b7d565b91506141b28287613b7d565b91506141be8286613b7d565b91506141ca8285613b7d565b91506141d68284613b7d565b91508190509998505050505050505050565b60006141f48285613b7d565b91506141ff82613d75565b915061420b8284613b7d565b915061421682613d52565b91508190509392505050565b600061422d82613bae565b91506142398285613ab4565b60148201915061424982846140cc565b6020820191508190509392505050565b600061426482613c80565b91506142708286613b7d565b915061427b82613e8d565b91506142878285613b7d565b915061429282613e6a565b915061429e8284613b7d565b91506142a982613e01565b9150819050949350505050565b60006142c182613ca3565b91506142cd8285613ab4565b6014820191506142dd82846140cc565b6020820191508190509392505050565b60006142f882613cc6565b91506143048284613b7d565b915081905092915050565b600061431a82613f3c565b91506143268284613ab4565b60148201915081905092915050565b600061434082613f82565b915061434c8284613b7d565b915081905092915050565b600061436282613fc8565b915061436e8285613ab4565b60148201915061437e82846140cc565b6020820191508190509392505050565b60006143998261400e565b91506143a58284613b7d565b915081905092915050565b60006143bb82614031565b91506143c78285613ab4565b6014820191506143d782846140cc565b6020820191508190509392505050565b60006143f282614054565b91506143fe8284613ab4565b60148201915081905092915050565b600061441882614077565b91506144248285613ab4565b60148201915061443482846140cc565b6020820191508190509392505050565b60006020820190506144596000830184613aa5565b92915050565b60006080820190506144746000830187613aa5565b6144816020830186613aa5565b61448e60408301856140bd565b81810360608301526144a08184613ada565b905095945050505050565b60006020820190506144c06000830184613acb565b92915050565b600060208201905081810360008301526144e08184613b44565b905092915050565b6000602082019050818103600083015261450181613bd1565b9050919050565b6000602082019050818103600083015261452181613bf4565b9050919050565b6000602082019050818103600083015261454181613c17565b9050919050565b6000602082019050818103600083015261456181613c3a565b9050919050565b6000602082019050818103600083015261458181613c5d565b9050919050565b600060208201905081810360008301526145a181613ce9565b9050919050565b600060208201905081810360008301526145c181613d0c565b9050919050565b600060208201905081810360008301526145e181613d2f565b9050919050565b6000602082019050818103600083015261460181613d98565b9050919050565b6000602082019050818103600083015261462181613dbb565b9050919050565b6000602082019050818103600083015261464181613dde565b9050919050565b6000602082019050818103600083015261466181613e24565b9050919050565b6000602082019050818103600083015261468181613e47565b9050919050565b600060208201905081810360008301526146a181613eb0565b9050919050565b600060208201905081810360008301526146c181613ed3565b9050919050565b600060208201905081810360008301526146e181613ef6565b9050919050565b6000602082019050818103600083015261470181613f19565b9050919050565b6000602082019050818103600083015261472181613f5f565b9050919050565b6000602082019050818103600083015261474181613fa5565b9050919050565b6000602082019050818103600083015261476181613feb565b9050919050565b600060208201905081810360008301526147818161409a565b9050919050565b600060208201905061479d60008301846140bd565b92915050565b60006147ad6147be565b90506147b98282614a44565b919050565b6000604051905090565b600067ffffffffffffffff8211156147e3576147e2614c08565b5b6147ec82614c4b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614852826149c6565b915061485d836149c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561489257614891614b1d565b5b828201905092915050565b60006148a8826149c6565b91506148b3836149c6565b9250826148c3576148c2614b4c565b5b828204905092915050565b60006148d9826149c6565b91506148e4836149c6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561491d5761491c614b1d565b5b828202905092915050565b6000614933826149c6565b915061493e836149c6565b92508282101561495157614950614b1d565b5b828203905092915050565b6000614967826149a6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149fd5780820151818401526020810190506149e2565b83811115614a0c576000848401525b50505050565b60006002820490506001821680614a2a57607f821691505b60208210811415614a3e57614a3d614b7b565b5b50919050565b614a4d82614c4b565b810181811067ffffffffffffffff82111715614a6c57614a6b614c08565b5b80604052505050565b6000614a80826149c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ab357614ab2614b1d565b5b600182019050919050565b6000614ac982614ad0565b9050919050565b6000614adb82614c5c565b9050919050565b6000819050919050565b6000614af7826149c6565b9150614b02836149c6565b925082614b1257614b11614b4c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5343414c45000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206c6f76650000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f7b226e616d65223a202270667020230000000000000000000000000000000000600082015250565b7f7200000000000000000000000000000000000000000000000000000000000000600082015250565b7f302e000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f22206f7061636974793d22302e3222202f3e0000000000000000000000000000600082015250565b7f3c726563742077696474683d2234303022206865696768743d2234303022206660008201527f696c6c3d22000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f416c7265616479206d696e7465642066726f6d20746869732061646472657373600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60008201527f3b6261736536342c000000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a202264656172206361726574616b6560008201527f722c207468616e6b207520666f7220612067726561742074696d6520696e207560208201527f7220776f726c6421206d6973732075206c6f747320616e6420686f706520746f60408201527f20736565207520736f6f6e222c202261747472696275746573223a205b7b227460608201527f726169745f74797065223a20224c4f5645222c202276616c7565223a00000000608082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f42415345434f554e540000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6f78000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f2d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f434f4c4f52000000000000000000000000000000000000000000000000000000600082015250565b7f4241434b47524f554e4400000000000000000000000000000000000000000000600082015250565b7f6f79000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6155318161495c565b811461553c57600080fd5b50565b6155488161496e565b811461555357600080fd5b50565b61555f8161497a565b811461556a57600080fd5b50565b615576816149c6565b811461558157600080fd5b5056fe29223e3c7061746820643d224d35322e3232363220322e303331384332302e3632363220392e3233313820352e33393238372036392e3033313820312e37323632312039382e30333138432d332e3737333739203133332e33363520302e373236323038203230362e3933322036322e37323632203231382e353332433134302e323236203233332e303332203136322e373236203131322e303332203136322e3732362036332e30333138433136322e3732362031342e303331382039312e37323632202d362e393638322035322e3232363220322e303331385a222f3e3c2f673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c67207472616e73666f726d3d227472616e736c617465283136302031353029223e3c7061746820643d224d3220333743352e33333333332034322e333333332031362e392035322e322033362e352034394335362e312034352e382036342033392e363636372036352e3520333722207374726f6b653d22626c61636b22207374726f6b652d77696474683d2235222f3e3c7061746820643d224d3320313243332e373334393120372e373735353420362e3238353034202d302e303339373131382031302e3630363320322e34393439364331342e3932373620352e30323936342031362e3636393320392e383837373720313720313222207374726f6b653d22626c61636b22207374726f6b652d77696474683d2235222f3e3c7061746820643d224d34322031324334322e3733343920372e37373535342034352e323835202d302e303339373131382034392e3630363320322e34393439364335332e3932373620352e30323936342035352e3636393320392e383837373720353620313222207374726f6b653d22626c61636b22207374726f6b652d77696474683d2235222f3e3c2f673e3c2f7376673e3c67207374726f6b652d77696474683d223522207374726f6b653d22626c61636b22206f7061636974793d223c67207472616e73666f726d3d227472616e736c6174652831363120373629223e3c7061746820643d224d33362e373731372032352e33354331372e303137332032382e3637383720352e33353935382031382e3431353120322031322e38363731433220382e373837393720382e3420302e39323831343420333420322e31323230344335392e3620332e333135393420363620392e37383238392036362031322e383637314336342e343838322031352e363431312035362e3532362032322e303231322033362e373731372032352e33355a22207374726f6b653d22626c61636b22207374726f6b652d77696474683d223130222f3e3c7061746820643d224d33362e373731372032352e33354331372e303137332032382e3637383720352e33353935382031382e3431353120322031322e38363731433220382e373837393720382e3420302e39323831343420333420322e31323230344335392e3620332e333135393420363620392e37383238392036362031322e383637314336342e343838322031352e363431312035362e3532362032322e303231322033362e373731372032352e33355a22207374726f6b653d222346464536303022207374726f6b652d77696474683d2235222f3e3c2f673e3c7376672077696474683d2234303022206865696768743d22343030222076696577426f783d2235302035302033303020333030222066696c6c3d226e6f6e652220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c646566733e3c6c696e6561724772616469656e742069643d226772616469656e742d66696c6c222078313d2230222079313d2230222078323d22383030222079323d223022206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f70206f66667365743d2230222073746f702d636f6c6f723d222331663030356322202f3e3c73746f70206f66667365743d22302e3134323835373134323835373134323835222073746f702d636f6c6f723d222335623030363022202f3e3c73746f70206f66667365743d22302e32383537313432383537313432383537222073746f702d636f6c6f723d222338373031363022202f3e3c73746f70206f66667365743d22302e3432383537313432383537313432383535222073746f702d636f6c6f723d222361633235356522202f3e3c73746f70206f66667365743d22302e35373134323835373134323835373134222073746f702d636f6c6f723d222363613438356322202f3e3c73746f70206f66667365743d22302e37313432383537313432383537313432222073746f702d636f6c6f723d222365313662356322202f3e3c73746f70206f66667365743d22302e38353731343238353731343238353731222073746f702d636f6c6f723d222366333930363022202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d222366666235366222202f3e3c2f6c696e6561724772616469656e743e3c2f646566733ea26469706673582212207c054fec25a4a5f074f90659e94f17c62ba7b35992d25720dacf79001a286ec364736f6c63430008070033

Deployed Bytecode Sourcemap

45970:8444:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39731:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26845:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28404:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27927:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52425:458;;;:::i;:::-;;40371:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29294:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40039:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48067:85;;;:::i;:::-;;29704:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40561:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49585:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26539:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26269:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11237:94;;;:::i;:::-;;52891:475;;;:::i;:::-;;10586:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27014:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28697:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29960:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49741:2676;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29063:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11486:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39731:224;39833:4;39872:35;39857:50;;;:11;:50;;;;:90;;;;39911:36;39935:11;39911:23;:36::i;:::-;39857:90;39850:97;;39731:224;;;:::o;26845:100::-;26899:13;26932:5;26925:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26845:100;:::o;28404:221::-;28480:7;28508:16;28516:7;28508;:16::i;:::-;28500:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28593:15;:24;28609:7;28593:24;;;;;;;;;;;;;;;;;;;;;28586:31;;28404:221;;;:::o;27927:411::-;28008:13;28024:23;28039:7;28024:14;:23::i;:::-;28008:39;;28072:5;28066:11;;:2;:11;;;;28058:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28166:5;28150:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28175:37;28192:5;28199:12;:10;:12::i;:::-;28175:16;:37::i;:::-;28150:62;28128:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28309:21;28318:2;28322:7;28309:8;:21::i;:::-;27997:341;27927:411;;:::o;52425:458::-;13525:1;14121:7;;:19;;14113:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13525:1;14254:7;:18;;;;52480:7:::1;;;;;;;;;;;:34;;;;52507:7;:5;:7::i;:::-;52491:23;;:12;:10;:12::i;:::-;:23;;;52480:34;52472:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52576:1;52549:5;;;;;;;;;;;:10;;;52560:12;:10;:12::i;:::-;52549:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;52541:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;52641:5;52616:30;;:7;:21;52624:12;:10;:12::i;:::-;52616:21;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;52608:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;52718:12;:10;:12::i;:::-;52694:6;:21;52701:13;:11;:13::i;:::-;52694:21;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;52765:4;52741:7;:21;52749:12;:10;:12::i;:::-;52741:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;52802:5;;;;;;;;;;;:10;;;52813:12;:10;:12::i;:::-;52802:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52780:5;:19;52786:12;:10;:12::i;:::-;52780:19;;;;;;;;;;;;;;;:46;;;;52837:38;52847:12;:10;:12::i;:::-;52861:13;:11;:13::i;:::-;52837:9;:38::i;:::-;13481:1:::0;14433:7;:22;;;;52425:458::o;40371:113::-;40432:7;40459:10;:17;;;;40452:24;;40371:113;:::o;29294:339::-;29489:41;29508:12;:10;:12::i;:::-;29522:7;29489:18;:41::i;:::-;29481:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29597:28;29607:4;29613:2;29617:7;29597:9;:28::i;:::-;29294:339;;;:::o;40039:256::-;40136:7;40172:23;40189:5;40172:16;:23::i;:::-;40164:5;:31;40156:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40261:12;:19;40274:5;40261:19;;;;;;;;;;;;;;;:26;40281:5;40261:26;;;;;;;;;;;;40254:33;;40039:256;;;;:::o;48067:85::-;10817:12;:10;:12::i;:::-;10806:23;;:7;:5;:7::i;:::-;:23;;;10798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13525:1:::1;14121:7;;:19;;14113:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13525:1;14254:7;:18;;;;48137:7:::2;;;;;;;;;;;48136:8;48126:7;;:18;;;;;;;;;;;;;;;;;;13481:1:::1;14433:7;:22;;;;48067:85::o:0;29704:185::-;29842:39;29859:4;29865:2;29869:7;29842:39;;;;;;;;;;;;:16;:39::i;:::-;29704:185;;;:::o;40561:233::-;40636:7;40672:30;:28;:30::i;:::-;40664:5;:38;40656:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40769:10;40780:5;40769:17;;;;;;;;:::i;:::-;;;;;;;;;;40762:24;;40561:233;;;:::o;49585:148::-;49640:7;49660:15;49678:6;:15;49685:7;49678:15;;;;;;;;;;;;;;;;;;;;;49660:33;;49711:5;:14;49717:7;49711:14;;;;;;;;;;;;;;;;49704:21;;;49585:148;;;:::o;26539:239::-;26611:7;26631:13;26647:7;:16;26655:7;26647:16;;;;;;;;;;;;;;;;;;;;;26631:32;;26699:1;26682:19;;:5;:19;;;;26674:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26765:5;26758:12;;;26539:239;;;:::o;26269:208::-;26341:7;26386:1;26369:19;;:5;:19;;;;26361:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26453:9;:16;26463:5;26453:16;;;;;;;;;;;;;;;;26446:23;;26269:208;;;:::o;11237:94::-;10817:12;:10;:12::i;:::-;10806:23;;:7;:5;:7::i;:::-;:23;;;10798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11302:21:::1;11320:1;11302:9;:21::i;:::-;11237:94::o:0;52891:475::-;13525:1;14121:7;;:19;;14113:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13525:1;14254:7;:18;;;;52957:7:::1;;;;;;;;;;;:34;;;;52984:7;:5;:7::i;:::-;52968:23;;:12;:10;:12::i;:::-;:23;;;52957:34;52949:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53056:1;53026:8;;;;;;;;;;;:13;;;53040:12;:10;:12::i;:::-;53026:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;53018:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;53121:5;53096:30;;:7;:21;53104:12;:10;:12::i;:::-;53096:21;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;53088:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;53198:12;:10;:12::i;:::-;53174:6;:21;53181:13;:11;:13::i;:::-;53174:21;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;53245:4;53221:7;:21;53229:12;:10;:12::i;:::-;53221:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;53282:8;;;;;;;;;;;:13;;;53296:12;:10;:12::i;:::-;53282:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53260:5;:19;53266:12;:10;:12::i;:::-;53260:19;;;;;;;;;;;;;;;:49;;;;53320:38;53330:12;:10;:12::i;:::-;53344:13;:11;:13::i;:::-;53320:9;:38::i;:::-;13481:1:::0;14433:7;:22;;;;52891:475::o;10586:87::-;10632:7;10659:6;;;;;;;;;;;10652:13;;10586:87;:::o;27014:104::-;27070:13;27103:7;27096:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27014:104;:::o;28697:295::-;28812:12;:10;:12::i;:::-;28800:24;;:8;:24;;;;28792:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28912:8;28867:18;:32;28886:12;:10;:12::i;:::-;28867:32;;;;;;;;;;;;;;;:42;28900:8;28867:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28965:8;28936:48;;28951:12;:10;:12::i;:::-;28936:48;;;28975:8;28936:48;;;;;;:::i;:::-;;;;;;;;28697:295;;:::o;29960:328::-;30135:41;30154:12;:10;:12::i;:::-;30168:7;30135:18;:41::i;:::-;30127:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30241:39;30255:4;30261:2;30265:7;30274:5;30241:13;:39::i;:::-;29960:328;;;;:::o;49741:2676::-;49806:13;49832:15;49850:6;:15;49857:7;49850:15;;;;;;;;;;;;;;;;;;;;;49832:33;;49878:20;49911:23;:205;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50138:6;;;;;;;;;;;;;;;;;50129:15;;50198:6;50273;50280:62;50318:7;50287:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;50328:13;50280:6;:62::i;:::-;50273:70;;;;;;;:::i;:::-;;;;;;50181:208;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50165:225;;50403:12;50418:5;:14;50424:7;50418:14;;;;;;;;;;;;;;;;50403:29;;50443:13;50511:4;50459:49;50496:7;50466:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;50506:1;50459:6;:49::i;:::-;:56;;;;:::i;:::-;50443:72;;50541:1;50532:5;:10;50528:52;;50567:1;50559:9;;50528:52;50599:9;50594:1161;50618:5;50614:1;:9;50594:1161;;;50645:19;50667:6;50674:60;50707:7;50716:1;50681:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50720:13;50674:6;:60::i;:::-;50667:68;;;;;;;:::i;:::-;;;;;;50645:90;;50750:10;50827:2;50821:3;50771:46;50801:7;50810:1;50778:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50814:2;50771:6;:46::i;:::-;50763:61;;;;:::i;:::-;:66;;;;:::i;:::-;50750:79;;50844:10;50920:2;50915;50865:46;50895:7;50904:1;50872:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50908:2;50865:6;:46::i;:::-;50857:60;;;;:::i;:::-;:65;;;;:::i;:::-;50844:78;;50937:9;50957:46;50986:7;50995:1;50964:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50999:3;50957:6;:46::i;:::-;50937:67;;51019:21;:29;;;;;;;;;;;;;;;;;;;51063:19;51151:64;51165:49;51198:7;51207:1;51172:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51211:2;51165:6;:49::i;:::-;51160:2;:54;;;;:::i;:::-;51151:8;:64::i;:::-;51092:138;;;;;;;;:::i;:::-;;;;;;;;;;;;;51063:168;;51263:1;51255:5;:9;;;;:::i;:::-;51250:1;:14;51246:276;;;51290:3;51285:8;;51317:2;51312:7;;51350:45;51379:7;51388:1;51357:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51392:2;51350:6;:45::i;:::-;51338:58;;51415:11;;;;;;;;;;;;;;;;;;;51445:13;;;;;;;;;;;;;;;;;;;51488:1;51481:4;:8;51477:29;;;51491:15;;;;;;;;;;;;;;;;;;;51477:29;51246:276;51536:11;51563:1;51555:5;:9;;;;:::i;:::-;51550:1;:14;51536:28;;51579:16;51598:85;51603:5;51610:12;51619:2;51610:8;:12::i;:::-;51624;51633:2;51624:8;:12::i;:::-;51638:20;51656:1;51638:17;:20::i;:::-;51660:5;51667:7;51676:6;51598:4;:85::i;:::-;51579:104;;51731:6;51739:2;51714:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51698:45;;50630:1125;;;;;;;;50625:3;;;;:::i;:::-;;;50594:1161;;;;51779:2;51771:4;:10;51767:90;;51831:6;51839:4;;;;;;;;;;;;;;;;;51814:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51798:47;;51767:90;51902:6;51910;;;;;;;;;;;;;;;;;51885:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51869:49;;51939:18;51960:340;52023:17;52032:7;52023:8;:17::i;:::-;52202:14;52211:4;52202:8;:14::i;:::-;52262:28;52282:6;52262:13;:28::i;:::-;51987:310;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51960:13;:340::i;:::-;51939:361;;52377:4;52327:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;52311:72;;52403:6;52396:13;;;;;;;;49741:2676;;;:::o;29063:164::-;29160:4;29184:18;:25;29203:5;29184:25;;;;;;;;;;;;;;;:35;29210:8;29184:35;;;;;;;;;;;;;;;;;;;;;;;;;29177:42;;29063:164;;;;:::o;11486:192::-;10817:12;:10;:12::i;:::-;10806:23;;:7;:5;:7::i;:::-;:23;;;10798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11595:1:::1;11575:22;;:8;:22;;;;11567:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11651:19;11661:8;11651:9;:19::i;:::-;11486:192:::0;:::o;25900:305::-;26002:4;26054:25;26039:40;;;:11;:40;;;;:105;;;;26111:33;26096:48;;;:11;:48;;;;26039:105;:158;;;;26161:36;26185:11;26161:23;:36::i;:::-;26039:158;26019:178;;25900:305;;;:::o;31798:127::-;31863:4;31915:1;31887:30;;:7;:16;31895:7;31887:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31880:37;;31798:127;;;:::o;9446:98::-;9499:7;9526:10;9519:17;;9446:98;:::o;35780:174::-;35882:2;35855:15;:24;35871:7;35855:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35938:7;35934:2;35900:46;;35909:23;35924:7;35909:14;:23::i;:::-;35900:46;;;;;;;;;;;;35780:174;;:::o;32782:110::-;32858:26;32868:2;32872:7;32858:26;;;;;;;;;;;;:9;:26::i;:::-;32782:110;;:::o;32092:348::-;32185:4;32210:16;32218:7;32210;:16::i;:::-;32202:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32286:13;32302:23;32317:7;32302:14;:23::i;:::-;32286:39;;32355:5;32344:16;;:7;:16;;;:51;;;;32388:7;32364:31;;:20;32376:7;32364:11;:20::i;:::-;:31;;;32344:51;:87;;;;32399:32;32416:5;32423:7;32399:16;:32::i;:::-;32344:87;32336:96;;;32092:348;;;;:::o;35084:578::-;35243:4;35216:31;;:23;35231:7;35216:14;:23::i;:::-;:31;;;35208:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35326:1;35312:16;;:2;:16;;;;35304:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35382:39;35403:4;35409:2;35413:7;35382:20;:39::i;:::-;35486:29;35503:1;35507:7;35486:8;:29::i;:::-;35547:1;35528:9;:15;35538:4;35528:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35576:1;35559:9;:13;35569:2;35559:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35607:2;35588:7;:16;35596:7;35588:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35646:7;35642:2;35627:27;;35636:4;35627:27;;;;;;;;;;;;35084:578;;;:::o;11686:173::-;11742:16;11761:6;;;;;;;;;;;11742:25;;11787:8;11778:6;;:17;;;;;;;;;;;;;;;;;;11842:8;11811:40;;11832:8;11811:40;;;;;;;;;;;;11731:128;11686:173;:::o;31170:315::-;31327:28;31337:4;31343:2;31347:7;31327:9;:28::i;:::-;31374:48;31397:4;31403:2;31407:7;31416:5;31374:22;:48::i;:::-;31366:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31170:315;;;;:::o;48164:160::-;48238:7;48311:5;48300;48283:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;48273:34;;;;;;48265:43;;:51;;;;:::i;:::-;48258:58;;48164:160;;;;:::o;53617:715::-;53673:13;53895:1;53886:5;:10;53882:53;;;53913:10;;;;;;;;;;;;;;;;;;;;;53882:53;53945:12;53960:5;53945:20;;53976:14;54001:78;54016:1;54008:4;:9;54001:78;;54034:8;;;;;:::i;:::-;;;;54065:2;54057:10;;;;;:::i;:::-;;;54001:78;;;54089:19;54121:6;54111:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54089:39;;54139:154;54155:1;54146:5;:10;54139:154;;54183:1;54173:11;;;;;:::i;:::-;;;54250:2;54242:5;:10;;;;:::i;:::-;54229:2;:24;;;;:::i;:::-;54216:39;;54199:6;54206;54199:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;54279:2;54270:11;;;;;:::i;:::-;;;54139:154;;;54317:6;54303:21;;;;;53617:715;;;;:::o;53374:231::-;53439:13;53482:1;53477;53469:5;:9;;;;:::i;:::-;:14;53465:100;;;53536:15;53545:5;53536:8;:15::i;:::-;53514:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;53500:53;;;;53465:100;53582:15;53591:5;53582:8;:15::i;:::-;53575:22;;53374:231;;;;:::o;48332:1245::-;48500:13;48526:23;;:::i;:::-;48565:6;48560:155;;48588:25;;;;;;;;;;;;;;;;;:5;48594:1;48588:8;;;;;;;:::i;:::-;;;;;:25;;;;48560:155;;;48646:57;;;;;;;;;;;;;;;;;:5;48652:1;48646:8;;;;;;;:::i;:::-;;;;;:57;;;;48560:155;48736:7;48725:5;48731:1;48725:8;;;;;;;:::i;:::-;;;;;:18;;;;48754:21;;;;;;;;;;;;;;;;;:5;48760:1;48754:8;;;;;;;:::i;:::-;;;;;:21;;;;48797:5;48786;48792:1;48786:8;;;;;;;:::i;:::-;;;;;:16;;;;48813:36;;;;;;;;;;;;;;;;;:5;48819:1;48813:8;;;;;;;:::i;:::-;;;;;:36;;;;48871:2;48860:5;48866:1;48860:8;;;;;;;:::i;:::-;;;;;:13;;;;48884:14;;;;;;;;;;;;;;;;;:5;48890:1;48884:8;;;;;;;:::i;:::-;;;;;:14;;;;48920:2;48909:5;48915:1;48909:8;;;;;;;:::i;:::-;;;;;:13;;;;48933:22;;;;;;;;;;;;;;;;;:5;48939:1;48933:8;;;;;;;:::i;:::-;;;;;:22;;;;48977:1;48966:5;48972:1;48966:8;;;;;;;:::i;:::-;;;;;:12;;;;48989:31;;;;;;;;;;;;;;;;;:5;48995:2;48989:9;;;;;;;:::i;:::-;;;;;:31;;;;49043:5;49031;49037:2;49031:9;;;;;;;:::i;:::-;;;;;:17;;;;49059:241;;;;;;;;;;;;;;;;;:5;49065:2;49059:9;;;;;;;:::i;:::-;;;;;:241;;;;49313:20;49360:5;49366:1;49360:8;;;;;;;:::i;:::-;;;;;;49370:5;49376:1;49370:8;;;;;;;:::i;:::-;;;;;;49380:5;49386:1;49380:8;;;;;;;:::i;:::-;;;;;;49390:5;49396:1;49390:8;;;;;;;:::i;:::-;;;;;;49400:5;49406:1;49400:8;;;;;;;:::i;:::-;;;;;;49410:5;49416:1;49410:8;;;;;;;:::i;:::-;;;;;;49420:5;49426:1;49420:8;;;;;;;:::i;:::-;;;;;;49430:5;49436:1;49430:8;;;;;;;:::i;:::-;;;;;;49343:96;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49313:127;;49484:6;49492:5;49498:1;49492:8;;;;;;;:::i;:::-;;;;;;49502:5;49508:1;49502:8;;;;;;;:::i;:::-;;;;;;49512:5;49518:2;49512:9;;;;;;;:::i;:::-;;;;;;49523:5;49529:2;49523:9;;;;;;;:::i;:::-;;;;;;49534:5;49540:2;49534:9;;;;;;;:::i;:::-;;;;;;49467:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49451:94;;49563:6;49556:13;;;;48332:1245;;;;;;;;;:::o;54765:1607::-;54823:13;54849:11;54863:4;:11;54849:25;;54896:1;54889:3;:8;54885:23;;;54899:9;;;;;;;;;;;;;;;;;54885:23;54960:18;54998:1;54993;54987:3;:7;;;;:::i;:::-;54986:13;;;;:::i;:::-;54981:1;:19;;;;:::i;:::-;54960:40;;55058:19;55103:2;55090:10;:15;;;;:::i;:::-;55080:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55058:48;;55119:18;55140:5;;;;;;;;;;;;;;;;;55119:26;;55209:1;55202:5;55198:13;55254:2;55246:6;55242:15;55305:1;55273:777;55328:3;55325:1;55322:10;55273:777;;;55383:1;55380;55376:9;55371:14;;55441:8;55436:1;55430:4;55426:12;55420:19;55416:34;55521:4;55513:5;55509:2;55505:14;55501:25;55491:8;55487:40;55481:47;55560:3;55557:1;55553:11;55546:18;;55651:4;55642;55634:5;55630:2;55626:14;55622:25;55612:8;55608:40;55602:47;55598:58;55593:3;55589:68;55582:75;;55689:3;55686:1;55682:11;55675:18;;55779:4;55770;55762:5;55759:1;55755:13;55751:24;55741:8;55737:39;55731:46;55727:57;55722:3;55718:67;55711:74;;55817:3;55814:1;55810:11;55803:18;;55899:4;55890;55883:5;55879:16;55869:8;55865:31;55859:38;55855:49;55850:3;55846:59;55839:66;;55939:3;55934;55930:13;55923:20;;55981:3;55970:9;55963:22;56033:1;56022:9;56018:17;56005:30;;55352:698;;55273:777;;;55277:44;56082:1;56077:3;56073:11;56103:1;56098:84;;;;56201:1;56196:82;;;;56066:212;;56098:84;56159:6;56154:3;56150:16;56146:1;56135:9;56131:17;56124:43;56098:84;;56196:82;56257:4;56252:3;56248:14;56244:1;56233:9;56229:17;56222:41;56066:212;;56309:10;56301:6;56294:26;55167:1164;;56357:6;56343:21;;;;;;54765:1607;;;;:::o;24507:157::-;24592:4;24631:25;24616:40;;;:11;:40;;;;24609:47;;24507:157;;;:::o;33119:321::-;33249:18;33255:2;33259:7;33249:5;:18::i;:::-;33300:54;33331:1;33335:2;33339:7;33348:5;33300:22;:54::i;:::-;33278:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33119:321;;;:::o;41407:589::-;41551:45;41578:4;41584:2;41588:7;41551:26;:45::i;:::-;41629:1;41613:18;;:4;:18;;;41609:187;;;41648:40;41680:7;41648:31;:40::i;:::-;41609:187;;;41718:2;41710:10;;:4;:10;;;41706:90;;41737:47;41770:4;41776:7;41737:32;:47::i;:::-;41706:90;41609:187;41824:1;41810:16;;:2;:16;;;41806:183;;;41843:45;41880:7;41843:36;:45::i;:::-;41806:183;;;41916:4;41910:10;;:2;:10;;;41906:83;;41937:40;41965:2;41969:7;41937:27;:40::i;:::-;41906:83;41806:183;41407:589;;;:::o;36519:803::-;36674:4;36695:15;:2;:13;;;:15::i;:::-;36691:624;;;36747:2;36731:36;;;36768:12;:10;:12::i;:::-;36782:4;36788:7;36797:5;36731:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36727:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36994:1;36977:6;:13;:18;36973:272;;;37020:60;;;;;;;;;;:::i;:::-;;;;;;;;36973:272;37195:6;37189:13;37180:6;37176:2;37172:15;37165:38;36727:533;36864:45;;;36854:55;;;:6;:55;;;;36847:62;;;;;36691:624;37299:4;37292:11;;36519:803;;;;;;;:::o;33776:382::-;33870:1;33856:16;;:2;:16;;;;33848:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33929:16;33937:7;33929;:16::i;:::-;33928:17;33920:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33991:45;34020:1;34024:2;34028:7;33991:20;:45::i;:::-;34066:1;34049:9;:13;34059:2;34049:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34097:2;34078:7;:16;34086:7;34078:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34142:7;34138:2;34117:33;;34134:1;34117:33;;;;;;;;;;;;33776:382;;:::o;37894:126::-;;;;:::o;42719:164::-;42823:10;:17;;;;42796:15;:24;42812:7;42796:24;;;;;;;;;;;:44;;;;42851:10;42867:7;42851:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42719:164;:::o;43510:988::-;43776:22;43826:1;43801:22;43818:4;43801:16;:22::i;:::-;:26;;;;:::i;:::-;43776:51;;43838:18;43859:17;:26;43877:7;43859:26;;;;;;;;;;;;43838:47;;44006:14;43992:10;:28;43988:328;;44037:19;44059:12;:18;44072:4;44059:18;;;;;;;;;;;;;;;:34;44078:14;44059:34;;;;;;;;;;;;44037:56;;44143:11;44110:12;:18;44123:4;44110:18;;;;;;;;;;;;;;;:30;44129:10;44110:30;;;;;;;;;;;:44;;;;44260:10;44227:17;:30;44245:11;44227:30;;;;;;;;;;;:43;;;;44022:294;43988:328;44412:17;:26;44430:7;44412:26;;;;;;;;;;;44405:33;;;44456:12;:18;44469:4;44456:18;;;;;;;;;;;;;;;:34;44475:14;44456:34;;;;;;;;;;;44449:41;;;43591:907;;43510:988;;:::o;44793:1079::-;45046:22;45091:1;45071:10;:17;;;;:21;;;;:::i;:::-;45046:46;;45103:18;45124:15;:24;45140:7;45124:24;;;;;;;;;;;;45103:45;;45475:19;45497:10;45508:14;45497:26;;;;;;;;:::i;:::-;;;;;;;;;;45475:48;;45561:11;45536:10;45547;45536:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45672:10;45641:15;:28;45657:11;45641:28;;;;;;;;;;;:41;;;;45813:15;:24;45829:7;45813:24;;;;;;;;;;;45806:31;;;45848:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44864:1008;;;44793:1079;:::o;42297:221::-;42382:14;42399:20;42416:2;42399:16;:20::i;:::-;42382:37;;42457:7;42430:12;:16;42443:2;42430:16;;;;;;;;;;;;;;;:24;42447:6;42430:24;;;;;;;;;;;:34;;;;42504:6;42475:17;:26;42493:7;42475:26;;;;;;;;;;;:35;;;;42371:147;42297:221;;:::o;16679:387::-;16739:4;16947:12;17014:7;17002:20;16994:28;;17057:1;17050:4;:8;17043:15;;;16679:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:143::-;1556:5;1587:6;1581:13;1572:22;;1603:33;1630:5;1603:33;:::i;:::-;1499:143;;;;:::o;1648:329::-;1707:6;1756:2;1744:9;1735:7;1731:23;1727:32;1724:119;;;1762:79;;:::i;:::-;1724:119;1882:1;1907:53;1952:7;1943:6;1932:9;1928:22;1907:53;:::i;:::-;1897:63;;1853:117;1648:329;;;;:::o;1983:474::-;2051:6;2059;2108:2;2096:9;2087:7;2083:23;2079:32;2076:119;;;2114:79;;:::i;:::-;2076:119;2234:1;2259:53;2304:7;2295:6;2284:9;2280:22;2259:53;:::i;:::-;2249:63;;2205:117;2361:2;2387:53;2432:7;2423:6;2412:9;2408:22;2387:53;:::i;:::-;2377:63;;2332:118;1983:474;;;;;:::o;2463:619::-;2540:6;2548;2556;2605:2;2593:9;2584:7;2580:23;2576:32;2573:119;;;2611:79;;:::i;:::-;2573:119;2731:1;2756:53;2801:7;2792:6;2781:9;2777:22;2756:53;:::i;:::-;2746:63;;2702:117;2858:2;2884:53;2929:7;2920:6;2909:9;2905:22;2884:53;:::i;:::-;2874:63;;2829:118;2986:2;3012:53;3057:7;3048:6;3037:9;3033:22;3012:53;:::i;:::-;3002:63;;2957:118;2463:619;;;;;:::o;3088:943::-;3183:6;3191;3199;3207;3256:3;3244:9;3235:7;3231:23;3227:33;3224:120;;;3263:79;;:::i;:::-;3224:120;3383:1;3408:53;3453:7;3444:6;3433:9;3429:22;3408:53;:::i;:::-;3398:63;;3354:117;3510:2;3536:53;3581:7;3572:6;3561:9;3557:22;3536:53;:::i;:::-;3526:63;;3481:118;3638:2;3664:53;3709:7;3700:6;3689:9;3685:22;3664:53;:::i;:::-;3654:63;;3609:118;3794:2;3783:9;3779:18;3766:32;3825:18;3817:6;3814:30;3811:117;;;3847:79;;:::i;:::-;3811:117;3952:62;4006:7;3997:6;3986:9;3982:22;3952:62;:::i;:::-;3942:72;;3737:287;3088:943;;;;;;;:::o;4037:468::-;4102:6;4110;4159:2;4147:9;4138:7;4134:23;4130:32;4127:119;;;4165:79;;:::i;:::-;4127:119;4285:1;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4256:117;4412:2;4438:50;4480:7;4471:6;4460:9;4456:22;4438:50;:::i;:::-;4428:60;;4383:115;4037:468;;;;;:::o;4511:474::-;4579:6;4587;4636:2;4624:9;4615:7;4611:23;4607:32;4604:119;;;4642:79;;:::i;:::-;4604:119;4762:1;4787:53;4832:7;4823:6;4812:9;4808:22;4787:53;:::i;:::-;4777:63;;4733:117;4889:2;4915:53;4960:7;4951:6;4940:9;4936:22;4915:53;:::i;:::-;4905:63;;4860:118;4511:474;;;;;:::o;4991:327::-;5049:6;5098:2;5086:9;5077:7;5073:23;5069:32;5066:119;;;5104:79;;:::i;:::-;5066:119;5224:1;5249:52;5293:7;5284:6;5273:9;5269:22;5249:52;:::i;:::-;5239:62;;5195:116;4991:327;;;;:::o;5324:349::-;5393:6;5442:2;5430:9;5421:7;5417:23;5413:32;5410:119;;;5448:79;;:::i;:::-;5410:119;5568:1;5593:63;5648:7;5639:6;5628:9;5624:22;5593:63;:::i;:::-;5583:73;;5539:127;5324:349;;;;:::o;5679:329::-;5738:6;5787:2;5775:9;5766:7;5762:23;5758:32;5755:119;;;5793:79;;:::i;:::-;5755:119;5913:1;5938:53;5983:7;5974:6;5963:9;5959:22;5938:53;:::i;:::-;5928:63;;5884:117;5679:329;;;;:::o;6014:351::-;6084:6;6133:2;6121:9;6112:7;6108:23;6104:32;6101:119;;;6139:79;;:::i;:::-;6101:119;6259:1;6284:64;6340:7;6331:6;6320:9;6316:22;6284:64;:::i;:::-;6274:74;;6230:128;6014:351;;;;:::o;6371:118::-;6458:24;6476:5;6458:24;:::i;:::-;6453:3;6446:37;6371:118;;:::o;6495:157::-;6600:45;6620:24;6638:5;6620:24;:::i;:::-;6600:45;:::i;:::-;6595:3;6588:58;6495:157;;:::o;6658:109::-;6739:21;6754:5;6739:21;:::i;:::-;6734:3;6727:34;6658:109;;:::o;6773:360::-;6859:3;6887:38;6919:5;6887:38;:::i;:::-;6941:70;7004:6;6999:3;6941:70;:::i;:::-;6934:77;;7020:52;7065:6;7060:3;7053:4;7046:5;7042:16;7020:52;:::i;:::-;7097:29;7119:6;7097:29;:::i;:::-;7092:3;7088:39;7081:46;;6863:270;6773:360;;;;:::o;7139:373::-;7243:3;7271:38;7303:5;7271:38;:::i;:::-;7325:88;7406:6;7401:3;7325:88;:::i;:::-;7318:95;;7422:52;7467:6;7462:3;7455:4;7448:5;7444:16;7422:52;:::i;:::-;7499:6;7494:3;7490:16;7483:23;;7247:265;7139:373;;;;:::o;7518:364::-;7606:3;7634:39;7667:5;7634:39;:::i;:::-;7689:71;7753:6;7748:3;7689:71;:::i;:::-;7682:78;;7769:52;7814:6;7809:3;7802:4;7795:5;7791:16;7769:52;:::i;:::-;7846:29;7868:6;7846:29;:::i;:::-;7841:3;7837:39;7830:46;;7610:272;7518:364;;;;:::o;7888:377::-;7994:3;8022:39;8055:5;8022:39;:::i;:::-;8077:89;8159:6;8154:3;8077:89;:::i;:::-;8070:96;;8175:52;8220:6;8215:3;8208:4;8201:5;8197:16;8175:52;:::i;:::-;8252:6;8247:3;8243:16;8236:23;;7998:267;7888:377;;;;:::o;8271:400::-;8431:3;8452:84;8534:1;8529:3;8452:84;:::i;:::-;8445:91;;8545:93;8634:3;8545:93;:::i;:::-;8663:1;8658:3;8654:11;8647:18;;8271:400;;;:::o;8677:366::-;8819:3;8840:67;8904:2;8899:3;8840:67;:::i;:::-;8833:74;;8916:93;9005:3;8916:93;:::i;:::-;9034:2;9029:3;9025:12;9018:19;;8677:366;;;:::o;9049:::-;9191:3;9212:67;9276:2;9271:3;9212:67;:::i;:::-;9205:74;;9288:93;9377:3;9288:93;:::i;:::-;9406:2;9401:3;9397:12;9390:19;;9049:366;;;:::o;9421:::-;9563:3;9584:67;9648:2;9643:3;9584:67;:::i;:::-;9577:74;;9660:93;9749:3;9660:93;:::i;:::-;9778:2;9773:3;9769:12;9762:19;;9421:366;;;:::o;9793:::-;9935:3;9956:67;10020:2;10015:3;9956:67;:::i;:::-;9949:74;;10032:93;10121:3;10032:93;:::i;:::-;10150:2;10145:3;10141:12;10134:19;;9793:366;;;:::o;10165:::-;10307:3;10328:67;10392:2;10387:3;10328:67;:::i;:::-;10321:74;;10404:93;10493:3;10404:93;:::i;:::-;10522:2;10517:3;10513:12;10506:19;;10165:366;;;:::o;10537:402::-;10697:3;10718:85;10800:2;10795:3;10718:85;:::i;:::-;10711:92;;10812:93;10901:3;10812:93;:::i;:::-;10930:2;10925:3;10921:12;10914:19;;10537:402;;;:::o;10945:400::-;11105:3;11126:84;11208:1;11203:3;11126:84;:::i;:::-;11119:91;;11219:93;11308:3;11219:93;:::i;:::-;11337:1;11332:3;11328:11;11321:18;;10945:400;;;:::o;11351:::-;11511:3;11532:84;11614:1;11609:3;11532:84;:::i;:::-;11525:91;;11625:93;11714:3;11625:93;:::i;:::-;11743:1;11738:3;11734:11;11727:18;;11351:400;;;:::o;11757:366::-;11899:3;11920:67;11984:2;11979:3;11920:67;:::i;:::-;11913:74;;11996:93;12085:3;11996:93;:::i;:::-;12114:2;12109:3;12105:12;12098:19;;11757:366;;;:::o;12129:::-;12271:3;12292:67;12356:2;12351:3;12292:67;:::i;:::-;12285:74;;12368:93;12457:3;12368:93;:::i;:::-;12486:2;12481:3;12477:12;12470:19;;12129:366;;;:::o;12501:::-;12643:3;12664:67;12728:2;12723:3;12664:67;:::i;:::-;12657:74;;12740:93;12829:3;12740:93;:::i;:::-;12858:2;12853:3;12849:12;12842:19;;12501:366;;;:::o;12873:402::-;13033:3;13054:85;13136:2;13131:3;13054:85;:::i;:::-;13047:92;;13148:93;13237:3;13148:93;:::i;:::-;13266:2;13261:3;13257:12;13250:19;;12873:402;;;:::o;13281:::-;13441:3;13462:85;13544:2;13539:3;13462:85;:::i;:::-;13455:92;;13556:93;13645:3;13556:93;:::i;:::-;13674:2;13669:3;13665:12;13658:19;;13281:402;;;:::o;13689:366::-;13831:3;13852:67;13916:2;13911:3;13852:67;:::i;:::-;13845:74;;13928:93;14017:3;13928:93;:::i;:::-;14046:2;14041:3;14037:12;14030:19;;13689:366;;;:::o;14061:::-;14203:3;14224:67;14288:2;14283:3;14224:67;:::i;:::-;14217:74;;14300:93;14389:3;14300:93;:::i;:::-;14418:2;14413:3;14409:12;14402:19;;14061:366;;;:::o;14433:::-;14575:3;14596:67;14660:2;14655:3;14596:67;:::i;:::-;14589:74;;14672:93;14761:3;14672:93;:::i;:::-;14790:2;14785:3;14781:12;14774:19;;14433:366;;;:::o;14805:400::-;14965:3;14986:84;15068:1;15063:3;14986:84;:::i;:::-;14979:91;;15079:93;15168:3;15079:93;:::i;:::-;15197:1;15192:3;15188:11;15181:18;;14805:400;;;:::o;15211:366::-;15353:3;15374:67;15438:2;15433:3;15374:67;:::i;:::-;15367:74;;15450:93;15539:3;15450:93;:::i;:::-;15568:2;15563:3;15559:12;15552:19;;15211:366;;;:::o;15583:::-;15725:3;15746:67;15810:2;15805:3;15746:67;:::i;:::-;15739:74;;15822:93;15911:3;15822:93;:::i;:::-;15940:2;15935:3;15931:12;15924:19;;15583:366;;;:::o;15955:402::-;16115:3;16136:85;16218:2;16213:3;16136:85;:::i;:::-;16129:92;;16230:93;16319:3;16230:93;:::i;:::-;16348:2;16343:3;16339:12;16332:19;;15955:402;;;:::o;16363:404::-;16523:3;16544:86;16626:3;16621;16544:86;:::i;:::-;16537:93;;16639;16728:3;16639:93;:::i;:::-;16757:3;16752;16748:13;16741:20;;16363:404;;;:::o;16773:366::-;16915:3;16936:67;17000:2;16995:3;16936:67;:::i;:::-;16929:74;;17012:93;17101:3;17012:93;:::i;:::-;17130:2;17125:3;17121:12;17114:19;;16773:366;;;:::o;17145:::-;17287:3;17308:67;17372:2;17367:3;17308:67;:::i;:::-;17301:74;;17384:93;17473:3;17384:93;:::i;:::-;17502:2;17497:3;17493:12;17486:19;;17145:366;;;:::o;17517:::-;17659:3;17680:67;17744:2;17739:3;17680:67;:::i;:::-;17673:74;;17756:93;17845:3;17756:93;:::i;:::-;17874:2;17869:3;17865:12;17858:19;;17517:366;;;:::o;17889:::-;18031:3;18052:67;18116:2;18111:3;18052:67;:::i;:::-;18045:74;;18128:93;18217:3;18128:93;:::i;:::-;18246:2;18241:3;18237:12;18230:19;;17889:366;;;:::o;18261:400::-;18421:3;18442:84;18524:1;18519:3;18442:84;:::i;:::-;18435:91;;18535:93;18624:3;18535:93;:::i;:::-;18653:1;18648:3;18644:11;18637:18;;18261:400;;;:::o;18667:366::-;18809:3;18830:67;18894:2;18889:3;18830:67;:::i;:::-;18823:74;;18906:93;18995:3;18906:93;:::i;:::-;19024:2;19019:3;19015:12;19008:19;;18667:366;;;:::o;19039:402::-;19199:3;19220:85;19302:2;19297:3;19220:85;:::i;:::-;19213:92;;19314:93;19403:3;19314:93;:::i;:::-;19432:2;19427:3;19423:12;19416:19;;19039:402;;;:::o;19447:366::-;19589:3;19610:67;19674:2;19669:3;19610:67;:::i;:::-;19603:74;;19686:93;19775:3;19686:93;:::i;:::-;19804:2;19799:3;19795:12;19788:19;;19447:366;;;:::o;19819:400::-;19979:3;20000:84;20082:1;20077:3;20000:84;:::i;:::-;19993:91;;20093:93;20182:3;20093:93;:::i;:::-;20211:1;20206:3;20202:11;20195:18;;19819:400;;;:::o;20225:366::-;20367:3;20388:67;20452:2;20447:3;20388:67;:::i;:::-;20381:74;;20464:93;20553:3;20464:93;:::i;:::-;20582:2;20577:3;20573:12;20566:19;;20225:366;;;:::o;20597:400::-;20757:3;20778:84;20860:1;20855:3;20778:84;:::i;:::-;20771:91;;20871:93;20960:3;20871:93;:::i;:::-;20989:1;20984:3;20980:11;20973:18;;20597:400;;;:::o;21003:::-;21163:3;21184:84;21266:1;21261:3;21184:84;:::i;:::-;21177:91;;21277:93;21366:3;21277:93;:::i;:::-;21395:1;21390:3;21386:11;21379:18;;21003:400;;;:::o;21409:402::-;21569:3;21590:85;21672:2;21667:3;21590:85;:::i;:::-;21583:92;;21684:93;21773:3;21684:93;:::i;:::-;21802:2;21797:3;21793:12;21786:19;;21409:402;;;:::o;21817:400::-;21977:3;21998:84;22080:1;22075:3;21998:84;:::i;:::-;21991:91;;22091:93;22180:3;22091:93;:::i;:::-;22209:1;22204:3;22200:11;22193:18;;21817:400;;;:::o;22223:366::-;22365:3;22386:67;22450:2;22445:3;22386:67;:::i;:::-;22379:74;;22462:93;22551:3;22462:93;:::i;:::-;22580:2;22575:3;22571:12;22564:19;;22223:366;;;:::o;22595:118::-;22682:24;22700:5;22682:24;:::i;:::-;22677:3;22670:37;22595:118;;:::o;22719:157::-;22824:45;22844:24;22862:5;22844:24;:::i;:::-;22824:45;:::i;:::-;22819:3;22812:58;22719:157;;:::o;22882:271::-;23012:3;23034:93;23123:3;23114:6;23034:93;:::i;:::-;23027:100;;23144:3;23137:10;;22882:271;;;;:::o;23159:435::-;23339:3;23361:95;23452:3;23443:6;23361:95;:::i;:::-;23354:102;;23473:95;23564:3;23555:6;23473:95;:::i;:::-;23466:102;;23585:3;23578:10;;23159:435;;;;;:::o;23600:1075::-;23972:3;23994:95;24085:3;24076:6;23994:95;:::i;:::-;23987:102;;24106:95;24197:3;24188:6;24106:95;:::i;:::-;24099:102;;24218:95;24309:3;24300:6;24218:95;:::i;:::-;24211:102;;24330:95;24421:3;24412:6;24330:95;:::i;:::-;24323:102;;24442:95;24533:3;24524:6;24442:95;:::i;:::-;24435:102;;24554:95;24645:3;24636:6;24554:95;:::i;:::-;24547:102;;24666:3;24659:10;;23600:1075;;;;;;;;;:::o;24681:1395::-;25149:3;25171:95;25262:3;25253:6;25171:95;:::i;:::-;25164:102;;25283:95;25374:3;25365:6;25283:95;:::i;:::-;25276:102;;25395:95;25486:3;25477:6;25395:95;:::i;:::-;25388:102;;25507:95;25598:3;25589:6;25507:95;:::i;:::-;25500:102;;25619:95;25710:3;25701:6;25619:95;:::i;:::-;25612:102;;25731:95;25822:3;25813:6;25731:95;:::i;:::-;25724:102;;25843:95;25934:3;25925:6;25843:95;:::i;:::-;25836:102;;25955:95;26046:3;26037:6;25955:95;:::i;:::-;25948:102;;26067:3;26060:10;;24681:1395;;;;;;;;;;;:::o;26082:967::-;26464:3;26486:95;26577:3;26568:6;26486:95;:::i;:::-;26479:102;;26598:148;26742:3;26598:148;:::i;:::-;26591:155;;26763:95;26854:3;26845:6;26763:95;:::i;:::-;26756:102;;26875:148;27019:3;26875:148;:::i;:::-;26868:155;;27040:3;27033:10;;26082:967;;;;;:::o;27055:663::-;27296:3;27318:148;27462:3;27318:148;:::i;:::-;27311:155;;27476:75;27547:3;27538:6;27476:75;:::i;:::-;27576:2;27571:3;27567:12;27560:19;;27589:75;27660:3;27651:6;27589:75;:::i;:::-;27689:2;27684:3;27680:12;27673:19;;27709:3;27702:10;;27055:663;;;;;:::o;27724:1659::-;28356:3;28378:148;28522:3;28378:148;:::i;:::-;28371:155;;28543:95;28634:3;28625:6;28543:95;:::i;:::-;28536:102;;28655:148;28799:3;28655:148;:::i;:::-;28648:155;;28820:95;28911:3;28902:6;28820:95;:::i;:::-;28813:102;;28932:148;29076:3;28932:148;:::i;:::-;28925:155;;29097:95;29188:3;29179:6;29097:95;:::i;:::-;29090:102;;29209:148;29353:3;29209:148;:::i;:::-;29202:155;;29374:3;29367:10;;27724:1659;;;;;;:::o;29389:663::-;29630:3;29652:148;29796:3;29652:148;:::i;:::-;29645:155;;29810:75;29881:3;29872:6;29810:75;:::i;:::-;29910:2;29905:3;29901:12;29894:19;;29923:75;29994:3;29985:6;29923:75;:::i;:::-;30023:2;30018:3;30014:12;30007:19;;30043:3;30036:10;;29389:663;;;;;:::o;30058:541::-;30291:3;30313:148;30457:3;30313:148;:::i;:::-;30306:155;;30478:95;30569:3;30560:6;30478:95;:::i;:::-;30471:102;;30590:3;30583:10;;30058:541;;;;:::o;30605:522::-;30818:3;30840:148;30984:3;30840:148;:::i;:::-;30833:155;;30998:75;31069:3;31060:6;30998:75;:::i;:::-;31098:2;31093:3;31089:12;31082:19;;31118:3;31111:10;;30605:522;;;;:::o;31133:541::-;31366:3;31388:148;31532:3;31388:148;:::i;:::-;31381:155;;31553:95;31644:3;31635:6;31553:95;:::i;:::-;31546:102;;31665:3;31658:10;;31133:541;;;;:::o;31680:663::-;31921:3;31943:148;32087:3;31943:148;:::i;:::-;31936:155;;32101:75;32172:3;32163:6;32101:75;:::i;:::-;32201:2;32196:3;32192:12;32185:19;;32214:75;32285:3;32276:6;32214:75;:::i;:::-;32314:2;32309:3;32305:12;32298:19;;32334:3;32327:10;;31680:663;;;;;:::o;32349:541::-;32582:3;32604:148;32748:3;32604:148;:::i;:::-;32597:155;;32769:95;32860:3;32851:6;32769:95;:::i;:::-;32762:102;;32881:3;32874:10;;32349:541;;;;:::o;32896:663::-;33137:3;33159:148;33303:3;33159:148;:::i;:::-;33152:155;;33317:75;33388:3;33379:6;33317:75;:::i;:::-;33417:2;33412:3;33408:12;33401:19;;33430:75;33501:3;33492:6;33430:75;:::i;:::-;33530:2;33525:3;33521:12;33514:19;;33550:3;33543:10;;32896:663;;;;;:::o;33565:522::-;33778:3;33800:148;33944:3;33800:148;:::i;:::-;33793:155;;33958:75;34029:3;34020:6;33958:75;:::i;:::-;34058:2;34053:3;34049:12;34042:19;;34078:3;34071:10;;33565:522;;;;:::o;34093:663::-;34334:3;34356:148;34500:3;34356:148;:::i;:::-;34349:155;;34514:75;34585:3;34576:6;34514:75;:::i;:::-;34614:2;34609:3;34605:12;34598:19;;34627:75;34698:3;34689:6;34627:75;:::i;:::-;34727:2;34722:3;34718:12;34711:19;;34747:3;34740:10;;34093:663;;;;;:::o;34762:222::-;34855:4;34893:2;34882:9;34878:18;34870:26;;34906:71;34974:1;34963:9;34959:17;34950:6;34906:71;:::i;:::-;34762:222;;;;:::o;34990:640::-;35185:4;35223:3;35212:9;35208:19;35200:27;;35237:71;35305:1;35294:9;35290:17;35281:6;35237:71;:::i;:::-;35318:72;35386:2;35375:9;35371:18;35362:6;35318:72;:::i;:::-;35400;35468:2;35457:9;35453:18;35444:6;35400:72;:::i;:::-;35519:9;35513:4;35509:20;35504:2;35493:9;35489:18;35482:48;35547:76;35618:4;35609:6;35547:76;:::i;:::-;35539:84;;34990:640;;;;;;;:::o;35636:210::-;35723:4;35761:2;35750:9;35746:18;35738:26;;35774:65;35836:1;35825:9;35821:17;35812:6;35774:65;:::i;:::-;35636:210;;;;:::o;35852:313::-;35965:4;36003:2;35992:9;35988:18;35980:26;;36052:9;36046:4;36042:20;36038:1;36027:9;36023:17;36016:47;36080:78;36153:4;36144:6;36080:78;:::i;:::-;36072:86;;35852:313;;;;:::o;36171:419::-;36337:4;36375:2;36364:9;36360:18;36352:26;;36424:9;36418:4;36414:20;36410:1;36399:9;36395:17;36388:47;36452:131;36578:4;36452:131;:::i;:::-;36444:139;;36171:419;;;:::o;36596:::-;36762:4;36800:2;36789:9;36785:18;36777:26;;36849:9;36843:4;36839:20;36835:1;36824:9;36820:17;36813:47;36877:131;37003:4;36877:131;:::i;:::-;36869:139;;36596:419;;;:::o;37021:::-;37187:4;37225:2;37214:9;37210:18;37202:26;;37274:9;37268:4;37264:20;37260:1;37249:9;37245:17;37238:47;37302:131;37428:4;37302:131;:::i;:::-;37294:139;;37021:419;;;:::o;37446:::-;37612:4;37650:2;37639:9;37635:18;37627:26;;37699:9;37693:4;37689:20;37685:1;37674:9;37670:17;37663:47;37727:131;37853:4;37727:131;:::i;:::-;37719:139;;37446:419;;;:::o;37871:::-;38037:4;38075:2;38064:9;38060:18;38052:26;;38124:9;38118:4;38114:20;38110:1;38099:9;38095:17;38088:47;38152:131;38278:4;38152:131;:::i;:::-;38144:139;;37871:419;;;:::o;38296:::-;38462:4;38500:2;38489:9;38485:18;38477:26;;38549:9;38543:4;38539:20;38535:1;38524:9;38520:17;38513:47;38577:131;38703:4;38577:131;:::i;:::-;38569:139;;38296:419;;;:::o;38721:::-;38887:4;38925:2;38914:9;38910:18;38902:26;;38974:9;38968:4;38964:20;38960:1;38949:9;38945:17;38938:47;39002:131;39128:4;39002:131;:::i;:::-;38994:139;;38721:419;;;:::o;39146:::-;39312:4;39350:2;39339:9;39335:18;39327:26;;39399:9;39393:4;39389:20;39385:1;39374:9;39370:17;39363:47;39427:131;39553:4;39427:131;:::i;:::-;39419:139;;39146:419;;;:::o;39571:::-;39737:4;39775:2;39764:9;39760:18;39752:26;;39824:9;39818:4;39814:20;39810:1;39799:9;39795:17;39788:47;39852:131;39978:4;39852:131;:::i;:::-;39844:139;;39571:419;;;:::o;39996:::-;40162:4;40200:2;40189:9;40185:18;40177:26;;40249:9;40243:4;40239:20;40235:1;40224:9;40220:17;40213:47;40277:131;40403:4;40277:131;:::i;:::-;40269:139;;39996:419;;;:::o;40421:::-;40587:4;40625:2;40614:9;40610:18;40602:26;;40674:9;40668:4;40664:20;40660:1;40649:9;40645:17;40638:47;40702:131;40828:4;40702:131;:::i;:::-;40694:139;;40421:419;;;:::o;40846:::-;41012:4;41050:2;41039:9;41035:18;41027:26;;41099:9;41093:4;41089:20;41085:1;41074:9;41070:17;41063:47;41127:131;41253:4;41127:131;:::i;:::-;41119:139;;40846:419;;;:::o;41271:::-;41437:4;41475:2;41464:9;41460:18;41452:26;;41524:9;41518:4;41514:20;41510:1;41499:9;41495:17;41488:47;41552:131;41678:4;41552:131;:::i;:::-;41544:139;;41271:419;;;:::o;41696:::-;41862:4;41900:2;41889:9;41885:18;41877:26;;41949:9;41943:4;41939:20;41935:1;41924:9;41920:17;41913:47;41977:131;42103:4;41977:131;:::i;:::-;41969:139;;41696:419;;;:::o;42121:::-;42287:4;42325:2;42314:9;42310:18;42302:26;;42374:9;42368:4;42364:20;42360:1;42349:9;42345:17;42338:47;42402:131;42528:4;42402:131;:::i;:::-;42394:139;;42121:419;;;:::o;42546:::-;42712:4;42750:2;42739:9;42735:18;42727:26;;42799:9;42793:4;42789:20;42785:1;42774:9;42770:17;42763:47;42827:131;42953:4;42827:131;:::i;:::-;42819:139;;42546:419;;;:::o;42971:::-;43137:4;43175:2;43164:9;43160:18;43152:26;;43224:9;43218:4;43214:20;43210:1;43199:9;43195:17;43188:47;43252:131;43378:4;43252:131;:::i;:::-;43244:139;;42971:419;;;:::o;43396:::-;43562:4;43600:2;43589:9;43585:18;43577:26;;43649:9;43643:4;43639:20;43635:1;43624:9;43620:17;43613:47;43677:131;43803:4;43677:131;:::i;:::-;43669:139;;43396:419;;;:::o;43821:::-;43987:4;44025:2;44014:9;44010:18;44002:26;;44074:9;44068:4;44064:20;44060:1;44049:9;44045:17;44038:47;44102:131;44228:4;44102:131;:::i;:::-;44094:139;;43821:419;;;:::o;44246:::-;44412:4;44450:2;44439:9;44435:18;44427:26;;44499:9;44493:4;44489:20;44485:1;44474:9;44470:17;44463:47;44527:131;44653:4;44527:131;:::i;:::-;44519:139;;44246:419;;;:::o;44671:::-;44837:4;44875:2;44864:9;44860:18;44852:26;;44924:9;44918:4;44914:20;44910:1;44899:9;44895:17;44888:47;44952:131;45078:4;44952:131;:::i;:::-;44944:139;;44671:419;;;:::o;45096:222::-;45189:4;45227:2;45216:9;45212:18;45204:26;;45240:71;45308:1;45297:9;45293:17;45284:6;45240:71;:::i;:::-;45096:222;;;;:::o;45324:129::-;45358:6;45385:20;;:::i;:::-;45375:30;;45414:33;45442:4;45434:6;45414:33;:::i;:::-;45324:129;;;:::o;45459:75::-;45492:6;45525:2;45519:9;45509:19;;45459:75;:::o;45540:307::-;45601:4;45691:18;45683:6;45680:30;45677:56;;;45713:18;;:::i;:::-;45677:56;45751:29;45773:6;45751:29;:::i;:::-;45743:37;;45835:4;45829;45825:15;45817:23;;45540:307;;;:::o;45853:98::-;45904:6;45938:5;45932:12;45922:22;;45853:98;;;:::o;45957:99::-;46009:6;46043:5;46037:12;46027:22;;45957:99;;;:::o;46062:168::-;46145:11;46179:6;46174:3;46167:19;46219:4;46214:3;46210:14;46195:29;;46062:168;;;;:::o;46236:147::-;46337:11;46374:3;46359:18;;46236:147;;;;:::o;46389:169::-;46473:11;46507:6;46502:3;46495:19;46547:4;46542:3;46538:14;46523:29;;46389:169;;;;:::o;46564:148::-;46666:11;46703:3;46688:18;;46564:148;;;;:::o;46718:305::-;46758:3;46777:20;46795:1;46777:20;:::i;:::-;46772:25;;46811:20;46829:1;46811:20;:::i;:::-;46806:25;;46965:1;46897:66;46893:74;46890:1;46887:81;46884:107;;;46971:18;;:::i;:::-;46884:107;47015:1;47012;47008:9;47001:16;;46718:305;;;;:::o;47029:185::-;47069:1;47086:20;47104:1;47086:20;:::i;:::-;47081:25;;47120:20;47138:1;47120:20;:::i;:::-;47115:25;;47159:1;47149:35;;47164:18;;:::i;:::-;47149:35;47206:1;47203;47199:9;47194:14;;47029:185;;;;:::o;47220:348::-;47260:7;47283:20;47301:1;47283:20;:::i;:::-;47278:25;;47317:20;47335:1;47317:20;:::i;:::-;47312:25;;47505:1;47437:66;47433:74;47430:1;47427:81;47422:1;47415:9;47408:17;47404:105;47401:131;;;47512:18;;:::i;:::-;47401:131;47560:1;47557;47553:9;47542:20;;47220:348;;;;:::o;47574:191::-;47614:4;47634:20;47652:1;47634:20;:::i;:::-;47629:25;;47668:20;47686:1;47668:20;:::i;:::-;47663:25;;47707:1;47704;47701:8;47698:34;;;47712:18;;:::i;:::-;47698:34;47757:1;47754;47750:9;47742:17;;47574:191;;;;:::o;47771:96::-;47808:7;47837:24;47855:5;47837:24;:::i;:::-;47826:35;;47771:96;;;:::o;47873:90::-;47907:7;47950:5;47943:13;47936:21;47925:32;;47873:90;;;:::o;47969:149::-;48005:7;48045:66;48038:5;48034:78;48023:89;;47969:149;;;:::o;48124:126::-;48161:7;48201:42;48194:5;48190:54;48179:65;;48124:126;;;:::o;48256:77::-;48293:7;48322:5;48311:16;;48256:77;;;:::o;48339:154::-;48423:6;48418:3;48413;48400:30;48485:1;48476:6;48471:3;48467:16;48460:27;48339:154;;;:::o;48499:307::-;48567:1;48577:113;48591:6;48588:1;48585:13;48577:113;;;48676:1;48671:3;48667:11;48661:18;48657:1;48652:3;48648:11;48641:39;48613:2;48610:1;48606:10;48601:15;;48577:113;;;48708:6;48705:1;48702:13;48699:101;;;48788:1;48779:6;48774:3;48770:16;48763:27;48699:101;48548:258;48499:307;;;:::o;48812:320::-;48856:6;48893:1;48887:4;48883:12;48873:22;;48940:1;48934:4;48930:12;48961:18;48951:81;;49017:4;49009:6;49005:17;48995:27;;48951:81;49079:2;49071:6;49068:14;49048:18;49045:38;49042:84;;;49098:18;;:::i;:::-;49042:84;48863:269;48812:320;;;:::o;49138:281::-;49221:27;49243:4;49221:27;:::i;:::-;49213:6;49209:40;49351:6;49339:10;49336:22;49315:18;49303:10;49300:34;49297:62;49294:88;;;49362:18;;:::i;:::-;49294:88;49402:10;49398:2;49391:22;49181:238;49138:281;;:::o;49425:233::-;49464:3;49487:24;49505:5;49487:24;:::i;:::-;49478:33;;49533:66;49526:5;49523:77;49520:103;;;49603:18;;:::i;:::-;49520:103;49650:1;49643:5;49639:13;49632:20;;49425:233;;;:::o;49664:100::-;49703:7;49732:26;49752:5;49732:26;:::i;:::-;49721:37;;49664:100;;;:::o;49770:94::-;49809:7;49838:20;49852:5;49838:20;:::i;:::-;49827:31;;49770:94;;;:::o;49870:79::-;49909:7;49938:5;49927:16;;49870:79;;;:::o;49955:176::-;49987:1;50004:20;50022:1;50004:20;:::i;:::-;49999:25;;50038:20;50056:1;50038:20;:::i;:::-;50033:25;;50077:1;50067:35;;50082:18;;:::i;:::-;50067:35;50123:1;50120;50116:9;50111:14;;49955:176;;;;:::o;50137:180::-;50185:77;50182:1;50175:88;50282:4;50279:1;50272:15;50306:4;50303:1;50296:15;50323:180;50371:77;50368:1;50361:88;50468:4;50465:1;50458:15;50492:4;50489:1;50482:15;50509:180;50557:77;50554:1;50547:88;50654:4;50651:1;50644:15;50678:4;50675:1;50668:15;50695:180;50743:77;50740:1;50733:88;50840:4;50837:1;50830:15;50864:4;50861:1;50854:15;50881:180;50929:77;50926:1;50919:88;51026:4;51023:1;51016:15;51050:4;51047:1;51040:15;51067:180;51115:77;51112:1;51105:88;51212:4;51209:1;51202:15;51236:4;51233:1;51226:15;51253:117;51362:1;51359;51352:12;51376:117;51485:1;51482;51475:12;51499:117;51608:1;51605;51598:12;51622:117;51731:1;51728;51721:12;51745:102;51786:6;51837:2;51833:7;51828:2;51821:5;51817:14;51813:28;51803:38;;51745:102;;;:::o;51853:94::-;51886:8;51934:5;51930:2;51926:14;51905:35;;51853:94;;;:::o;51953:155::-;52093:7;52089:1;52081:6;52077:14;52070:31;51953:155;:::o;52114:230::-;52254:34;52250:1;52242:6;52238:14;52231:58;52323:13;52318:2;52310:6;52306:15;52299:38;52114:230;:::o;52350:237::-;52490:34;52486:1;52478:6;52474:14;52467:58;52559:20;52554:2;52546:6;52542:15;52535:45;52350:237;:::o;52593:225::-;52733:34;52729:1;52721:6;52717:14;52710:58;52802:8;52797:2;52789:6;52785:15;52778:33;52593:225;:::o;52824:165::-;52964:17;52960:1;52952:6;52948:14;52941:41;52824:165;:::o;52995:178::-;53135:30;53131:1;53123:6;53119:14;53112:54;52995:178;:::o;53179:214::-;53319:66;53315:1;53307:6;53303:14;53296:90;53179:214;:::o;53399:151::-;53539:3;53535:1;53527:6;53523:14;53516:27;53399:151;:::o;53556:152::-;53696:4;53692:1;53684:6;53680:14;53673:28;53556:152;:::o;53714:223::-;53854:34;53850:1;53842:6;53838:14;53831:58;53923:6;53918:2;53910:6;53906:15;53899:31;53714:223;:::o;53943:175::-;54083:27;54079:1;54071:6;54067:14;54060:51;53943:175;:::o;54124:231::-;54264:34;54260:1;54252:6;54248:14;54241:58;54333:14;54328:2;54320:6;54316:15;54309:39;54124:231;:::o;54361:214::-;54501:66;54497:1;54489:6;54485:14;54478:90;54361:214;:::o;54581:315::-;54721:66;54717:1;54709:6;54705:14;54698:90;54822:66;54817:2;54809:6;54805:15;54798:91;54581:315;:::o;54902:243::-;55042:34;55038:1;55030:6;55026:14;55019:58;55111:26;55106:2;55098:6;55094:15;55087:51;54902:243;:::o;55151:229::-;55291:34;55287:1;55279:6;55275:14;55268:58;55360:12;55355:2;55347:6;55343:15;55336:37;55151:229;:::o;55386:228::-;55526:34;55522:1;55514:6;55510:14;55503:58;55595:11;55590:2;55582:6;55578:15;55571:36;55386:228;:::o;55620:214::-;55760:66;55756:1;55748:6;55744:14;55737:90;55620:214;:::o;55840:182::-;55980:34;55976:1;55968:6;55964:14;55957:58;55840:182;:::o;56028:::-;56168:34;56164:1;56156:6;56152:14;56145:58;56028:182;:::o;56216:259::-;56356:66;56352:1;56344:6;56340:14;56333:90;56457:10;56452:2;56444:6;56440:15;56433:35;56216:259;:::o;56481:555::-;56621:66;56617:1;56609:6;56605:14;56598:90;56722:34;56717:2;56709:6;56705:15;56698:59;56791:34;56786:2;56778:6;56774:15;56767:59;56860:66;56855:2;56847:6;56843:15;56836:91;56962:66;56956:3;56948:6;56944:16;56937:92;56481:555;:::o;57042:231::-;57182:34;57178:1;57170:6;57166:14;57159:58;57251:14;57246:2;57238:6;57234:15;57227:39;57042:231;:::o;57279:161::-;57419:13;57415:1;57407:6;57403:14;57396:37;57279:161;:::o;57446:182::-;57586:34;57582:1;57574:6;57570:14;57563:58;57446:182;:::o;57634:228::-;57774:34;57770:1;57762:6;57758:14;57751:58;57843:11;57838:2;57830:6;57826:15;57819:36;57634:228;:::o;57868:159::-;58008:11;58004:1;57996:6;57992:14;57985:35;57868:159;:::o;58033:220::-;58173:34;58169:1;58161:6;58157:14;58150:58;58242:3;58237:2;58229:6;58225:15;58218:28;58033:220;:::o;58259:179::-;58399:31;58395:1;58387:6;58383:14;58376:55;58259:179;:::o;58444:236::-;58584:34;58580:1;58572:6;58568:14;58561:58;58653:19;58648:2;58640:6;58636:15;58629:44;58444:236;:::o;58686:152::-;58826:4;58822:1;58814:6;58810:14;58803:28;58686:152;:::o;58844:231::-;58984:34;58980:1;58972:6;58968:14;58961:58;59053:14;59048:2;59040:6;59036:15;59029:39;58844:231;:::o;59081:151::-;59221:3;59217:1;59209:6;59205:14;59198:27;59081:151;:::o;59238:155::-;59378:7;59374:1;59366:6;59362:14;59355:31;59238:155;:::o;59399:160::-;59539:12;59535:1;59527:6;59523:14;59516:36;59399:160;:::o;59565:152::-;59705:4;59701:1;59693:6;59689:14;59682:28;59565:152;:::o;59723:181::-;59863:33;59859:1;59851:6;59847:14;59840:57;59723:181;:::o;59910:122::-;59983:24;60001:5;59983:24;:::i;:::-;59976:5;59973:35;59963:63;;60022:1;60019;60012:12;59963:63;59910:122;:::o;60038:116::-;60108:21;60123:5;60108:21;:::i;:::-;60101:5;60098:32;60088:60;;60144:1;60141;60134:12;60088:60;60038:116;:::o;60160:120::-;60232:23;60249:5;60232:23;:::i;:::-;60225:5;60222:34;60212:62;;60270:1;60267;60260:12;60212:62;60160:120;:::o;60286:122::-;60359:24;60377:5;60359:24;:::i;:::-;60352:5;60349:35;60339:63;;60398:1;60395;60388:12;60339:63;60286:122;:::o

Swarm Source

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