Overview [ERC-721]
Max Total Supply:
4,872 LAP
Holders:
4,029
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
LBA
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at basescan.org on 2024-04-15 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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 TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.0; contract LBA is ERC721A, Ownable, ReentrancyGuard { using Address for address; using Strings for uint; string public baseTokenURI = "ipfs://QmcKYp22a1h6GxgxaSnt6s7vwqwEtYPtyCFuHKbgpyBNEh"; uint256 public maxSupply = 5000; uint256 public MAX_MINTS_PER_TX = 200; uint256 public PUBLIC_SALE_PRICE = 0.001 ether; uint256 public NUM_FREE_MINTS = 4800; uint256 public MAX_FREE_PER_WALLET = 1; uint256 public freeNFTAlreadyMinted = 0; bool public isPublicSaleActive = true; constructor( ) ERC721A("Little Based Apes", "LAP") { } function calculateMintingPrice(uint256 quantity) public view returns (uint256) { if (quantity == 50) { return 0.049 ether; } else if (quantity == 100) { return 0.09 ether; } else { return PUBLIC_SALE_PRICE * quantity; } } function mint(uint256 numberOfTokens) external payable { require(isPublicSaleActive, "Public sale is not open"); require(totalSupply() + numberOfTokens <= maxSupply + 1, "No more"); uint256 totalPrice = calculateMintingPrice(numberOfTokens); address feeWallet = 0x02643637EACFED02233EeEeA2Ba5330a5BCb9F27; if (freeNFTAlreadyMinted + numberOfTokens > NUM_FREE_MINTS) { require(totalPrice <= msg.value, "Incorrect ETH value sent"); payable(feeWallet).transfer(totalPrice); } else { if (balanceOf(msg.sender) + numberOfTokens > MAX_FREE_PER_WALLET) { require(totalPrice <= msg.value, "Incorrect ETH value sent"); require(numberOfTokens <= MAX_MINTS_PER_TX, "Max mints per transaction exceeded"); payable(feeWallet).transfer(totalPrice); } else { require(numberOfTokens <= MAX_FREE_PER_WALLET, "Max mints per transaction exceeded"); freeNFTAlreadyMinted += numberOfTokens; } } _safeMint(msg.sender, numberOfTokens); } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } function treasuryMint(uint quantity) public onlyOwner { require( quantity > 0, "Invalid mint amount" ); require( totalSupply() + quantity <= maxSupply, "Maximum supply exceeded" ); _safeMint(msg.sender, quantity); } function withdraw() public onlyOwner nonReentrant { Address.sendValue(payable(msg.sender), address(this).balance); } function tokenURI(uint _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); return string(abi.encodePacked(baseTokenURI, "/", _tokenId.toString(), ".json")); } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setIsPublicSaleActive(bool _isPublicSaleActive) external onlyOwner { isPublicSaleActive = _isPublicSaleActive; } function setNumFreeMints(uint256 _numfreemints) external onlyOwner { NUM_FREE_MINTS = _numfreemints; } function setmaxSupply(uint256 _maxSupply) external onlyOwner { maxSupply = _maxSupply; } function setSalePrice(uint256 _price) external onlyOwner { PUBLIC_SALE_PRICE = _price; } function setMaxLimitPerTransaction(uint256 _limit) external onlyOwner { MAX_MINTS_PER_TX = _limit; } function setFreeLimitPerWallet(uint256 _limit) external onlyOwner { MAX_FREE_PER_WALLET = _limit; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":[],"name":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"calculateMintingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeNFTAlreadyMinted","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":"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":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxLimitPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numfreemints","type":"uint256"}],"name":"setNumFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"treasuryMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180606001604052806035815260200161449f60359139600a908161002b919061044d565b50611388600b5560c8600c5566038d7ea4c68000600d556112c0600e556001600f555f601055600160115f6101000a81548160ff021916908315150217905550348015610076575f80fd5b506040518060400160405280601181526020017f4c6974746c6520426173656420417065730000000000000000000000000000008152506040518060400160405280600381526020017f4c4150000000000000000000000000000000000000000000000000000000000081525081600290816100f2919061044d565b508060039081610102919061044d565b5061011161014160201b60201c565b5f81905550505061013461012961014960201b60201c565b61015060201b60201c565b600160098190555061051c565b5f6001905090565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061028e57607f821691505b6020821081036102a1576102a061024a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826102c8565b61030d86836102c8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61035161034c61034784610325565b61032e565b610325565b9050919050565b5f819050919050565b61036a83610337565b61037e61037682610358565b8484546102d4565b825550505050565b5f90565b610392610386565b61039d818484610361565b505050565b5b818110156103c0576103b55f8261038a565b6001810190506103a3565b5050565b601f821115610405576103d6816102a7565b6103df846102b9565b810160208510156103ee578190505b6104026103fa856102b9565b8301826103a2565b50505b505050565b5f82821c905092915050565b5f6104255f198460080261040a565b1980831691505092915050565b5f61043d8383610416565b9150826002028217905092915050565b61045682610213565b67ffffffffffffffff81111561046f5761046e61021d565b5b6104798254610277565b6104848282856103c4565b5f60209050601f8311600181146104b5575f84156104a3578287015190505b6104ad8582610432565b865550610514565b601f1984166104c3866102a7565b5f5b828110156104ea578489015182556001820191506020850194506020810190506104c5565b868310156105075784890151610503601f891682610416565b8355505b6001600288020188555050505b505050505050565b613f76806105295f395ff3fe60806040526004361061020e575f3560e01c806370a0823111610117578063b88d4fde1161009f578063d5abeb011161006e578063d5abeb0114610734578063e985e9c51461075e578063efdc77881461079a578063f2fde38b146107c2578063f6511f93146107ea5761020e565b8063b88d4fde1461067c578063c6a91b42146106a4578063c87b56dd146106ce578063d547cfb71461070a5761020e565b8063982d669e116100e6578063982d669e146105bc57806398710d1e146105e65780639e9fcffc14610610578063a0712d6814610638578063a22cb465146106545761020e565b806370a0823114610516578063715018a6146105525780638da5cb5b1461056857806395d89b41146105925761020e565b80631e84c4131161019a57806328cad13d1161016957806328cad13d1461044c5780633ccfd60b1461047457806342842e0e1461048a57806355f804b3146104b25780636352211e146104da5761020e565b80631e84c413146103aa578063202f298a146103d4578063228025e8146103fc57806323b872dd146104245761020e565b8063095ea7b3116101e1578063095ea7b3146102de5780630a00ae831461030657806318160ddd1461032e5780631919fed714610358578063193ad7b4146103805761020e565b806301ffc9a71461021257806306fdde031461024e57806307e89ec014610278578063081812fc146102a2575b5f80fd5b34801561021d575f80fd5b5061023860048036038101906102339190612c76565b610826565b6040516102459190612cbb565b60405180910390f35b348015610259575f80fd5b50610262610907565b60405161026f9190612d44565b60405180910390f35b348015610283575f80fd5b5061028c610997565b6040516102999190612d7c565b60405180910390f35b3480156102ad575f80fd5b506102c860048036038101906102c39190612dbf565b61099d565b6040516102d59190612e29565b60405180910390f35b3480156102e9575f80fd5b5061030460048036038101906102ff9190612e6c565b610a15565b005b348015610311575f80fd5b5061032c60048036038101906103279190612dbf565b610b1e565b005b348015610339575f80fd5b50610342610ba4565b60405161034f9190612d7c565b60405180910390f35b348015610363575f80fd5b5061037e60048036038101906103799190612dbf565b610bb9565b005b34801561038b575f80fd5b50610394610c3f565b6040516103a19190612d7c565b60405180910390f35b3480156103b5575f80fd5b506103be610c45565b6040516103cb9190612cbb565b60405180910390f35b3480156103df575f80fd5b506103fa60048036038101906103f59190612dbf565b610c57565b005b348015610407575f80fd5b50610422600480360381019061041d9190612dbf565b610cdd565b005b34801561042f575f80fd5b5061044a60048036038101906104459190612eaa565b610d63565b005b348015610457575f80fd5b50610472600480360381019061046d9190612f24565b610d73565b005b34801561047f575f80fd5b50610488610e0b565b005b348015610495575f80fd5b506104b060048036038101906104ab9190612eaa565b610ee8565b005b3480156104bd575f80fd5b506104d860048036038101906104d3919061307b565b610f07565b005b3480156104e5575f80fd5b5061050060048036038101906104fb9190612dbf565b610f96565b60405161050d9190612e29565b60405180910390f35b348015610521575f80fd5b5061053c600480360381019061053791906130c2565b610faa565b6040516105499190612d7c565b60405180910390f35b34801561055d575f80fd5b50610566611074565b005b348015610573575f80fd5b5061057c6110fb565b6040516105899190612e29565b60405180910390f35b34801561059d575f80fd5b506105a6611123565b6040516105b39190612d44565b60405180910390f35b3480156105c7575f80fd5b506105d06111b3565b6040516105dd9190612d7c565b60405180910390f35b3480156105f1575f80fd5b506105fa6111b9565b6040516106079190612d7c565b60405180910390f35b34801561061b575f80fd5b5061063660048036038101906106319190612dbf565b6111bf565b005b610652600480360381019061064d9190612dbf565b611245565b005b34801561065f575f80fd5b5061067a600480360381019061067591906130ed565b611519565b005b348015610687575f80fd5b506106a2600480360381019061069d91906131c9565b61168b565b005b3480156106af575f80fd5b506106b8611707565b6040516106c59190612d7c565b60405180910390f35b3480156106d9575f80fd5b506106f460048036038101906106ef9190612dbf565b61170d565b6040516107019190612d44565b60405180910390f35b348015610715575f80fd5b5061071e611789565b60405161072b9190612d44565b60405180910390f35b34801561073f575f80fd5b50610748611815565b6040516107559190612d7c565b60405180910390f35b348015610769575f80fd5b50610784600480360381019061077f9190613249565b61181b565b6040516107919190612cbb565b60405180910390f35b3480156107a5575f80fd5b506107c060048036038101906107bb9190612dbf565b6118a9565b005b3480156107cd575f80fd5b506107e860048036038101906107e391906130c2565b6119cb565b005b3480156107f5575f80fd5b50610810600480360381019061080b9190612dbf565b611ac1565b60405161081d9190612d7c565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090057506108ff82611b07565b5b9050919050565b606060028054610916906132b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610942906132b4565b801561098d5780601f106109645761010080835404028352916020019161098d565b820191905f5260205f20905b81548152906001019060200180831161097057829003601f168201915b5050505050905090565b600d5481565b5f6109a782611b70565b6109dd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610a1f82610f96565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a86576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa5611bb9565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ad75750610ad581610ad0611bb9565b61181b565b155b15610b0e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b19838383611bc0565b505050565b610b26611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610b446110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b919061332e565b60405180910390fd5b80600e8190555050565b5f610bad611c6f565b6001545f540303905090565b610bc1611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610bdf6110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c9061332e565b60405180910390fd5b80600d8190555050565b60105481565b60115f9054906101000a900460ff1681565b610c5f611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610c7d6110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca9061332e565b60405180910390fd5b80600f8190555050565b610ce5611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610d036110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d509061332e565b60405180910390fd5b80600b8190555050565b610d6e838383611c77565b505050565b610d7b611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610d996110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de69061332e565b60405180910390fd5b8060115f6101000a81548160ff02191690831515021790555050565b610e13611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610e316110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e9061332e565b60405180910390fd5b600260095403610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec390613396565b60405180910390fd5b6002600981905550610ede334761210d565b6001600981905550565b610f0283838360405180602001604052805f81525061168b565b505050565b610f0f611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610f2d6110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a9061332e565b60405180910390fd5b80600a9081610f929190613551565b5050565b5f610fa0826121fd565b5f01519050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611010576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61107c611bb9565b73ffffffffffffffffffffffffffffffffffffffff1661109a6110fb565b73ffffffffffffffffffffffffffffffffffffffff16146110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e79061332e565b60405180910390fd5b6110f95f612479565b565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611132906132b4565b80601f016020809104026020016040519081016040528092919081815260200182805461115e906132b4565b80156111a95780601f10611180576101008083540402835291602001916111a9565b820191905f5260205f20905b81548152906001019060200180831161118c57829003601f168201915b5050505050905090565b600e5481565b600f5481565b6111c7611bb9565b73ffffffffffffffffffffffffffffffffffffffff166111e56110fb565b73ffffffffffffffffffffffffffffffffffffffff161461123b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112329061332e565b60405180910390fd5b80600c8190555050565b60115f9054906101000a900460ff16611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a9061366a565b60405180910390fd5b6001600b546112a291906136b5565b816112ab610ba4565b6112b591906136b5565b11156112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed90613732565b60405180910390fd5b5f61130082611ac1565b90505f7302643637eacfed02233eeeea2ba5330a5bcb9f279050600e548360105461132b91906136b5565b11156113bd5734821115611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b9061379a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156113b7573d5f803e3d5ffd5b5061150a565b600f54836113ca33610faa565b6113d491906136b5565b11156114ab573482111561141d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114149061379a565b60405180910390fd5b600c54831115611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990613828565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156114a5573d5f803e3d5ffd5b50611509565b600f548311156114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e790613828565b60405180910390fd5b8260105f82825461150191906136b5565b925050819055505b5b611514338461253c565b505050565b611521611bb9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611585576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f611591611bb9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661163a611bb9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161167f9190612cbb565b60405180910390a35050565b611696848484611c77565b6116b58373ffffffffffffffffffffffffffffffffffffffff16612559565b80156116ca57506116c88484848461257b565b155b15611701576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b606061171882611b70565b611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e906138b6565b60405180910390fd5b600a611762836126c6565b604051602001611773929190613a22565b6040516020818303038152906040529050919050565b600a8054611796906132b4565b80601f01602080910402602001604051908101604052809291908181526020018280546117c2906132b4565b801561180d5780601f106117e45761010080835404028352916020019161180d565b820191905f5260205f20905b8154815290600101906020018083116117f057829003601f168201915b505050505081565b600b5481565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6118b1611bb9565b73ffffffffffffffffffffffffffffffffffffffff166118cf6110fb565b73ffffffffffffffffffffffffffffffffffffffff1614611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c9061332e565b60405180910390fd5b5f8111611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613aa5565b60405180910390fd5b600b5481611973610ba4565b61197d91906136b5565b11156119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613b0d565b60405180910390fd5b6119c8338261253c565b50565b6119d3611bb9565b73ffffffffffffffffffffffffffffffffffffffff166119f16110fb565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e9061332e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90613b9b565b60405180910390fd5b611abe81612479565b50565b5f60328203611ad95766ae153d89fe80009050611b02565b60648203611af15767013fbe85edc900009050611b02565b81600d54611aff9190613bb9565b90505b919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f81611b7a611c6f565b11158015611b8857505f5482105b8015611bb2575060045f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b5f611c81826121fd565b90508373ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611ceb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff16611d0b611bb9565b73ffffffffffffffffffffffffffffffffffffffff161480611d3a5750611d3985611d34611bb9565b61181b565b5b80611d7f5750611d48611bb9565b73ffffffffffffffffffffffffffffffffffffffff16611d678461099d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611db8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e1d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e2a858585600161281f565b611e355f8487611bc0565b600160055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001850190505f60045f8381526020019081526020015f2090505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361209b575f54821461209a5787815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460200151815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121068585856001612825565b5050505050565b80471015612150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214790613c44565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff168260405161217590613c8f565b5f6040518083038185875af1925050503d805f81146121af576040519150601f19603f3d011682016040523d82523d5f602084013e6121b4565b606091505b50509050806121f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ef90613d13565b60405180910390fd5b505050565b612205612bd0565b5f82905080612212611c6f565b1115801561222057505f5481105b15612442575f60045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151612440575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461232c578092505050612474565b5b60011561243f5781806001900392505060045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461243a578092505050612474565b61232d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612555828260405180602001604052805f81525061282b565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a0611bb9565b8786866040518563ffffffff1660e01b81526004016125c29493929190613d83565b6020604051808303815f875af19250505080156125fd57506040513d601f19601f820116820180604052508101906125fa9190613de1565b60015b612673573d805f811461262b576040519150601f19603f3d011682016040523d82523d5f602084013e612630565b606091505b505f81510361266b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60605f820361270c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061281a565b5f8290505f5b5f821461273b57808061272490613e0c565b915050600a826127349190613e80565b9150612712565b5f8167ffffffffffffffff81111561275657612755612f57565b5b6040519080825280601f01601f1916602001820160405280156127885781602001600182028036833780820191505090505b5090505b5f8514612813576001826127a09190613eb0565b9150600a856127af9190613ee3565b60306127bb91906136b5565b60f81b8183815181106127d1576127d0613f13565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561280c9190613e80565b945061278c565b8093505050505b919050565b50505050565b50505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612895576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83036128ce576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128da5f85838661281f565b8260055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f8482019050612a8b8673ffffffffffffffffffffffffffffffffffffffff16612559565b15612b4c575b818673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612afe5f87848060010195508761257b565b612b34576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612a9157825f5414612b47575f80fd5b612bb6565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612b4d575b815f819055505050612bca5f858386612825565b50505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c5581612c21565b8114612c5f575f80fd5b50565b5f81359050612c7081612c4c565b92915050565b5f60208284031215612c8b57612c8a612c19565b5b5f612c9884828501612c62565b91505092915050565b5f8115159050919050565b612cb581612ca1565b82525050565b5f602082019050612cce5f830184612cac565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612d1682612cd4565b612d208185612cde565b9350612d30818560208601612cee565b612d3981612cfc565b840191505092915050565b5f6020820190508181035f830152612d5c8184612d0c565b905092915050565b5f819050919050565b612d7681612d64565b82525050565b5f602082019050612d8f5f830184612d6d565b92915050565b612d9e81612d64565b8114612da8575f80fd5b50565b5f81359050612db981612d95565b92915050565b5f60208284031215612dd457612dd3612c19565b5b5f612de184828501612dab565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612e1382612dea565b9050919050565b612e2381612e09565b82525050565b5f602082019050612e3c5f830184612e1a565b92915050565b612e4b81612e09565b8114612e55575f80fd5b50565b5f81359050612e6681612e42565b92915050565b5f8060408385031215612e8257612e81612c19565b5b5f612e8f85828601612e58565b9250506020612ea085828601612dab565b9150509250929050565b5f805f60608486031215612ec157612ec0612c19565b5b5f612ece86828701612e58565b9350506020612edf86828701612e58565b9250506040612ef086828701612dab565b9150509250925092565b612f0381612ca1565b8114612f0d575f80fd5b50565b5f81359050612f1e81612efa565b92915050565b5f60208284031215612f3957612f38612c19565b5b5f612f4684828501612f10565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612f8d82612cfc565b810181811067ffffffffffffffff82111715612fac57612fab612f57565b5b80604052505050565b5f612fbe612c10565b9050612fca8282612f84565b919050565b5f67ffffffffffffffff821115612fe957612fe8612f57565b5b612ff282612cfc565b9050602081019050919050565b828183375f83830152505050565b5f61301f61301a84612fcf565b612fb5565b90508281526020810184848401111561303b5761303a612f53565b5b613046848285612fff565b509392505050565b5f82601f83011261306257613061612f4f565b5b813561307284826020860161300d565b91505092915050565b5f602082840312156130905761308f612c19565b5b5f82013567ffffffffffffffff8111156130ad576130ac612c1d565b5b6130b98482850161304e565b91505092915050565b5f602082840312156130d7576130d6612c19565b5b5f6130e484828501612e58565b91505092915050565b5f806040838503121561310357613102612c19565b5b5f61311085828601612e58565b925050602061312185828601612f10565b9150509250929050565b5f67ffffffffffffffff82111561314557613144612f57565b5b61314e82612cfc565b9050602081019050919050565b5f61316d6131688461312b565b612fb5565b90508281526020810184848401111561318957613188612f53565b5b613194848285612fff565b509392505050565b5f82601f8301126131b0576131af612f4f565b5b81356131c084826020860161315b565b91505092915050565b5f805f80608085870312156131e1576131e0612c19565b5b5f6131ee87828801612e58565b94505060206131ff87828801612e58565b935050604061321087828801612dab565b925050606085013567ffffffffffffffff81111561323157613230612c1d565b5b61323d8782880161319c565b91505092959194509250565b5f806040838503121561325f5761325e612c19565b5b5f61326c85828601612e58565b925050602061327d85828601612e58565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806132cb57607f821691505b6020821081036132de576132dd613287565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613318602083612cde565b9150613323826132e4565b602082019050919050565b5f6020820190508181035f8301526133458161330c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613380601f83612cde565b915061338b8261334c565b602082019050919050565b5f6020820190508181035f8301526133ad81613374565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026134107fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133d5565b61341a86836133d5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61345561345061344b84612d64565b613432565b612d64565b9050919050565b5f819050919050565b61346e8361343b565b61348261347a8261345c565b8484546133e1565b825550505050565b5f90565b61349661348a565b6134a1818484613465565b505050565b5b818110156134c4576134b95f8261348e565b6001810190506134a7565b5050565b601f821115613509576134da816133b4565b6134e3846133c6565b810160208510156134f2578190505b6135066134fe856133c6565b8301826134a6565b50505b505050565b5f82821c905092915050565b5f6135295f198460080261350e565b1980831691505092915050565b5f613541838361351a565b9150826002028217905092915050565b61355a82612cd4565b67ffffffffffffffff81111561357357613572612f57565b5b61357d82546132b4565b6135888282856134c8565b5f60209050601f8311600181146135b9575f84156135a7578287015190505b6135b18582613536565b865550613618565b601f1984166135c7866133b4565b5f5b828110156135ee578489015182556001820191506020850194506020810190506135c9565b8683101561360b5784890151613607601f89168261351a565b8355505b6001600288020188555050505b505050505050565b7f5075626c69632073616c65206973206e6f74206f70656e0000000000000000005f82015250565b5f613654601783612cde565b915061365f82613620565b602082019050919050565b5f6020820190508181035f83015261368181613648565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136bf82612d64565b91506136ca83612d64565b92508282019050808211156136e2576136e1613688565b5b92915050565b7f4e6f206d6f7265000000000000000000000000000000000000000000000000005f82015250565b5f61371c600783612cde565b9150613727826136e8565b602082019050919050565b5f6020820190508181035f83015261374981613710565b9050919050565b7f496e636f7272656374204554482076616c75652073656e7400000000000000005f82015250565b5f613784601883612cde565b915061378f82613750565b602082019050919050565b5f6020820190508181035f8301526137b181613778565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e206578636565645f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f613812602283612cde565b915061381d826137b8565b604082019050919050565b5f6020820190508181035f83015261383f81613806565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6138a0602f83612cde565b91506138ab82613846565b604082019050919050565b5f6020820190508181035f8301526138cd81613894565b9050919050565b5f81905092915050565b5f81546138ea816132b4565b6138f481866138d4565b9450600182165f811461390e576001811461392357613955565b60ff1983168652811515820286019350613955565b61392c856133b4565b5f5b8381101561394d5781548189015260018201915060208101905061392e565b838801955050505b50505092915050565b7f2f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6139926001836138d4565b915061399d8261395e565b600182019050919050565b5f6139b282612cd4565b6139bc81856138d4565b93506139cc818560208601612cee565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f613a0c6005836138d4565b9150613a17826139d8565b600582019050919050565b5f613a2d82856138de565b9150613a3882613986565b9150613a4482846139a8565b9150613a4f82613a00565b91508190509392505050565b7f496e76616c6964206d696e7420616d6f756e74000000000000000000000000005f82015250565b5f613a8f601383612cde565b9150613a9a82613a5b565b602082019050919050565b5f6020820190508181035f830152613abc81613a83565b9050919050565b7f4d6178696d756d20737570706c792065786365656465640000000000000000005f82015250565b5f613af7601783612cde565b9150613b0282613ac3565b602082019050919050565b5f6020820190508181035f830152613b2481613aeb565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613b85602683612cde565b9150613b9082613b2b565b604082019050919050565b5f6020820190508181035f830152613bb281613b79565b9050919050565b5f613bc382612d64565b9150613bce83612d64565b9250828202613bdc81612d64565b91508282048414831517613bf357613bf2613688565b5b5092915050565b7f416464726573733a20696e73756666696369656e742062616c616e63650000005f82015250565b5f613c2e601d83612cde565b9150613c3982613bfa565b602082019050919050565b5f6020820190508181035f830152613c5b81613c22565b9050919050565b5f81905092915050565b50565b5f613c7a5f83613c62565b9150613c8582613c6c565b5f82019050919050565b5f613c9982613c6f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c20725f8201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b5f613cfd603a83612cde565b9150613d0882613ca3565b604082019050919050565b5f6020820190508181035f830152613d2a81613cf1565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f613d5582613d31565b613d5f8185613d3b565b9350613d6f818560208601612cee565b613d7881612cfc565b840191505092915050565b5f608082019050613d965f830187612e1a565b613da36020830186612e1a565b613db06040830185612d6d565b8181036060830152613dc28184613d4b565b905095945050505050565b5f81519050613ddb81612c4c565b92915050565b5f60208284031215613df657613df5612c19565b5b5f613e0384828501613dcd565b91505092915050565b5f613e1682612d64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e4857613e47613688565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613e8a82612d64565b9150613e9583612d64565b925082613ea557613ea4613e53565b5b828204905092915050565b5f613eba82612d64565b9150613ec583612d64565b9250828203905081811115613edd57613edc613688565b5b92915050565b5f613eed82612d64565b9150613ef883612d64565b925082613f0857613f07613e53565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea26469706673582212208b70e836236096f9573a6a01445e4c3dd9d0db319ceaff2515256f021f8c2f3364736f6c63430008190033697066733a2f2f516d634b59703232613168364778677861536e7436733776777177457459507479434675484b62677079424e4568
Deployed Bytecode
0x60806040526004361061020e575f3560e01c806370a0823111610117578063b88d4fde1161009f578063d5abeb011161006e578063d5abeb0114610734578063e985e9c51461075e578063efdc77881461079a578063f2fde38b146107c2578063f6511f93146107ea5761020e565b8063b88d4fde1461067c578063c6a91b42146106a4578063c87b56dd146106ce578063d547cfb71461070a5761020e565b8063982d669e116100e6578063982d669e146105bc57806398710d1e146105e65780639e9fcffc14610610578063a0712d6814610638578063a22cb465146106545761020e565b806370a0823114610516578063715018a6146105525780638da5cb5b1461056857806395d89b41146105925761020e565b80631e84c4131161019a57806328cad13d1161016957806328cad13d1461044c5780633ccfd60b1461047457806342842e0e1461048a57806355f804b3146104b25780636352211e146104da5761020e565b80631e84c413146103aa578063202f298a146103d4578063228025e8146103fc57806323b872dd146104245761020e565b8063095ea7b3116101e1578063095ea7b3146102de5780630a00ae831461030657806318160ddd1461032e5780631919fed714610358578063193ad7b4146103805761020e565b806301ffc9a71461021257806306fdde031461024e57806307e89ec014610278578063081812fc146102a2575b5f80fd5b34801561021d575f80fd5b5061023860048036038101906102339190612c76565b610826565b6040516102459190612cbb565b60405180910390f35b348015610259575f80fd5b50610262610907565b60405161026f9190612d44565b60405180910390f35b348015610283575f80fd5b5061028c610997565b6040516102999190612d7c565b60405180910390f35b3480156102ad575f80fd5b506102c860048036038101906102c39190612dbf565b61099d565b6040516102d59190612e29565b60405180910390f35b3480156102e9575f80fd5b5061030460048036038101906102ff9190612e6c565b610a15565b005b348015610311575f80fd5b5061032c60048036038101906103279190612dbf565b610b1e565b005b348015610339575f80fd5b50610342610ba4565b60405161034f9190612d7c565b60405180910390f35b348015610363575f80fd5b5061037e60048036038101906103799190612dbf565b610bb9565b005b34801561038b575f80fd5b50610394610c3f565b6040516103a19190612d7c565b60405180910390f35b3480156103b5575f80fd5b506103be610c45565b6040516103cb9190612cbb565b60405180910390f35b3480156103df575f80fd5b506103fa60048036038101906103f59190612dbf565b610c57565b005b348015610407575f80fd5b50610422600480360381019061041d9190612dbf565b610cdd565b005b34801561042f575f80fd5b5061044a60048036038101906104459190612eaa565b610d63565b005b348015610457575f80fd5b50610472600480360381019061046d9190612f24565b610d73565b005b34801561047f575f80fd5b50610488610e0b565b005b348015610495575f80fd5b506104b060048036038101906104ab9190612eaa565b610ee8565b005b3480156104bd575f80fd5b506104d860048036038101906104d3919061307b565b610f07565b005b3480156104e5575f80fd5b5061050060048036038101906104fb9190612dbf565b610f96565b60405161050d9190612e29565b60405180910390f35b348015610521575f80fd5b5061053c600480360381019061053791906130c2565b610faa565b6040516105499190612d7c565b60405180910390f35b34801561055d575f80fd5b50610566611074565b005b348015610573575f80fd5b5061057c6110fb565b6040516105899190612e29565b60405180910390f35b34801561059d575f80fd5b506105a6611123565b6040516105b39190612d44565b60405180910390f35b3480156105c7575f80fd5b506105d06111b3565b6040516105dd9190612d7c565b60405180910390f35b3480156105f1575f80fd5b506105fa6111b9565b6040516106079190612d7c565b60405180910390f35b34801561061b575f80fd5b5061063660048036038101906106319190612dbf565b6111bf565b005b610652600480360381019061064d9190612dbf565b611245565b005b34801561065f575f80fd5b5061067a600480360381019061067591906130ed565b611519565b005b348015610687575f80fd5b506106a2600480360381019061069d91906131c9565b61168b565b005b3480156106af575f80fd5b506106b8611707565b6040516106c59190612d7c565b60405180910390f35b3480156106d9575f80fd5b506106f460048036038101906106ef9190612dbf565b61170d565b6040516107019190612d44565b60405180910390f35b348015610715575f80fd5b5061071e611789565b60405161072b9190612d44565b60405180910390f35b34801561073f575f80fd5b50610748611815565b6040516107559190612d7c565b60405180910390f35b348015610769575f80fd5b50610784600480360381019061077f9190613249565b61181b565b6040516107919190612cbb565b60405180910390f35b3480156107a5575f80fd5b506107c060048036038101906107bb9190612dbf565b6118a9565b005b3480156107cd575f80fd5b506107e860048036038101906107e391906130c2565b6119cb565b005b3480156107f5575f80fd5b50610810600480360381019061080b9190612dbf565b611ac1565b60405161081d9190612d7c565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090057506108ff82611b07565b5b9050919050565b606060028054610916906132b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610942906132b4565b801561098d5780601f106109645761010080835404028352916020019161098d565b820191905f5260205f20905b81548152906001019060200180831161097057829003601f168201915b5050505050905090565b600d5481565b5f6109a782611b70565b6109dd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610a1f82610f96565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a86576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa5611bb9565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ad75750610ad581610ad0611bb9565b61181b565b155b15610b0e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b19838383611bc0565b505050565b610b26611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610b446110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b919061332e565b60405180910390fd5b80600e8190555050565b5f610bad611c6f565b6001545f540303905090565b610bc1611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610bdf6110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c9061332e565b60405180910390fd5b80600d8190555050565b60105481565b60115f9054906101000a900460ff1681565b610c5f611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610c7d6110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca9061332e565b60405180910390fd5b80600f8190555050565b610ce5611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610d036110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d509061332e565b60405180910390fd5b80600b8190555050565b610d6e838383611c77565b505050565b610d7b611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610d996110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de69061332e565b60405180910390fd5b8060115f6101000a81548160ff02191690831515021790555050565b610e13611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610e316110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e9061332e565b60405180910390fd5b600260095403610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec390613396565b60405180910390fd5b6002600981905550610ede334761210d565b6001600981905550565b610f0283838360405180602001604052805f81525061168b565b505050565b610f0f611bb9565b73ffffffffffffffffffffffffffffffffffffffff16610f2d6110fb565b73ffffffffffffffffffffffffffffffffffffffff1614610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a9061332e565b60405180910390fd5b80600a9081610f929190613551565b5050565b5f610fa0826121fd565b5f01519050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611010576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61107c611bb9565b73ffffffffffffffffffffffffffffffffffffffff1661109a6110fb565b73ffffffffffffffffffffffffffffffffffffffff16146110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e79061332e565b60405180910390fd5b6110f95f612479565b565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611132906132b4565b80601f016020809104026020016040519081016040528092919081815260200182805461115e906132b4565b80156111a95780601f10611180576101008083540402835291602001916111a9565b820191905f5260205f20905b81548152906001019060200180831161118c57829003601f168201915b5050505050905090565b600e5481565b600f5481565b6111c7611bb9565b73ffffffffffffffffffffffffffffffffffffffff166111e56110fb565b73ffffffffffffffffffffffffffffffffffffffff161461123b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112329061332e565b60405180910390fd5b80600c8190555050565b60115f9054906101000a900460ff16611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a9061366a565b60405180910390fd5b6001600b546112a291906136b5565b816112ab610ba4565b6112b591906136b5565b11156112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed90613732565b60405180910390fd5b5f61130082611ac1565b90505f7302643637eacfed02233eeeea2ba5330a5bcb9f279050600e548360105461132b91906136b5565b11156113bd5734821115611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b9061379a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156113b7573d5f803e3d5ffd5b5061150a565b600f54836113ca33610faa565b6113d491906136b5565b11156114ab573482111561141d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114149061379a565b60405180910390fd5b600c54831115611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990613828565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156114a5573d5f803e3d5ffd5b50611509565b600f548311156114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e790613828565b60405180910390fd5b8260105f82825461150191906136b5565b925050819055505b5b611514338461253c565b505050565b611521611bb9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611585576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f611591611bb9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661163a611bb9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161167f9190612cbb565b60405180910390a35050565b611696848484611c77565b6116b58373ffffffffffffffffffffffffffffffffffffffff16612559565b80156116ca57506116c88484848461257b565b155b15611701576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b606061171882611b70565b611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e906138b6565b60405180910390fd5b600a611762836126c6565b604051602001611773929190613a22565b6040516020818303038152906040529050919050565b600a8054611796906132b4565b80601f01602080910402602001604051908101604052809291908181526020018280546117c2906132b4565b801561180d5780601f106117e45761010080835404028352916020019161180d565b820191905f5260205f20905b8154815290600101906020018083116117f057829003601f168201915b505050505081565b600b5481565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6118b1611bb9565b73ffffffffffffffffffffffffffffffffffffffff166118cf6110fb565b73ffffffffffffffffffffffffffffffffffffffff1614611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c9061332e565b60405180910390fd5b5f8111611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613aa5565b60405180910390fd5b600b5481611973610ba4565b61197d91906136b5565b11156119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613b0d565b60405180910390fd5b6119c8338261253c565b50565b6119d3611bb9565b73ffffffffffffffffffffffffffffffffffffffff166119f16110fb565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e9061332e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90613b9b565b60405180910390fd5b611abe81612479565b50565b5f60328203611ad95766ae153d89fe80009050611b02565b60648203611af15767013fbe85edc900009050611b02565b81600d54611aff9190613bb9565b90505b919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f81611b7a611c6f565b11158015611b8857505f5482105b8015611bb2575060045f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b5f611c81826121fd565b90508373ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff1614611ceb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff16611d0b611bb9565b73ffffffffffffffffffffffffffffffffffffffff161480611d3a5750611d3985611d34611bb9565b61181b565b5b80611d7f5750611d48611bb9565b73ffffffffffffffffffffffffffffffffffffffff16611d678461099d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611db8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e1d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e2a858585600161281f565b611e355f8487611bc0565b600160055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001850190505f60045f8381526020019081526020015f2090505f73ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361209b575f54821461209a5787815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460200151815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121068585856001612825565b5050505050565b80471015612150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214790613c44565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff168260405161217590613c8f565b5f6040518083038185875af1925050503d805f81146121af576040519150601f19603f3d011682016040523d82523d5f602084013e6121b4565b606091505b50509050806121f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ef90613d13565b60405180910390fd5b505050565b612205612bd0565b5f82905080612212611c6f565b1115801561222057505f5481105b15612442575f60045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090508060400151612440575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461232c578092505050612474565b5b60011561243f5781806001900392505060045f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff161461243a578092505050612474565b61232d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612555828260405180602001604052805f81525061282b565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a0611bb9565b8786866040518563ffffffff1660e01b81526004016125c29493929190613d83565b6020604051808303815f875af19250505080156125fd57506040513d601f19601f820116820180604052508101906125fa9190613de1565b60015b612673573d805f811461262b576040519150601f19603f3d011682016040523d82523d5f602084013e612630565b606091505b505f81510361266b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60605f820361270c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061281a565b5f8290505f5b5f821461273b57808061272490613e0c565b915050600a826127349190613e80565b9150612712565b5f8167ffffffffffffffff81111561275657612755612f57565b5b6040519080825280601f01601f1916602001820160405280156127885781602001600182028036833780820191505090505b5090505b5f8514612813576001826127a09190613eb0565b9150600a856127af9190613ee3565b60306127bb91906136b5565b60f81b8183815181106127d1576127d0613f13565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561280c9190613e80565b945061278c565b8093505050505b919050565b50505050565b50505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612895576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83036128ce576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128da5f85838661281f565b8260055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360045f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260045f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f8482019050612a8b8673ffffffffffffffffffffffffffffffffffffffff16612559565b15612b4c575b818673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612afe5f87848060010195508761257b565b612b34576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612a9157825f5414612b47575f80fd5b612bb6565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612b4d575b815f819055505050612bca5f858386612825565b50505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c5581612c21565b8114612c5f575f80fd5b50565b5f81359050612c7081612c4c565b92915050565b5f60208284031215612c8b57612c8a612c19565b5b5f612c9884828501612c62565b91505092915050565b5f8115159050919050565b612cb581612ca1565b82525050565b5f602082019050612cce5f830184612cac565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612d1682612cd4565b612d208185612cde565b9350612d30818560208601612cee565b612d3981612cfc565b840191505092915050565b5f6020820190508181035f830152612d5c8184612d0c565b905092915050565b5f819050919050565b612d7681612d64565b82525050565b5f602082019050612d8f5f830184612d6d565b92915050565b612d9e81612d64565b8114612da8575f80fd5b50565b5f81359050612db981612d95565b92915050565b5f60208284031215612dd457612dd3612c19565b5b5f612de184828501612dab565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612e1382612dea565b9050919050565b612e2381612e09565b82525050565b5f602082019050612e3c5f830184612e1a565b92915050565b612e4b81612e09565b8114612e55575f80fd5b50565b5f81359050612e6681612e42565b92915050565b5f8060408385031215612e8257612e81612c19565b5b5f612e8f85828601612e58565b9250506020612ea085828601612dab565b9150509250929050565b5f805f60608486031215612ec157612ec0612c19565b5b5f612ece86828701612e58565b9350506020612edf86828701612e58565b9250506040612ef086828701612dab565b9150509250925092565b612f0381612ca1565b8114612f0d575f80fd5b50565b5f81359050612f1e81612efa565b92915050565b5f60208284031215612f3957612f38612c19565b5b5f612f4684828501612f10565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612f8d82612cfc565b810181811067ffffffffffffffff82111715612fac57612fab612f57565b5b80604052505050565b5f612fbe612c10565b9050612fca8282612f84565b919050565b5f67ffffffffffffffff821115612fe957612fe8612f57565b5b612ff282612cfc565b9050602081019050919050565b828183375f83830152505050565b5f61301f61301a84612fcf565b612fb5565b90508281526020810184848401111561303b5761303a612f53565b5b613046848285612fff565b509392505050565b5f82601f83011261306257613061612f4f565b5b813561307284826020860161300d565b91505092915050565b5f602082840312156130905761308f612c19565b5b5f82013567ffffffffffffffff8111156130ad576130ac612c1d565b5b6130b98482850161304e565b91505092915050565b5f602082840312156130d7576130d6612c19565b5b5f6130e484828501612e58565b91505092915050565b5f806040838503121561310357613102612c19565b5b5f61311085828601612e58565b925050602061312185828601612f10565b9150509250929050565b5f67ffffffffffffffff82111561314557613144612f57565b5b61314e82612cfc565b9050602081019050919050565b5f61316d6131688461312b565b612fb5565b90508281526020810184848401111561318957613188612f53565b5b613194848285612fff565b509392505050565b5f82601f8301126131b0576131af612f4f565b5b81356131c084826020860161315b565b91505092915050565b5f805f80608085870312156131e1576131e0612c19565b5b5f6131ee87828801612e58565b94505060206131ff87828801612e58565b935050604061321087828801612dab565b925050606085013567ffffffffffffffff81111561323157613230612c1d565b5b61323d8782880161319c565b91505092959194509250565b5f806040838503121561325f5761325e612c19565b5b5f61326c85828601612e58565b925050602061327d85828601612e58565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806132cb57607f821691505b6020821081036132de576132dd613287565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613318602083612cde565b9150613323826132e4565b602082019050919050565b5f6020820190508181035f8301526133458161330c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613380601f83612cde565b915061338b8261334c565b602082019050919050565b5f6020820190508181035f8301526133ad81613374565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026134107fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133d5565b61341a86836133d5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61345561345061344b84612d64565b613432565b612d64565b9050919050565b5f819050919050565b61346e8361343b565b61348261347a8261345c565b8484546133e1565b825550505050565b5f90565b61349661348a565b6134a1818484613465565b505050565b5b818110156134c4576134b95f8261348e565b6001810190506134a7565b5050565b601f821115613509576134da816133b4565b6134e3846133c6565b810160208510156134f2578190505b6135066134fe856133c6565b8301826134a6565b50505b505050565b5f82821c905092915050565b5f6135295f198460080261350e565b1980831691505092915050565b5f613541838361351a565b9150826002028217905092915050565b61355a82612cd4565b67ffffffffffffffff81111561357357613572612f57565b5b61357d82546132b4565b6135888282856134c8565b5f60209050601f8311600181146135b9575f84156135a7578287015190505b6135b18582613536565b865550613618565b601f1984166135c7866133b4565b5f5b828110156135ee578489015182556001820191506020850194506020810190506135c9565b8683101561360b5784890151613607601f89168261351a565b8355505b6001600288020188555050505b505050505050565b7f5075626c69632073616c65206973206e6f74206f70656e0000000000000000005f82015250565b5f613654601783612cde565b915061365f82613620565b602082019050919050565b5f6020820190508181035f83015261368181613648565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136bf82612d64565b91506136ca83612d64565b92508282019050808211156136e2576136e1613688565b5b92915050565b7f4e6f206d6f7265000000000000000000000000000000000000000000000000005f82015250565b5f61371c600783612cde565b9150613727826136e8565b602082019050919050565b5f6020820190508181035f83015261374981613710565b9050919050565b7f496e636f7272656374204554482076616c75652073656e7400000000000000005f82015250565b5f613784601883612cde565b915061378f82613750565b602082019050919050565b5f6020820190508181035f8301526137b181613778565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e206578636565645f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f613812602283612cde565b915061381d826137b8565b604082019050919050565b5f6020820190508181035f83015261383f81613806565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6138a0602f83612cde565b91506138ab82613846565b604082019050919050565b5f6020820190508181035f8301526138cd81613894565b9050919050565b5f81905092915050565b5f81546138ea816132b4565b6138f481866138d4565b9450600182165f811461390e576001811461392357613955565b60ff1983168652811515820286019350613955565b61392c856133b4565b5f5b8381101561394d5781548189015260018201915060208101905061392e565b838801955050505b50505092915050565b7f2f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6139926001836138d4565b915061399d8261395e565b600182019050919050565b5f6139b282612cd4565b6139bc81856138d4565b93506139cc818560208601612cee565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f613a0c6005836138d4565b9150613a17826139d8565b600582019050919050565b5f613a2d82856138de565b9150613a3882613986565b9150613a4482846139a8565b9150613a4f82613a00565b91508190509392505050565b7f496e76616c6964206d696e7420616d6f756e74000000000000000000000000005f82015250565b5f613a8f601383612cde565b9150613a9a82613a5b565b602082019050919050565b5f6020820190508181035f830152613abc81613a83565b9050919050565b7f4d6178696d756d20737570706c792065786365656465640000000000000000005f82015250565b5f613af7601783612cde565b9150613b0282613ac3565b602082019050919050565b5f6020820190508181035f830152613b2481613aeb565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613b85602683612cde565b9150613b9082613b2b565b604082019050919050565b5f6020820190508181035f830152613bb281613b79565b9050919050565b5f613bc382612d64565b9150613bce83612d64565b9250828202613bdc81612d64565b91508282048414831517613bf357613bf2613688565b5b5092915050565b7f416464726573733a20696e73756666696369656e742062616c616e63650000005f82015250565b5f613c2e601d83612cde565b9150613c3982613bfa565b602082019050919050565b5f6020820190508181035f830152613c5b81613c22565b9050919050565b5f81905092915050565b50565b5f613c7a5f83613c62565b9150613c8582613c6c565b5f82019050919050565b5f613c9982613c6f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c20725f8201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b5f613cfd603a83612cde565b9150613d0882613ca3565b604082019050919050565b5f6020820190508181035f830152613d2a81613cf1565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f613d5582613d31565b613d5f8185613d3b565b9350613d6f818560208601612cee565b613d7881612cfc565b840191505092915050565b5f608082019050613d965f830187612e1a565b613da36020830186612e1a565b613db06040830185612d6d565b8181036060830152613dc28184613d4b565b905095945050505050565b5f81519050613ddb81612c4c565b92915050565b5f60208284031215613df657613df5612c19565b5b5f613e0384828501613dcd565b91505092915050565b5f613e1682612d64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e4857613e47613688565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613e8a82612d64565b9150613e9583612d64565b925082613ea557613ea4613e53565b5b828204905092915050565b5f613eba82612d64565b9150613ec583612d64565b9250828203905081811115613edd57613edc613688565b5b92915050565b5f613eed82612d64565b9150613ef883612d64565b925082613f0857613f07613e53565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea26469706673582212208b70e836236096f9573a6a01445e4c3dd9d0db319ceaff2515256f021f8c2f3364736f6c63430008190033
Deployed ByteCode Sourcemap
47840:3783:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28989:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32102:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48127:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33605:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33168:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50983:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28238:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51240:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48265:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48309:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51494:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51119:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34470:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50829:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50222:142;;;;;;;;;;;;;:::i;:::-;;34711:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49818:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31910:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29358:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6755:103;;;;;;;;;;;;;:::i;:::-;;6104:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32271:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48179:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48221:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51361:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48736:1074;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33881:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34967:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48084:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50370:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47956:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48047:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34239:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49932:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7013:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48425:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28989:305;29091:4;29143:25;29128:40;;;:11;:40;;;;:105;;;;29200:33;29185:48;;;:11;:48;;;;29128:105;:158;;;;29250:36;29274:11;29250:23;:36::i;:::-;29128:158;29108:178;;28989:305;;;:::o;32102:100::-;32156:13;32189:5;32182:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32102:100;:::o;48127:47::-;;;;:::o;33605:204::-;33673:7;33698:16;33706:7;33698;:16::i;:::-;33693:64;;33723:34;;;;;;;;;;;;;;33693:64;33777:15;:24;33793:7;33777:24;;;;;;;;;;;;;;;;;;;;;33770:31;;33605:204;;;:::o;33168:371::-;33241:13;33257:24;33273:7;33257:15;:24::i;:::-;33241:40;;33302:5;33296:11;;:2;:11;;;33292:48;;33316:24;;;;;;;;;;;;;;33292:48;33373:5;33357:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33383:37;33400:5;33407:12;:10;:12::i;:::-;33383:16;:37::i;:::-;33382:38;33357:63;33353:138;;;33444:35;;;;;;;;;;;;;;33353:138;33503:28;33512:2;33516:7;33525:5;33503:8;:28::i;:::-;33230:309;33168:371;;:::o;50983:129::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51093:13:::1;51076:14;:30;;;;50983:129:::0;:::o;28238:303::-;28282:7;28507:15;:13;:15::i;:::-;28492:12;;28476:13;;:28;:46;28469:53;;28238:303;:::o;51240:115::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51343:6:::1;51323:17;:26;;;;51240:115:::0;:::o;48265:39::-;;;;:::o;48309:37::-;;;;;;;;;;;;;:::o;51494:126::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51608:6:::1;51586:19;:28;;;;51494:126:::0;:::o;51119:115::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51218:10:::1;51206:9;:22;;;;51119:115:::0;:::o;34470:170::-;34604:28;34614:4;34620:2;34624:7;34604:9;:28::i;:::-;34470:170;;;:::o;50829:148::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50952:19:::1;50931:18;;:40;;;;;;;;;;;;;;;;;;50829:148:::0;:::o;50222:142::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1078:1:::1;1676:7;;:19:::0;1668:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1078:1;1809:7;:18;;;;50297:61:::2;50323:10;50336:21;50297:17;:61::i;:::-;1034:1:::1;1988:7;:22;;;;50222:142::o:0;34711:185::-;34849:39;34866:4;34872:2;34876:7;34849:39;;;;;;;;;;;;:16;:39::i;:::-;34711:185;;;:::o;49818:108::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49913:7:::1;49898:12;:22;;;;;;:::i;:::-;;49818:108:::0;:::o;31910:125::-;31974:7;32001:21;32014:7;32001:12;:21::i;:::-;:26;;;31994:33;;31910:125;;;:::o;29358:206::-;29422:7;29463:1;29446:19;;:5;:19;;;29442:60;;29474:28;;;;;;;;;;;;;;29442:60;29528:12;:19;29541:5;29528:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29520:36;;29513:43;;29358:206;;;:::o;6755:103::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6820:30:::1;6847:1;6820:18;:30::i;:::-;6755:103::o:0;6104:87::-;6150:7;6177:6;;;;;;;;;;;6170:13;;6104:87;:::o;32271:104::-;32327:13;32360:7;32353:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32271:104;:::o;48179:37::-;;;;:::o;48221:39::-;;;;:::o;51361:127::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51476:6:::1;51457:16;:25;;;;51361:127:::0;:::o;48736:1074::-;48806:18;;;;;;;;;;;48798:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48913:1;48901:9;;:13;;;;:::i;:::-;48883:14;48867:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:47;;48859:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48935:18;48956:37;48978:14;48956:21;:37::i;:::-;48935:58;;49000:17;49020:42;49000:62;;49119:14;;49102;49079:20;;:37;;;;:::i;:::-;:54;49075:686;;;49168:9;49154:10;:23;;49146:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;49225:9;49217:27;;:39;49245:10;49217:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49075:686;;;49326:19;;49309:14;49285:21;49295:10;49285:9;:21::i;:::-;:38;;;;:::i;:::-;:60;49281:473;;;49384:9;49370:10;:23;;49362:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;49463:16;;49445:14;:34;;49437:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49541:9;49533:27;;:39;49561:10;49533:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49281:473;;;49631:19;;49613:14;:37;;49605:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;49728:14;49704:20;;:38;;;;;;;:::i;:::-;;;;;;;;49281:473;49075:686;49767:37;49777:10;49789:14;49767:9;:37::i;:::-;48791:1019;;48736:1074;:::o;33881:287::-;33992:12;:10;:12::i;:::-;33980:24;;:8;:24;;;33976:54;;34013:17;;;;;;;;;;;;;;33976:54;34088:8;34043:18;:32;34062:12;:10;:12::i;:::-;34043:32;;;;;;;;;;;;;;;:42;34076:8;34043:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34141:8;34112:48;;34127:12;:10;:12::i;:::-;34112:48;;;34151:8;34112:48;;;;;;:::i;:::-;;;;;;;;33881:287;;:::o;34967:369::-;35134:28;35144:4;35150:2;35154:7;35134:9;:28::i;:::-;35177:15;:2;:13;;;:15::i;:::-;:76;;;;;35197:56;35228:4;35234:2;35238:7;35247:5;35197:30;:56::i;:::-;35196:57;35177:76;35173:156;;;35277:40;;;;;;;;;;;;;;35173:156;34967:369;;;;:::o;48084:38::-;;;;:::o;50370:312::-;50466:13;50507:17;50515:8;50507:7;:17::i;:::-;50491:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;50627:12;50646:19;:8;:17;:19::i;:::-;50610:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50596:80;;50370:312;;;:::o;47956:86::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48047:32::-;;;;:::o;34239:164::-;34336:4;34360:18;:25;34379:5;34360:25;;;;;;;;;;;;;;;:35;34386:8;34360:35;;;;;;;;;;;;;;;;;;;;;;;;;34353:42;;34239:164;;;;:::o;49932:284::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50033:1:::1;50022:8;:12;50006:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50122:9;;50110:8;50094:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;50078:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;50179:31;50189:10;50201:8;50179:9;:31::i;:::-;49932:284:::0;:::o;7013:201::-;6335:12;:10;:12::i;:::-;6324:23;;:7;:5;:7::i;:::-;:23;;;6316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7122:1:::1;7102:22;;:8;:22;;::::0;7094:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7178:28;7197:8;7178:18;:28::i;:::-;7013:201:::0;:::o;48425:301::-;48495:7;48531:2;48519:8;:14;48515:204;;48557:11;48550:18;;;;48515:204;48602:3;48590:8;:15;48586:133;;48629:10;48622:17;;;;48586:133;48699:8;48679:17;;:28;;;;:::i;:::-;48672:35;;48425:301;;;;:::o;18888:157::-;18973:4;19012:25;18997:40;;;:11;:40;;;;18990:47;;18888:157;;;:::o;35591:174::-;35648:4;35691:7;35672:15;:13;:15::i;:::-;:26;;:53;;;;;35712:13;;35702:7;:23;35672:53;:85;;;;;35730:11;:20;35742:7;35730:20;;;;;;;;;;;:27;;;;;;;;;;;;35729:28;35672:85;35665:92;;35591:174;;;:::o;4828:98::-;4881:7;4908:10;4901:17;;4828:98;:::o;44817:196::-;44959:2;44932:15;:24;44948:7;44932:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44997:7;44993:2;44977:28;;44986:5;44977:28;;;;;;;;;;;;44817:196;;;:::o;28012:92::-;28068:7;28095:1;28088:8;;28012:92;:::o;39765:2130::-;39880:35;39918:21;39931:7;39918:12;:21::i;:::-;39880:59;;39978:4;39956:26;;:13;:18;;;:26;;;39952:67;;39991:28;;;;;;;;;;;;;;39952:67;40032:22;40074:4;40058:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40095:36;40112:4;40118:12;:10;:12::i;:::-;40095:16;:36::i;:::-;40058:73;:126;;;;40172:12;:10;:12::i;:::-;40148:36;;:20;40160:7;40148:11;:20::i;:::-;:36;;;40058:126;40032:153;;40203:17;40198:66;;40229:35;;;;;;;;;;;;;;40198:66;40293:1;40279:16;;:2;:16;;;40275:52;;40304:23;;;;;;;;;;;;;;40275:52;40340:43;40362:4;40368:2;40372:7;40381:1;40340:21;:43::i;:::-;40448:35;40465:1;40469:7;40478:4;40448:8;:35::i;:::-;40809:1;40779:12;:18;40792:4;40779:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40853:1;40825:12;:16;40838:2;40825:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40871:31;40905:11;:20;40917:7;40905:20;;;;;;;;;;;40871:54;;40956:2;40940:8;:13;;;:18;;;;;;;;;;;;;;;;;;41006:15;40973:8;:23;;;:49;;;;;;;;;;;;;;;;;;41274:19;41306:1;41296:7;:11;41274:33;;41322:31;41356:11;:24;41368:11;41356:24;;;;;;;;;;;41322:58;;41424:1;41399:27;;:8;:13;;;;;;;;;;;;:27;;;41395:384;;41609:13;;41594:11;:28;41590:174;;41663:4;41647:8;:13;;;:20;;;;;;;;;;;;;;;;;;41716:13;:28;;;41690:8;:23;;;:54;;;;;;;;;;;;;;;;;;41590:174;41395:384;40754:1036;;;41826:7;41822:2;41807:27;;41816:4;41807:27;;;;;;;;;;;;41845:42;41866:4;41872:2;41876:7;41885:1;41845:20;:42::i;:::-;39869:2026;;39765:2130;;;:::o;10066:317::-;10181:6;10156:21;:31;;10148:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10235:12;10253:9;:14;;10275:6;10253:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10234:52;;;10305:7;10297:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10137:246;10066:317;;:::o;30739:1109::-;30801:21;;:::i;:::-;30835:12;30850:7;30835:22;;30918:4;30899:15;:13;:15::i;:::-;:23;;:47;;;;;30933:13;;30926:4;:20;30899:47;30895:886;;;30967:31;31001:11;:17;31013:4;31001:17;;;;;;;;;;;30967:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31042:9;:16;;;31037:729;;31113:1;31087:28;;:9;:14;;;:28;;;31083:101;;31151:9;31144:16;;;;;;31083:101;31486:261;31493:4;31486:261;;;31526:6;;;;;;;;31571:11;:17;31583:4;31571:17;;;;;;;;;;;31559:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31645:1;31619:28;;:9;:14;;;:28;;;31615:109;;31687:9;31680:16;;;;;;31615:109;31486:261;;;31037:729;30948:833;30895:886;31809:31;;;;;;;;;;;;;;30739:1109;;;;:::o;7374:191::-;7448:16;7467:6;;;;;;;;;;;7448:25;;7493:8;7484:6;;:17;;;;;;;;;;;;;;;;;;7548:8;7517:40;;7538:8;7517:40;;;;;;;;;;;;7437:128;7374:191;:::o;35849:104::-;35918:27;35928:2;35932:8;35918:27;;;;;;;;;;;;:9;:27::i;:::-;35849:104;;:::o;8805:326::-;8865:4;9122:1;9100:7;:19;;;:23;9093:30;;8805:326;;;:::o;45505:667::-;45668:4;45705:2;45689:36;;;45726:12;:10;:12::i;:::-;45740:4;45746:7;45755:5;45689:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45685:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45940:1;45923:6;:13;:18;45919:235;;45969:40;;;;;;;;;;;;;;45919:235;46112:6;46106:13;46097:6;46093:2;46089:15;46082:38;45685:480;45818:45;;;45808:55;;;:6;:55;;;;45801:62;;;45505:667;;;;;;:::o;2390:723::-;2446:13;2676:1;2667:5;:10;2663:53;;2694:10;;;;;;;;;;;;;;;;;;;;;2663:53;2726:12;2741:5;2726:20;;2757:14;2782:78;2797:1;2789:4;:9;2782:78;;2815:8;;;;;:::i;:::-;;;;2846:2;2838:10;;;;;:::i;:::-;;;2782:78;;;2870:19;2902:6;2892:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2870:39;;2920:154;2936:1;2927:5;:10;2920:154;;2964:1;2954:11;;;;;:::i;:::-;;;3031:2;3023:5;:10;;;;:::i;:::-;3010:2;:24;;;;:::i;:::-;2997:39;;2980:6;2987;2980:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3060:2;3051:11;;;;;:::i;:::-;;;2920:154;;;3098:6;3084:21;;;;;2390:723;;;;:::o;46820:159::-;;;;;:::o;47638:158::-;;;;;:::o;36327:1751::-;36450:20;36473:13;;36450:36;;36515:1;36501:16;;:2;:16;;;36497:48;;36526:19;;;;;;;;;;;;;;36497:48;36572:1;36560:8;:13;36556:44;;36582:18;;;;;;;;;;;;;;36556:44;36613:61;36643:1;36647:2;36651:12;36665:8;36613:21;:61::i;:::-;36986:8;36951:12;:16;36964:2;36951:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37050:8;37010:12;:16;37023:2;37010:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37109:2;37076:11;:25;37088:12;37076:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37176:15;37126:11;:25;37138:12;37126:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37209:20;37232:12;37209:35;;37259:11;37288:8;37273:12;:23;37259:37;;37317:15;:2;:13;;;:15::i;:::-;37313:633;;;37353:314;37409:12;37405:2;37384:38;;37401:1;37384:38;;;;;;;;;;;;37450:69;37489:1;37493:2;37497:14;;;;;;37513:5;37450:30;:69::i;:::-;37445:174;;37555:40;;;;;;;;;;;;;;37445:174;37662:3;37646:12;:19;37353:314;;37748:12;37731:13;;:29;37727:43;;37762:8;;;37727:43;37313:633;;;37811:120;37867:14;;;;;;37863:2;37842:40;;37859:1;37842:40;;;;;;;;;;;;37926:3;37910:12;:19;37811:120;;37313:633;37976:12;37960:13;:28;;;;36926:1074;;38010:60;38039:1;38043:2;38047:12;38061:8;38010:20;:60::i;:::-;36439:1639;36327:1751;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:118::-;2923:24;2941:5;2923:24;:::i;:::-;2918:3;2911:37;2836:118;;:::o;2960:222::-;3053:4;3091:2;3080:9;3076:18;3068:26;;3104:71;3172:1;3161:9;3157:17;3148:6;3104:71;:::i;:::-;2960:222;;;;:::o;3188:122::-;3261:24;3279:5;3261:24;:::i;:::-;3254:5;3251:35;3241:63;;3300:1;3297;3290:12;3241:63;3188:122;:::o;3316:139::-;3362:5;3400:6;3387:20;3378:29;;3416:33;3443:5;3416:33;:::i;:::-;3316:139;;;;:::o;3461:329::-;3520:6;3569:2;3557:9;3548:7;3544:23;3540:32;3537:119;;;3575:79;;:::i;:::-;3537:119;3695:1;3720:53;3765:7;3756:6;3745:9;3741:22;3720:53;:::i;:::-;3710:63;;3666:117;3461:329;;;;:::o;3796:126::-;3833:7;3873:42;3866:5;3862:54;3851:65;;3796:126;;;:::o;3928:96::-;3965:7;3994:24;4012:5;3994:24;:::i;:::-;3983:35;;3928:96;;;:::o;4030:118::-;4117:24;4135:5;4117:24;:::i;:::-;4112:3;4105:37;4030:118;;:::o;4154:222::-;4247:4;4285:2;4274:9;4270:18;4262:26;;4298:71;4366:1;4355:9;4351:17;4342:6;4298:71;:::i;:::-;4154:222;;;;:::o;4382:122::-;4455:24;4473:5;4455:24;:::i;:::-;4448:5;4445:35;4435:63;;4494:1;4491;4484:12;4435:63;4382:122;:::o;4510:139::-;4556:5;4594:6;4581:20;4572:29;;4610:33;4637:5;4610:33;:::i;:::-;4510:139;;;;:::o;4655:474::-;4723:6;4731;4780:2;4768:9;4759:7;4755:23;4751:32;4748:119;;;4786:79;;:::i;:::-;4748:119;4906:1;4931:53;4976:7;4967:6;4956:9;4952:22;4931:53;:::i;:::-;4921:63;;4877:117;5033:2;5059:53;5104:7;5095:6;5084:9;5080:22;5059:53;:::i;:::-;5049:63;;5004:118;4655:474;;;;;:::o;5135:619::-;5212:6;5220;5228;5277:2;5265:9;5256:7;5252:23;5248:32;5245:119;;;5283:79;;:::i;:::-;5245:119;5403:1;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5374:117;5530:2;5556:53;5601:7;5592:6;5581:9;5577:22;5556:53;:::i;:::-;5546:63;;5501:118;5658:2;5684:53;5729:7;5720:6;5709:9;5705:22;5684:53;:::i;:::-;5674:63;;5629:118;5135:619;;;;;:::o;5760:116::-;5830:21;5845:5;5830:21;:::i;:::-;5823:5;5820:32;5810:60;;5866:1;5863;5856:12;5810:60;5760:116;:::o;5882:133::-;5925:5;5963:6;5950:20;5941:29;;5979:30;6003:5;5979:30;:::i;:::-;5882:133;;;;:::o;6021:323::-;6077:6;6126:2;6114:9;6105:7;6101:23;6097:32;6094:119;;;6132:79;;:::i;:::-;6094:119;6252:1;6277:50;6319:7;6310:6;6299:9;6295:22;6277:50;:::i;:::-;6267:60;;6223:114;6021:323;;;;:::o;6350:117::-;6459:1;6456;6449:12;6473:117;6582:1;6579;6572:12;6596:180;6644:77;6641:1;6634:88;6741:4;6738:1;6731:15;6765:4;6762:1;6755:15;6782:281;6865:27;6887:4;6865:27;:::i;:::-;6857:6;6853:40;6995:6;6983:10;6980:22;6959:18;6947:10;6944:34;6941:62;6938:88;;;7006:18;;:::i;:::-;6938:88;7046:10;7042:2;7035:22;6825:238;6782:281;;:::o;7069:129::-;7103:6;7130:20;;:::i;:::-;7120:30;;7159:33;7187:4;7179:6;7159:33;:::i;:::-;7069:129;;;:::o;7204:308::-;7266:4;7356:18;7348:6;7345:30;7342:56;;;7378:18;;:::i;:::-;7342:56;7416:29;7438:6;7416:29;:::i;:::-;7408:37;;7500:4;7494;7490:15;7482:23;;7204:308;;;:::o;7518:148::-;7616:6;7611:3;7606;7593:30;7657:1;7648:6;7643:3;7639:16;7632:27;7518:148;;;:::o;7672:425::-;7750:5;7775:66;7791:49;7833:6;7791:49;:::i;:::-;7775:66;:::i;:::-;7766:75;;7864:6;7857:5;7850:21;7902:4;7895:5;7891:16;7940:3;7931:6;7926:3;7922:16;7919:25;7916:112;;;7947:79;;:::i;:::-;7916:112;8037:54;8084:6;8079:3;8074;8037:54;:::i;:::-;7756:341;7672:425;;;;;:::o;8117:340::-;8173:5;8222:3;8215:4;8207:6;8203:17;8199:27;8189:122;;8230:79;;:::i;:::-;8189:122;8347:6;8334:20;8372:79;8447:3;8439:6;8432:4;8424:6;8420:17;8372:79;:::i;:::-;8363:88;;8179:278;8117:340;;;;:::o;8463:509::-;8532:6;8581:2;8569:9;8560:7;8556:23;8552:32;8549:119;;;8587:79;;:::i;:::-;8549:119;8735:1;8724:9;8720:17;8707:31;8765:18;8757:6;8754:30;8751:117;;;8787:79;;:::i;:::-;8751:117;8892:63;8947:7;8938:6;8927:9;8923:22;8892:63;:::i;:::-;8882:73;;8678:287;8463:509;;;;:::o;8978:329::-;9037:6;9086:2;9074:9;9065:7;9061:23;9057:32;9054:119;;;9092:79;;:::i;:::-;9054:119;9212:1;9237:53;9282:7;9273:6;9262:9;9258:22;9237:53;:::i;:::-;9227:63;;9183:117;8978:329;;;;:::o;9313:468::-;9378:6;9386;9435:2;9423:9;9414:7;9410:23;9406:32;9403:119;;;9441:79;;:::i;:::-;9403:119;9561:1;9586:53;9631:7;9622:6;9611:9;9607:22;9586:53;:::i;:::-;9576:63;;9532:117;9688:2;9714:50;9756:7;9747:6;9736:9;9732:22;9714:50;:::i;:::-;9704:60;;9659:115;9313:468;;;;;:::o;9787:307::-;9848:4;9938:18;9930:6;9927:30;9924:56;;;9960:18;;:::i;:::-;9924:56;9998:29;10020:6;9998:29;:::i;:::-;9990:37;;10082:4;10076;10072:15;10064:23;;9787:307;;;:::o;10100:423::-;10177:5;10202:65;10218:48;10259:6;10218:48;:::i;:::-;10202:65;:::i;:::-;10193:74;;10290:6;10283:5;10276:21;10328:4;10321:5;10317:16;10366:3;10357:6;10352:3;10348:16;10345:25;10342:112;;;10373:79;;:::i;:::-;10342:112;10463:54;10510:6;10505:3;10500;10463:54;:::i;:::-;10183:340;10100:423;;;;;:::o;10542:338::-;10597:5;10646:3;10639:4;10631:6;10627:17;10623:27;10613:122;;10654:79;;:::i;:::-;10613:122;10771:6;10758:20;10796:78;10870:3;10862:6;10855:4;10847:6;10843:17;10796:78;:::i;:::-;10787:87;;10603:277;10542:338;;;;:::o;10886:943::-;10981:6;10989;10997;11005;11054:3;11042:9;11033:7;11029:23;11025:33;11022:120;;;11061:79;;:::i;:::-;11022:120;11181:1;11206:53;11251:7;11242:6;11231:9;11227:22;11206:53;:::i;:::-;11196:63;;11152:117;11308:2;11334:53;11379:7;11370:6;11359:9;11355:22;11334:53;:::i;:::-;11324:63;;11279:118;11436:2;11462:53;11507:7;11498:6;11487:9;11483:22;11462:53;:::i;:::-;11452:63;;11407:118;11592:2;11581:9;11577:18;11564:32;11623:18;11615:6;11612:30;11609:117;;;11645:79;;:::i;:::-;11609:117;11750:62;11804:7;11795:6;11784:9;11780:22;11750:62;:::i;:::-;11740:72;;11535:287;10886:943;;;;;;;:::o;11835:474::-;11903:6;11911;11960:2;11948:9;11939:7;11935:23;11931:32;11928:119;;;11966:79;;:::i;:::-;11928:119;12086:1;12111:53;12156:7;12147:6;12136:9;12132:22;12111:53;:::i;:::-;12101:63;;12057:117;12213:2;12239:53;12284:7;12275:6;12264:9;12260:22;12239:53;:::i;:::-;12229:63;;12184:118;11835:474;;;;;:::o;12315:180::-;12363:77;12360:1;12353:88;12460:4;12457:1;12450:15;12484:4;12481:1;12474:15;12501:320;12545:6;12582:1;12576:4;12572:12;12562:22;;12629:1;12623:4;12619:12;12650:18;12640:81;;12706:4;12698:6;12694:17;12684:27;;12640:81;12768:2;12760:6;12757:14;12737:18;12734:38;12731:84;;12787:18;;:::i;:::-;12731:84;12552:269;12501:320;;;:::o;12827:182::-;12967:34;12963:1;12955:6;12951:14;12944:58;12827:182;:::o;13015:366::-;13157:3;13178:67;13242:2;13237:3;13178:67;:::i;:::-;13171:74;;13254:93;13343:3;13254:93;:::i;:::-;13372:2;13367:3;13363:12;13356:19;;13015:366;;;:::o;13387:419::-;13553:4;13591:2;13580:9;13576:18;13568:26;;13640:9;13634:4;13630:20;13626:1;13615:9;13611:17;13604:47;13668:131;13794:4;13668:131;:::i;:::-;13660:139;;13387:419;;;:::o;13812:181::-;13952:33;13948:1;13940:6;13936:14;13929:57;13812:181;:::o;13999:366::-;14141:3;14162:67;14226:2;14221:3;14162:67;:::i;:::-;14155:74;;14238:93;14327:3;14238:93;:::i;:::-;14356:2;14351:3;14347:12;14340:19;;13999:366;;;:::o;14371:419::-;14537:4;14575:2;14564:9;14560:18;14552:26;;14624:9;14618:4;14614:20;14610:1;14599:9;14595:17;14588:47;14652:131;14778:4;14652:131;:::i;:::-;14644:139;;14371:419;;;:::o;14796:141::-;14845:4;14868:3;14860:11;;14891:3;14888:1;14881:14;14925:4;14922:1;14912:18;14904:26;;14796:141;;;:::o;14943:93::-;14980:6;15027:2;15022;15015:5;15011:14;15007:23;14997:33;;14943:93;;;:::o;15042:107::-;15086:8;15136:5;15130:4;15126:16;15105:37;;15042:107;;;;:::o;15155:393::-;15224:6;15274:1;15262:10;15258:18;15297:97;15327:66;15316:9;15297:97;:::i;:::-;15415:39;15445:8;15434:9;15415:39;:::i;:::-;15403:51;;15487:4;15483:9;15476:5;15472:21;15463:30;;15536:4;15526:8;15522:19;15515:5;15512:30;15502:40;;15231:317;;15155:393;;;;;:::o;15554:60::-;15582:3;15603:5;15596:12;;15554:60;;;:::o;15620:142::-;15670:9;15703:53;15721:34;15730:24;15748:5;15730:24;:::i;:::-;15721:34;:::i;:::-;15703:53;:::i;:::-;15690:66;;15620:142;;;:::o;15768:75::-;15811:3;15832:5;15825:12;;15768:75;;;:::o;15849:269::-;15959:39;15990:7;15959:39;:::i;:::-;16020:91;16069:41;16093:16;16069:41;:::i;:::-;16061:6;16054:4;16048:11;16020:91;:::i;:::-;16014:4;16007:105;15925:193;15849:269;;;:::o;16124:73::-;16169:3;16124:73;:::o;16203:189::-;16280:32;;:::i;:::-;16321:65;16379:6;16371;16365:4;16321:65;:::i;:::-;16256:136;16203:189;;:::o;16398:186::-;16458:120;16475:3;16468:5;16465:14;16458:120;;;16529:39;16566:1;16559:5;16529:39;:::i;:::-;16502:1;16495:5;16491:13;16482:22;;16458:120;;;16398:186;;:::o;16590:543::-;16691:2;16686:3;16683:11;16680:446;;;16725:38;16757:5;16725:38;:::i;:::-;16809:29;16827:10;16809:29;:::i;:::-;16799:8;16795:44;16992:2;16980:10;16977:18;16974:49;;;17013:8;16998:23;;16974:49;17036:80;17092:22;17110:3;17092:22;:::i;:::-;17082:8;17078:37;17065:11;17036:80;:::i;:::-;16695:431;;16680:446;16590:543;;;:::o;17139:117::-;17193:8;17243:5;17237:4;17233:16;17212:37;;17139:117;;;;:::o;17262:169::-;17306:6;17339:51;17387:1;17383:6;17375:5;17372:1;17368:13;17339:51;:::i;:::-;17335:56;17420:4;17414;17410:15;17400:25;;17313:118;17262:169;;;;:::o;17436:295::-;17512:4;17658:29;17683:3;17677:4;17658:29;:::i;:::-;17650:37;;17720:3;17717:1;17713:11;17707:4;17704:21;17696:29;;17436:295;;;;:::o;17736:1395::-;17853:37;17886:3;17853:37;:::i;:::-;17955:18;17947:6;17944:30;17941:56;;;17977:18;;:::i;:::-;17941:56;18021:38;18053:4;18047:11;18021:38;:::i;:::-;18106:67;18166:6;18158;18152:4;18106:67;:::i;:::-;18200:1;18224:4;18211:17;;18256:2;18248:6;18245:14;18273:1;18268:618;;;;18930:1;18947:6;18944:77;;;18996:9;18991:3;18987:19;18981:26;18972:35;;18944:77;19047:67;19107:6;19100:5;19047:67;:::i;:::-;19041:4;19034:81;18903:222;18238:887;;18268:618;18320:4;18316:9;18308:6;18304:22;18354:37;18386:4;18354:37;:::i;:::-;18413:1;18427:208;18441:7;18438:1;18435:14;18427:208;;;18520:9;18515:3;18511:19;18505:26;18497:6;18490:42;18571:1;18563:6;18559:14;18549:24;;18618:2;18607:9;18603:18;18590:31;;18464:4;18461:1;18457:12;18452:17;;18427:208;;;18663:6;18654:7;18651:19;18648:179;;;18721:9;18716:3;18712:19;18706:26;18764:48;18806:4;18798:6;18794:17;18783:9;18764:48;:::i;:::-;18756:6;18749:64;18671:156;18648:179;18873:1;18869;18861:6;18857:14;18853:22;18847:4;18840:36;18275:611;;;18238:887;;17828:1303;;;17736:1395;;:::o;19137:173::-;19277:25;19273:1;19265:6;19261:14;19254:49;19137:173;:::o;19316:366::-;19458:3;19479:67;19543:2;19538:3;19479:67;:::i;:::-;19472:74;;19555:93;19644:3;19555:93;:::i;:::-;19673:2;19668:3;19664:12;19657:19;;19316:366;;;:::o;19688:419::-;19854:4;19892:2;19881:9;19877:18;19869:26;;19941:9;19935:4;19931:20;19927:1;19916:9;19912:17;19905:47;19969:131;20095:4;19969:131;:::i;:::-;19961:139;;19688:419;;;:::o;20113:180::-;20161:77;20158:1;20151:88;20258:4;20255:1;20248:15;20282:4;20279:1;20272:15;20299:191;20339:3;20358:20;20376:1;20358:20;:::i;:::-;20353:25;;20392:20;20410:1;20392:20;:::i;:::-;20387:25;;20435:1;20432;20428:9;20421:16;;20456:3;20453:1;20450:10;20447:36;;;20463:18;;:::i;:::-;20447:36;20299:191;;;;:::o;20496:157::-;20636:9;20632:1;20624:6;20620:14;20613:33;20496:157;:::o;20659:365::-;20801:3;20822:66;20886:1;20881:3;20822:66;:::i;:::-;20815:73;;20897:93;20986:3;20897:93;:::i;:::-;21015:2;21010:3;21006:12;20999:19;;20659:365;;;:::o;21030:419::-;21196:4;21234:2;21223:9;21219:18;21211:26;;21283:9;21277:4;21273:20;21269:1;21258:9;21254:17;21247:47;21311:131;21437:4;21311:131;:::i;:::-;21303:139;;21030:419;;;:::o;21455:174::-;21595:26;21591:1;21583:6;21579:14;21572:50;21455:174;:::o;21635:366::-;21777:3;21798:67;21862:2;21857:3;21798:67;:::i;:::-;21791:74;;21874:93;21963:3;21874:93;:::i;:::-;21992:2;21987:3;21983:12;21976:19;;21635:366;;;:::o;22007:419::-;22173:4;22211:2;22200:9;22196:18;22188:26;;22260:9;22254:4;22250:20;22246:1;22235:9;22231:17;22224:47;22288:131;22414:4;22288:131;:::i;:::-;22280:139;;22007:419;;;:::o;22432:221::-;22572:34;22568:1;22560:6;22556:14;22549:58;22641:4;22636:2;22628:6;22624:15;22617:29;22432:221;:::o;22659:366::-;22801:3;22822:67;22886:2;22881:3;22822:67;:::i;:::-;22815:74;;22898:93;22987:3;22898:93;:::i;:::-;23016:2;23011:3;23007:12;23000:19;;22659:366;;;:::o;23031:419::-;23197:4;23235:2;23224:9;23220:18;23212:26;;23284:9;23278:4;23274:20;23270:1;23259:9;23255:17;23248:47;23312:131;23438:4;23312:131;:::i;:::-;23304:139;;23031:419;;;:::o;23456:234::-;23596:34;23592:1;23584:6;23580:14;23573:58;23665:17;23660:2;23652:6;23648:15;23641:42;23456:234;:::o;23696:366::-;23838:3;23859:67;23923:2;23918:3;23859:67;:::i;:::-;23852:74;;23935:93;24024:3;23935:93;:::i;:::-;24053:2;24048:3;24044:12;24037:19;;23696:366;;;:::o;24068:419::-;24234:4;24272:2;24261:9;24257:18;24249:26;;24321:9;24315:4;24311:20;24307:1;24296:9;24292:17;24285:47;24349:131;24475:4;24349:131;:::i;:::-;24341:139;;24068:419;;;:::o;24493:148::-;24595:11;24632:3;24617:18;;24493:148;;;;:::o;24671:874::-;24774:3;24811:5;24805:12;24840:36;24866:9;24840:36;:::i;:::-;24892:89;24974:6;24969:3;24892:89;:::i;:::-;24885:96;;25012:1;25001:9;24997:17;25028:1;25023:166;;;;25203:1;25198:341;;;;24990:549;;25023:166;25107:4;25103:9;25092;25088:25;25083:3;25076:38;25169:6;25162:14;25155:22;25147:6;25143:35;25138:3;25134:45;25127:52;;25023:166;;25198:341;25265:38;25297:5;25265:38;:::i;:::-;25325:1;25339:154;25353:6;25350:1;25347:13;25339:154;;;25427:7;25421:14;25417:1;25412:3;25408:11;25401:35;25477:1;25468:7;25464:15;25453:26;;25375:4;25372:1;25368:12;25363:17;;25339:154;;;25522:6;25517:3;25513:16;25506:23;;25205:334;;24990:549;;24778:767;;24671:874;;;;:::o;25551:151::-;25691:3;25687:1;25679:6;25675:14;25668:27;25551:151;:::o;25708:400::-;25868:3;25889:84;25971:1;25966:3;25889:84;:::i;:::-;25882:91;;25982:93;26071:3;25982:93;:::i;:::-;26100:1;26095:3;26091:11;26084:18;;25708:400;;;:::o;26114:390::-;26220:3;26248:39;26281:5;26248:39;:::i;:::-;26303:89;26385:6;26380:3;26303:89;:::i;:::-;26296:96;;26401:65;26459:6;26454:3;26447:4;26440:5;26436:16;26401:65;:::i;:::-;26491:6;26486:3;26482:16;26475:23;;26224:280;26114:390;;;;:::o;26510:155::-;26650:7;26646:1;26638:6;26634:14;26627:31;26510:155;:::o;26671:400::-;26831:3;26852:84;26934:1;26929:3;26852:84;:::i;:::-;26845:91;;26945:93;27034:3;26945:93;:::i;:::-;27063:1;27058:3;27054:11;27047:18;;26671:400;;;:::o;27077:961::-;27456:3;27478:92;27566:3;27557:6;27478:92;:::i;:::-;27471:99;;27587:148;27731:3;27587:148;:::i;:::-;27580:155;;27752:95;27843:3;27834:6;27752:95;:::i;:::-;27745:102;;27864:148;28008:3;27864:148;:::i;:::-;27857:155;;28029:3;28022:10;;27077:961;;;;;:::o;28044:169::-;28184:21;28180:1;28172:6;28168:14;28161:45;28044:169;:::o;28219:366::-;28361:3;28382:67;28446:2;28441:3;28382:67;:::i;:::-;28375:74;;28458:93;28547:3;28458:93;:::i;:::-;28576:2;28571:3;28567:12;28560:19;;28219:366;;;:::o;28591:419::-;28757:4;28795:2;28784:9;28780:18;28772:26;;28844:9;28838:4;28834:20;28830:1;28819:9;28815:17;28808:47;28872:131;28998:4;28872:131;:::i;:::-;28864:139;;28591:419;;;:::o;29016:173::-;29156:25;29152:1;29144:6;29140:14;29133:49;29016:173;:::o;29195:366::-;29337:3;29358:67;29422:2;29417:3;29358:67;:::i;:::-;29351:74;;29434:93;29523:3;29434:93;:::i;:::-;29552:2;29547:3;29543:12;29536:19;;29195:366;;;:::o;29567:419::-;29733:4;29771:2;29760:9;29756:18;29748:26;;29820:9;29814:4;29810:20;29806:1;29795:9;29791:17;29784:47;29848:131;29974:4;29848:131;:::i;:::-;29840:139;;29567:419;;;:::o;29992:225::-;30132:34;30128:1;30120:6;30116:14;30109:58;30201:8;30196:2;30188:6;30184:15;30177:33;29992:225;:::o;30223:366::-;30365:3;30386:67;30450:2;30445:3;30386:67;:::i;:::-;30379:74;;30462:93;30551:3;30462:93;:::i;:::-;30580:2;30575:3;30571:12;30564:19;;30223:366;;;:::o;30595:419::-;30761:4;30799:2;30788:9;30784:18;30776:26;;30848:9;30842:4;30838:20;30834:1;30823:9;30819:17;30812:47;30876:131;31002:4;30876:131;:::i;:::-;30868:139;;30595:419;;;:::o;31020:410::-;31060:7;31083:20;31101:1;31083:20;:::i;:::-;31078:25;;31117:20;31135:1;31117:20;:::i;:::-;31112:25;;31172:1;31169;31165:9;31194:30;31212:11;31194:30;:::i;:::-;31183:41;;31373:1;31364:7;31360:15;31357:1;31354:22;31334:1;31327:9;31307:83;31284:139;;31403:18;;:::i;:::-;31284:139;31068:362;31020:410;;;;:::o;31436:179::-;31576:31;31572:1;31564:6;31560:14;31553:55;31436:179;:::o;31621:366::-;31763:3;31784:67;31848:2;31843:3;31784:67;:::i;:::-;31777:74;;31860:93;31949:3;31860:93;:::i;:::-;31978:2;31973:3;31969:12;31962:19;;31621:366;;;:::o;31993:419::-;32159:4;32197:2;32186:9;32182:18;32174:26;;32246:9;32240:4;32236:20;32232:1;32221:9;32217:17;32210:47;32274:131;32400:4;32274:131;:::i;:::-;32266:139;;31993:419;;;:::o;32418:147::-;32519:11;32556:3;32541:18;;32418:147;;;;:::o;32571:114::-;;:::o;32691:398::-;32850:3;32871:83;32952:1;32947:3;32871:83;:::i;:::-;32864:90;;32963:93;33052:3;32963:93;:::i;:::-;33081:1;33076:3;33072:11;33065:18;;32691:398;;;:::o;33095:379::-;33279:3;33301:147;33444:3;33301:147;:::i;:::-;33294:154;;33465:3;33458:10;;33095:379;;;:::o;33480:245::-;33620:34;33616:1;33608:6;33604:14;33597:58;33689:28;33684:2;33676:6;33672:15;33665:53;33480:245;:::o;33731:366::-;33873:3;33894:67;33958:2;33953:3;33894:67;:::i;:::-;33887:74;;33970:93;34059:3;33970:93;:::i;:::-;34088:2;34083:3;34079:12;34072:19;;33731:366;;;:::o;34103:419::-;34269:4;34307:2;34296:9;34292:18;34284:26;;34356:9;34350:4;34346:20;34342:1;34331:9;34327:17;34320:47;34384:131;34510:4;34384:131;:::i;:::-;34376:139;;34103:419;;;:::o;34528:98::-;34579:6;34613:5;34607:12;34597:22;;34528:98;;;:::o;34632:168::-;34715:11;34749:6;34744:3;34737:19;34789:4;34784:3;34780:14;34765:29;;34632:168;;;;:::o;34806:373::-;34892:3;34920:38;34952:5;34920:38;:::i;:::-;34974:70;35037:6;35032:3;34974:70;:::i;:::-;34967:77;;35053:65;35111:6;35106:3;35099:4;35092:5;35088:16;35053:65;:::i;:::-;35143:29;35165:6;35143:29;:::i;:::-;35138:3;35134:39;35127:46;;34896:283;34806:373;;;;:::o;35185:640::-;35380:4;35418:3;35407:9;35403:19;35395:27;;35432:71;35500:1;35489:9;35485:17;35476:6;35432:71;:::i;:::-;35513:72;35581:2;35570:9;35566:18;35557:6;35513:72;:::i;:::-;35595;35663:2;35652:9;35648:18;35639:6;35595:72;:::i;:::-;35714:9;35708:4;35704:20;35699:2;35688:9;35684:18;35677:48;35742:76;35813:4;35804:6;35742:76;:::i;:::-;35734:84;;35185:640;;;;;;;:::o;35831:141::-;35887:5;35918:6;35912:13;35903:22;;35934:32;35960:5;35934:32;:::i;:::-;35831:141;;;;:::o;35978:349::-;36047:6;36096:2;36084:9;36075:7;36071:23;36067:32;36064:119;;;36102:79;;:::i;:::-;36064:119;36222:1;36247:63;36302:7;36293:6;36282:9;36278:22;36247:63;:::i;:::-;36237:73;;36193:127;35978:349;;;;:::o;36333:233::-;36372:3;36395:24;36413:5;36395:24;:::i;:::-;36386:33;;36441:66;36434:5;36431:77;36428:103;;36511:18;;:::i;:::-;36428:103;36558:1;36551:5;36547:13;36540:20;;36333:233;;;:::o;36572:180::-;36620:77;36617:1;36610:88;36717:4;36714:1;36707:15;36741:4;36738:1;36731:15;36758:185;36798:1;36815:20;36833:1;36815:20;:::i;:::-;36810:25;;36849:20;36867:1;36849:20;:::i;:::-;36844:25;;36888:1;36878:35;;36893:18;;:::i;:::-;36878:35;36935:1;36932;36928:9;36923:14;;36758:185;;;;:::o;36949:194::-;36989:4;37009:20;37027:1;37009:20;:::i;:::-;37004:25;;37043:20;37061:1;37043:20;:::i;:::-;37038:25;;37087:1;37084;37080:9;37072:17;;37111:1;37105:4;37102:11;37099:37;;;37116:18;;:::i;:::-;37099:37;36949:194;;;;:::o;37149:176::-;37181:1;37198:20;37216:1;37198:20;:::i;:::-;37193:25;;37232:20;37250:1;37232:20;:::i;:::-;37227:25;;37271:1;37261:35;;37276:18;;:::i;:::-;37261:35;37317:1;37314;37310:9;37305:14;;37149:176;;;;:::o;37331:180::-;37379:77;37376:1;37369:88;37476:4;37473:1;37466:15;37500:4;37497:1;37490:15
Swarm Source
ipfs://8b70e836236096f9573a6a01445e4c3dd9d0db319ceaff2515256f021f8c2f33