Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 14 from a total of 14 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 14387374 | 981 days ago | IN | 0 ETH | 0.00362661 | ||||
Private Bake | 13339337 | 1145 days ago | IN | 0 ETH | 0.01207854 | ||||
Private Bake | 13338870 | 1145 days ago | IN | 0 ETH | 0.01293593 | ||||
Private Bake | 13338633 | 1145 days ago | IN | 0 ETH | 0.01499264 | ||||
Update Whitelist | 13334917 | 1145 days ago | IN | 0 ETH | 0.00483364 | ||||
Private Bake | 13334557 | 1145 days ago | IN | 0 ETH | 0.02949009 | ||||
Private Bake | 13334435 | 1145 days ago | IN | 0 ETH | 0.01995136 | ||||
Update Whitelist | 13334374 | 1145 days ago | IN | 0 ETH | 0.00803992 | ||||
Add Trait Type | 13333563 | 1145 days ago | IN | 0 ETH | 0.05259286 | ||||
Add Trait Type | 13333551 | 1145 days ago | IN | 0 ETH | 0.09662806 | ||||
Add Trait Type | 13333544 | 1145 days ago | IN | 0 ETH | 0.1858662 | ||||
Add Trait Type | 13333538 | 1145 days ago | IN | 0 ETH | 0.09161724 | ||||
Add Trait Type | 13333506 | 1145 days ago | IN | 0 ETH | 0.23545349 | ||||
0x60016103 | 13332847 | 1146 days ago | IN | 0 ETH | 0.33602616 |
Loading...
Loading
Contract Name:
Pizza
Compiler Version
v0.8.8+commit.dddeac2f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-01 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.8; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @dev 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; } } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } /** * @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); } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /* ._ ,( `-. ,': `. `. ,` * `-. \ ,' ` :+ = `. `. ,~ (o): ., `. `. ,' ; : ,(__) x;`. ; ,' :' itz ; ; ; _,-' .'O ; = _' C ; ;'_,_ ; ,; _; ` : ;'_,-' i' ,` `;(_) 0 ; ',' : .';6 ; ' ,-'~ ,' Q ,& ;',-.' ,( :` ; _,-'~ ; ,~.`c _',' .';^_,-' ~ ,'_;-'' ,,~ i' :The CryptoDoughCompany */ contract Pizza is ERC721Enumerable, Ownable { using SafeMath for uint256; uint256 public constant PUBLIC_MINT_PRICE = 55000000000000000; using Oven for uint8; struct Trait { string traitName; string traitType; string pixels; uint256 pixelCount; } //string arrays string[] LETTERS = [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ]; //Mappings mapping(uint256 => Trait[]) public traitTypes; mapping(string => bool) hashToMinted; mapping(uint256 => string) internal tokenIdToHash; mapping(address => bool) private _techTaliaWhitelist; //uint256s uint256 MAX_SUPPLY = 5555; uint256 SEED_NONCE = 0; uint256 RESERVED = 165; //bool bool public _paused = true; // Events event Minted(address indexed minter, uint256 indexed tokenId); //uint arrays uint16[][9] TIERS; //address address _owner; constructor() ERC721("PizzaOnChain", "PIZZA") { _owner = msg.sender; //bg colors traitTypes[0].push(Trait("Aero Blue","Background","C1FFD7",0)); traitTypes[0].push(Trait("Gold","Background","FECD51",0)); traitTypes[0].push(Trait("Green Crayola","Background","C6D57E",0)); traitTypes[0].push(Trait("Light Coral","Background","F16F6F",0)); traitTypes[0].push(Trait("Maximum Purple","Background","CAB8FF",0)); traitTypes[0].push(Trait("New York Pink","Background","D57E7E",0)); traitTypes[0].push(Trait("Opal","Background","A2CDCD",0)); traitTypes[0].push(Trait("Peach","Background","FFE1AF",0)); traitTypes[0].push(Trait("Snow","Background","F9F3F3",0)); traitTypes[0].push(Trait("Uranian Blue","Background","B5DEFF",0)); //Sauce traitTypes[1].push(Trait("BBQ","Sauce","714c4b",0)); traitTypes[1].push(Trait("Gold","Sauce","FECD51",0)); traitTypes[1].push(Trait("Hot","Sauce","cd7542",0)); traitTypes[1].push(Trait("Pesto","Sauce","7aa579",0)); traitTypes[1].push(Trait("Tomato","Sauce","c94f49",0)); traitTypes[1].push(Trait("White","Sauce","acacac",0)); //Thickness traitTypes[2].push(Trait("Thin","Thickness","",0)); traitTypes[2].push(Trait("Thick","Thickness","",0)); //bg colors TIERS[0] = [242, 20, 954, 1007, 45, 399, 990, 333, 1447, 118]; //basis colors TIERS[1] = [671, 20, 707, 1323, 2343, 491]; //Thickness TIERS[2] = [2777, 2778]; //Crust TIERS[3] = [2211, 1165, 473, 20, 256, 408, 1022]; //Cheese TIERS[4] = [204, 1451, 550, 1239, 2111]; //Topping TIERS[5] = [240, 670, 507, 780, 12, 555, 1732, 60, 999]; //Vegetable TIERS[6] = [258, 249, 302, 1420, 1793, 669, 864]; //Spice TIERS[7] = [259, 876, 1968, 1230, 1210, 12]; //Size TIERS[8] = [2992, 222, 2325, 16]; traitTypes[8].push(Trait("Large","Size","",0)); traitTypes[8].push(Trait("Massive","Size","",0)); traitTypes[8].push(Trait("Medium","Size","",0)); traitTypes[8].push(Trait("Nano","Size","",0)); } /** * @dev Converts a digit from 0 - 5555 into its corresponding rarity based on the given rarity tier. * @param _randinput The input from 0 - 5555 to use for rarity gen. * @param _rarityTier The tier to use. */ function rarityGen(uint256 _randinput, uint8 _rarityTier) internal view returns (string memory) { uint16 currentLowerBound = 0; for (uint8 i = 0; i < TIERS[_rarityTier].length; i++) { uint16 thisPercentage = TIERS[_rarityTier][i]; if ( _randinput >= currentLowerBound && _randinput < currentLowerBound + thisPercentage ) return i.toString(); currentLowerBound = currentLowerBound + thisPercentage; } revert(); } /** * @dev Generates a 9 digit hash from a tokenId, address, and random number. * @param _t The token id to be used within the hash. * @param _a The address to be used within the hash. * @param _c The custom nonce to be used within the hash. */ function hash( uint256 _t, address _a, uint256 _c ) internal returns (string memory) { require(_c < 10); // This will generate a 9 character string. string memory currentHash = ""; for (uint8 i = 0; i < 9; i++) { SEED_NONCE++; uint16 _randinput = uint16( uint256( keccak256( abi.encodePacked( block.timestamp, block.difficulty, _t, _a, _c, SEED_NONCE ) ) ) % 5555 ); currentHash = string( abi.encodePacked(currentHash, rarityGen(_randinput, i)) ); } if (hashToMinted[currentHash]) return hash(_t, _a, _c + 1); return currentHash; } /** * @dev Mint internal, this is to avoid code duplication. */ function mintInternal(address to, uint256 _quantity) internal { uint256 _totalSupply = totalSupply(); require(totalSupply().add(_quantity) <= MAX_SUPPLY, "Public Sale Exceeded"); require(_quantity > 0,"Quantity must be greater then zero"); require(!Oven.isContract(to)); for (uint256 i = 0; i < _quantity; i++) { uint256 thisTokenId = _totalSupply + i; tokenIdToHash[thisTokenId] = hash(thisTokenId, to, 0); hashToMinted[tokenIdToHash[thisTokenId]] = true; _mint(to, thisTokenId); emit Minted(to, thisTokenId); } } /** * @dev Mints new tokens. */ function bakePizza(uint256 _quantity) public payable { require( msg.value >= PUBLIC_MINT_PRICE * _quantity, "Payment too low"); require(totalSupply().add(_quantity) <= MAX_SUPPLY - RESERVED, "Public Sale Exceeded"); require(balanceOf(_msgSender()) <= 2,"Max mints per wallet = 3"); require( !_paused, "Sale paused"); return mintInternal(_msgSender(), _quantity); } /** * @dev Private Mint. */ function privateBake() public { require( 1 <= RESERVED, "Exceeds reserved supply" ); require( totalSupply().add(1) <= MAX_SUPPLY, "Supply Exceeded"); require(isWhitelisted(_msgSender()) == true, "Not Whitelisted"); _techTaliaWhitelist[_msgSender()] = false; RESERVED -= 1; return mintInternal(_msgSender(), 1); } /* ____ ___ ____ ___ _____ __ __ ____ __ ______ ____ ___ ____ _____ | \ / _] / || \ | || | || \ / ] || |/ \ | \ / ___/ | D ) / [_ | o || \ | __|| | || _ | / /| | | || || _ ( \_ | / | _]| || D | | |_ | | || | |/ / |_| |_| | || O || | |\__ | | \ | [_ | _ || | | _] | : || | / \_ | | | || || | |/ \ | | . \| || | || | | | | || | \ | | | | || || | |\ | |__|\_||_____||__|__||_____| |__| \__,_||__|__|\____| |__| |____|\___/ |__|__| \___| */ /** * @dev Helper function to reduce pixel size within contract */ function letterToNumber(string memory _inputLetter) internal view returns (uint8) { for (uint8 i = 0; i < LETTERS.length; i++) { if (Oven.compareStrings((LETTERS[i]),_inputLetter)) return (i); } revert(); } function isWhitelisted(address _from) public view returns (bool) { return _techTaliaWhitelist[_from]; } /** * @dev Hash to SVG function */ function hashToSVG(string memory _hash) public view returns (string memory) { string memory svgString; string memory bgRect; string memory basisRect; string memory crustRect; string memory crustColor; bgRect = string( abi.encodePacked( '<rect class="bg" fill="#', traitTypes[0][Oven.parseInt(Oven.substring(_hash, 0, 1))].pixels, '"/>' ) ); basisRect = string( abi.encodePacked( '<circle fill="#', traitTypes[1][Oven.parseInt(Oven.substring(_hash, 1, 2))].pixels, '" cx="12" cy="12" r="9.9" />' ) ); if(Oven.compareStrings(traitTypes[2][Oven.parseInt(Oven.substring(_hash, 2, 3))].traitName, "Thick")){ crustColor = string( abi.encodePacked('c', Oven.substring(traitTypes[3][Oven.parseInt(Oven.substring(_hash, 3, 4))].pixels, 14, 16) ) ); crustRect = string( abi.encodePacked( '<rect x="0" y="9" class="a p"/><rect x="1" y="7" class="b o"/><rect x="2" y="5" class="c n"/><rect x="3" y="4" class="d m"/><rect x="4" y="3" class="e l"/><rect x="5" y="2" class="f k"/><rect x="7" y="1" class="g j"/><rect x="9" y="0" class="h i"/>' ) ); } for (uint8 i = 2; i < 8; i++) { uint8 thisTraitIndex = Oven.parseInt( Oven.substring(_hash, i, i + 1) ); for ( uint16 j = 0; j < traitTypes[i][thisTraitIndex].pixelCount; j++ ) { string memory thisPixel; if(j <= traitTypes[i][thisTraitIndex].pixelCount - 1){ thisPixel = Oven.substring( traitTypes[i][thisTraitIndex].pixels, j * 4, j * 4 + 4 ); uint8 x = letterToNumber( Oven.substring(thisPixel, 0, 1) ); uint8 y = letterToNumber( Oven.substring(thisPixel, 1, 2) ); svgString = string( abi.encodePacked( svgString, "<rect class='c", Oven.substring(thisPixel, 2, 4), "' x='", x.toString(), "' y='", y.toString(), "'/>" ) ); } } } svgString = string( abi.encodePacked( '<svg id="pizza-svg" class="', crustColor, '" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 48 48">', bgRect, '<g transform="matrix(1 0 0 1 12 12)">', crustRect, basisRect, svgString, '</g><style>rect {width: 1px;height: 1px;}#pizza-svg {shape-rendering: crispedges;}.bg {width: 100%;height: 100%}.z{fill:#590a01}..c00{fill:#c2d7cf}.c01{fill:#aabeb6}.c02{fill:#ed8126}.c03{fill:#ecf69e}.c04{fill:#708848}.c05{fill:#efffd4}.c06{fill:#b45230}.c07{fill:#d36d4a}.c08{fill:#63363a}.c09{fill:#6a160a}.c10{fill:#903e20}.c11{fill:#b6742f}.c12{fill:#d59049}.c13{fill:#590a01}.c14{fill:#6b2e09}.c15{fill:#915a1f}.c16{fill:#2e2e2e}.c17{fill:#393939}.c18{fill:#171717}.c19{fill:#232323}.c20{fill:#acbfd3}.c21{fill:#b8cce0}.c22{fill:#d1d9da}.c23{fill:#98a9b4}.c24{fill:#a3b2c4}.c25{fill:#c5a51f}.c26{fill:#e5c339}.c27{fill:#856900}.c28{fill:#744e00}.c29{fill:#9e8412}.c30{fill:#dfc6a7}.c31{fill:#ecd2b2}.c32{fill:#d0c4c2}.c33{fill:#bfa897}.c34{fill:#cfbba0}.c35{fill:#373737}.c36{fill:#837554}.c37{fill:#9f906e}.c38{fill:#3a241b}.c39{fill:#483925}.c40{fill:#665a3e}.c41{fill:#466930}.c42{fill:#779a61}.c43{fill:#fffae1}.c44{fill:#311500}.c45{fill:#2d2a26}.c46{fill:#821003}.c47{fill:#4e1e03}.c48{fill:#864420}.c49{fill:#862520}.c50{fill:#ff7244}.c51{fill:#9a4025}.c52{fill:#db8e2e}.c53{fill:#efca66}.c54{fill:#7c1f1f}.c55{fill:#9a4126}.c56{fill:#b85805}.c57{fill:#ce402a}.c58{fill:#b75704}.c59{fill:#7e1d13}.c60{fill:#620f06}.c61{fill:#e4bc0e}.c62{fill:#e4d20e}.c63{fill:#91112c}.c64{fill:#ba193a}.c65{fill:#d7f66a}.c66{fill:#f6ea6a}.c67{fill:#2d7717}.c68{fill:#366028}.c69{fill:#e6d7d7}.c70{fill:#c7bfac}.c71{fill:#131913}.c72{fill:#c74833}.c73{fill:#e99a8c}', '.a{width:24px}.b{width:22px}.c{width:20px}.d{width:18px}.e{width:16px}.f{width:14px}.g{width:10px}.h{width:6px}.i{height:24px}.j{height:22px}.k{height:20px}.l{height:18px}.m{height:16px}.n{height:14px}.o{height:10px}.p{height:6px}', '</style></svg>' ) ); return svgString; } /** * @dev Hash to metadata function */ function hashToMetadata(string memory _hash) public view returns (string memory) { string memory metadataString; for (uint8 i = 0; i < 9; i++) { uint8 thisTraitIndex = Oven.parseInt( Oven.substring(_hash, i, i + 1) ); metadataString = string( abi.encodePacked( metadataString, '{"trait_type":"', traitTypes[i][thisTraitIndex].traitType, '","value":"', traitTypes[i][thisTraitIndex].traitName, '"}' ) ); if (i != 8) metadataString = string(abi.encodePacked(metadataString, ",")); } return string(abi.encodePacked("[", metadataString, "]")); } /** * @dev Returns the SVG and metadata for a token Id * @param _tokenId The tokenId to return the SVG and metadata for. */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId)); string memory tokenHash = _tokenIdToHash(_tokenId); return string( abi.encodePacked( "data:application/json;base64,", Oven.encode( bytes( string( abi.encodePacked( '{"name": "Pizza #', Oven.toString(_tokenId), '", "description": "Delicious pizzas baked with love and kept warm on chain. All the metadata and images are generated and stored 100% on-chain. No IPFS, no API. Just the Ethereum blockchain.", "image": "data:image/svg+xml;base64,', Oven.encode( bytes(hashToSVG(tokenHash)) ), '","attributes":', hashToMetadata(tokenHash), "}" ) ) ) ) ) ); } /** * @dev Returns a hash for a given tokenId * @param _tokenId The tokenId to return the hash for. */ function _tokenIdToHash(uint256 _tokenId) public view returns (string memory) { string memory tokenHash = tokenIdToHash[_tokenId]; return tokenHash; } /** * @dev Returns the wallet of a given wallet. Mainly for ease for frontend devs. * @param _wallet The wallet to get the tokens of. */ function walletOfOwner(address _wallet) public view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_wallet); uint256[] memory tokensId = new uint256[](tokenCount); for (uint256 i; i < tokenCount; i++) { tokensId[i] = tokenOfOwnerByIndex(_wallet, i); } return tokensId; } /* ___ __ __ ____ ___ ____ _____ __ __ ____ __ ______ ____ ___ ____ _____ / \ | |__| || \ / _]| \ | || | || \ / ] || |/ \ | \ / ___/ | || | | || _ | / [_ | D ) | __|| | || _ | / /| | | || || _ ( \_ | O || | | || | || _]| / | |_ | | || | |/ / |_| |_| | || O || | |\__ | | || ` ' || | || [_ | \ | _] | : || | / \_ | | | || || | |/ \ | | | \ / | | || || . \ | | | || | \ | | | | || || | |\ | \___/ \_/\_/ |__|__||_____||__|\_| |__| \__,_||__|__|\____| |__| |____|\___/ |__|__| \___| */ /** * @dev Clears the traits. */ function clearTraits() public onlyOwner { for (uint256 i = 3; i < 8; i++) { delete traitTypes[i]; } } /** * @dev Add a trait type * @param _traitTypeIndex The trait type index * @param traits Array of traits to add */ function addTraitType(uint256 _traitTypeIndex, Trait[] memory traits) public onlyOwner { for (uint256 i = 0; i < traits.length; i++) { traitTypes[_traitTypeIndex].push( Trait( traits[i].traitName, traits[i].traitType, traits[i].pixels, traits[i].pixelCount ) ); } return; } /** * @dev In case of Gas War, will do manual minting. */ function setReserved(uint256 _newReserved) public onlyOwner { RESERVED = _newReserved; } function withdrawFunds() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } /** * @dev Mints new tokens ownerOnly. */ function bakeReservedPizza(uint256 _amount) public onlyOwner { require( _amount <= RESERVED, "Exceeds reserved supply" ); RESERVED -= _amount; return mintInternal(_msgSender(), _amount); } function giveAwayPizza(address _to, uint256 _amount) public onlyOwner { require( _amount <= RESERVED, "Exceeds reserved supply" ); RESERVED -= _amount; return mintInternal(_to, _amount); } function updateWhitelist(address[] calldata whitelist) public onlyOwner { for (uint256 i = 0; i < whitelist.length; i++) { _techTaliaWhitelist[whitelist[i]] = true; } } function pause(bool val) public onlyOwner { _paused = val; } } library Oven { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } function compareStrings(string memory a, string memory b) internal pure returns (bool) { return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { 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); } function parseInt(string memory _a) internal pure returns (uint8 _parsedInt) { bytes memory bresult = bytes(_a); uint8 mint = 0; for (uint8 i = 0; i < bresult.length; i++) { if ( (uint8(uint8(bresult[i])) >= 48) && (uint8(uint8(bresult[i])) <= 57) ) { mint *= 10; mint += uint8(bresult[i]) - 48; } } return mint; } function substring( string memory str, uint256 startIndex, uint256 endIndex ) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex - startIndex); for (uint256 i = startIndex; i < endIndex; i++) { result[i - startIndex] = strBytes[i]; } return string(result); } function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","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":"PUBLIC_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"_tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"internalType":"struct Pizza.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"bakePizza","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"bakeReservedPizza","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":"clearTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveAwayPizza","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"privateBake","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_newReserved","type":"uint256"}],"name":"setReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","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":"address[]","name":"whitelist","type":"address[]"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60016103c0818152606160f81b6103e0526080908152610400828152603160f91b6104205260a052610440828152606360f81b6104605260c052610480828152601960fa1b6104a05260e0526104c0828152606560f81b6104e05261010052610500828152603360f91b6105205261012052610540828152606760f81b6105605261014052610580828152600d60fb1b6105a052610160526105c0828152606960f81b6105e05261018052610600828152603560f91b610620526101a052610640828152606b60f81b610660526101c052610680828152601b60fa1b6106a0526101e0526106c0828152606d60f81b6106e05261020052610700828152603760f91b6107205261022052610740828152606f60f81b6107605261024052610780828152600760fc1b6107a052610260526107c0828152607160f81b6107e05261028052610800828152603960f91b610820526102a052610840828152607360f81b610860526102c052610880828152601d60fa1b6108a0526102e0526108c0828152607560f81b6108e05261030052610900828152603b60f91b6109205261032052610940828152607760f81b6109605261034052610980828152600f60fb1b6109a052610360526109c0828152607960f81b6109e05261038052610a40604052610a00918252603d60f91b610a20526103a0919091526200020690600b90601a62001b24565b506115b3601055600060115560a56012556013805460ff191660011790553480156200023157600080fd5b50604080518082018252600c81526b2834bd3d30a7b721b430b4b760a11b60208083019182528351808501909452600584526450495a5a4160d81b908401528151919291620002839160009162001b88565b5080516200029990600190602084019062001b88565b505050620002b6620002b062001ace60201b60201c565b62001ad2565b601d80546001600160a01b03191633179055600c60209081526040805160c081018252600960808201908152684165726f20426c756560b81b60a0830152815281518083018352600a815269109858dad9dc9bdd5b9960b21b818501528184015281518083018352600681526543314646443760d01b8185015291810191909152600060608201819052600080516020620068ba8339815191528054600181018255915281518051929360049092026000805160206200691a833981519152019262000386928492019062001b88565b506020828101518051620003a1926001850192019062001b88565b5060408201518051620003bf91600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c0810182526004608082018181526311dbdb1960e21b60a0840152825282518084018452600a815269109858dad9dc9bdd5b9960b21b818601528285015282518084018452600681526546454344353160d01b81860152928201929092526000938101849052600080516020620068ba833981519152805460018101825594528051805191949092026000805160206200691a83398151915201926200048392849291019062001b88565b5060208281015180516200049e926001850192019062001b88565b5060408201518051620004bc91600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600d608082019081526c477265656e20437261796f6c6160981b60a0830152815281518083018352600a815269109858dad9dc9bdd5b9960b21b818501528184015281518083018352600681526543364435374560d01b81850152918101919091526000928101839052600080516020620068ba833981519152805460018101825593528051805191936004026000805160206200691a83398151915201926200058a9284929091019062001b88565b506020828101518051620005a5926001850192019062001b88565b5060408201518051620005c391600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600b608082019081526a131a59da1d0810dbdc985b60aa1b60a0830152815281518083018352600a815269109858dad9dc9bdd5b9960b21b818501528184015281518083018352600681526523189b231b2360d11b81850152918101919091526000928101839052600080516020620068ba833981519152805460018101825593528051805191936004026000805160206200691a83398151915201926200068f9284929091019062001b88565b506020828101518051620006aa926001850192019062001b88565b5060408201518051620006c891600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600e608082019081526d4d6178696d756d20507572706c6560901b60a0830152815281518083018352600a815269109858dad9dc9bdd5b9960b21b818501528184015281518083018352600681526521a0a11c232360d11b81850152918101919091526000928101839052600080516020620068ba833981519152805460018101825593528051805191936004026000805160206200691a8339815191520192620007979284929091019062001b88565b506020828101518051620007b2926001850192019062001b88565b5060408201518051620007d091600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600d608082019081526c4e657720596f726b2050696e6b60981b60a0830152815281518083018352600a815269109858dad9dc9bdd5b9960b21b818501528184015281518083018352600681526544353745374560d01b81850152918101919091526000928101839052600080516020620068ba833981519152805460018101825593528051805191936004026000805160206200691a83398151915201926200089e9284929091019062001b88565b506020828101518051620008b9926001850192019062001b88565b5060408201518051620008d791600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c0810182526004608082018181526313dc185b60e21b60a0840152825282518084018452600a815269109858dad9dc9bdd5b9960b21b8186015282850152825180840184526006815265104c90d110d160d21b81860152928201929092526000938101849052600080516020620068ba833981519152805460018101825594528051805191949092026000805160206200691a83398151915201926200099b92849291019062001b88565b506020828101518051620009b6926001850192019062001b88565b5060408201518051620009d491600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600560808201908152640a0cac2c6d60db1b60a0830152815281518083018352600a815269109858dad9dc9bdd5b9960b21b818501528184015281518083018352600681526523232298a0a360d11b81850152918101919091526000928101839052600080516020620068ba833981519152805460018101825593528051805191936004026000805160206200691a833981519152019262000a9a9284929091019062001b88565b50602082810151805162000ab5926001850192019062001b88565b506040820151805162000ad391600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c08101825260046080820181815263536e6f7760e01b60a0840152825282518084018452600a815269109858dad9dc9bdd5b9960b21b818601528285015282518084018452600681526546394633463360d01b81860152928201929092526000938101849052600080516020620068ba833981519152805460018101825594528051805191949092026000805160206200691a833981519152019262000b9792849291019062001b88565b50602082810151805162000bb2926001850192019062001b88565b506040820151805162000bd091600284019160209091019062001b88565b50606091820151600390910155600c60208181526040805160c081018252608081019384526b5572616e69616e20426c756560a01b60a082015292835280518082018252600a815269109858dad9dc9bdd5b9960b21b8184015283830152805180820182526006815265211aa222a32360d11b81840152908301526000928201839052600080516020620068ba833981519152805460018101825593528151805192936004026000805160206200691a833981519152019262000c97928492019062001b88565b50602082810151805162000cb2926001850192019062001b88565b506040820151805162000cd091600284019160209091019062001b88565b50606091820151600391820155600c60209081526040805160c081018252608081019384526242425160e81b60a0820152928352805180820182526005815264536175636560d81b81840152838301528051808201825260068152651b989a319a3160d11b81840152908301526000928201839052600080516020620068fa833981519152805460018101825593528151805192936004026000805160206200697a833981519152019262000d89928492019062001b88565b50602082810151805162000da4926001850192019062001b88565b506040820151805162000dc291600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c0810182526004608082018181526311dbdb1960e21b60a08401528252825180840184526005815264536175636560d81b818601528285015282518084018452600681526546454344353160d01b81860152928201929092526000938101849052600080516020620068fa833981519152805460018101825594528051805191949092026000805160206200697a833981519152019262000e8192849291019062001b88565b50602082810151805162000e9c926001850192019062001b88565b506040820151805162000eba91600284019160209091019062001b88565b50606091820151600391820155600c60209081526040805160c0810182526080810193845262121bdd60ea1b60a0820152928352805180820182526005815264536175636560d81b818401528383015280518082018252600681526531b21b9a9a1960d11b81840152908301526000928201839052600080516020620068fa833981519152805460018101825593528151805192936004026000805160206200697a833981519152019262000f73928492019062001b88565b50602082810151805162000f8e926001850192019062001b88565b506040820151805162000fac91600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c08101825260056080820181815264506573746f60d81b60a084015282528251808401845290815264536175636560d81b818501528184015281518083018352600681526537616135373960d01b81850152918101919091526000928101839052600080516020620068fa833981519152805460018101825593528051805191936004026000805160206200697a83398151915201926200106c9284929091019062001b88565b50602082810151805162001087926001850192019062001b88565b5060408201518051620010a591600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c08101825260066080820181815265546f6d61746f60d01b60a08401528252825180840184526005815264536175636560d81b8186015282850152825180840184529081526563393466343960d01b81850152918101919091526000928101839052600080516020620068fa833981519152805460018101825593528051805191936004026000805160206200697a8339815191520192620011669284929091019062001b88565b50602082810151805162001181926001850192019062001b88565b50604082015180516200119f91600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c08101825260056080820181815264576869746560d81b60a084015282528251808401845290815264536175636560d81b818501528184015281518083018352600681526561636163616360d01b81850152918101919091526000928101839052600080516020620068fa833981519152805460018101825593528051805191936004026000805160206200697a83398151915201926200125f9284929091019062001b88565b5060208281015180516200127a926001850192019062001b88565b50604082015180516200129891600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600460808201818152632a3434b760e11b60a08401528252825180840184526009815268546869636b6e65737360b81b8186015282850152825180850184526000808252938301529381018290526000805160206200693a83398151915280546001810182559252805180519194929092026000805160206200695a83398151915201926200134a92849291019062001b88565b50602082810151805162001365926001850192019062001b88565b50604082015180516200138391600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c08101825260056080820190815264546869636b60d81b60a08301528152815180830183526009815268546869636b6e65737360b81b8185015281840152815180840183526000808252928201529283018190526000805160206200693a833981519152805460018101825591528251805160049092026000805160206200695a8339815191520192620014369284929091019062001b88565b50602082810151805162001451926001850192019062001b88565b50604082015180516200146f91600284019160209091019062001b88565b5060609182015160039190910155604080516101408101825260f281526014602082018190526103ba928201929092526103ef92810192909252602d608083015261018f60a08301526103de60c083015261014d60e08301526105a76101008301526076610120830152620014e691600a62001c13565b506040805160c08101825261029f8152601460208201526102c39181019190915261052b606082015261092760808201526101eb60a08201526200152f90601590600662001c13565b5060408051808201909152610ad98152610ada60208201526200155790601690600262001c13565b506040805160e0810182526108a3815261048d60208201526101d99181019190915260146060820152610100608082015261019860a08201526103fe60c0820152620015a890601790600762001c13565b506040805160a08101825260cc81526105ab6020820152610226918101919091526104d7606082015261083f6080820152620015e990601890600562001c13565b50604080516101208101825260f0815261029e60208201526101fb9181019190915261030c6060820152600c608082015261022b60a08201526106c460c0820152603c60e08201526103e76101008201526200164a90601990600962001c13565b506040805160e081018252610102815260f9602082015261012e9181019190915261058c6060820152610701608082015261029d60a082015261036060c08201526200169b90601a90600762001c13565b506040805160c081018252610103815261036c60208201526107b0918101919091526104ce60608201526104ba6080820152600c60a0820152620016e490601b90600662001c13565b5060408051608081018252610bb0815260de602082015261091591810191909152601060608201526200171c90601c90600462001c13565b50600c60209081526040805160c081018252600560808201908152644c6172676560d81b60a083015281528151808301835260048082526353697a6560e01b82860152828501919091528251808501845260008082529383015260608201839052600080516020620068da83398151915280546001810182559352815180519294939091026000805160206200699a8339815191520192620017c49284929091019062001b88565b506020828101518051620017df926001850192019062001b88565b5060408201518051620017fd91600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600760808201908152664d61737369766560c81b60a083015281528151808301835260048082526353697a6560e01b828601528285019190915282518085018452600080825293830152938101829052600080516020620068da83398151915280546001810182559252805180519194929092026000805160206200699a8339815191520192620018b192849291019062001b88565b506020828101518051620018cc926001850192019062001b88565b5060408201518051620018ea91600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600660808201908152654d656469756d60d01b60a083015281528151808301835260048082526353697a6560e01b828601528285019190915282518085018452600080825293830152938101829052600080516020620068da83398151915280546001810182559252805180519194929092026000805160206200699a83398151915201926200199d92849291019062001b88565b506020828101518051620019b8926001850192019062001b88565b5060408201518051620019d691600284019160209091019062001b88565b50606091820151600390910155600c60209081526040805160c081018252600460808201818152634e616e6f60e01b60a08401528252825180840184528181526353697a6560e01b818601528285015282518085018452600080825293830152938101829052600080516020620068da83398151915280546001810182559252805180519194929092026000805160206200699a833981519152019262001a8292849291019062001b88565b50602082810151805162001a9d926001850192019062001b88565b506040820151805162001abb91600284019160209091019062001b88565b5060608201518160030155505062001d75565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562001b76579160200282015b8281111562001b76578251805162001b6591849160209091019062001b88565b509160200191906001019062001b45565b5062001b8492915062001cbe565b5090565b82805462001b969062001d38565b90600052602060002090601f01602090048101928262001bba576000855562001c05565b82601f1062001bd557805160ff191683800117855562001c05565b8280016001018555821562001c05579182015b8281111562001c0557825182559160200191906001019062001be8565b5062001b8492915062001cdf565b82805482825590600052602060002090600f0160109004810192821562001c055791602002820160005b8382111562001c7f57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262001c3d565b801562001caf5782816101000a81549061ffff021916905560020160208160010104928301926001030262001c7f565b505062001b8492915062001cdf565b8082111562001b8457600062001cd5828262001cf6565b5060010162001cbe565b5b8082111562001b84576000815560010162001ce0565b50805462001d049062001d38565b6000825580601f1062001d15575050565b601f01602090049060005260206000209081019062001d35919062001cdf565b50565b600181811c9082168062001d4d57607f821691505b6020821081141562001d6f57634e487b7160e01b600052602260045260246000fd5b50919050565b614b358062001d856000396000f3fe6080604052600436106102195760003560e01c806345627764116101235780639140e272116100ab578063c87b56dd1161006f578063c87b56dd14610644578063cac8200514610664578063d93dfe8814610677578063e985e9c514610697578063f2fde38b146106e057600080fd5b80639140e272146105af57806395d89b41146105cf578063a22cb465146105e4578063b73a956814610604578063b88d4fde1461062457600080fd5b80636bde2627116100f25780636bde26271461052157806370a082311461053c578063715018a61461055c57806389ce3074146105715780638da5cb5b1461059157600080fd5b806345627764146104ac5780634f6ccce7146104c15780636352211e146104e157806366e338701461050157600080fd5b806323b872dd116101a65780632fb098d2116101755780632fb098d2146103d657806335377214146104065780633af32abf1461042657806342842e0e1461045f578063438b63001461047f57600080fd5b806323b872dd1461036157806324600fc3146103815780632d6e71b6146103965780632f745c59146103b657600080fd5b8063081812fc116101ed578063081812fc146102bb578063095ea7b3146102f3578063098afd4b1461031357806316c61ccc1461032857806318160ddd1461034257600080fd5b80625ea3071461021e57806301ffc9a71461025457806302329a291461028457806306fdde03146102a6575b600080fd5b34801561022a57600080fd5b5061023e6102393660046132ab565b610700565b60405161024b919061331c565b60405180910390f35b34801561026057600080fd5b5061027461026f366004613345565b6107a4565b604051901515815260200161024b565b34801561029057600080fd5b506102a461029f366004613377565b6107cf565b005b3480156102b257600080fd5b5061023e610815565b3480156102c757600080fd5b506102db6102d63660046132ab565b6108a7565b6040516001600160a01b03909116815260200161024b565b3480156102ff57600080fd5b506102a461030e3660046133a9565b61093c565b34801561031f57600080fd5b506102a4610a52565b34801561033457600080fd5b506013546102749060ff1681565b34801561034e57600080fd5b506008545b60405190815260200161024b565b34801561036d57600080fd5b506102a461037c3660046133d3565b610ab4565b34801561038d57600080fd5b506102a4610ae5565b3480156103a257600080fd5b506102a46103b13660046132ab565b610b42565b3480156103c257600080fd5b506103536103d13660046133a9565b610b71565b3480156103e257600080fd5b506103f66103f136600461340f565b610c07565b60405161024b9493929190613431565b34801561041257600080fd5b506102a461042136600461347c565b610dec565b34801561043257600080fd5b506102746104413660046134f1565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561046b57600080fd5b506102a461047a3660046133d3565b610e88565b34801561048b57600080fd5b5061049f61049a3660046134f1565b610ea3565b60405161024b919061350c565b3480156104b857600080fd5b506102a4610f45565b3480156104cd57600080fd5b506103536104dc3660046132ab565b611048565b3480156104ed57600080fd5b506102db6104fc3660046132ab565b6110db565b34801561050d57600080fd5b5061023e61051c366004613638565b611152565b34801561052d57600080fd5b5061035366c3663566a5800081565b34801561054857600080fd5b506103536105573660046134f1565b61128f565b34801561056857600080fd5b506102a4611316565b34801561057d57600080fd5b5061023e61058c366004613638565b61134a565b34801561059d57600080fd5b50600a546001600160a01b03166102db565b3480156105bb57600080fd5b506102a46105ca3660046132ab565b611a1d565b3480156105db57600080fd5b5061023e611a8c565b3480156105f057600080fd5b506102a46105ff36600461366d565b611a9b565b34801561061057600080fd5b506102a461061f3660046133a9565b611b60565b34801561063057600080fd5b506102a461063f3660046136a0565b611bce565b34801561065057600080fd5b5061023e61065f3660046132ab565b611c06565b6102a46106723660046132ab565b611c93565b34801561068357600080fd5b506102a461069236600461371c565b611dea565b3480156106a357600080fd5b506102746106b2366004613879565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ec57600080fd5b506102a46106fb3660046134f1565b611f4c565b6000818152600e602052604081208054606092919061071e906138a3565b80601f016020809104026020016040519081016040528092919081815260200182805461074a906138a3565b80156107975780601f1061076c57610100808354040283529160200191610797565b820191906000526020600020905b81548152906001019060200180831161077a57829003601f168201915b5093979650505050505050565b60006001600160e01b0319821663780e9d6360e01b14806107c957506107c982611fe4565b92915050565b600a546001600160a01b031633146108025760405162461bcd60e51b81526004016107f9906138de565b60405180910390fd5b6013805460ff1916911515919091179055565b606060008054610824906138a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610850906138a3565b801561089d5780601f106108725761010080835404028352916020019161089d565b820191906000526020600020905b81548152906001019060200180831161088057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109205760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107f9565b506000908152600460205260409020546001600160a01b031690565b6000610947826110db565b9050806001600160a01b0316836001600160a01b031614156109b55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107f9565b336001600160a01b03821614806109d157506109d181336106b2565b610a435760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107f9565b610a4d8383612034565b505050565b600a546001600160a01b03163314610a7c5760405162461bcd60e51b81526004016107f9906138de565b60035b6008811015610ab1576000818152600c60205260408120610a9f91613177565b80610aa981613929565b915050610a7f565b50565b610abe33826120a2565b610ada5760405162461bcd60e51b81526004016107f990613944565b610a4d838383612199565b600a546001600160a01b03163314610b0f5760405162461bcd60e51b81526004016107f9906138de565b6040514790339082156108fc029083906000818181858888f19350505050158015610b3e573d6000803e3d6000fd5b5050565b600a546001600160a01b03163314610b6c5760405162461bcd60e51b81526004016107f9906138de565b601255565b6000610b7c8361128f565b8210610bde5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107f9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600c6020528160005260406000208181548110610c2357600080fd5b906000526020600020906004020160009150915050806000018054610c47906138a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c73906138a3565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b505050505090806001018054610cd5906138a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d01906138a3565b8015610d4e5780601f10610d2357610100808354040283529160200191610d4e565b820191906000526020600020905b815481529060010190602001808311610d3157829003601f168201915b505050505090806002018054610d63906138a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8f906138a3565b8015610ddc5780601f10610db157610100808354040283529160200191610ddc565b820191906000526020600020905b815481529060010190602001808311610dbf57829003601f168201915b5050505050908060030154905084565b600a546001600160a01b03163314610e165760405162461bcd60e51b81526004016107f9906138de565b60005b81811015610a4d576001600f6000858585818110610e3957610e39613995565b9050602002016020810190610e4e91906134f1565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610e8081613929565b915050610e19565b610a4d83838360405180602001604052806000815250611bce565b60606000610eb08361128f565b905060008167ffffffffffffffff811115610ecd57610ecd613550565b604051908082528060200260200182016040528015610ef6578160200160208202803683370190505b50905060005b82811015610f3d57610f0e8582610b71565b828281518110610f2057610f20613995565b602090810291909101015280610f3581613929565b915050610efc565b509392505050565b60125460011115610f685760405162461bcd60e51b81526004016107f9906139ab565b601054610f7f6001610f7960085490565b90612344565b1115610fbf5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48115e18d959591959608a1b60448201526064016107f9565b610fc833610441565b151560011461100b5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b60448201526064016107f9565b336000908152600f60205260408120805460ff1916905560128054600192906110359084906139e2565b90915550611046905033600161236a565b565b600061105360085490565b82106110b65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107f9565b600882815481106110c9576110c9613995565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107c95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107f9565b60608060005b60098160ff1610156112665760006111896111848660ff851661117c8660016139f9565b60ff16612513565b6125e0565b905082600c60008460ff1681526020019081526020016000208260ff16815481106111b6576111b6613995565b9060005260206000209060040201600101600c60008560ff1681526020019081526020016000208360ff16815481106111f1576111f1613995565b906000526020600020906004020160000160405160200161121493929190613ad4565b60405160208183030381529060405292508160ff1660081461125357826040516020016112419190613b41565b60405160208183030381529060405292505b508061125e81613b66565b915050611158565b50806040516020016112789190613b86565b604051602081830303815290604052915050919050565b60006001600160a01b0382166112fa5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107f9565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113405760405162461bcd60e51b81526004016107f9906138de565b6110466000612696565b606080606080606080600c60008081526020019081526020016000206113766111848960006001612513565b60ff168154811061138957611389613995565b90600052602060002090600402016002016040516020016113aa9190613bba565b6040516020818303038152906040529350600c6000600181526020019081526020016000206113df6111848960016002612513565b60ff16815481106113f2576113f2613995565b90600052602060002090600402016002016040516020016114139190613bff565b604051602081830303815290604052925061151b600c60006002815260200190815260200160002061144b6111848a60026003612513565b60ff168154811061145e5761145e613995565b9060005260206000209060040201600001805461147a906138a3565b80601f01602080910402602001604051908101604052809291908181526020018280546114a6906138a3565b80156114f35780601f106114c8576101008083540402835291602001916114f3565b820191906000526020600020905b8154815290600101906020018083116114d657829003601f168201915b505050505060405180604001604052806005815260200164546869636b60d81b8152506126e8565b156117895760036000819052600c602052611619907fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd79061156390611184908b906004612513565b60ff168154811061157657611576613995565b90600052602060002090600402016002018054611592906138a3565b80601f01602080910402602001604051908101604052809291908181526020018280546115be906138a3565b801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b5050505050600e6010612513565b6040516020016116299190613c50565b6040516020818303038152906040529050604051602001611777907f3c7265637420783d22302220793d22392220636c6173733d22612070222f3e3c81527f7265637420783d22312220793d22372220636c6173733d2262206f222f3e3c7260208201527f65637420783d22322220793d22352220636c6173733d2263206e222f3e3c726560408201527f637420783d22332220793d22342220636c6173733d2264206d222f3e3c72656360608201527f7420783d22342220793d22332220636c6173733d2265206c222f3e3c7265637460808201527f20783d22352220793d22322220636c6173733d2266206b222f3e3c726563742060a08201527f783d22372220793d22312220636c6173733d2267206a222f3e3c72656374207860c08201527f3d22392220793d22302220636c6173733d22682069222f3e000000000000000060e082015260f80190565b60405160208183030381529060405291505b60025b60088160ff1610156119e85760006117b06111848a60ff851661117c8660016139f9565b905060005b600c60008460ff1681526020019081526020016000208260ff16815481106117df576117df613995565b9060005260206000209060040201600301548161ffff1610156119d35760606001600c60008660ff1681526020019081526020016000208460ff168154811061182a5761182a613995565b90600052602060002090600402016003015461184691906139e2565b8261ffff16116119c05760ff8085166000908152600c60205260409020805461194492861690811061187a5761187a613995565b90600052602060002090600402016002018054611896906138a3565b80601f01602080910402602001604051908101604052809291908181526020018280546118c2906138a3565b801561190f5780601f106118e45761010080835404028352916020019161190f565b820191906000526020600020905b8154815290600101906020018083116118f257829003601f168201915b50505050508360046119219190613c79565b61ffff16611930856004613c79565b61193b906004613ca3565b61ffff16612513565b9050600061195d6119588360006001612513565b612741565b905060006119716119588460016002612513565b90508a6119818460026004612513565b61198d8460ff16612827565b6119998460ff16612827565b6040516020016119ac9493929190613cc9565b6040516020818303038152906040529a5050505b50806119cb81613d70565b9150506117b5565b505080806119e090613b66565b91505061178c565b508084838588604051602001611a02959493929190613d92565b60408051601f19818403018152919052979650505050505050565b600a546001600160a01b03163314611a475760405162461bcd60e51b81526004016107f9906138de565b601254811115611a695760405162461bcd60e51b81526004016107f9906139ab565b8060126000828254611a7b91906139e2565b90915550610ab19050335b8261236a565b606060018054610824906138a3565b6001600160a01b038216331415611af45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107f9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611b8a5760405162461bcd60e51b81526004016107f9906138de565b601254811115611bac5760405162461bcd60e51b81526004016107f9906139ab565b8060126000828254611bbe91906139e2565b90915550610b3e9050828261236a565b611bd833836120a2565b611bf45760405162461bcd60e51b81526004016107f990613944565b611c0084848484612925565b50505050565b6000818152600260205260409020546060906001600160a01b0316611c2a57600080fd5b6000611c3583610700565b9050611c83611c4384612827565b611c54611c4f8461134a565b612958565b611c5d84611152565b604051602001611c6f93929190614706565b604051602081830303815290604052612958565b604051602001611278919061489d565b611ca48166c3663566a580006148e2565b341015611ce55760405162461bcd60e51b815260206004820152600f60248201526e5061796d656e7420746f6f206c6f7760881b60448201526064016107f9565b601254601054611cf591906139e2565b611d0282610f7960085490565b1115611d475760405162461bcd60e51b8152602060048201526014602482015273141d589b1a58c814d85b1948115e18d95959195960621b60448201526064016107f9565b6002611d523361128f565b1115611da05760405162461bcd60e51b815260206004820152601860248201527f4d6178206d696e7473207065722077616c6c6574203d2033000000000000000060448201526064016107f9565b60135460ff1615611de15760405162461bcd60e51b815260206004820152600b60248201526a14d85b19481c185d5cd95960aa1b60448201526064016107f9565b610ab133611a86565b600a546001600160a01b03163314611e145760405162461bcd60e51b81526004016107f9906138de565b60005b8151811015610a4d57600c60008481526020019081526020016000206040518060800160405280848481518110611e5057611e50613995565b6020026020010151600001518152602001848481518110611e7357611e73613995565b6020026020010151602001518152602001848481518110611e9657611e96613995565b6020026020010151604001518152602001848481518110611eb957611eb9613995565b60209081029190910181015160600151909152825460018101845560009384529281902082518051939460040290910192611ef79284920190613198565b506020828101518051611f109260018501920190613198565b5060408201518051611f2c916002840191602090910190613198565b506060820151816003015550508080611f4490613929565b915050611e17565b600a546001600160a01b03163314611f765760405162461bcd60e51b81526004016107f9906138de565b6001600160a01b038116611fdb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b610ab181612696565b60006001600160e01b031982166380ac58cd60e01b148061201557506001600160e01b03198216635b5e139f60e01b145b806107c957506301ffc9a760e01b6001600160e01b03198316146107c9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612069826110db565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661211b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107f9565b6000612126836110db565b9050806001600160a01b0316846001600160a01b031614806121615750836001600160a01b0316612156846108a7565b6001600160a01b0316145b8061219157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166121ac826110db565b6001600160a01b0316146122145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107f9565b6001600160a01b0382166122765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107f9565b612281838383612ac0565b61228c600082612034565b6001600160a01b03831660009081526003602052604081208054600192906122b59084906139e2565b90915550506001600160a01b03821660009081526003602052604081208054600192906122e3908490614901565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000806123518385614901565b90508381101561236357612363614919565b9392505050565b600061237560085490565b905060105461238783610f7960085490565b11156123cc5760405162461bcd60e51b8152602060048201526014602482015273141d589b1a58c814d85b1948115e18d95959195960621b60448201526064016107f9565b600082116124275760405162461bcd60e51b815260206004820152602260248201527f5175616e74697479206d7573742062652067726561746572207468656e207a65604482015261726f60f01b60648201526084016107f9565b823b1561243357600080fd5b60005b82811015611c0057600061244a8284614901565b905061245881866000612b78565b6000828152600e60209081526040909120825161247b9391929190910190613198565b506001600d600e60008481526020019081526020016000206040516124a0919061492f565b908152604051908190036020019020805491151560ff199092169190911790556124ca8582612cb6565b60405181906001600160a01b038716907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe90600090a3508061250b81613929565b915050612436565b606083600061252285856139e2565b67ffffffffffffffff81111561253a5761253a613550565b6040519080825280601f01601f191660200182016040528015612564576020820181803683370190505b509050845b848110156125d65782818151811061258357612583613995565b01602001516001600160f81b0319168261259d88846139e2565b815181106125ad576125ad613995565b60200101906001600160f81b031916908160001a905350806125ce81613929565b915050612569565b5095945050505050565b60008181805b82518160ff161015610f3d576030838260ff168151811061260957612609613995565b016020015160f81c1080159061263c57506039838260ff168151811061263157612631613995565b016020015160f81c11155b156126845761264c600a8361493b565b91506030838260ff168151811061266557612665613995565b0160200151612677919060f81c614964565b61268190836139f9565b91505b8061268e81613b66565b9150506125e6565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000816040516020016126fb9190614987565b60405160208183030381529060405280519060200120836040516020016127229190614987565b6040516020818303038152906040528051906020012014905092915050565b6000805b600b5460ff8216101561282157612804600b8260ff168154811061276b5761276b613995565b906000526020600020018054612780906138a3565b80601f01602080910402602001604051908101604052809291908181526020018280546127ac906138a3565b80156127f95780601f106127ce576101008083540402835291602001916127f9565b820191906000526020600020905b8154815290600101906020018083116127dc57829003601f168201915b5050505050846126e8565b1561280f5792915050565b8061281981613b66565b915050612745565b50600080fd5b60608161284b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612875578061285f81613929565b915061286e9050600a836149b9565b915061284f565b60008167ffffffffffffffff81111561289057612890613550565b6040519080825280601f01601f1916602001820160405280156128ba576020820181803683370190505b5090505b8415612191576128cf6001836139e2565b91506128dc600a866149cd565b6128e7906030614901565b60f81b8183815181106128fc576128fc613995565b60200101906001600160f81b031916908160001a90535061291e600a866149b9565b94506128be565b612930848484612199565b61293c84848484612e04565b611c005760405162461bcd60e51b81526004016107f9906149e1565b606081516000141561297857505060408051602081019091526000815290565b6000604051806060016040528060408152602001614ac060409139905060006003845160026129a79190614901565b6129b191906149b9565b6129bc9060046148e2565b905060006129cb826020614901565b67ffffffffffffffff8111156129e3576129e3613550565b6040519080825280601f01601f191660200182016040528015612a0d576020820181803683370190505b509050818152600183018586518101602084015b81831015612a7b5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612a21565b600389510660018114612a955760028114612aa657612ab2565b613d3d60f01b600119830152612ab2565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b038316612b1b57612b1681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b3e565b816001600160a01b0316836001600160a01b031614612b3e57612b3e8382612f11565b6001600160a01b038216612b5557610a4d81612fae565b826001600160a01b0316826001600160a01b031614610a4d57610a4d828261305d565b6060600a8210612b8757600080fd5b604080516020810190915260008082525b60098160ff161015612c705760118054906000612bb483613929565b9091555050601154604080514260208201524491810191909152606080820189905287901b6bffffffffffffffffffffffff191660808201526094810186905260b48101919091526000906115b39060d4016040516020818303038152906040528051906020012060001c612c2991906149cd565b905082612c3a8261ffff16846130a1565b604051602001612c4b929190614a33565b6040516020818303038152906040529250508080612c6890613b66565b915050612b98565b50600d81604051612c819190614987565b9081526040519081900360200190205460ff161561219157612cae8585612ca9866001614901565b612b78565b915050612363565b6001600160a01b038216612d0c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107f9565b6000818152600260205260409020546001600160a01b031615612d715760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f9565b612d7d60008383612ac0565b6001600160a01b0382166000908152600360205260408120805460019290612da6908490614901565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612f0657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e48903390899088908890600401614a59565b602060405180830381600087803b158015612e6257600080fd5b505af1925050508015612e92575060408051601f3d908101601f19168201909252612e8f91810190614a8c565b60015b612eec573d808015612ec0576040519150601f19603f3d011682016040523d82523d6000602084013e612ec5565b606091505b508051612ee45760405162461bcd60e51b81526004016107f9906149e1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612191565b506001949350505050565b60006001612f1e8461128f565b612f2891906139e2565b600083815260076020526040902054909150808214612f7b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612fc0906001906139e2565b60008381526009602052604081205460088054939450909284908110612fe857612fe8613995565b90600052602060002001549050806008838154811061300957613009613995565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061304157613041614aa9565b6001900381819060005260206000200160009055905550505050565b60006130688361128f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60606000805b60148460ff16600981106130bd576130bd613995565b015460ff8216101561282157600060148560ff16600981106130e1576130e1613995565b018260ff16815481106130f6576130f6613995565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff16861015801561313c57506131358184613ca3565b61ffff1686105b156131575761314d8260ff16612827565b93505050506107c9565b6131618184613ca3565b925050808061316f90613b66565b9150506130a7565b5080546000825560040290600052602060002090810190610ab1919061321c565b8280546131a4906138a3565b90600052602060002090601f0160209004810192826131c6576000855561320c565b82601f106131df57805160ff191683800117855561320c565b8280016001018555821561320c579182015b8281111561320c5782518255916020019190600101906131f1565b5061321892915061325c565b5090565b808211156132185760006132308282613271565b61323e600183016000613271565b61324c600283016000613271565b506000600382015560040161321c565b5b80821115613218576000815560010161325d565b50805461327d906138a3565b6000825580601f1061328d575050565b601f016020900490600052602060002090810190610ab1919061325c565b6000602082840312156132bd57600080fd5b5035919050565b60005b838110156132df5781810151838201526020016132c7565b83811115611c005750506000910152565b600081518084526133088160208601602086016132c4565b601f01601f19169290920160200192915050565b60208152600061236360208301846132f0565b6001600160e01b031981168114610ab157600080fd5b60006020828403121561335757600080fd5b81356123638161332f565b8035801515811461337257600080fd5b919050565b60006020828403121561338957600080fd5b61236382613362565b80356001600160a01b038116811461337257600080fd5b600080604083850312156133bc57600080fd5b6133c583613392565b946020939093013593505050565b6000806000606084860312156133e857600080fd5b6133f184613392565b92506133ff60208501613392565b9150604084013590509250925092565b6000806040838503121561342257600080fd5b50508035926020909101359150565b60808152600061344460808301876132f0565b828103602084015261345681876132f0565b9050828103604084015261346a81866132f0565b91505082606083015295945050505050565b6000806020838503121561348f57600080fd5b823567ffffffffffffffff808211156134a757600080fd5b818501915085601f8301126134bb57600080fd5b8135818111156134ca57600080fd5b8660208260051b85010111156134df57600080fd5b60209290920196919550909350505050565b60006020828403121561350357600080fd5b61236382613392565b6020808252825182820181905260009190848201906040850190845b8181101561354457835183529284019291840191600101613528565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561358957613589613550565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156135b8576135b8613550565b604052919050565b600067ffffffffffffffff8311156135da576135da613550565b6135ed601f8401601f191660200161358f565b905082815283838301111561360157600080fd5b828260208301376000602084830101529392505050565b600082601f83011261362957600080fd5b612363838335602085016135c0565b60006020828403121561364a57600080fd5b813567ffffffffffffffff81111561366157600080fd5b61219184828501613618565b6000806040838503121561368057600080fd5b61368983613392565b915061369760208401613362565b90509250929050565b600080600080608085870312156136b657600080fd5b6136bf85613392565b93506136cd60208601613392565b925060408501359150606085013567ffffffffffffffff8111156136f057600080fd5b8501601f8101871361370157600080fd5b613710878235602084016135c0565b91505092959194509250565b6000806040838503121561372f57600080fd5b8235915060208084013567ffffffffffffffff8082111561374f57600080fd5b818601915086601f83011261376357600080fd5b81358181111561377557613775613550565b8060051b61378485820161358f565b918252838101850191858101908a84111561379e57600080fd5b86860192505b83831015613868578235858111156137bb57600080fd5b86016080818d03601f190112156137d25760008081fd5b6137da613566565b88820135878111156137ec5760008081fd5b6137fa8e8b83860101613618565b8252506040820135878111156138105760008081fd5b61381e8e8b83860101613618565b8a83015250606080830135888111156138375760008081fd5b6138458f8c83870101613618565b6040840152506080929092013591810191909152825291860191908601906137a4565b809750505050505050509250929050565b6000806040838503121561388c57600080fd5b61389583613392565b915061369760208401613392565b600181811c908216806138b757607f821691505b602082108114156138d857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060001982141561393d5761393d613913565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526017908201527f4578636565647320726573657276656420737570706c79000000000000000000604082015260600190565b6000828210156139f4576139f4613913565b500390565b600060ff821660ff84168060ff03821115613a1657613a16613913565b019392505050565b60008151613a308185602086016132c4565b9290920192915050565b8054600090600181811c9080831680613a5457607f831692505b6020808410821415613a7657634e487b7160e01b600052602260045260246000fd5b818015613a8a5760018114613a9b57613ac8565b60ff19861689528489019650613ac8565b60008881526020902060005b86811015613ac05781548b820152908501908301613aa7565b505084890196505b50505050505092915050565b60008451613ae68184602089016132c4565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613b0c600f820186613a3a565b6a1116113b30b63ab2911d1160a91b81529050613b2c600b820185613a3a565b61227d60f01b81526002019695505050505050565b60008251613b538184602087016132c4565b600b60fa1b920191825250600101919050565b600060ff821660ff811415613b7d57613b7d613913565b60010192915050565b605b60f81b815260008251613ba28160018501602087016132c4565b605d60f81b6001939091019283015250600201919050565b7f3c7265637420636c6173733d226267222066696c6c3d2223000000000000000081526000613bec6018830184613a3a565b6211179f60e91b81526003019392505050565b6e3c636972636c652066696c6c3d222360881b81526000613c23600f830184613a3a565b7f222063783d223132222063793d2231322220723d22392e3922202f3e000000008152601c019392505050565b606360f81b815260008251613c6c8160018501602087016132c4565b9190910160010192915050565b600061ffff80831681851681830481118215151615613c9a57613c9a613913565b02949350505050565b600061ffff808316818516808303821115613cc057613cc0613913565b01949350505050565b60008551613cdb818460208a016132c4565b6d3c7265637420636c6173733d276360901b9083019081528551613d0681600e840160208a016132c4565b642720783d2760d81b600e92909101918201528451613d2c8160138401602089016132c4565b642720793d2760d81b601392909101918201528351613d528160188401602088016132c4565b6213979f60e91b60189290910191820152601b019695505050505050565b600061ffff80831681811415613d8857613d88613913565b6001019392505050565b7f3c7376672069643d2270697a7a612d7376672220636c6173733d220000000000815260008651613dca81601b850160208b016132c4565b7f2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f601b918401918201527f73766722207072657365727665417370656374526174696f3d22784d696e594d603b8201527f696e206d656574222076696577426f783d22302030203438203438223e000000605b8201528651613e53816078840160208b016132c4565b7f3c67207472616e73666f726d3d226d61747269782831203020302031203132206078929091019182015264189914911f60d91b60988201528551613e9f81609d840160208a016132c4565b8551910190613eb581609d8401602089016132c4565b6146f96146df6145c3613ecd609d8587010189613a1e565b7f3c2f673e3c7374796c653e72656374207b77696474683a203170783b6865696781527f68743a203170783b7d2370697a7a612d737667207b73686170652d72656e646560208201527f72696e673a20637269737065646765733b7d2e6267207b77696474683a20313060408201527f30253b6865696768743a20313030257d2e7a7b66696c6c3a233539306130317d60608201527f2e2e6330307b66696c6c3a236332643763667d2e6330317b66696c6c3a23616160808201527f626562367d2e6330327b66696c6c3a236564383132367d2e6330337b66696c6c60a08201527f3a236563663639657d2e6330347b66696c6c3a233730383834387d2e6330357b60c08201527f66696c6c3a236566666664347d2e6330367b66696c6c3a236234353233307d2e60e08201527f6330377b66696c6c3a236433366434617d2e6330387b66696c6c3a23363333366101008201527f33617d2e6330397b66696c6c3a233661313630617d2e6331307b66696c6c3a236101208201527f3930336532307d2e6331317b66696c6c3a236236373432667d2e6331327b66696101408201527f6c6c3a236435393034397d2e6331337b66696c6c3a233539306130317d2e63316101608201527f347b66696c6c3a233662326530397d2e6331357b66696c6c3a233931356131666101808201527f7d2e6331367b66696c6c3a233265326532657d2e6331377b66696c6c3a2333396101a08201527f333933397d2e6331387b66696c6c3a233137313731377d2e6331397b66696c6c6101c08201527f3a233233323332337d2e6332307b66696c6c3a236163626664337d2e6332317b6101e08201527f66696c6c3a236238636365307d2e6332327b66696c6c3a236431643964617d2e6102008201527f6332337b66696c6c3a233938613962347d2e6332347b66696c6c3a23613362326102208201527f63347d2e6332357b66696c6c3a236335613531667d2e6332367b66696c6c3a236102408201527f6535633333397d2e6332377b66696c6c3a233835363930307d2e6332387b66696102608201527f6c6c3a233734346530307d2e6332397b66696c6c3a233965383431327d2e63336102808201527f307b66696c6c3a236466633661377d2e6333317b66696c6c3a236563643262326102a08201527f7d2e6333327b66696c6c3a236430633463327d2e6333337b66696c6c3a2362666102c08201527f613839377d2e6333347b66696c6c3a236366626261307d2e6333357b66696c6c6102e08201527f3a233337333733377d2e6333367b66696c6c3a233833373535347d2e6333377b6103008201527f66696c6c3a233966393036657d2e6333387b66696c6c3a233361323431627d2e6103208201527f6333397b66696c6c3a233438333932357d2e6334307b66696c6c3a23363635616103408201527f33657d2e6334317b66696c6c3a233436363933307d2e6334327b66696c6c3a236103608201527f3737396136317d2e6334337b66696c6c3a236666666165317d2e6334347b66696103808201527f6c6c3a233331313530307d2e6334357b66696c6c3a233264326132367d2e63346103a08201527f367b66696c6c3a233832313030337d2e6334377b66696c6c3a233465316530336103c08201527f7d2e6334387b66696c6c3a233836343432307d2e6334397b66696c6c3a2338366103e08201527f323532307d2e6335307b66696c6c3a236666373234347d2e6335317b66696c6c6104008201527f3a233961343032357d2e6335327b66696c6c3a236462386532657d2e6335337b6104208201527f66696c6c3a236566636136367d2e6335347b66696c6c3a233763316631667d2e6104408201527f6335357b66696c6c3a233961343132367d2e6335367b66696c6c3a23623835386104608201527f30357d2e6335377b66696c6c3a236365343032617d2e6335387b66696c6c3a236104808201527f6237353730347d2e6335397b66696c6c3a233765316431337d2e6336307b66696104a08201527f6c6c3a233632306630367d2e6336317b66696c6c3a236534626330657d2e63366104c08201527f327b66696c6c3a236534643230657d2e6336337b66696c6c3a233931313132636104e08201527f7d2e6336347b66696c6c3a236261313933617d2e6336357b66696c6c3a2364376105008201527f663636617d2e6336367b66696c6c3a236636656136617d2e6336377b66696c6c6105208201527f3a233264373731377d2e6336387b66696c6c3a233336363032387d2e6336397b6105408201527f66696c6c3a236536643764377d2e6337307b66696c6c3a236337626661637d2e6105608201527f6337317b66696c6c3a233133313931337d2e6337327b66696c6c3a23633734386105808201527433337d2e6337337b66696c6c3a236539396138637d60581b6105a08201526105b50190565b7f2e617b77696474683a323470787d2e627b77696474683a323270787d2e637b7781527f696474683a323070787d2e647b77696474683a313870787d2e657b776964746860208201527f3a313670787d2e667b77696474683a313470787d2e677b77696474683a31307060408201527f787d2e687b77696474683a3670787d2e697b6865696768743a323470787d2e6a60608201527f7b6865696768743a323270787d2e6b7b6865696768743a323070787d2e6c7b6860808201527f65696768743a313870787d2e6d7b6865696768743a313670787d2e6e7b68656960a08201527f6768743a313470787d2e6f7b6865696768743a313070787d2e707b686569676860c082015265743a3670787d60d01b60e082015260e60190565b6d1e17b9ba3cb6329f1e17b9bb339f60911b8152600e0190565b9998505050505050505050565b707b226e616d65223a202250697a7a61202360781b815283516000906147338160118501602089016132c4565b7f222c20226465736372697074696f6e223a202244656c6963696f75732070697a6011918401918201527f7a61732062616b65642077697468206c6f766520616e64206b6570742077617260318201527f6d206f6e20636861696e2e20416c6c20746865206d6574616461746120616e6460518201527f20696d61676573206172652067656e65726174656420616e642073746f72656460718201527f2031303025206f6e2d636861696e2e204e6f20495046532c206e6f204150492e60918201527f204a7573742074686520457468657265756d20626c6f636b636861696e2e222c60b18201527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160d1820152641cd94d8d0b60da1b60f182015261489361488661488061486560f6850189613a1e565b6e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b86613a1e565b607d60f81b815260010190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516148d581601d8501602087016132c4565b91909101601d0192915050565b60008160001904831182151516156148fc576148fc613913565b500290565b6000821982111561491457614914613913565b500190565b634e487b7160e01b600052600160045260246000fd5b60006123638284613a3a565b600060ff821660ff84168160ff048111821515161561495c5761495c613913565b029392505050565b600060ff821660ff84168082101561497e5761497e613913565b90039392505050565b600082516149998184602087016132c4565b9190910192915050565b634e487b7160e01b600052601260045260246000fd5b6000826149c8576149c86149a3565b500490565b6000826149dc576149dc6149a3565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351614a458184602088016132c4565b835190830190613cc08183602088016132c4565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614893908301846132f0565b600060208284031215614a9e57600080fd5b81516123638161332f565b634e487b7160e01b600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220abdf6b0b463bd3e7aa46efe0654f74a9912e37a2b3975ee487d2485d63e1ea8864736f6c6343000808003313649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e85ff1be3842b54290a9d10674244dae5848d2371b5314790c54805c086586e1dfd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c178c34144aa4f22f9dcdc9a6606881972cf65c835163e066ef62f7c2706837635d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd7207d4c80b053cfbaf3ab6018fbfc8795c3dbf56b5ead5e56a18231068919af04b2316d947374d71758e457e80486787a2c828942c59266cc0c2fb7ed856b0e118d1c58e170a4eae5ce6d3321c7de6187c7019b53d3221fd9c6cf69e8546f56053f
Deployed Bytecode
0x6080604052600436106102195760003560e01c806345627764116101235780639140e272116100ab578063c87b56dd1161006f578063c87b56dd14610644578063cac8200514610664578063d93dfe8814610677578063e985e9c514610697578063f2fde38b146106e057600080fd5b80639140e272146105af57806395d89b41146105cf578063a22cb465146105e4578063b73a956814610604578063b88d4fde1461062457600080fd5b80636bde2627116100f25780636bde26271461052157806370a082311461053c578063715018a61461055c57806389ce3074146105715780638da5cb5b1461059157600080fd5b806345627764146104ac5780634f6ccce7146104c15780636352211e146104e157806366e338701461050157600080fd5b806323b872dd116101a65780632fb098d2116101755780632fb098d2146103d657806335377214146104065780633af32abf1461042657806342842e0e1461045f578063438b63001461047f57600080fd5b806323b872dd1461036157806324600fc3146103815780632d6e71b6146103965780632f745c59146103b657600080fd5b8063081812fc116101ed578063081812fc146102bb578063095ea7b3146102f3578063098afd4b1461031357806316c61ccc1461032857806318160ddd1461034257600080fd5b80625ea3071461021e57806301ffc9a71461025457806302329a291461028457806306fdde03146102a6575b600080fd5b34801561022a57600080fd5b5061023e6102393660046132ab565b610700565b60405161024b919061331c565b60405180910390f35b34801561026057600080fd5b5061027461026f366004613345565b6107a4565b604051901515815260200161024b565b34801561029057600080fd5b506102a461029f366004613377565b6107cf565b005b3480156102b257600080fd5b5061023e610815565b3480156102c757600080fd5b506102db6102d63660046132ab565b6108a7565b6040516001600160a01b03909116815260200161024b565b3480156102ff57600080fd5b506102a461030e3660046133a9565b61093c565b34801561031f57600080fd5b506102a4610a52565b34801561033457600080fd5b506013546102749060ff1681565b34801561034e57600080fd5b506008545b60405190815260200161024b565b34801561036d57600080fd5b506102a461037c3660046133d3565b610ab4565b34801561038d57600080fd5b506102a4610ae5565b3480156103a257600080fd5b506102a46103b13660046132ab565b610b42565b3480156103c257600080fd5b506103536103d13660046133a9565b610b71565b3480156103e257600080fd5b506103f66103f136600461340f565b610c07565b60405161024b9493929190613431565b34801561041257600080fd5b506102a461042136600461347c565b610dec565b34801561043257600080fd5b506102746104413660046134f1565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561046b57600080fd5b506102a461047a3660046133d3565b610e88565b34801561048b57600080fd5b5061049f61049a3660046134f1565b610ea3565b60405161024b919061350c565b3480156104b857600080fd5b506102a4610f45565b3480156104cd57600080fd5b506103536104dc3660046132ab565b611048565b3480156104ed57600080fd5b506102db6104fc3660046132ab565b6110db565b34801561050d57600080fd5b5061023e61051c366004613638565b611152565b34801561052d57600080fd5b5061035366c3663566a5800081565b34801561054857600080fd5b506103536105573660046134f1565b61128f565b34801561056857600080fd5b506102a4611316565b34801561057d57600080fd5b5061023e61058c366004613638565b61134a565b34801561059d57600080fd5b50600a546001600160a01b03166102db565b3480156105bb57600080fd5b506102a46105ca3660046132ab565b611a1d565b3480156105db57600080fd5b5061023e611a8c565b3480156105f057600080fd5b506102a46105ff36600461366d565b611a9b565b34801561061057600080fd5b506102a461061f3660046133a9565b611b60565b34801561063057600080fd5b506102a461063f3660046136a0565b611bce565b34801561065057600080fd5b5061023e61065f3660046132ab565b611c06565b6102a46106723660046132ab565b611c93565b34801561068357600080fd5b506102a461069236600461371c565b611dea565b3480156106a357600080fd5b506102746106b2366004613879565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ec57600080fd5b506102a46106fb3660046134f1565b611f4c565b6000818152600e602052604081208054606092919061071e906138a3565b80601f016020809104026020016040519081016040528092919081815260200182805461074a906138a3565b80156107975780601f1061076c57610100808354040283529160200191610797565b820191906000526020600020905b81548152906001019060200180831161077a57829003601f168201915b5093979650505050505050565b60006001600160e01b0319821663780e9d6360e01b14806107c957506107c982611fe4565b92915050565b600a546001600160a01b031633146108025760405162461bcd60e51b81526004016107f9906138de565b60405180910390fd5b6013805460ff1916911515919091179055565b606060008054610824906138a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610850906138a3565b801561089d5780601f106108725761010080835404028352916020019161089d565b820191906000526020600020905b81548152906001019060200180831161088057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109205760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107f9565b506000908152600460205260409020546001600160a01b031690565b6000610947826110db565b9050806001600160a01b0316836001600160a01b031614156109b55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107f9565b336001600160a01b03821614806109d157506109d181336106b2565b610a435760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107f9565b610a4d8383612034565b505050565b600a546001600160a01b03163314610a7c5760405162461bcd60e51b81526004016107f9906138de565b60035b6008811015610ab1576000818152600c60205260408120610a9f91613177565b80610aa981613929565b915050610a7f565b50565b610abe33826120a2565b610ada5760405162461bcd60e51b81526004016107f990613944565b610a4d838383612199565b600a546001600160a01b03163314610b0f5760405162461bcd60e51b81526004016107f9906138de565b6040514790339082156108fc029083906000818181858888f19350505050158015610b3e573d6000803e3d6000fd5b5050565b600a546001600160a01b03163314610b6c5760405162461bcd60e51b81526004016107f9906138de565b601255565b6000610b7c8361128f565b8210610bde5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107f9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600c6020528160005260406000208181548110610c2357600080fd5b906000526020600020906004020160009150915050806000018054610c47906138a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c73906138a3565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b505050505090806001018054610cd5906138a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d01906138a3565b8015610d4e5780601f10610d2357610100808354040283529160200191610d4e565b820191906000526020600020905b815481529060010190602001808311610d3157829003601f168201915b505050505090806002018054610d63906138a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8f906138a3565b8015610ddc5780601f10610db157610100808354040283529160200191610ddc565b820191906000526020600020905b815481529060010190602001808311610dbf57829003601f168201915b5050505050908060030154905084565b600a546001600160a01b03163314610e165760405162461bcd60e51b81526004016107f9906138de565b60005b81811015610a4d576001600f6000858585818110610e3957610e39613995565b9050602002016020810190610e4e91906134f1565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610e8081613929565b915050610e19565b610a4d83838360405180602001604052806000815250611bce565b60606000610eb08361128f565b905060008167ffffffffffffffff811115610ecd57610ecd613550565b604051908082528060200260200182016040528015610ef6578160200160208202803683370190505b50905060005b82811015610f3d57610f0e8582610b71565b828281518110610f2057610f20613995565b602090810291909101015280610f3581613929565b915050610efc565b509392505050565b60125460011115610f685760405162461bcd60e51b81526004016107f9906139ab565b601054610f7f6001610f7960085490565b90612344565b1115610fbf5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48115e18d959591959608a1b60448201526064016107f9565b610fc833610441565b151560011461100b5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b60448201526064016107f9565b336000908152600f60205260408120805460ff1916905560128054600192906110359084906139e2565b90915550611046905033600161236a565b565b600061105360085490565b82106110b65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107f9565b600882815481106110c9576110c9613995565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107c95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107f9565b60608060005b60098160ff1610156112665760006111896111848660ff851661117c8660016139f9565b60ff16612513565b6125e0565b905082600c60008460ff1681526020019081526020016000208260ff16815481106111b6576111b6613995565b9060005260206000209060040201600101600c60008560ff1681526020019081526020016000208360ff16815481106111f1576111f1613995565b906000526020600020906004020160000160405160200161121493929190613ad4565b60405160208183030381529060405292508160ff1660081461125357826040516020016112419190613b41565b60405160208183030381529060405292505b508061125e81613b66565b915050611158565b50806040516020016112789190613b86565b604051602081830303815290604052915050919050565b60006001600160a01b0382166112fa5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107f9565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113405760405162461bcd60e51b81526004016107f9906138de565b6110466000612696565b606080606080606080600c60008081526020019081526020016000206113766111848960006001612513565b60ff168154811061138957611389613995565b90600052602060002090600402016002016040516020016113aa9190613bba565b6040516020818303038152906040529350600c6000600181526020019081526020016000206113df6111848960016002612513565b60ff16815481106113f2576113f2613995565b90600052602060002090600402016002016040516020016114139190613bff565b604051602081830303815290604052925061151b600c60006002815260200190815260200160002061144b6111848a60026003612513565b60ff168154811061145e5761145e613995565b9060005260206000209060040201600001805461147a906138a3565b80601f01602080910402602001604051908101604052809291908181526020018280546114a6906138a3565b80156114f35780601f106114c8576101008083540402835291602001916114f3565b820191906000526020600020905b8154815290600101906020018083116114d657829003601f168201915b505050505060405180604001604052806005815260200164546869636b60d81b8152506126e8565b156117895760036000819052600c602052611619907fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd79061156390611184908b906004612513565b60ff168154811061157657611576613995565b90600052602060002090600402016002018054611592906138a3565b80601f01602080910402602001604051908101604052809291908181526020018280546115be906138a3565b801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b5050505050600e6010612513565b6040516020016116299190613c50565b6040516020818303038152906040529050604051602001611777907f3c7265637420783d22302220793d22392220636c6173733d22612070222f3e3c81527f7265637420783d22312220793d22372220636c6173733d2262206f222f3e3c7260208201527f65637420783d22322220793d22352220636c6173733d2263206e222f3e3c726560408201527f637420783d22332220793d22342220636c6173733d2264206d222f3e3c72656360608201527f7420783d22342220793d22332220636c6173733d2265206c222f3e3c7265637460808201527f20783d22352220793d22322220636c6173733d2266206b222f3e3c726563742060a08201527f783d22372220793d22312220636c6173733d2267206a222f3e3c72656374207860c08201527f3d22392220793d22302220636c6173733d22682069222f3e000000000000000060e082015260f80190565b60405160208183030381529060405291505b60025b60088160ff1610156119e85760006117b06111848a60ff851661117c8660016139f9565b905060005b600c60008460ff1681526020019081526020016000208260ff16815481106117df576117df613995565b9060005260206000209060040201600301548161ffff1610156119d35760606001600c60008660ff1681526020019081526020016000208460ff168154811061182a5761182a613995565b90600052602060002090600402016003015461184691906139e2565b8261ffff16116119c05760ff8085166000908152600c60205260409020805461194492861690811061187a5761187a613995565b90600052602060002090600402016002018054611896906138a3565b80601f01602080910402602001604051908101604052809291908181526020018280546118c2906138a3565b801561190f5780601f106118e45761010080835404028352916020019161190f565b820191906000526020600020905b8154815290600101906020018083116118f257829003601f168201915b50505050508360046119219190613c79565b61ffff16611930856004613c79565b61193b906004613ca3565b61ffff16612513565b9050600061195d6119588360006001612513565b612741565b905060006119716119588460016002612513565b90508a6119818460026004612513565b61198d8460ff16612827565b6119998460ff16612827565b6040516020016119ac9493929190613cc9565b6040516020818303038152906040529a5050505b50806119cb81613d70565b9150506117b5565b505080806119e090613b66565b91505061178c565b508084838588604051602001611a02959493929190613d92565b60408051601f19818403018152919052979650505050505050565b600a546001600160a01b03163314611a475760405162461bcd60e51b81526004016107f9906138de565b601254811115611a695760405162461bcd60e51b81526004016107f9906139ab565b8060126000828254611a7b91906139e2565b90915550610ab19050335b8261236a565b606060018054610824906138a3565b6001600160a01b038216331415611af45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107f9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611b8a5760405162461bcd60e51b81526004016107f9906138de565b601254811115611bac5760405162461bcd60e51b81526004016107f9906139ab565b8060126000828254611bbe91906139e2565b90915550610b3e9050828261236a565b611bd833836120a2565b611bf45760405162461bcd60e51b81526004016107f990613944565b611c0084848484612925565b50505050565b6000818152600260205260409020546060906001600160a01b0316611c2a57600080fd5b6000611c3583610700565b9050611c83611c4384612827565b611c54611c4f8461134a565b612958565b611c5d84611152565b604051602001611c6f93929190614706565b604051602081830303815290604052612958565b604051602001611278919061489d565b611ca48166c3663566a580006148e2565b341015611ce55760405162461bcd60e51b815260206004820152600f60248201526e5061796d656e7420746f6f206c6f7760881b60448201526064016107f9565b601254601054611cf591906139e2565b611d0282610f7960085490565b1115611d475760405162461bcd60e51b8152602060048201526014602482015273141d589b1a58c814d85b1948115e18d95959195960621b60448201526064016107f9565b6002611d523361128f565b1115611da05760405162461bcd60e51b815260206004820152601860248201527f4d6178206d696e7473207065722077616c6c6574203d2033000000000000000060448201526064016107f9565b60135460ff1615611de15760405162461bcd60e51b815260206004820152600b60248201526a14d85b19481c185d5cd95960aa1b60448201526064016107f9565b610ab133611a86565b600a546001600160a01b03163314611e145760405162461bcd60e51b81526004016107f9906138de565b60005b8151811015610a4d57600c60008481526020019081526020016000206040518060800160405280848481518110611e5057611e50613995565b6020026020010151600001518152602001848481518110611e7357611e73613995565b6020026020010151602001518152602001848481518110611e9657611e96613995565b6020026020010151604001518152602001848481518110611eb957611eb9613995565b60209081029190910181015160600151909152825460018101845560009384529281902082518051939460040290910192611ef79284920190613198565b506020828101518051611f109260018501920190613198565b5060408201518051611f2c916002840191602090910190613198565b506060820151816003015550508080611f4490613929565b915050611e17565b600a546001600160a01b03163314611f765760405162461bcd60e51b81526004016107f9906138de565b6001600160a01b038116611fdb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b610ab181612696565b60006001600160e01b031982166380ac58cd60e01b148061201557506001600160e01b03198216635b5e139f60e01b145b806107c957506301ffc9a760e01b6001600160e01b03198316146107c9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612069826110db565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661211b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107f9565b6000612126836110db565b9050806001600160a01b0316846001600160a01b031614806121615750836001600160a01b0316612156846108a7565b6001600160a01b0316145b8061219157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166121ac826110db565b6001600160a01b0316146122145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107f9565b6001600160a01b0382166122765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107f9565b612281838383612ac0565b61228c600082612034565b6001600160a01b03831660009081526003602052604081208054600192906122b59084906139e2565b90915550506001600160a01b03821660009081526003602052604081208054600192906122e3908490614901565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000806123518385614901565b90508381101561236357612363614919565b9392505050565b600061237560085490565b905060105461238783610f7960085490565b11156123cc5760405162461bcd60e51b8152602060048201526014602482015273141d589b1a58c814d85b1948115e18d95959195960621b60448201526064016107f9565b600082116124275760405162461bcd60e51b815260206004820152602260248201527f5175616e74697479206d7573742062652067726561746572207468656e207a65604482015261726f60f01b60648201526084016107f9565b823b1561243357600080fd5b60005b82811015611c0057600061244a8284614901565b905061245881866000612b78565b6000828152600e60209081526040909120825161247b9391929190910190613198565b506001600d600e60008481526020019081526020016000206040516124a0919061492f565b908152604051908190036020019020805491151560ff199092169190911790556124ca8582612cb6565b60405181906001600160a01b038716907f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe90600090a3508061250b81613929565b915050612436565b606083600061252285856139e2565b67ffffffffffffffff81111561253a5761253a613550565b6040519080825280601f01601f191660200182016040528015612564576020820181803683370190505b509050845b848110156125d65782818151811061258357612583613995565b01602001516001600160f81b0319168261259d88846139e2565b815181106125ad576125ad613995565b60200101906001600160f81b031916908160001a905350806125ce81613929565b915050612569565b5095945050505050565b60008181805b82518160ff161015610f3d576030838260ff168151811061260957612609613995565b016020015160f81c1080159061263c57506039838260ff168151811061263157612631613995565b016020015160f81c11155b156126845761264c600a8361493b565b91506030838260ff168151811061266557612665613995565b0160200151612677919060f81c614964565b61268190836139f9565b91505b8061268e81613b66565b9150506125e6565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000816040516020016126fb9190614987565b60405160208183030381529060405280519060200120836040516020016127229190614987565b6040516020818303038152906040528051906020012014905092915050565b6000805b600b5460ff8216101561282157612804600b8260ff168154811061276b5761276b613995565b906000526020600020018054612780906138a3565b80601f01602080910402602001604051908101604052809291908181526020018280546127ac906138a3565b80156127f95780601f106127ce576101008083540402835291602001916127f9565b820191906000526020600020905b8154815290600101906020018083116127dc57829003601f168201915b5050505050846126e8565b1561280f5792915050565b8061281981613b66565b915050612745565b50600080fd5b60608161284b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612875578061285f81613929565b915061286e9050600a836149b9565b915061284f565b60008167ffffffffffffffff81111561289057612890613550565b6040519080825280601f01601f1916602001820160405280156128ba576020820181803683370190505b5090505b8415612191576128cf6001836139e2565b91506128dc600a866149cd565b6128e7906030614901565b60f81b8183815181106128fc576128fc613995565b60200101906001600160f81b031916908160001a90535061291e600a866149b9565b94506128be565b612930848484612199565b61293c84848484612e04565b611c005760405162461bcd60e51b81526004016107f9906149e1565b606081516000141561297857505060408051602081019091526000815290565b6000604051806060016040528060408152602001614ac060409139905060006003845160026129a79190614901565b6129b191906149b9565b6129bc9060046148e2565b905060006129cb826020614901565b67ffffffffffffffff8111156129e3576129e3613550565b6040519080825280601f01601f191660200182016040528015612a0d576020820181803683370190505b509050818152600183018586518101602084015b81831015612a7b5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612a21565b600389510660018114612a955760028114612aa657612ab2565b613d3d60f01b600119830152612ab2565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b038316612b1b57612b1681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b3e565b816001600160a01b0316836001600160a01b031614612b3e57612b3e8382612f11565b6001600160a01b038216612b5557610a4d81612fae565b826001600160a01b0316826001600160a01b031614610a4d57610a4d828261305d565b6060600a8210612b8757600080fd5b604080516020810190915260008082525b60098160ff161015612c705760118054906000612bb483613929565b9091555050601154604080514260208201524491810191909152606080820189905287901b6bffffffffffffffffffffffff191660808201526094810186905260b48101919091526000906115b39060d4016040516020818303038152906040528051906020012060001c612c2991906149cd565b905082612c3a8261ffff16846130a1565b604051602001612c4b929190614a33565b6040516020818303038152906040529250508080612c6890613b66565b915050612b98565b50600d81604051612c819190614987565b9081526040519081900360200190205460ff161561219157612cae8585612ca9866001614901565b612b78565b915050612363565b6001600160a01b038216612d0c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107f9565b6000818152600260205260409020546001600160a01b031615612d715760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f9565b612d7d60008383612ac0565b6001600160a01b0382166000908152600360205260408120805460019290612da6908490614901565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612f0657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e48903390899088908890600401614a59565b602060405180830381600087803b158015612e6257600080fd5b505af1925050508015612e92575060408051601f3d908101601f19168201909252612e8f91810190614a8c565b60015b612eec573d808015612ec0576040519150601f19603f3d011682016040523d82523d6000602084013e612ec5565b606091505b508051612ee45760405162461bcd60e51b81526004016107f9906149e1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612191565b506001949350505050565b60006001612f1e8461128f565b612f2891906139e2565b600083815260076020526040902054909150808214612f7b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612fc0906001906139e2565b60008381526009602052604081205460088054939450909284908110612fe857612fe8613995565b90600052602060002001549050806008838154811061300957613009613995565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061304157613041614aa9565b6001900381819060005260206000200160009055905550505050565b60006130688361128f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60606000805b60148460ff16600981106130bd576130bd613995565b015460ff8216101561282157600060148560ff16600981106130e1576130e1613995565b018260ff16815481106130f6576130f6613995565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff16861015801561313c57506131358184613ca3565b61ffff1686105b156131575761314d8260ff16612827565b93505050506107c9565b6131618184613ca3565b925050808061316f90613b66565b9150506130a7565b5080546000825560040290600052602060002090810190610ab1919061321c565b8280546131a4906138a3565b90600052602060002090601f0160209004810192826131c6576000855561320c565b82601f106131df57805160ff191683800117855561320c565b8280016001018555821561320c579182015b8281111561320c5782518255916020019190600101906131f1565b5061321892915061325c565b5090565b808211156132185760006132308282613271565b61323e600183016000613271565b61324c600283016000613271565b506000600382015560040161321c565b5b80821115613218576000815560010161325d565b50805461327d906138a3565b6000825580601f1061328d575050565b601f016020900490600052602060002090810190610ab1919061325c565b6000602082840312156132bd57600080fd5b5035919050565b60005b838110156132df5781810151838201526020016132c7565b83811115611c005750506000910152565b600081518084526133088160208601602086016132c4565b601f01601f19169290920160200192915050565b60208152600061236360208301846132f0565b6001600160e01b031981168114610ab157600080fd5b60006020828403121561335757600080fd5b81356123638161332f565b8035801515811461337257600080fd5b919050565b60006020828403121561338957600080fd5b61236382613362565b80356001600160a01b038116811461337257600080fd5b600080604083850312156133bc57600080fd5b6133c583613392565b946020939093013593505050565b6000806000606084860312156133e857600080fd5b6133f184613392565b92506133ff60208501613392565b9150604084013590509250925092565b6000806040838503121561342257600080fd5b50508035926020909101359150565b60808152600061344460808301876132f0565b828103602084015261345681876132f0565b9050828103604084015261346a81866132f0565b91505082606083015295945050505050565b6000806020838503121561348f57600080fd5b823567ffffffffffffffff808211156134a757600080fd5b818501915085601f8301126134bb57600080fd5b8135818111156134ca57600080fd5b8660208260051b85010111156134df57600080fd5b60209290920196919550909350505050565b60006020828403121561350357600080fd5b61236382613392565b6020808252825182820181905260009190848201906040850190845b8181101561354457835183529284019291840191600101613528565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561358957613589613550565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156135b8576135b8613550565b604052919050565b600067ffffffffffffffff8311156135da576135da613550565b6135ed601f8401601f191660200161358f565b905082815283838301111561360157600080fd5b828260208301376000602084830101529392505050565b600082601f83011261362957600080fd5b612363838335602085016135c0565b60006020828403121561364a57600080fd5b813567ffffffffffffffff81111561366157600080fd5b61219184828501613618565b6000806040838503121561368057600080fd5b61368983613392565b915061369760208401613362565b90509250929050565b600080600080608085870312156136b657600080fd5b6136bf85613392565b93506136cd60208601613392565b925060408501359150606085013567ffffffffffffffff8111156136f057600080fd5b8501601f8101871361370157600080fd5b613710878235602084016135c0565b91505092959194509250565b6000806040838503121561372f57600080fd5b8235915060208084013567ffffffffffffffff8082111561374f57600080fd5b818601915086601f83011261376357600080fd5b81358181111561377557613775613550565b8060051b61378485820161358f565b918252838101850191858101908a84111561379e57600080fd5b86860192505b83831015613868578235858111156137bb57600080fd5b86016080818d03601f190112156137d25760008081fd5b6137da613566565b88820135878111156137ec5760008081fd5b6137fa8e8b83860101613618565b8252506040820135878111156138105760008081fd5b61381e8e8b83860101613618565b8a83015250606080830135888111156138375760008081fd5b6138458f8c83870101613618565b6040840152506080929092013591810191909152825291860191908601906137a4565b809750505050505050509250929050565b6000806040838503121561388c57600080fd5b61389583613392565b915061369760208401613392565b600181811c908216806138b757607f821691505b602082108114156138d857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060001982141561393d5761393d613913565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526017908201527f4578636565647320726573657276656420737570706c79000000000000000000604082015260600190565b6000828210156139f4576139f4613913565b500390565b600060ff821660ff84168060ff03821115613a1657613a16613913565b019392505050565b60008151613a308185602086016132c4565b9290920192915050565b8054600090600181811c9080831680613a5457607f831692505b6020808410821415613a7657634e487b7160e01b600052602260045260246000fd5b818015613a8a5760018114613a9b57613ac8565b60ff19861689528489019650613ac8565b60008881526020902060005b86811015613ac05781548b820152908501908301613aa7565b505084890196505b50505050505092915050565b60008451613ae68184602089016132c4565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613b0c600f820186613a3a565b6a1116113b30b63ab2911d1160a91b81529050613b2c600b820185613a3a565b61227d60f01b81526002019695505050505050565b60008251613b538184602087016132c4565b600b60fa1b920191825250600101919050565b600060ff821660ff811415613b7d57613b7d613913565b60010192915050565b605b60f81b815260008251613ba28160018501602087016132c4565b605d60f81b6001939091019283015250600201919050565b7f3c7265637420636c6173733d226267222066696c6c3d2223000000000000000081526000613bec6018830184613a3a565b6211179f60e91b81526003019392505050565b6e3c636972636c652066696c6c3d222360881b81526000613c23600f830184613a3a565b7f222063783d223132222063793d2231322220723d22392e3922202f3e000000008152601c019392505050565b606360f81b815260008251613c6c8160018501602087016132c4565b9190910160010192915050565b600061ffff80831681851681830481118215151615613c9a57613c9a613913565b02949350505050565b600061ffff808316818516808303821115613cc057613cc0613913565b01949350505050565b60008551613cdb818460208a016132c4565b6d3c7265637420636c6173733d276360901b9083019081528551613d0681600e840160208a016132c4565b642720783d2760d81b600e92909101918201528451613d2c8160138401602089016132c4565b642720793d2760d81b601392909101918201528351613d528160188401602088016132c4565b6213979f60e91b60189290910191820152601b019695505050505050565b600061ffff80831681811415613d8857613d88613913565b6001019392505050565b7f3c7376672069643d2270697a7a612d7376672220636c6173733d220000000000815260008651613dca81601b850160208b016132c4565b7f2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f601b918401918201527f73766722207072657365727665417370656374526174696f3d22784d696e594d603b8201527f696e206d656574222076696577426f783d22302030203438203438223e000000605b8201528651613e53816078840160208b016132c4565b7f3c67207472616e73666f726d3d226d61747269782831203020302031203132206078929091019182015264189914911f60d91b60988201528551613e9f81609d840160208a016132c4565b8551910190613eb581609d8401602089016132c4565b6146f96146df6145c3613ecd609d8587010189613a1e565b7f3c2f673e3c7374796c653e72656374207b77696474683a203170783b6865696781527f68743a203170783b7d2370697a7a612d737667207b73686170652d72656e646560208201527f72696e673a20637269737065646765733b7d2e6267207b77696474683a20313060408201527f30253b6865696768743a20313030257d2e7a7b66696c6c3a233539306130317d60608201527f2e2e6330307b66696c6c3a236332643763667d2e6330317b66696c6c3a23616160808201527f626562367d2e6330327b66696c6c3a236564383132367d2e6330337b66696c6c60a08201527f3a236563663639657d2e6330347b66696c6c3a233730383834387d2e6330357b60c08201527f66696c6c3a236566666664347d2e6330367b66696c6c3a236234353233307d2e60e08201527f6330377b66696c6c3a236433366434617d2e6330387b66696c6c3a23363333366101008201527f33617d2e6330397b66696c6c3a233661313630617d2e6331307b66696c6c3a236101208201527f3930336532307d2e6331317b66696c6c3a236236373432667d2e6331327b66696101408201527f6c6c3a236435393034397d2e6331337b66696c6c3a233539306130317d2e63316101608201527f347b66696c6c3a233662326530397d2e6331357b66696c6c3a233931356131666101808201527f7d2e6331367b66696c6c3a233265326532657d2e6331377b66696c6c3a2333396101a08201527f333933397d2e6331387b66696c6c3a233137313731377d2e6331397b66696c6c6101c08201527f3a233233323332337d2e6332307b66696c6c3a236163626664337d2e6332317b6101e08201527f66696c6c3a236238636365307d2e6332327b66696c6c3a236431643964617d2e6102008201527f6332337b66696c6c3a233938613962347d2e6332347b66696c6c3a23613362326102208201527f63347d2e6332357b66696c6c3a236335613531667d2e6332367b66696c6c3a236102408201527f6535633333397d2e6332377b66696c6c3a233835363930307d2e6332387b66696102608201527f6c6c3a233734346530307d2e6332397b66696c6c3a233965383431327d2e63336102808201527f307b66696c6c3a236466633661377d2e6333317b66696c6c3a236563643262326102a08201527f7d2e6333327b66696c6c3a236430633463327d2e6333337b66696c6c3a2362666102c08201527f613839377d2e6333347b66696c6c3a236366626261307d2e6333357b66696c6c6102e08201527f3a233337333733377d2e6333367b66696c6c3a233833373535347d2e6333377b6103008201527f66696c6c3a233966393036657d2e6333387b66696c6c3a233361323431627d2e6103208201527f6333397b66696c6c3a233438333932357d2e6334307b66696c6c3a23363635616103408201527f33657d2e6334317b66696c6c3a233436363933307d2e6334327b66696c6c3a236103608201527f3737396136317d2e6334337b66696c6c3a236666666165317d2e6334347b66696103808201527f6c6c3a233331313530307d2e6334357b66696c6c3a233264326132367d2e63346103a08201527f367b66696c6c3a233832313030337d2e6334377b66696c6c3a233465316530336103c08201527f7d2e6334387b66696c6c3a233836343432307d2e6334397b66696c6c3a2338366103e08201527f323532307d2e6335307b66696c6c3a236666373234347d2e6335317b66696c6c6104008201527f3a233961343032357d2e6335327b66696c6c3a236462386532657d2e6335337b6104208201527f66696c6c3a236566636136367d2e6335347b66696c6c3a233763316631667d2e6104408201527f6335357b66696c6c3a233961343132367d2e6335367b66696c6c3a23623835386104608201527f30357d2e6335377b66696c6c3a236365343032617d2e6335387b66696c6c3a236104808201527f6237353730347d2e6335397b66696c6c3a233765316431337d2e6336307b66696104a08201527f6c6c3a233632306630367d2e6336317b66696c6c3a236534626330657d2e63366104c08201527f327b66696c6c3a236534643230657d2e6336337b66696c6c3a233931313132636104e08201527f7d2e6336347b66696c6c3a236261313933617d2e6336357b66696c6c3a2364376105008201527f663636617d2e6336367b66696c6c3a236636656136617d2e6336377b66696c6c6105208201527f3a233264373731377d2e6336387b66696c6c3a233336363032387d2e6336397b6105408201527f66696c6c3a236536643764377d2e6337307b66696c6c3a236337626661637d2e6105608201527f6337317b66696c6c3a233133313931337d2e6337327b66696c6c3a23633734386105808201527433337d2e6337337b66696c6c3a236539396138637d60581b6105a08201526105b50190565b7f2e617b77696474683a323470787d2e627b77696474683a323270787d2e637b7781527f696474683a323070787d2e647b77696474683a313870787d2e657b776964746860208201527f3a313670787d2e667b77696474683a313470787d2e677b77696474683a31307060408201527f787d2e687b77696474683a3670787d2e697b6865696768743a323470787d2e6a60608201527f7b6865696768743a323270787d2e6b7b6865696768743a323070787d2e6c7b6860808201527f65696768743a313870787d2e6d7b6865696768743a313670787d2e6e7b68656960a08201527f6768743a313470787d2e6f7b6865696768743a313070787d2e707b686569676860c082015265743a3670787d60d01b60e082015260e60190565b6d1e17b9ba3cb6329f1e17b9bb339f60911b8152600e0190565b9998505050505050505050565b707b226e616d65223a202250697a7a61202360781b815283516000906147338160118501602089016132c4565b7f222c20226465736372697074696f6e223a202244656c6963696f75732070697a6011918401918201527f7a61732062616b65642077697468206c6f766520616e64206b6570742077617260318201527f6d206f6e20636861696e2e20416c6c20746865206d6574616461746120616e6460518201527f20696d61676573206172652067656e65726174656420616e642073746f72656460718201527f2031303025206f6e2d636861696e2e204e6f20495046532c206e6f204150492e60918201527f204a7573742074686520457468657265756d20626c6f636b636861696e2e222c60b18201527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160d1820152641cd94d8d0b60da1b60f182015261489361488661488061486560f6850189613a1e565b6e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b86613a1e565b607d60f81b815260010190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516148d581601d8501602087016132c4565b91909101601d0192915050565b60008160001904831182151516156148fc576148fc613913565b500290565b6000821982111561491457614914613913565b500190565b634e487b7160e01b600052600160045260246000fd5b60006123638284613a3a565b600060ff821660ff84168160ff048111821515161561495c5761495c613913565b029392505050565b600060ff821660ff84168082101561497e5761497e613913565b90039392505050565b600082516149998184602087016132c4565b9190910192915050565b634e487b7160e01b600052601260045260246000fd5b6000826149c8576149c86149a3565b500490565b6000826149dc576149dc6149a3565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351614a458184602088016132c4565b835190830190613cc08183602088016132c4565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614893908301846132f0565b600060208284031215614a9e57600080fd5b81516123638161332f565b634e487b7160e01b600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220abdf6b0b463bd3e7aa46efe0654f74a9912e37a2b3975ee487d2485d63e1ea8864736f6c63430008080033
Deployed Bytecode Sourcemap
42583:20445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59384:205;;;;;;;;;;-1:-1:-1;59384:205:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23690:224;;;;;;;;;;-1:-1:-1;23690:224:0;;;;;:::i;:::-;;:::i;:::-;;;1523:14:1;;1516:22;1498:41;;1486:2;1471:18;23690:224:0;1358:187:1;62944:74:0;;;;;;;;;;-1:-1:-1;62944:74:0;;;;;:::i;:::-;;:::i;:::-;;9948:100;;;;;;;;;;;;;:::i;11507:221::-;;;;;;;;;;-1:-1:-1;11507:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2064:32:1;;;2046:51;;2034:2;2019:18;11507:221:0;1900:203:1;11030:411:0;;;;;;;;;;-1:-1:-1;11030:411:0;;;;;:::i;:::-;;:::i;61043:137::-;;;;;;;;;;;;;:::i;43572:26::-;;;;;;;;;;-1:-1:-1;43572:26:0;;;;;;;;24330:113;;;;;;;;;;-1:-1:-1;24418:10:0;:17;24330:113;;;2691:25:1;;;2679:2;2664:18;24330:113:0;2545:177:1;12397:339:0;;;;;;;;;;-1:-1:-1;12397:339:0;;;;;:::i;:::-;;:::i;62006:145::-;;;;;;;;;;;;;:::i;61896:102::-;;;;;;;;;;-1:-1:-1;61896:102:0;;;;;:::i;:::-;;:::i;23998:256::-;;;;;;;;;;-1:-1:-1;23998:256:0;;;;;:::i;:::-;;:::i;43236:45::-;;;;;;;;;;-1:-1:-1;43236:45:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;62728:204::-;;;;;;;;;;-1:-1:-1;62728:204:0;;;;;:::i;:::-;;:::i;51182:117::-;;;;;;;;;;-1:-1:-1;51182:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;51265:26:0;51241:4;51265:26;;;:19;:26;;;;;;;;;51182:117;12807:185;;;;;;;;;;-1:-1:-1;12807:185:0;;;;;:::i;:::-;;:::i;59757:380::-;;;;;;;;;;-1:-1:-1;59757:380:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49632:371::-;;;;;;;;;;;;;:::i;24520:233::-;;;;;;;;;;-1:-1:-1;24520:233:0;;;;;:::i;:::-;;:::i;9642:239::-;;;;;;;;;;-1:-1:-1;9642:239:0;;;;;:::i;:::-;;:::i;56821:881::-;;;;;;;;;;-1:-1:-1;56821:881:0;;;;;:::i;:::-;;:::i;42671:61::-;;;;;;;;;;;;42715:17;42671:61;;9372:208;;;;;;;;;;-1:-1:-1;9372:208:0;;;;;:::i;:::-;;:::i;41268:94::-;;;;;;;;;;;;;:::i;51363:5389::-;;;;;;;;;;-1:-1:-1;51363:5389:0;;;;;:::i;:::-;;:::i;40617:87::-;;;;;;;;;;-1:-1:-1;40690:6:0;;-1:-1:-1;;;;;40690:6:0;40617:87;;62228:234;;;;;;;;;;-1:-1:-1;62228:234:0;;;;;:::i;:::-;;:::i;10117:104::-;;;;;;;;;;;;;:::i;11800:295::-;;;;;;;;;;-1:-1:-1;11800:295:0;;;;;:::i;:::-;;:::i;62480:230::-;;;;;;;;;;-1:-1:-1;62480:230:0;;;;;:::i;:::-;;:::i;13063:328::-;;;;;;;;;;-1:-1:-1;13063:328:0;;;;;:::i;:::-;;:::i;57857:1393::-;;;;;;;;;;-1:-1:-1;57857:1393:0;;;;;:::i;:::-;;:::i;49157:418::-;;;;;;:::i;:::-;;:::i;61335:474::-;;;;;;;;;;-1:-1:-1;61335:474:0;;;;;:::i;:::-;;:::i;12166:164::-;;;;;;;;;;-1:-1:-1;12166:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;12287:25:0;;;12263:4;12287:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;12166:164;41517:192;;;;;;;;;;-1:-1:-1;41517:192:0;;;;;:::i;:::-;;:::i;59384:205::-;59505:23;59531;;;:13;:23;;;;;59505:49;;59474:13;;59505:23;59531;59505:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59505:49:0;;59384:205;-1:-1:-1;;;;;;;59384:205:0:o;23690:224::-;23792:4;-1:-1:-1;;;;;;23816:50:0;;-1:-1:-1;;;23816:50:0;;:90;;;23870:36;23894:11;23870:23;:36::i;:::-;23809:97;23690:224;-1:-1:-1;;23690:224:0:o;62944:74::-;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;;;;;;;;;62997:7:::1;:13:::0;;-1:-1:-1;;62997:13:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62944:74::o;9948:100::-;10002:13;10035:5;10028:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9948:100;:::o;11507:221::-;11583:7;14990:16;;;:7;:16;;;;;;-1:-1:-1;;;;;14990:16:0;11603:73;;;;-1:-1:-1;;;11603:73:0;;11442:2:1;11603:73:0;;;11424:21:1;11481:2;11461:18;;;11454:30;11520:34;11500:18;;;11493:62;-1:-1:-1;;;11571:18:1;;;11564:42;11623:19;;11603:73:0;11240:408:1;11603:73:0;-1:-1:-1;11696:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;11696:24:0;;11507:221::o;11030:411::-;11111:13;11127:23;11142:7;11127:14;:23::i;:::-;11111:39;;11175:5;-1:-1:-1;;;;;11169:11:0;:2;-1:-1:-1;;;;;11169:11:0;;;11161:57;;;;-1:-1:-1;;;11161:57:0;;11855:2:1;11161:57:0;;;11837:21:1;11894:2;11874:18;;;11867:30;11933:34;11913:18;;;11906:62;-1:-1:-1;;;11984:18:1;;;11977:31;12025:19;;11161:57:0;11653:397:1;11161:57:0;7638:10;-1:-1:-1;;;;;11253:21:0;;;;:62;;-1:-1:-1;11278:37:0;11295:5;7638:10;12166:164;:::i;11278:37::-;11231:168;;;;-1:-1:-1;;;11231:168:0;;12257:2:1;11231:168:0;;;12239:21:1;12296:2;12276:18;;;12269:30;12335:34;12315:18;;;12308:62;12406:26;12386:18;;;12379:54;12450:19;;11231:168:0;12055:420:1;11231:168:0;11412:21;11421:2;11425:7;11412:8;:21::i;:::-;11100:341;11030:411;;:::o;61043:137::-;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;61111:1:::1;61094:79;61118:1;61114;:5;61094:79;;;61148:13;::::0;;;:10:::1;:13;::::0;;;;61141:20:::1;::::0;::::1;:::i;:::-;61121:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61094:79;;;;61043:137::o:0;12397:339::-;12592:41;7638:10;12625:7;12592:18;:41::i;:::-;12584:103;;;;-1:-1:-1;;;12584:103:0;;;;;;;:::i;:::-;12700:28;12710:4;12716:2;12720:7;12700:9;:28::i;62006:145::-;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;62106:37:::1;::::0;62074:21:::1;::::0;62114:10:::1;::::0;62106:37;::::1;;;::::0;62074:21;;62059:12:::1;62106:37:::0;62059:12;62106:37;62074:21;62114:10;62106:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;62048:103;62006:145::o:0;61896:102::-;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;61967:8:::1;:23:::0;61896:102::o;23998:256::-;24095:7;24131:23;24148:5;24131:16;:23::i;:::-;24123:5;:31;24115:87;;;;-1:-1:-1;;;24115:87:0;;13372:2:1;24115:87:0;;;13354:21:1;13411:2;13391:18;;;13384:30;13450:34;13430:18;;;13423:62;-1:-1:-1;;;13501:18:1;;;13494:41;13552:19;;24115:87:0;13170:407:1;24115:87:0;-1:-1:-1;;;;;;24220:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;23998:256::o;43236:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62728:204::-;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;62816:9:::1;62811:114;62831:20:::0;;::::1;62811:114;;;62909:4;62873:19;:33;62893:9;;62903:1;62893:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62873:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;62873:33:0;:40;;-1:-1:-1;;62873:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62853:3;::::1;::::0;::::1;:::i;:::-;;;;62811:114;;12807:185:::0;12945:39;12962:4;12968:2;12972:7;12945:39;;;;;;;;;;;;:16;:39::i;59757:380::-;59845:16;59879:18;59900;59910:7;59900:9;:18::i;:::-;59879:39;;59931:25;59973:10;59959:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59959:25:0;;59931:53;;60000:9;59995:109;60015:10;60011:1;:14;59995:109;;;60061:31;60081:7;60090:1;60061:19;:31::i;:::-;60047:8;60056:1;60047:11;;;;;;;;:::i;:::-;;;;;;;;;;:45;60027:3;;;;:::i;:::-;;;;59995:109;;;-1:-1:-1;60121:8:0;59757:380;-1:-1:-1;;;59757:380:0:o;49632:371::-;49687:8;;49682:1;:13;;49673:51;;;;-1:-1:-1;;;49673:51:0;;;;;;;:::i;:::-;49768:10;;49744:20;49762:1;49744:13;24418:10;:17;;24330:113;49744:13;:17;;:20::i;:::-;:34;;49735:63;;;;-1:-1:-1;;;49735:63:0;;14268:2:1;49735:63:0;;;14250:21:1;14307:2;14287:18;;;14280:30;-1:-1:-1;;;14326:18:1;;;14319:45;14381:18;;49735:63:0;14066:339:1;49735:63:0;49817:27;7638:10;49831:12;7558:98;49817:27;:35;;49848:4;49817:35;49809:63;;;;-1:-1:-1;;;49809:63:0;;14612:2:1;49809:63:0;;;14594:21:1;14651:2;14631:18;;;14624:30;-1:-1:-1;;;14670:18:1;;;14663:45;14725:18;;49809:63:0;14410:339:1;49809:63:0;7638:10;49919:5;49883:33;;;:19;:33;;;;;:41;;-1:-1:-1;;49883:41:0;;;49935:8;:13;;49883:41;;49919:5;49935:13;;49883:41;;49935:13;:::i;:::-;;;;-1:-1:-1;49966:29:0;;-1:-1:-1;7638:10:0;49993:1;49966:12;:29::i;:::-;49632:371::o;24520:233::-;24595:7;24631:30;24418:10;:17;;24330:113;24631:30;24623:5;:38;24615:95;;;;-1:-1:-1;;;24615:95:0;;15086:2:1;24615:95:0;;;15068:21:1;15125:2;15105:18;;;15098:30;15164:34;15144:18;;;15137:62;-1:-1:-1;;;15215:18:1;;;15208:42;15267:19;;24615:95:0;14884:408:1;24615:95:0;24728:10;24739:5;24728:17;;;;;;;;:::i;:::-;;;;;;;;;24721:24;;24520:233;;;:::o;9642:239::-;9714:7;9750:16;;;:7;:16;;;;;;-1:-1:-1;;;;;9750:16:0;9785:19;9777:73;;;;-1:-1:-1;;;9777:73:0;;15499:2:1;9777:73:0;;;15481:21:1;15538:2;15518:18;;;15511:30;15577:34;15557:18;;;15550:62;-1:-1:-1;;;15628:18:1;;;15621:39;15677:19;;9777:73:0;15297:405:1;56821:881:0;56914:13;56945:28;56991:7;56986:639;57008:1;57004;:5;;;56986:639;;;57031:20;57054:78;57086:31;57101:5;57086:31;;;57111:5;57108:1;57115;57111:5;:::i;:::-;57086:31;;:14;:31::i;:::-;57054:13;:78::i;:::-;57031:101;;57230:14;57307:10;:13;57318:1;57307:13;;;;;;;;;;;;;57321:14;57307:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;57405:10;:13;57416:1;57405:13;;;;;;;;;;;;;57419:14;57405:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;57191:299;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57149:356;;57526:1;:6;;57531:1;57526:6;57522:91;;57592:14;57575:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;57551:62;;57522:91;-1:-1:-1;57011:3:0;;;;:::i;:::-;;;;56986:639;;;;57673:14;57651:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;57637:57;;;56821:881;;;:::o;9372:208::-;9444:7;-1:-1:-1;;;;;9472:19:0;;9464:74;;;;-1:-1:-1;;;9464:74:0;;19608:2:1;9464:74:0;;;19590:21:1;19647:2;19627:18;;;19620:30;19686:34;19666:18;;;19659:62;-1:-1:-1;;;19737:18:1;;;19730:40;19787:19;;9464:74:0;19406:406:1;9464:74:0;-1:-1:-1;;;;;;9556:16:0;;;;;:9;:16;;;;;;;9372:208::o;41268:94::-;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;41333:21:::1;41351:1;41333:9;:21::i;51363:5389::-:0;51451:13;51482:23;51516:20;51547:23;51581;51615:24;51804:10;:13;51815:1;51804:13;;;;;;;;;;;51818:42;51832:27;51847:5;51854:1;51857;51832:14;:27::i;51818:42::-;51804:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;:64;;51708:215;;;;;;;;:::i;:::-;;;;;;;;;;;;;51670:272;;52099:10;:13;52110:1;52099:13;;;;;;;;;;;52113:42;52127:27;52142:5;52149:1;52152;52127:14;:27::i;52113:42::-;52099:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;:64;;52012:231;;;;;;;;:::i;:::-;;;;;;;;;;;;;51971:291;;52319:97;52339:10;:13;52350:1;52339:13;;;;;;;;;;;52353:42;52367:27;52382:5;52389:1;52392;52367:14;:27::i;52353:42::-;52339:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;:67;;52319:97;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52319:97:0;;;:19;:97::i;:::-;52316:763;;;52546:1;52535:13;;;;:10;:13;;52520:88;;52535:13;;52549:42;;52563:27;;52578:5;;52588:1;52563:14;:27::i;52549:42::-;52535:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;:64;;52520:88;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52601:2;52605;52520:14;:88::i;:::-;52477:154;;;;;;;;:::i;:::-;;;;;;;;;;;;;52435:215;;52724:320;;;;;;21616:66:1;21604:79;;21713:66;21708:2;21699:12;;21692:88;21810:66;21805:2;21796:12;;21789:88;21907:66;21902:2;21893:12;;21886:88;22005:66;21999:3;21990:13;;21983:89;22103:66;22097:3;22088:13;;22081:89;22201:66;22195:3;22186:13;;22179:89;22299:66;22293:3;22284:13;;22277:89;22391:3;22382:13;;21402:999;52724:320:0;;;;;;;;;;;;;52683:380;;52316:763;53114:1;53099:1396;53121:1;53117;:5;;;53099:1396;;;53144:20;53167:78;53199:31;53214:5;53199:31;;;53224:5;53221:1;53228;53224:5;:::i;53167:78::-;53144:101;;53285:8;53262:1212;53320:10;:13;53331:1;53320:13;;;;;;;;;;;;;53334:14;53320:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;53316:1;:44;;;53262:1212;;;53435:23;53546:1;53503:10;:13;53514:1;53503:13;;;;;;;;;;;;;53517:14;53503:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:40;;;:44;;;;:::i;:::-;53498:1;:49;;;53495:964;;53617:13;;;;;;;;:10;:13;;;;;:29;;53580:152;;53617:29;;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;53580:152;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53676:1;53680;53676:5;;;;:::i;:::-;53580:152;;53704:5;:1;53708;53704:5;:::i;:::-;:9;;53712:1;53704:9;:::i;:::-;53580:152;;:14;:152::i;:::-;53568:164;;53771:7;53781:87;53818:31;53833:9;53844:1;53847;53818:14;:31::i;:::-;53781:14;:87::i;:::-;53771:97;;53887:7;53897:87;53934:31;53949:9;53960:1;53963;53934:14;:31::i;53897:87::-;53887:97;;54107:9;54186:31;54201:9;54212:1;54215;54186:14;:31::i;:::-;54278:12;:1;:10;;;:12::i;:::-;54351;:1;:10;;;:12::i;:::-;54064:354;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54023:414;;53548:911;;53495:964;-1:-1:-1;53379:3:0;;;;:::i;:::-;;;;53262:1212;;;;53129:1366;53124:3;;;;;:::i;:::-;;;;53099:1396;;;;54623:10;54766:6;54849:9;54877;54905;54540:2154;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;54540:2154:0;;;;;;;;;;51363:5389;-1:-1:-1;;;;;;;51363:5389:0:o;62228:234::-;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;62320:8:::1;;62309:7;:19;;62300:57;;;;-1:-1:-1::0;;;62300:57:0::1;;;;;;;:::i;:::-;62380:7;62368:8;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62405:35:0::1;::::0;-1:-1:-1;7638:10:0;62418:12:::1;62432:7;62405:12;:35::i;10117:104::-:0;10173:13;10206:7;10199:14;;;;;:::i;11800:295::-;-1:-1:-1;;;;;11903:24:0;;7638:10;11903:24;;11895:62;;;;-1:-1:-1;;;11895:62:0;;30783:2:1;11895:62:0;;;30765:21:1;30822:2;30802:18;;;30795:30;30861:27;30841:18;;;30834:55;30906:18;;11895:62:0;30581:349:1;11895:62:0;7638:10;11970:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;11970:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;11970:53:0;;;;;;;;;;12039:48;;1498:41:1;;;11970:42:0;;7638:10;12039:48;;1471:18:1;12039:48:0;;;;;;;11800:295;;:::o;62480:230::-;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;62581:8:::1;;62570:7;:19;;62561:57;;;;-1:-1:-1::0;;;62561:57:0::1;;;;;;;:::i;:::-;62641:7;62629:8;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62666:26:0::1;::::0;-1:-1:-1;62679:3:0;62684:7;62666:12:::1;:26::i;13063:328::-:0;13238:41;7638:10;13271:7;13238:18;:41::i;:::-;13230:103;;;;-1:-1:-1;;;13230:103:0;;;;;;;:::i;:::-;13344:39;13358:4;13364:2;13368:7;13377:5;13344:13;:39::i;:::-;13063:328;;;;:::o;57857:1393::-;14966:4;14990:16;;;:7;:16;;;;;;57959:13;;-1:-1:-1;;;;;14990:16:0;57990:26;;;;;;58029:23;58055:24;58070:8;58055:14;:24::i;:::-;58029:50;;58230:958;58458:23;58472:8;58458:13;:23::i;:::-;58790:120;58850:20;58860:9;58850;:20::i;:::-;58790:11;:120::i;:::-;59005:25;59020:9;59005:14;:25::i;:::-;58345:762;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58230:11;:958::i;:::-;58137:1070;;;;;;;;:::i;49157:418::-;49243:29;49263:9;42715:17;49243:29;:::i;:::-;49230:9;:42;;49221:71;;;;-1:-1:-1;;;49221:71:0;;33622:2:1;49221:71:0;;;33604:21:1;33661:2;33641:18;;;33634:30;-1:-1:-1;;;33680:18:1;;;33673:45;33735:18;;49221:71:0;33420:339:1;49221:71:0;49356:8;;49343:10;;:21;;;;:::i;:::-;49311:28;49329:9;49311:13;24418:10;:17;;24330:113;49311:28;:53;;49303:86;;;;-1:-1:-1;;;49303:86:0;;33966:2:1;49303:86:0;;;33948:21:1;34005:2;33985:18;;;33978:30;-1:-1:-1;;;34024:18:1;;;34017:50;34084:18;;49303:86:0;33764:344:1;49303:86:0;49435:1;49408:23;7638:10;9372:208;:::i;49408:23::-;:28;;49400:64;;;;-1:-1:-1;;;49400:64:0;;34315:2:1;49400:64:0;;;34297:21:1;34354:2;34334:18;;;34327:30;34393:26;34373:18;;;34366:54;34437:18;;49400:64:0;34113:348:1;49400:64:0;49485:7;;;;49484:8;49475:33;;;;-1:-1:-1;;;49475:33:0;;34668:2:1;49475:33:0;;;34650:21:1;34707:2;34687:18;;;34680:30;-1:-1:-1;;;34726:18:1;;;34719:41;34777:18;;49475:33:0;34466:335:1;49475:33:0;49530:37;7638:10;49543:12;7558:98;61335:474;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;61461:9:::1;61456:327;61480:6;:13;61476:1;:17;61456:327;;;61515:10;:27;61526:15;61515:27;;;;;;;;;;;61566:190;;;;;;;;61594:6;61601:1;61594:9;;;;;;;;:::i;:::-;;;;;;;:19;;;61566:190;;;;61636:6;61643:1;61636:9;;;;;;;;:::i;:::-;;;;;;;:19;;;61566:190;;;;61678:6;61685:1;61678:9;;;;;;;;:::i;:::-;;;;;;;:16;;;61566:190;;;;61717:6;61724:1;61717:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:20:::1;;::::0;61566:190;;;61515:256;;::::1;::::0;::::1;::::0;;-1:-1:-1;61515:256:0;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;61515:256:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;61515:256:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;61495:3;;;;;:::i;:::-;;;;61456:327;;41517:192:::0;40690:6;;-1:-1:-1;;;;;40690:6:0;7638:10;40837:23;40829:68;;;;-1:-1:-1;;;40829:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41606:22:0;::::1;41598:73;;;::::0;-1:-1:-1;;;41598:73:0;;35008:2:1;41598:73:0::1;::::0;::::1;34990:21:1::0;35047:2;35027:18;;;35020:30;35086:34;35066:18;;;35059:62;-1:-1:-1;;;35137:18:1;;;35130:36;35183:19;;41598:73:0::1;34806:402:1::0;41598:73:0::1;41682:19;41692:8;41682:9;:19::i;9003:305::-:0;9105:4;-1:-1:-1;;;;;;9142:40:0;;-1:-1:-1;;;9142:40:0;;:105;;-1:-1:-1;;;;;;;9199:48:0;;-1:-1:-1;;;9199:48:0;9142:105;:158;;;-1:-1:-1;;;;;;;;;;6335:40:0;;;9264:36;6226:157;18883:174;18958:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;18958:29:0;-1:-1:-1;;;;;18958:29:0;;;;;;;;:24;;19012:23;18958:24;19012:14;:23::i;:::-;-1:-1:-1;;;;;19003:46:0;;;;;;;;;;;18883:174;;:::o;15195:348::-;15288:4;14990:16;;;:7;:16;;;;;;-1:-1:-1;;;;;14990:16:0;15305:73;;;;-1:-1:-1;;;15305:73:0;;35415:2:1;15305:73:0;;;35397:21:1;35454:2;35434:18;;;35427:30;35493:34;35473:18;;;35466:62;-1:-1:-1;;;35544:18:1;;;35537:42;35596:19;;15305:73:0;35213:408:1;15305:73:0;15389:13;15405:23;15420:7;15405:14;:23::i;:::-;15389:39;;15458:5;-1:-1:-1;;;;;15447:16:0;:7;-1:-1:-1;;;;;15447:16:0;;:51;;;;15491:7;-1:-1:-1;;;;;15467:31:0;:20;15479:7;15467:11;:20::i;:::-;-1:-1:-1;;;;;15467:31:0;;15447:51;:87;;;-1:-1:-1;;;;;;12287:25:0;;;12263:4;12287:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;15502:32;15439:96;15195:348;-1:-1:-1;;;;15195:348:0:o;18187:578::-;18346:4;-1:-1:-1;;;;;18319:31:0;:23;18334:7;18319:14;:23::i;:::-;-1:-1:-1;;;;;18319:31:0;;18311:85;;;;-1:-1:-1;;;18311:85:0;;35828:2:1;18311:85:0;;;35810:21:1;35867:2;35847:18;;;35840:30;35906:34;35886:18;;;35879:62;-1:-1:-1;;;35957:18:1;;;35950:39;36006:19;;18311:85:0;35626:405:1;18311:85:0;-1:-1:-1;;;;;18415:16:0;;18407:65;;;;-1:-1:-1;;;18407:65:0;;36238:2:1;18407:65:0;;;36220:21:1;36277:2;36257:18;;;36250:30;36316:34;36296:18;;;36289:62;-1:-1:-1;;;36367:18:1;;;36360:34;36411:19;;18407:65:0;36036:400:1;18407:65:0;18485:39;18506:4;18512:2;18516:7;18485:20;:39::i;:::-;18589:29;18606:1;18610:7;18589:8;:29::i;:::-;-1:-1:-1;;;;;18631:15:0;;;;;;:9;:15;;;;;:20;;18650:1;;18631:15;:20;;18650:1;;18631:20;:::i;:::-;;;;-1:-1:-1;;;;;;;18662:13:0;;;;;;:9;:13;;;;;:18;;18679:1;;18662:13;:18;;18679:1;;18662:18;:::i;:::-;;;;-1:-1:-1;;18691:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;18691:21:0;-1:-1:-1;;;;;18691:21:0;;;;;;;;;18730:27;;18691:16;;18730:27;;;;;;;18187:578;;;:::o;38083:133::-;38141:7;;38169:5;38173:1;38169;:5;:::i;:::-;38157:17;;38193:1;38188;:6;;38181:14;;;;:::i;:::-;38209:1;38083:133;-1:-1:-1;;;38083:133:0:o;48440:656::-;48513:20;48536:13;24418:10;:17;;24330:113;48536:13;48513:36;;48600:10;;48568:28;48586:9;48568:13;24418:10;:17;;24330:113;48568:28;:42;;48560:75;;;;-1:-1:-1;;;48560:75:0;;33966:2:1;48560:75:0;;;33948:21:1;34005:2;33985:18;;;33978:30;-1:-1:-1;;;34024:18:1;;;34017:50;34084:18;;48560:75:0;33764:344:1;48560:75:0;48666:1;48654:9;:13;48646:59;;;;-1:-1:-1;;;48646:59:0;;36908:2:1;48646:59:0;;;36890:21:1;36947:2;36927:18;;;36920:30;36986:34;36966:18;;;36959:62;-1:-1:-1;;;37037:18:1;;;37030:32;37079:19;;48646:59:0;36706:398:1;48646:59:0;67557:20;;67605:8;48716:29;;;;;;48773:9;48768:321;48792:9;48788:1;:13;48768:321;;;48824:19;48846:16;48861:1;48846:12;:16;:::i;:::-;48824:38;;48907:24;48912:11;48925:2;48929:1;48907:4;:24::i;:::-;48878:26;;;;:13;:26;;;;;;;;:53;;;;:26;;:53;;;;;;:::i;:::-;;48990:4;48947:12;48960:13;:26;48974:11;48960:26;;;;;;;;;;;48947:40;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;;-1:-1:-1;;48947:47:0;;;;;;;;;49010:22;49016:2;49020:11;49010:5;:22::i;:::-;49054:23;;49065:11;;-1:-1:-1;;;;;49054:23:0;;;;;;;;-1:-1:-1;48803:3:0;;;;:::i;:::-;;;;48768:321;;66807:419;66940:13;66996:3;66966:21;67043;67054:10;67043:8;:21;:::i;:::-;67033:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67033:32:0;-1:-1:-1;67011:54:0;-1:-1:-1;67093:10:0;67076:111;67109:8;67105:1;:12;67076:111;;;67164:8;67173:1;67164:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;67164:11:0;67139:6;67146:14;67150:10;67146:1;:14;:::i;:::-;67139:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;67139:36:0;;;;;;;;-1:-1:-1;67119:3:0;;;;:::i;:::-;;;;67076:111;;;-1:-1:-1;67211:6:0;66807:419;-1:-1:-1;;;;;66807:419:0:o;66296:503::-;66382:16;66445:2;66382:16;;66484:286;66506:7;:14;66502:1;:18;;;66484:286;;;66593:2;66577:7;66585:1;66577:10;;;;;;;;;;:::i;:::-;;;;;;;66565:30;;;;66564:85;;;66646:2;66630:7;66638:1;66630:10;;;;;;;;;;:::i;:::-;;;;;;;66618:30;;66564:85;66542:217;;;66684:10;66692:2;66684:10;;:::i;:::-;;;66741:2;66727:7;66735:1;66727:10;;;;;;;;;;:::i;:::-;;;;;66721:22;;;66727:10;;66721:22;:::i;:::-;66713:30;;;;:::i;:::-;;;66542:217;66522:3;;;;:::i;:::-;;;;66484:286;;41717:173;41792:6;;;-1:-1:-1;;;;;41809:17:0;;;-1:-1:-1;;;;;;41809:17:0;;;;;;;41842:40;;41792:6;;;41809:17;41792:6;;41842:40;;41773:16;;41842:40;41762:128;41717:173;:::o;65455:183::-;65536:4;65625:1;65607:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;65597:32;;;;;;65589:1;65571:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;65561:32;;;;;;:68;65553:77;;65455:183;;;;:::o;50865:299::-;50967:5;;50990:148;51012:7;:14;51008:18;;;;50990:148;;;51052:46;51073:7;51081:1;51073:10;;;;;;;;;;:::i;:::-;;;;;;;;51052:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51085:12;51052:19;:46::i;:::-;51048:78;;;51124:1;50865:299;-1:-1:-1;;50865:299:0:o;51048:78::-;51028:3;;;;:::i;:::-;;;;50990:148;;;;51148:8;;;65756:532;65812:13;65842:10;65838:53;;-1:-1:-1;;65869:10:0;;;;;;;;;;;;-1:-1:-1;;;65869:10:0;;;;;65756:532::o;65838:53::-;65916:5;65901:12;65957:78;65964:9;;65957:78;;65990:8;;;;:::i;:::-;;-1:-1:-1;66013:10:0;;-1:-1:-1;66021:2:0;66013:10;;:::i;:::-;;;65957:78;;;66045:19;66077:6;66067:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66067:17:0;;66045:39;;66095:154;66102:10;;66095:154;;66129:11;66139:1;66129:11;;:::i;:::-;;-1:-1:-1;66198:10:0;66206:2;66198:5;:10;:::i;:::-;66185:24;;:2;:24;:::i;:::-;66172:39;;66155:6;66162;66155:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;66155:56:0;;;;;;;;-1:-1:-1;66226:11:0;66235:2;66226:11;;:::i;:::-;;;66095:154;;14273:315;14430:28;14440:4;14446:2;14450:7;14430:9;:28::i;:::-;14477:48;14500:4;14506:2;14510:7;14519:5;14477:22;:48::i;:::-;14469:111;;;;-1:-1:-1;;;14469:111:0;;;;;;;:::i;63187:2256::-;63245:13;63275:4;:11;63290:1;63275:16;63271:31;;;-1:-1:-1;;63293:9:0;;;;;;;;;-1:-1:-1;63293:9:0;;;63187:2256::o;63271:31::-;63354:19;63376:5;;;;;;;;;;;;;;;;;63354:27;;63433:18;63479:1;63460:4;:11;63474:1;63460:15;;;;:::i;:::-;63459:21;;;;:::i;:::-;63454:27;;:1;:27;:::i;:::-;63433:48;-1:-1:-1;63564:20:0;63598:15;63433:48;63611:2;63598:15;:::i;:::-;63587:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63587:27:0;;63564:50;;63711:10;63703:6;63696:26;63806:1;63799:5;63795:13;63865:4;63916;63910:11;63901:7;63897:25;64012:2;64004:6;64000:15;64085:1045;64120:6;64111:7;64108:19;64085:1045;;;64190:1;64177:15;;;64258:14;;64441:4;64429:2;64425:14;;;64421:25;;64407:40;;64401:47;64396:3;64392:57;;;64331:137;;64632:2;64628:14;;;64624:25;;64610:40;;64604:47;64595:57;;64514:1;64499:17;;64534:137;64835:1;64831:13;;;64827:24;;64813:39;;64807:46;64798:56;;64702:17;;;64737:136;65029:16;;65015:31;;65009:38;65000:48;;64904:17;;;64939:128;;;;65098:17;;64085:1045;;;65203:1;65196:4;65190:11;65186:19;65224:1;65219:84;;;;65322:1;65317:82;;;;65179:220;;65219:84;-1:-1:-1;;;;;65252:17:0;;65245:43;65219:84;;65317:82;-1:-1:-1;;;;;65350:17:0;;65343:41;65179:220;-1:-1:-1;65429:6:0;;63187:2256;-1:-1:-1;;;;;;;;63187:2256:0:o;25366:589::-;-1:-1:-1;;;;;25572:18:0;;25568:187;;25607:40;25639:7;26782:10;:17;;26755:24;;;;:15;:24;;;;;:44;;;26810:24;;;;;;;;;;;;26678:164;25607:40;25568:187;;;25677:2;-1:-1:-1;;;;;25669:10:0;:4;-1:-1:-1;;;;;25669:10:0;;25665:90;;25696:47;25729:4;25735:7;25696:32;:47::i;:::-;-1:-1:-1;;;;;25769:16:0;;25765:183;;25802:45;25839:7;25802:36;:45::i;25765:183::-;25875:4;-1:-1:-1;;;;;25869:10:0;:2;-1:-1:-1;;;;;25869:10:0;;25865:83;;25896:40;25924:2;25928:7;25896:27;:40::i;47321:1023::-;47423:13;47462:2;47457;:7;47449:16;;;;;;47531:30;;;;;;;;;:25;:30;;;47574:661;47596:1;47592;:5;;;47574:661;;;47619:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;47996:10:0;;47757:276;;;47804:15;47757:276;;;39097:19:1;47850:16:0;39132:12:1;;;39125:28;;;;39169:12;;;;39162:28;;;39224:15;;;-1:-1:-1;;39220:53:1;39206:12;;;39199:75;39290:13;;;39283:29;;;39328:13;;;39321:29;;;;-1:-1:-1;;48078:4:0;;39366:13:1;;47757:276:0;;;;;;;;;;;;47721:335;;;;;;47691:384;;:391;;;;:::i;:::-;47646:451;;48170:11;48183:24;48193:10;48183:24;;48205:1;48183:9;:24::i;:::-;48153:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48114:109;;47604:631;47599:3;;;;;:::i;:::-;;;;47574:661;;;;48251:12;48264:11;48251:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;48247:58;;;48285:20;48290:2;48294;48298:6;:2;48303:1;48298:6;:::i;:::-;48285:4;:20::i;:::-;48278:27;;;;;16879:382;-1:-1:-1;;;;;16959:16:0;;16951:61;;;;-1:-1:-1;;;16951:61:0;;40067:2:1;16951:61:0;;;40049:21:1;;;40086:18;;;40079:30;40145:34;40125:18;;;40118:62;40197:18;;16951:61:0;39865:356:1;16951:61:0;14966:4;14990:16;;;:7;:16;;;;;;-1:-1:-1;;;;;14990:16:0;:30;17023:58;;;;-1:-1:-1;;;17023:58:0;;40428:2:1;17023:58:0;;;40410:21:1;40467:2;40447:18;;;40440:30;40506;40486:18;;;40479:58;40554:18;;17023:58:0;40226:352:1;17023:58:0;17094:45;17123:1;17127:2;17131:7;17094:20;:45::i;:::-;-1:-1:-1;;;;;17152:13:0;;;;;;:9;:13;;;;;:18;;17169:1;;17152:13;:18;;17169:1;;17152:18;:::i;:::-;;;;-1:-1:-1;;17181:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;17181:21:0;-1:-1:-1;;;;;17181:21:0;;;;;;;;17220:33;;17181:16;;;17220:33;;17181:16;;17220:33;16879:382;;:::o;19622:799::-;19777:4;-1:-1:-1;;;;;19798:13:0;;67557:20;67605:8;19794:620;;19834:72;;-1:-1:-1;;;19834:72:0;;-1:-1:-1;;;;;19834:36:0;;;;;:72;;7638:10;;19885:4;;19891:7;;19900:5;;19834:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19834:72:0;;;;;;;;-1:-1:-1;;19834:72:0;;;;;;;;;;;;:::i;:::-;;;19830:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20076:13:0;;20072:272;;20119:60;;-1:-1:-1;;;20119:60:0;;;;;;;:::i;20072:272::-;20294:6;20288:13;20279:6;20275:2;20271:15;20264:38;19830:529;-1:-1:-1;;;;;;19957:51:0;-1:-1:-1;;;19957:51:0;;-1:-1:-1;19950:58:0;;19794:620;-1:-1:-1;20398:4:0;19622:799;;;;;;:::o;27469:988::-;27735:22;27785:1;27760:22;27777:4;27760:16;:22::i;:::-;:26;;;;:::i;:::-;27797:18;27818:26;;;:17;:26;;;;;;27735:51;;-1:-1:-1;27951:28:0;;;27947:328;;-1:-1:-1;;;;;28018:18:0;;27996:19;28018:18;;;:12;:18;;;;;;;;:34;;;;;;;;;28069:30;;;;;;:44;;;28186:30;;:17;:30;;;;;:43;;;27947:328;-1:-1:-1;28371:26:0;;;;:17;:26;;;;;;;;28364:33;;;-1:-1:-1;;;;;28415:18:0;;;;;:12;:18;;;;;:34;;;;;;;28408:41;27469:988::o;28752:1079::-;29030:10;:17;29005:22;;29030:21;;29050:1;;29030:21;:::i;:::-;29062:18;29083:24;;;:15;:24;;;;;;29456:10;:26;;29005:46;;-1:-1:-1;29083:24:0;;29005:46;;29456:26;;;;;;:::i;:::-;;;;;;;;;29434:48;;29520:11;29495:10;29506;29495:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;29600:28;;;:15;:28;;;;;;;:41;;;29772:24;;;;;29765:31;29807:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28823:1008;;;28752:1079;:::o;26256:221::-;26341:14;26358:20;26375:2;26358:16;:20::i;:::-;-1:-1:-1;;;;;26389:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;26434:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;26256:221:0:o;46461:572::-;46569:13;46600:24;46644:7;46639:366;46661:5;46667:11;46661:18;;;;;;;;;:::i;:::-;;:25;46657:29;;;;46639:366;;;46708:21;46732:5;46738:11;46732:18;;;;;;;;;:::i;:::-;;46751:1;46732:21;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;46708:45;;46804:17;46790:31;;:10;:31;;:99;;;;-1:-1:-1;46855:34:0;46875:14;46855:17;:34;:::i;:::-;46842:47;;:10;:47;46790:99;46768:156;;;46912:12;:1;:10;;;:12::i;:::-;46905:19;;;;;;;46768:156;46959:34;46979:14;46959:17;:34;:::i;:::-;46939:54;;46693:312;46688:3;;;;;:::i;:::-;;;;46639:366;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:258::-;271:1;281:113;295:6;292:1;289:13;281:113;;;371:11;;;365:18;352:11;;;345:39;317:2;310:10;281:113;;;412:6;409:1;406:13;403:48;;;-1:-1:-1;;447:1:1;429:16;;422:27;199:258::o;462:269::-;515:3;553:5;547:12;580:6;575:3;568:19;596:63;652:6;645:4;640:3;636:14;629:4;622:5;618:16;596:63;:::i;:::-;713:2;692:15;-1:-1:-1;;688:29:1;679:39;;;;720:4;675:50;;462:269;-1:-1:-1;;462:269:1:o;736:231::-;885:2;874:9;867:21;848:4;905:56;957:2;946:9;942:18;934:6;905:56;:::i;972:131::-;-1:-1:-1;;;;;;1046:32:1;;1036:43;;1026:71;;1093:1;1090;1083:12;1108:245;1166:6;1219:2;1207:9;1198:7;1194:23;1190:32;1187:52;;;1235:1;1232;1225:12;1187:52;1274:9;1261:23;1293:30;1317:5;1293:30;:::i;1550:160::-;1615:20;;1671:13;;1664:21;1654:32;;1644:60;;1700:1;1697;1690:12;1644:60;1550:160;;;:::o;1715:180::-;1771:6;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;1863:26;1879:9;1863:26;:::i;2108:173::-;2176:20;;-1:-1:-1;;;;;2225:31:1;;2215:42;;2205:70;;2271:1;2268;2261:12;2286:254;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;2530:2;2515:18;;;;2502:32;;-1:-1:-1;;;2286:254:1:o;2727:328::-;2804:6;2812;2820;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2912:29;2931:9;2912:29;:::i;:::-;2902:39;;2960:38;2994:2;2983:9;2979:18;2960:38;:::i;:::-;2950:48;;3045:2;3034:9;3030:18;3017:32;3007:42;;2727:328;;;;;:::o;3060:248::-;3128:6;3136;3189:2;3177:9;3168:7;3164:23;3160:32;3157:52;;;3205:1;3202;3195:12;3157:52;-1:-1:-1;;3228:23:1;;;3298:2;3283:18;;;3270:32;;-1:-1:-1;3060:248:1:o;3313:652::-;3586:3;3575:9;3568:22;3549:4;3613:57;3665:3;3654:9;3650:19;3642:6;3613:57;:::i;:::-;3718:9;3710:6;3706:22;3701:2;3690:9;3686:18;3679:50;3752:44;3789:6;3781;3752:44;:::i;:::-;3738:58;;3844:9;3836:6;3832:22;3827:2;3816:9;3812:18;3805:50;3872:44;3909:6;3901;3872:44;:::i;:::-;3864:52;;;3952:6;3947:2;3936:9;3932:18;3925:34;3313:652;;;;;;;:::o;3970:615::-;4056:6;4064;4117:2;4105:9;4096:7;4092:23;4088:32;4085:52;;;4133:1;4130;4123:12;4085:52;4173:9;4160:23;4202:18;4243:2;4235:6;4232:14;4229:34;;;4259:1;4256;4249:12;4229:34;4297:6;4286:9;4282:22;4272:32;;4342:7;4335:4;4331:2;4327:13;4323:27;4313:55;;4364:1;4361;4354:12;4313:55;4404:2;4391:16;4430:2;4422:6;4419:14;4416:34;;;4446:1;4443;4436:12;4416:34;4499:7;4494:2;4484:6;4481:1;4477:14;4473:2;4469:23;4465:32;4462:45;4459:65;;;4520:1;4517;4510:12;4459:65;4551:2;4543:11;;;;;4573:6;;-1:-1:-1;3970:615:1;;-1:-1:-1;;;;3970:615:1:o;4590:186::-;4649:6;4702:2;4690:9;4681:7;4677:23;4673:32;4670:52;;;4718:1;4715;4708:12;4670:52;4741:29;4760:9;4741:29;:::i;4781:632::-;4952:2;5004:21;;;5074:13;;4977:18;;;5096:22;;;4923:4;;4952:2;5175:15;;;;5149:2;5134:18;;;4923:4;5218:169;5232:6;5229:1;5226:13;5218:169;;;5293:13;;5281:26;;5362:15;;;;5327:12;;;;5254:1;5247:9;5218:169;;;-1:-1:-1;5404:3:1;;4781:632;-1:-1:-1;;;;;;4781:632:1:o;5418:127::-;5479:10;5474:3;5470:20;5467:1;5460:31;5510:4;5507:1;5500:15;5534:4;5531:1;5524:15;5550:253;5622:2;5616:9;5664:4;5652:17;;5699:18;5684:34;;5720:22;;;5681:62;5678:88;;;5746:18;;:::i;:::-;5782:2;5775:22;5550:253;:::o;5808:275::-;5879:2;5873:9;5944:2;5925:13;;-1:-1:-1;;5921:27:1;5909:40;;5979:18;5964:34;;6000:22;;;5961:62;5958:88;;;6026:18;;:::i;:::-;6062:2;6055:22;5808:275;;-1:-1:-1;5808:275:1:o;6088:407::-;6153:5;6187:18;6179:6;6176:30;6173:56;;;6209:18;;:::i;:::-;6247:57;6292:2;6271:15;;-1:-1:-1;;6267:29:1;6298:4;6263:40;6247:57;:::i;:::-;6238:66;;6327:6;6320:5;6313:21;6367:3;6358:6;6353:3;6349:16;6346:25;6343:45;;;6384:1;6381;6374:12;6343:45;6433:6;6428:3;6421:4;6414:5;6410:16;6397:43;6487:1;6480:4;6471:6;6464:5;6460:18;6456:29;6449:40;6088:407;;;;;:::o;6500:222::-;6543:5;6596:3;6589:4;6581:6;6577:17;6573:27;6563:55;;6614:1;6611;6604:12;6563:55;6636:80;6712:3;6703:6;6690:20;6683:4;6675:6;6671:17;6636:80;:::i;6727:322::-;6796:6;6849:2;6837:9;6828:7;6824:23;6820:32;6817:52;;;6865:1;6862;6855:12;6817:52;6905:9;6892:23;6938:18;6930:6;6927:30;6924:50;;;6970:1;6967;6960:12;6924:50;6993;7035:7;7026:6;7015:9;7011:22;6993:50;:::i;7054:254::-;7119:6;7127;7180:2;7168:9;7159:7;7155:23;7151:32;7148:52;;;7196:1;7193;7186:12;7148:52;7219:29;7238:9;7219:29;:::i;:::-;7209:39;;7267:35;7298:2;7287:9;7283:18;7267:35;:::i;:::-;7257:45;;7054:254;;;;;:::o;7313:667::-;7408:6;7416;7424;7432;7485:3;7473:9;7464:7;7460:23;7456:33;7453:53;;;7502:1;7499;7492:12;7453:53;7525:29;7544:9;7525:29;:::i;:::-;7515:39;;7573:38;7607:2;7596:9;7592:18;7573:38;:::i;:::-;7563:48;;7658:2;7647:9;7643:18;7630:32;7620:42;;7713:2;7702:9;7698:18;7685:32;7740:18;7732:6;7729:30;7726:50;;;7772:1;7769;7762:12;7726:50;7795:22;;7848:4;7840:13;;7836:27;-1:-1:-1;7826:55:1;;7877:1;7874;7867:12;7826:55;7900:74;7966:7;7961:2;7948:16;7943:2;7939;7935:11;7900:74;:::i;:::-;7890:84;;;7313:667;;;;;;;:::o;7985:2239::-;8101:6;8109;8162:2;8150:9;8141:7;8137:23;8133:32;8130:52;;;8178:1;8175;8168:12;8130:52;8214:9;8201:23;8191:33;;8243:2;8296;8285:9;8281:18;8268:32;8319:18;8360:2;8352:6;8349:14;8346:34;;;8376:1;8373;8366:12;8346:34;8414:6;8403:9;8399:22;8389:32;;8459:7;8452:4;8448:2;8444:13;8440:27;8430:55;;8481:1;8478;8471:12;8430:55;8517:2;8504:16;8539:2;8535;8532:10;8529:36;;;8545:18;;:::i;:::-;8591:2;8588:1;8584:10;8614:28;8638:2;8634;8630:11;8614:28;:::i;:::-;8676:15;;;8746:11;;;8742:20;;;8707:12;;;;8774:19;;;8771:39;;;8806:1;8803;8796:12;8771:39;8838:2;8834;8830:11;8819:22;;8850:1344;8866:6;8861:3;8858:15;8850:1344;;;8952:3;8939:17;8988:2;8975:11;8972:19;8969:39;;;9004:1;9001;8994:12;8969:39;9031:20;;9103:4;9075:16;;;-1:-1:-1;;9071:30:1;9067:41;9064:131;;;9149:1;9178:2;9174;9167:14;9064:131;9221:22;;:::i;:::-;9293:2;9289;9285:11;9272:25;9326:2;9316:8;9313:16;9310:106;;;9370:1;9399:2;9395;9388:14;9310:106;9443:54;9489:7;9484:2;9473:8;9469:2;9465:17;9461:26;9443:54;:::i;:::-;9436:5;9429:69;;9548:2;9544;9540:11;9527:25;9581:2;9571:8;9568:16;9565:106;;;9625:1;9654:2;9650;9643:14;9565:106;9707:54;9753:7;9748:2;9737:8;9733:2;9729:17;9725:26;9707:54;:::i;:::-;9702:2;9695:5;9691:14;9684:78;;9786:2;9838:3;9834:2;9830:12;9817:26;9872:2;9862:8;9859:16;9856:109;;;9917:1;9947:3;9942;9935:16;9856:109;10001:54;10047:7;10042:2;10031:8;10027:2;10023:17;10019:26;10001:54;:::i;:::-;9996:2;9985:14;;9978:78;-1:-1:-1;10114:4:1;10106:13;;;;10093:27;10076:15;;;10069:52;;;;10134:18;;8883:12;;;;10172;;;;8850:1344;;;10213:5;10203:15;;;;;;;;;7985:2239;;;;;:::o;10229:260::-;10297:6;10305;10358:2;10346:9;10337:7;10333:23;10329:32;10326:52;;;10374:1;10371;10364:12;10326:52;10397:29;10416:9;10397:29;:::i;:::-;10387:39;;10445:38;10479:2;10468:9;10464:18;10445:38;:::i;10494:380::-;10573:1;10569:12;;;;10616;;;10637:61;;10691:4;10683:6;10679:17;10669:27;;10637:61;10744:2;10736:6;10733:14;10713:18;10710:38;10707:161;;;10790:10;10785:3;10781:20;10778:1;10771:31;10825:4;10822:1;10815:15;10853:4;10850:1;10843:15;10707:161;;10494:380;;;:::o;10879:356::-;11081:2;11063:21;;;11100:18;;;11093:30;11159:34;11154:2;11139:18;;11132:62;11226:2;11211:18;;10879:356::o;12480:127::-;12541:10;12536:3;12532:20;12529:1;12522:31;12572:4;12569:1;12562:15;12596:4;12593:1;12586:15;12612:135;12651:3;-1:-1:-1;;12672:17:1;;12669:43;;;12692:18;;:::i;:::-;-1:-1:-1;12739:1:1;12728:13;;12612:135::o;12752:413::-;12954:2;12936:21;;;12993:2;12973:18;;;12966:30;13032:34;13027:2;13012:18;;13005:62;-1:-1:-1;;;13098:2:1;13083:18;;13076:47;13155:3;13140:19;;12752:413::o;13582:127::-;13643:10;13638:3;13634:20;13631:1;13624:31;13674:4;13671:1;13664:15;13698:4;13695:1;13688:15;13714:347;13916:2;13898:21;;;13955:2;13935:18;;;13928:30;13994:25;13989:2;13974:18;;13967:53;14052:2;14037:18;;13714:347::o;14754:125::-;14794:4;14822:1;14819;14816:8;14813:34;;;14827:18;;:::i;:::-;-1:-1:-1;14864:9:1;;14754:125::o;15707:204::-;15745:3;15781:4;15778:1;15774:12;15813:4;15810:1;15806:12;15848:3;15842:4;15838:14;15833:3;15830:23;15827:49;;;15856:18;;:::i;:::-;15892:13;;15707:204;-1:-1:-1;;;15707:204:1:o;15916:185::-;15958:3;15996:5;15990:12;16011:52;16056:6;16051:3;16044:4;16037:5;16033:16;16011:52;:::i;:::-;16079:16;;;;;15916:185;-1:-1:-1;;15916:185:1:o;16232:973::-;16317:12;;16282:3;;16372:1;16392:18;;;;16445;;;;16472:61;;16526:4;16518:6;16514:17;16504:27;;16472:61;16552:2;16600;16592:6;16589:14;16569:18;16566:38;16563:161;;;16646:10;16641:3;16637:20;16634:1;16627:31;16681:4;16678:1;16671:15;16709:4;16706:1;16699:15;16563:161;16740:18;16767:104;;;;16885:1;16880:319;;;;16733:466;;16767:104;-1:-1:-1;;16800:24:1;;16788:37;;16845:16;;;;-1:-1:-1;16767:104:1;;16880:319;16179:1;16172:14;;;16216:4;16203:18;;16974:1;16988:165;17002:6;16999:1;16996:13;16988:165;;;17080:14;;17067:11;;;17060:35;17123:16;;;;17017:10;;16988:165;;;16992:3;;17182:6;17177:3;17173:16;17166:23;;16733:466;;;;;;;16232:973;;;;:::o;17210:990::-;17734:3;17772:6;17766:13;17788:53;17834:6;17829:3;17822:4;17814:6;17810:17;17788:53;:::i;:::-;-1:-1:-1;;;17863:16:1;;;17888:57;;;17964:49;18009:2;17998:14;;17990:6;17964:49;:::i;:::-;-1:-1:-1;;;18022:46:1;;17954:59;-1:-1:-1;18087:46:1;18129:2;18121:11;;18113:6;18087:46;:::i;:::-;-1:-1:-1;;;18142:26:1;;18192:1;18184:10;;17210:990;-1:-1:-1;;;;;;17210:990:1:o;18205:439::-;18437:3;18475:6;18469:13;18491:53;18537:6;18532:3;18525:4;18517:6;18513:17;18491:53;:::i;:::-;-1:-1:-1;;;18566:16:1;;18591:18;;;-1:-1:-1;18636:1:1;18625:13;;18205:439;-1:-1:-1;18205:439:1:o;18649:175::-;18686:3;18730:4;18723:5;18719:16;18759:4;18750:7;18747:17;18744:43;;;18767:18;;:::i;:::-;18816:1;18803:15;;18649:175;-1:-1:-1;;18649:175:1:o;18829:572::-;-1:-1:-1;;;19187:3:1;19180:16;19162:3;19225:6;19219:13;19241:61;19295:6;19291:1;19286:3;19282:11;19275:4;19267:6;19263:17;19241:61;:::i;:::-;-1:-1:-1;;;19361:1:1;19321:16;;;;19353:10;;;19346:23;-1:-1:-1;19393:1:1;19385:10;;18829:572;-1:-1:-1;18829:572:1:o;19817:563::-;20177:66;20172:3;20165:79;20147:3;20263:47;20306:2;20301:3;20297:12;20289:6;20263:47;:::i;:::-;-1:-1:-1;;;20319:29:1;;20372:1;20364:10;;19817:563;-1:-1:-1;;;19817:563:1:o;20385:589::-;-1:-1:-1;;;20733:55:1;;20715:3;20807:47;20850:2;20841:12;;20833:6;20807:47;:::i;:::-;20874:66;20863:78;;20965:2;20957:11;;20385:589;-1:-1:-1;;;20385:589:1:o;20979:418::-;-1:-1:-1;;;21236:3:1;21229:16;21211:3;21274:6;21268:13;21290:61;21344:6;21340:1;21335:3;21331:11;21324:4;21316:6;21312:17;21290:61;:::i;:::-;21371:16;;;;21389:1;21367:24;;20979:418;-1:-1:-1;;20979:418:1:o;22406:258::-;22445:7;22477:6;22510:2;22507:1;22503:10;22540:2;22537:1;22533:10;22596:3;22592:2;22588:12;22583:3;22580:21;22573:3;22566:11;22559:19;22555:47;22552:73;;;22605:18;;:::i;:::-;22645:13;;22406:258;-1:-1:-1;;;;22406:258:1:o;22669:224::-;22708:3;22736:6;22769:2;22766:1;22762:10;22799:2;22796:1;22792:10;22830:3;22826:2;22822:12;22817:3;22814:21;22811:47;;;22838:18;;:::i;:::-;22874:13;;22669:224;-1:-1:-1;;;;22669:224:1:o;22898:1450::-;23577:3;23615:6;23609:13;23631:53;23677:6;23672:3;23665:4;23657:6;23653:17;23631:53;:::i;:::-;-1:-1:-1;;;23706:16:1;;;23731:31;;;23787:13;;23809:66;23787:13;23861:2;23850:14;;23843:4;23831:17;;23809:66;:::i;:::-;-1:-1:-1;;;23938:2:1;23894:20;;;;23930:11;;;23923:28;23976:13;;23998:63;23976:13;24047:2;24039:11;;24032:4;24020:17;;23998:63;:::i;:::-;-1:-1:-1;;;24121:2:1;24080:17;;;;24113:11;;;24106:28;24159:13;;24181:63;24159:13;24230:2;24222:11;;24215:4;24203:17;;24181:63;:::i;:::-;-1:-1:-1;;;24304:2:1;24263:17;;;;24296:11;;;24289:26;24339:2;24331:11;;22898:1450;-1:-1:-1;;;;;;22898:1450:1:o;24353:197::-;24391:3;24419:6;24460:2;24453:5;24449:14;24487:2;24478:7;24475:15;24472:41;;;24493:18;;:::i;:::-;24542:1;24529:15;;24353:197;-1:-1:-1;;;24353:197:1:o;28396:2180::-;29355:66;29350:3;29343:79;29325:3;29451:6;29445:13;29467:62;29522:6;29517:2;29512:3;29508:12;29501:4;29493:6;29489:17;29467:62;:::i;:::-;29593:66;29588:2;29548:16;;;29580:11;;;29573:87;29689:66;29684:2;29676:11;;29669:87;29785:66;29780:2;29772:11;;29765:87;29877:13;;29899:64;29877:13;29948:3;29940:12;;29933:4;29921:17;;29899:64;:::i;:::-;30029:66;30023:3;29982:17;;;;30015:12;;;30008:88;-1:-1:-1;;;30120:3:1;30112:12;;30105:44;30174:13;;30196:64;30174:13;30245:3;30237:12;;30230:4;30218:17;;30196:64;:::i;:::-;30321:13;;30279:17;;;30343:64;30321:13;30392:3;30384:12;;30377:4;30365:17;;30343:64;:::i;:::-;30423:147;30453:116;30483:85;30513:54;30562:3;30551:8;30547:2;30543:17;30539:27;30531:6;30513:54;:::i;:::-;24632:34;24620:47;;24697:34;24692:2;24683:12;;24676:56;24762:34;24757:2;24748:12;;24741:56;24827:34;24822:2;24813:12;;24806:56;24893:34;24887:3;24878:13;;24871:57;24959:34;24953:3;24944:13;;24937:57;25025:34;25019:3;25010:13;;25003:57;25091:34;25085:3;25076:13;;25069:57;25157:34;25151:3;25142:13;;25135:57;25223:34;25217:3;25208:13;;25201:57;25289:34;25283:3;25274:13;;25267:57;25355:34;25349:3;25340:13;;25333:57;25421:34;25415:3;25406:13;;25399:57;25487:34;25481:3;25472:13;;25465:57;25553:34;25547:3;25538:13;;25531:57;25619:34;25613:3;25604:13;;25597:57;25685:34;25679:3;25670:13;;25663:57;25751:34;25745:3;25736:13;;25729:57;25817:34;25811:3;25802:13;;25795:57;25883:34;25877:3;25868:13;;25861:57;25949:34;25943:3;25934:13;;25927:57;26015:34;26009:3;26000:13;;25993:57;26081:34;26075:3;26066:13;;26059:57;26147:34;26141:3;26132:13;;26125:57;26213:34;26207:3;26198:13;;26191:57;26279:34;26273:3;26264:13;;26257:57;26345:34;26339:3;26330:13;;26323:57;26411:34;26405:3;26396:13;;26389:57;26477:34;26471:3;26462:13;;26455:57;26543:34;26537:3;26528:13;;26521:57;26609:34;26603:3;26594:13;;26587:57;26675:34;26669:3;26660:13;;26653:57;26742:34;26735:4;26726:14;;26719:58;26809:34;26802:4;26793:14;;26786:58;26876:34;26869:4;26860:14;;26853:58;26943:34;26936:4;26927:14;;26920:58;27010:34;27003:4;26994:14;;26987:58;27077:34;27070:4;27061:14;;27054:58;27144:34;27137:4;27128:14;;27121:58;27211:34;27204:4;27195:14;;27188:58;27278:34;27271:4;27262:14;;27255:58;27345:34;27338:4;27329:14;;27322:58;27412:34;27405:4;27396:14;;27389:58;27479:34;27472:4;27463:14;;27456:58;27546:34;27539:4;27530:14;;27523:58;-1:-1:-1;;;27606:4:1;27597:14;;27590:47;27662:4;27653:14;;24555:3118;30483:85;27755:34;27743:47;;27820:34;27815:2;27806:12;;27799:56;27885:34;27880:2;27871:12;;27864:56;27950:34;27945:2;27936:12;;27929:56;28016:34;28010:3;28001:13;;27994:57;28082:34;28076:3;28067:13;;28060:57;28148:34;28142:3;28133:13;;28126:57;-1:-1:-1;;;28208:3:1;28199:13;;28192:31;28248:3;28239:13;;27678:580;30453:116;-1:-1:-1;;;28328:29:1;;28382:2;28373:12;;28263:128;30423:147;30416:154;28396:2180;-1:-1:-1;;;;;;;;;28396:2180:1:o;31208:1581::-;-1:-1:-1;;;31857:59:1;;31939:13;;31839:3;;31961:62;31939:13;32011:2;32002:12;;31995:4;31983:17;;31961:62;:::i;:::-;32087:66;32082:2;32042:16;;;32074:11;;;32067:87;32183:34;32178:2;32170:11;;32163:55;32247:34;32242:2;32234:11;;32227:55;32312:34;32306:3;32298:12;;32291:56;32377:34;32371:3;32363:12;;32356:56;32442:66;32436:3;32428:12;;32421:88;32539:66;32533:3;32525:12;;32518:88;-1:-1:-1;;;32630:3:1;32622:12;;32615:29;32660:123;32690:92;32716:65;32741:39;32775:3;32767:12;;32759:6;32741:39;:::i;:::-;-1:-1:-1;;;30995:55:1;;31075:2;31066:12;;30935:149;32716:65;32708:6;32690:92;:::i;:::-;-1:-1:-1;;;31154:16:1;;31195:1;31186:11;;31089:114;32660:123;32653:130;31208:1581;-1:-1:-1;;;;;;31208:1581:1:o;32794:448::-;33056:31;33051:3;33044:44;33026:3;33117:6;33111:13;33133:62;33188:6;33183:2;33178:3;33174:12;33167:4;33159:6;33155:17;33133:62;:::i;:::-;33215:16;;;;33233:2;33211:25;;32794:448;-1:-1:-1;;32794:448:1:o;33247:168::-;33287:7;33353:1;33349;33345:6;33341:14;33338:1;33335:21;33330:1;33323:9;33316:17;33312:45;33309:71;;;33360:18;;:::i;:::-;-1:-1:-1;33400:9:1;;33247:168::o;36441:128::-;36481:3;36512:1;36508:6;36505:1;36502:13;36499:39;;;36518:18;;:::i;:::-;-1:-1:-1;36554:9:1;;36441:128::o;36574:127::-;36635:10;36630:3;36626:20;36623:1;36616:31;36666:4;36663:1;36656:15;36690:4;36687:1;36680:15;37109:197;37237:3;37262:38;37296:3;37288:6;37262:38;:::i;37311:238::-;37349:7;37389:4;37386:1;37382:12;37421:4;37418:1;37414:12;37481:3;37475:4;37471:14;37466:3;37463:23;37456:3;37449:11;37442:19;37438:49;37435:75;;;37490:18;;:::i;:::-;37530:13;;37311:238;-1:-1:-1;;;37311:238:1:o;37554:195::-;37592:4;37629;37626:1;37622:12;37661:4;37658:1;37654:12;37686:3;37681;37678:12;37675:38;;;37693:18;;:::i;:::-;37730:13;;;37554:195;-1:-1:-1;;;37554:195:1:o;37754:276::-;37885:3;37923:6;37917:13;37939:53;37985:6;37980:3;37973:4;37965:6;37961:17;37939:53;:::i;:::-;38008:16;;;;;37754:276;-1:-1:-1;;37754:276:1:o;38035:127::-;38096:10;38091:3;38087:20;38084:1;38077:31;38127:4;38124:1;38117:15;38151:4;38148:1;38141:15;38167:120;38207:1;38233;38223:35;;38238:18;;:::i;:::-;-1:-1:-1;38272:9:1;;38167:120::o;38292:112::-;38324:1;38350;38340:35;;38355:18;;:::i;:::-;-1:-1:-1;38389:9:1;;38292:112::o;38409:414::-;38611:2;38593:21;;;38650:2;38630:18;;;38623:30;38689:34;38684:2;38669:18;;38662:62;-1:-1:-1;;;38755:2:1;38740:18;;38733:48;38813:3;38798:19;;38409:414::o;39390:470::-;39569:3;39607:6;39601:13;39623:53;39669:6;39664:3;39657:4;39649:6;39645:17;39623:53;:::i;:::-;39739:13;;39698:16;;;;39761:57;39739:13;39698:16;39795:4;39783:17;;39761:57;:::i;40583:500::-;-1:-1:-1;;;;;40852:15:1;;;40834:34;;40904:15;;40899:2;40884:18;;40877:43;40951:2;40936:18;;40929:34;;;40999:3;40994:2;40979:18;;40972:31;;;40777:4;;41020:57;;41057:19;;41049:6;41020:57;:::i;41088:249::-;41157:6;41210:2;41198:9;41189:7;41185:23;41181:32;41178:52;;;41226:1;41223;41216:12;41178:52;41258:9;41252:16;41277:30;41301:5;41277:30;:::i;41342:127::-;41403:10;41398:3;41394:20;41391:1;41384:31;41434:4;41431:1;41424:15;41458:4;41455:1;41448:15
Swarm Source
ipfs://abdf6b0b463bd3e7aa46efe0654f74a9912e37a2b3975ee487d2485d63e1ea88
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.