Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 403 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Refresh | 24681122 | 3 days ago | IN | 0 ETH | 0.00013973 | ||||
| Refresh | 24549636 | 22 days ago | IN | 0 ETH | 0.00001248 | ||||
| Refresh | 24491259 | 30 days ago | IN | 0 ETH | 0.00001566 | ||||
| Set Approval For... | 24470384 | 33 days ago | IN | 0 ETH | 0.00000617 | ||||
| Commit | 24377515 | 46 days ago | IN | 0 ETH | 0.00002602 | ||||
| Commit | 24377512 | 46 days ago | IN | 0 ETH | 0.00002349 | ||||
| Refresh | 24364059 | 48 days ago | IN | 0 ETH | 0.000016 | ||||
| Refresh | 24301796 | 56 days ago | IN | 0 ETH | 0.00000281 | ||||
| Refresh | 24301783 | 56 days ago | IN | 0 ETH | 0.00000291 | ||||
| Refresh | 24287025 | 58 days ago | IN | 0 ETH | 0.00000135 | ||||
| Refresh | 24286976 | 58 days ago | IN | 0 ETH | 0.00000126 | ||||
| Refresh | 24262313 | 62 days ago | IN | 0 ETH | 0.00013286 | ||||
| Refresh | 24204690 | 70 days ago | IN | 0 ETH | 0.00013287 | ||||
| Refresh | 24185916 | 73 days ago | IN | 0 ETH | 0.00013468 | ||||
| Refresh | 24123212 | 81 days ago | IN | 0 ETH | 0.00000227 | ||||
| Refresh | 24027145 | 95 days ago | IN | 0 ETH | 0.00013458 | ||||
| Refresh | 23986239 | 100 days ago | IN | 0 ETH | 0.00013994 | ||||
| Refresh | 23986231 | 100 days ago | IN | 0 ETH | 0.000139 | ||||
| Refresh | 23986214 | 100 days ago | IN | 0 ETH | 0.00014038 | ||||
| Commit | 23986147 | 100 days ago | IN | 0 ETH | 0.00015101 | ||||
| Refresh | 23980704 | 101 days ago | IN | 0 ETH | 0.00014251 | ||||
| Refresh | 23980032 | 101 days ago | IN | 0 ETH | 0.00014061 | ||||
| Refresh | 23978235 | 102 days ago | IN | 0 ETH | 0.00014547 | ||||
| Refresh | 23969161 | 103 days ago | IN | 0 ETH | 0.00015349 | ||||
| Commit | 23969123 | 103 days ago | IN | 0 ETH | 0.00007878 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Hashmarks
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-10-26
*/
//
// █████████████████████████████████████████████████████████████████████████████████████████████████
// █████████████████████████████████████████████████████████████████████████████████████████████████
// ██████░ ▒████████████░ ▒███░ ▒████░▒████░ ▒█░ ▒██░ ▒█░ ▒█░ ▒████
// █████░ ▒░ ▒████████████░ ▒░ ▒███░ ▒█░ ▒███░ ▒████░ ▒█░ ▒██░ ▒█░ ▒██░ ▒█░ ▒██░ ▒█░ ▒██░ ▒█░ ▒████
// ████░ ▒██░ ▒███████████░ ▒█░ ▒██░ ▒██░▒██░ ▒░ ▒███░ ▒██░▒██░ ▒█░ ▒██░ ▒██░▒██░ ▒██░▒██░ ▒██░▒████
// ████░ ▒██░ ▒█░ ▒██░ ▒██░ ▒█░ ▒██░ ▒░▒███░ ▒██░ ▒██░ ▒░▒████░ ▒█░ ▒██░ ▒░▒████░ ▒░▒████░ ▒░▒██████
// ████░ ▒░▒░ ▒██░ ▒░ ▒███░ ▒█░ ▒██░ ▒███░ ▒██░ ▒██░ ▒████░ ▒███░ ▒████░ ▒████░ ▒██████
// ████░ ▒██░ ▒███░ ▒████░ ▒█░ ▒██░ ▒░▒███░ ▒██░ ▒░▒████░ ▒█░ ▒██░ ▒░▒████░ ▒░▒████░ ▒░▒██████
// ████░ ▒██░ ▒███░ ▒████░ ▒█░ ▒██░ ▒██░▒█░ ▒██░ ▒██░ ▒██████░ ▒█░ ▒██░ ▒██░▒██░ ▒██░▒██░ ▒████████
// █████░ ▒░ ▒███░ ▒░ ▒███░ ▒░ ▒███░ ▒░ ▒█░ ▒██░ ▒██░ ▒██████░ ▒█░ ▒██░ ▒░ ▒██░ ▒░ ▒██░ ▒████████
// ██████░ ▒███░ ▒██░ ▒█░ ▒███░ ▒█░ ▒██░ ▒█░ ▒████░ ▒██░ ▒█░ ▒█░ ▒███████
// █████████████████████████████████████████████████████████████████████████████████████████████████
// █████████████████████████████████████████████████████████████████████████████████████████████████
//
// HASHMARKS by 0xDEAFBEEF
// Oct 2023
//
// SPDX-License-Identifier: MIT
abstract contract DataContract {
function data() external virtual view returns (bytes memory);
}
pragma solidity ^0.8.0;
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
* @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);
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
* @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;
}
}
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
* @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;
}
}
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
/**
* @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 `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
/**
* @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`.
*
* 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 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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* 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 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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
* @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);
}
// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)
/**
* @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;
string internal _baseURI;
mapping(uint256 => string) internal _tokenURIs;
// 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: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
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;
}
// On-chain metadata per token can optionally be stored in _tokenURIs[]
// If it exists, use it. Otherwise use _baseURI concatenated with tokenId
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
if (bytes(_tokenURIs[tokenId]).length > 0) {
return _tokenURIs[tokenId];
}
return bytes(_baseURI).length > 0 ? string(abi.encodePacked(_baseURI, ToString.toString(tokenId))) : "";
}
/**
* @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 token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @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 _ownerOf(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) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
// Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
unchecked {
// Cannot overflow, as that would require more tokens to be burned/transferred
// out than the owner initially received through minting and transferring in.
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
/**
* @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 from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
// Check that tokenId was not transferred by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
unchecked {
// `_balances[from]` cannot overflow for the same reason as described in `_burn`:
// `from`'s balance is the number of token held, which is at least one before the current
// transfer.
// `_balances[to]` could overflow in the conditions described in `_mint`. That would require
// all 2**256 token ids to be minted, which in practice is impossible.
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @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 {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
* - When `from` is zero, the tokens will be minted for `to`.
* - When `to` is zero, ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
* - When `from` is zero, the tokens were minted for `to`.
* - When `to` is zero, ``from``'s tokens were burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
* being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
* that `ownerOf(tokenId)` is `a`.
*/
// solhint-disable-next-line func-name-mixedcase
function __unsafe_increaseBalance(address account, uint256 amount) internal {
_balances[account] += amount;
}
}
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
pragma solidity ^0.8.4;
library ToString {
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT license
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
bytes internal constant TABLE = "0123456789ABCDEF";
//returns hex byte value like 00 - ff
function toHex(uint256 val) internal pure returns (string memory) {
if (val==0) return "00";
bytes memory buf = new bytes(2);
buf[1] = TABLE[val & 0xf];
buf[0] = TABLE[val >> 4 & 0xf];
return string(buf);
}
}
library Base64 {
bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/// @notice Encodes some bytes to the base64 representation
function encode(bytes memory data) internal pure returns (string memory) {
// return string(data);
uint256 len = data.length;
if (len == 0) return "";
// multiply by 4/3 rounded up
uint256 encodedLen = 4 * ((len + 2) / 3);
// Add some extra buffer at the end
bytes memory result = new bytes(encodedLen + 32);
bytes memory table = TABLE;
assembly {
let tablePtr := add(table, 1)
let resultPtr := add(result, 32)
for {
let i := 0
} lt(i, len) {
} {
i := add(i, 3)
let input := and(mload(add(data, i)), 0xffffff)
let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
out := shl(8, out)
out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
out := shl(8, out)
out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
out := shl(8, out)
out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
out := shl(224, out)
mstore(resultPtr, out)
resultPtr := add(resultPtr, 4)
}
switch mod(len, 3)
case 1 {
mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
}
case 2 {
mstore(sub(resultPtr, 1), shl(248, 0x3d))
}
mstore(result, encodedLen)
}
return string(result);
}
}
contract Hashmarks is ERC721 {
bool isSealed;
address _owner;
// H^11(secret) to claim, H^10.. H^1 for refreshes
uint256 public constant max_hashes = 11;
uint256 public constant fade_period = (86400*365); // 1 year
/* image fades to this color; */
uint256 public constant grey_fade = 0xc0;
uint256 public constant reveal_window = (86400*2); //48 hr
/* safeguard allowlists for commit/reveal expire after 180 days,
after which any address can perform commit/reveals */
uint256 public constant safeguard_expire = 86400*180;
uint256 public deployed_ts;
uint256[100] fadeamounts;
uint256 numTokens;
struct TokenStruct {
bool claimed;
address claimer;
uint256 hindex; //index into hashchain[]
bytes32[100] hashchain;
DataContract[2] paths; //svg paths
uint256 last_refresh;
uint256 period;
bool immortal;
}
struct CommitStruct {
bytes32 hash;
uint256 ts;
}
event eRefresh(uint256 tid,uint256 hindex);
event eAscension(uint256 tid);
event eClaim(uint256 tid);
mapping(uint256 => TokenStruct) public tokens;
mapping(address => CommitStruct) public commits;
mapping(address => bool) public allow_commit; //safeguard allow list for address allowed to perform commits
mapping(bytes32 => bool) public allow_reveal; //safeguard allow list for (address,token_id) eligible to be revealed
//only performed by contract owner, before seal() is called
modifier onlyInit() {
require(msg.sender==_owner && isSealed == false);
_;
}
//only performed by contract owner
modifier onlyOwner() {
require(msg.sender==_owner);
_;
}
constructor() ERC721("HASHMARKS", "HASHMARKS") {
deployed_ts = block.timestamp;
_owner = msg.sender;
}
function owner() public view virtual returns (address) {
return _owner;
}
function totalSupply() public view returns (uint256) {
return numTokens;
}
function walletOfOwner(address a) public view returns (uint256[] memory) {
uint256 ownerTokenCount = balanceOf(a);
uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
uint256 currentTokenId = 0;
uint256 ownedTokenIndex = 0;
while (ownedTokenIndex < ownerTokenCount && currentTokenId < 100) {
if (_exists(currentTokenId)) {
address currentTokenOwner = ownerOf(currentTokenId);
if (currentTokenOwner == a) {
ownedTokenIds[ownedTokenIndex] = currentTokenId;
ownedTokenIndex++;
}
}
currentTokenId++;
}
return ownedTokenIds;
}
// Prevents any further admin updates to initHashes, initData, safeguard_addresses or safeguard_tokenids
function seal() public onlyOwner {
require(isSealed == false, "Already sealed.");
isSealed = true;
}
function initHashes(uint256[] memory tid, bytes32[] memory a) public onlyInit {
for (uint256 i = 0;i<tid.length;i++) {
tokens[tid[i]].hashchain[0] = a[i];
}
}
// Admin maintained safeguard list of addresses allowed to perform commits
// Safeguard expires automatically after 180 days
function safeguard_commit(address[] memory a, bool v) public onlyInit {
for (uint256 i = 0;i<a.length;i++)
allow_commit[a[i]] = v;
}
// Admin maintained safeguard list of (address,token id) pairs allowed to be revealed
// Safeguard expires automatically after 180 days
function safeguard_reveal(address[] memory a, uint256[] memory tid, bool v) public onlyInit {
for (uint256 i = 0;i<tid.length;i++)
allow_reveal[keccak256(abi.encodePacked(a[i],tid[i]))] = v;
}
// public read function for additional TokenStruct array fields
function tokenInfo(uint256 tid) public view returns(address[] memory paths, bytes32[] memory hashchain) {
address[] memory plist = new address[](2);
plist[0] = address(tokens[tid].paths[0]);
plist[1] = address(tokens[tid].paths[1]);
paths = plist;
bytes32[] memory rlist = new bytes32[](11);
for (uint256 k=0;k<11;k++) {
rlist[k]=tokens[tid].hashchain[k];
}
hashchain = rlist;
}
// (address,token id) pairs that can perform reveals
function is_allow_reveal(address a) public view returns (uint256[] memory) {
uint k=0;
for (uint256 tid=0;tid<100;tid++)
if (allow_reveal[keccak256(abi.encodePacked(a,tid))]) k++;
uint256[] memory rlist = new uint256[](k);
k=0;
for (uint256 tid=0;tid<100;tid++) {
if (allow_reveal[keccak256(abi.encodePacked(a,tid))]) {
rlist[k]=tid;
k++;
}
}
return rlist;
}
function iToHex(bytes memory buffer) public pure returns (string memory) {
// Fixed buffer size for hexadecimal convertion
bytes memory converted = new bytes(buffer.length * 2);
bytes memory _base = "0123456789abcdef";
for (uint256 i = 0; i < buffer.length; i++) {
converted[i * 2] = _base[uint8(buffer[i]) / _base.length];
converted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];
}
return string(abi.encodePacked("0x", converted));
}
//specify on-chain locations of encrypted SVG data for each token
function initData(uint256[] memory tid, uint256[] memory ind, address[] memory a) public onlyInit {
for (uint256 i = 0;i<tid.length;i++) {
tokens[tid[i]].paths[ind[i]] = DataContract(a[i]);
}
}
// claim is a commit-reveal to prevent front running
// What you should submit is a 32-byte hash calculated by the following:
// keccak256(token ID, address, H^11(secret), salt);
// - token ID is between 0 and 99, indicated on back of physical hashmark
// - address is the address you want the token minted to
// - H^11(secret) is the 11th hash of the 32 byte secret engraved on back of physical hashmark
// - salt is a password of your choice; will be used again during the reveal stage
function commit(bytes32 a) public {
/* safeguard: an expiring allowlist of addresses that can perform commits */
require(allow_commit[msg.sender] || block.timestamp > deployed_ts + safeguard_expire, "Safeguard: msg.sender not on temporary allow list");
commits[msg.sender].hash = a;
commits[msg.sender].ts = block.timestamp; //enforce 48hr between commit and reveal
}
function getCommit(address a) public view returns (bytes32 hash, uint256 ts) {
return (commits[a].hash, commits[a].ts);
}
function reveal(uint8 tid, bytes32 solution, string memory salt) public {
require(tid < 100,"token ID out of range");
require(!tokens[tid].claimed,"token ID already claimed");
/* safeguard: an expiring allowlist of (address,token id) pairs that are elligible to be claimed (tokens get enabled for claiming once
I verify the physical has arrived with its owner). Safeguard expires after 180 days, at which point any
remaining tokens are elligible for commit/reveal */
require(allow_reveal[keccak256(abi.encodePacked(msg.sender,uint256(tid)))] || block.timestamp > deployed_ts + safeguard_expire, "Safeguard: (address,tokenid) pair not on temporary allow list");
address i = msg.sender;
require(commits[i].ts > 0, "No commit has been made for this address");
require(block.timestamp - commits[i].ts > reveal_window, "need 48hr between commit and reveal");
bytes32 b = keccak256(abi.encodePacked(bytes1(tid), msg.sender, solution, salt));
require(b==commits[i].hash, "Commit hash doesn't match");
require(keccak256(abi.encodePacked(solution))==tokens[tid].hashchain[0],"Invalid solution");
tokens[tid].last_refresh = block.timestamp;
tokens[tid].period = fade_period; //one year
tokens[tid].claimed = true;
tokens[tid].hindex++;
tokens[tid].hashchain[tokens[tid].hindex] = solution;
// mint ERC721 token to msg.sender
_mint(msg.sender, tid);
tokens[tid].claimer = msg.sender;
numTokens++;
emit eClaim(tid);
}
// token must be "refreshed" using a series of one-time passwords.
// keccak256 hash chain of the secret key.
// no commit reveal scheme needed, as any front runner would only succeed in refreshing the token
function refresh(uint256 tid, bytes32 solution) public {
require(tid < 100, "tid out of range");
require(tokens[tid].claimed,"Token not yet claimed");
require(!tokens[tid].immortal,"maximum refreshes exceeded");
//can only refresh after elapsed time period.
require(block.timestamp > tokens[tid].last_refresh + tokens[tid].period, "Must wait till period expires to refresh");
require(keccak256(abi.encodePacked(solution)) == tokens[tid].hashchain[tokens[tid].hindex], "Incorrect hash");
tokens[tid].hindex++;
tokens[tid].last_refresh = block.timestamp;
tokens[tid].hashchain[tokens[tid].hindex] = solution;
emit eRefresh(tid,tokens[tid].hindex);
// After claim and 10 hashes, token ascends to immortality and will never fade.
//H^1(secret) is the final refresh hash. Engraved secret key remains unrevealed
if (tokens[tid].hindex>=max_hashes) {
tokens[tid].immortal = true;
emit eAscension(tid);
}
}
function fade_amount(uint256 tid) public view returns (uint256) {
if (fadeamounts[tid] > 0) return fadeamounts[tid];
//block at which token begins to fade
uint256 c = tokens[tid].last_refresh + tokens[tid].period;
uint256 am = 0; //amount to fade;
if (tokens[tid].immortal) {
//immortal, no fading
} else if (block.timestamp <= c || tokens[tid].claimed==false) {
//not at cutoff time, no fading
} else {
am = ((block.timestamp - c)*100) / tokens[tid].period;
if (am > 100 ) am = 100; //clamp to 100;
//square law
uint256 iam = (100-am);
am = 100 - ((iam*iam)/100);
}
return am;
}
function getSVG(uint256 tid) public view returns (string memory) {
require(tid < 100, "Token ID out of range");
// require(tokens[tid].claimed ==true, "Token must be claimed");
uint256 am = fade_amount(tid);
//linear interpolation between current fill and grey
uint256 fill = 255;
fill = fill * (100-am) + grey_fade * am;
fill /= 100;
string memory hexcol = ToString.toHex(fill);
string memory p1 = string(abi.encodePacked('<svg preserveAspectRatio="xMinYMin meet" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg"> <g stroke-width=".32"> <rect width="100%" height="100%" fill="#',hexcol,hexcol,hexcol,'" />'));
string memory p2 = '</g></svg>';
uint256 num_paths = 2;
uint256[2] memory path_fills = [uint256(85*2),85];
string memory res;
for (uint pi=0;pi<num_paths;pi++) {
//retrieve onchain encrypted data
bytes memory s = tokens[tid].paths[pi].data();
string memory svg_path;
//decrypt the data, using H(1)
bytes32 h = tokens[tid].hashchain[1];
if (h == 0x0) {
svg_path = string(s); }
else {
svg_path = decrypt(s,h);
}
fill = path_fills[pi];
//linear interpolation between current fill and grey
fill = fill * (100-am) + grey_fade * am;
fill /= 100;
hexcol = ToString.toHex(fill);
res = string(abi.encodePacked(res,"<path d=\"",svg_path,"\" style=\"fill:#",hexcol,hexcol,hexcol,";stroke-width:0.32\" />\n"));
// assemble path.
// The fill colors will dynamically change to fade to grey based on time from last refresh.
// if the physical with secret key is lost, the token will eventually fade.
// alternatively, if max refreshes have been made, the token becomes "immortal" and immune to fading.
}
res = string(abi.encodePacked(p1,res,p2));
return res;
}
// Decryption of keccak256 stream cipher
// assumes bytelength of message is multiple of 32
function decrypt(bytes memory s, bytes32 h) public pure returns (string memory) {
bytes32 m;
uint256 j = 0;
assembly {
j := s
}
for (uint i=0;i<s.length/32;i++) {
h = keccak256(abi.encodePacked(h,i));
assembly {
j := add(j,32)
m := mload(j)
mstore(j,xor(m,h))
}
}
return string(s);
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
_requireMinted(tokenId);
string memory svg = getSVG(tokenId);
// include metadata traits for immortal, refreshes, fade amount
uint256 refreshes = tokens[tokenId].hindex - 1;
uint256 fa = fade_amount(tokenId);
string memory attributes = string(abi.encodePacked(", \"attributes\": [ {\"trait_type\": \"Refreshes\", \"value\": \"",ToString.toString(refreshes),"\"}"));
if (tokens[tokenId].immortal) attributes = string(abi.encodePacked(attributes,", {\"trait_type\": \"Immortal\", \"value\": \"Immortal\"}"));
if (fa > 0) attributes = string(abi.encodePacked(attributes,", {\"trait_type\": \"Fade\", \"value\": \"",ToString.toString(fa),"\"}"));
attributes = string(abi.encodePacked(attributes,"]"));
string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "HASHMARKS #', ToString.toString(tokenId), '", "description": "HASHMARKS by 0xDEAFBEEF: 100 unique hand forged iron sculptures and cryptographically linked digital tokens."', attributes, ', "image": "data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '"}'))));
return string(abi.encodePacked('data:application/json;base64,', json));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tid","type":"uint256"}],"name":"eAscension","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tid","type":"uint256"}],"name":"eClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hindex","type":"uint256"}],"name":"eRefresh","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allow_commit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"allow_reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"a","type":"bytes32"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"commits","outputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint256","name":"ts","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"s","type":"bytes"},{"internalType":"bytes32","name":"h","type":"bytes32"}],"name":"decrypt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"deployed_ts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tid","type":"uint256"}],"name":"fade_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fade_period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"getCommit","outputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint256","name":"ts","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tid","type":"uint256"}],"name":"getSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"grey_fade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"buffer","type":"bytes"}],"name":"iToHex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tid","type":"uint256[]"},{"internalType":"uint256[]","name":"ind","type":"uint256[]"},{"internalType":"address[]","name":"a","type":"address[]"}],"name":"initData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tid","type":"uint256[]"},{"internalType":"bytes32[]","name":"a","type":"bytes32[]"}],"name":"initHashes","outputs":[],"stateMutability":"nonpayable","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":"a","type":"address"}],"name":"is_allow_reveal","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_hashes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tid","type":"uint256"},{"internalType":"bytes32","name":"solution","type":"bytes32"}],"name":"refresh","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"tid","type":"uint8"},{"internalType":"bytes32","name":"solution","type":"bytes32"},{"internalType":"string","name":"salt","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal_window","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"a","type":"address[]"},{"internalType":"bool","name":"v","type":"bool"}],"name":"safeguard_commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeguard_expire","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"a","type":"address[]"},{"internalType":"uint256[]","name":"tid","type":"uint256[]"},{"internalType":"bool","name":"v","type":"bool"}],"name":"safeguard_reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tid","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"address[]","name":"paths","type":"address[]"},{"internalType":"bytes32[]","name":"hashchain","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"address","name":"claimer","type":"address"},{"internalType":"uint256","name":"hindex","type":"uint256"},{"internalType":"uint256","name":"last_refresh","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"bool","name":"immortal","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600980825268484153484d41524b5360b81b602080840182815285518087019096529285528401528151919291620000569160009162000090565b5080516200006c90600190602084019062000090565b5050426009555060088054610100600160a81b031916336101000217905562000173565b8280546200009e9062000136565b90600052602060002090601f016020900481019282620000c257600085556200010d565b82601f10620000dd57805160ff19168380011785556200010d565b828001600101855582156200010d579182015b828111156200010d578251825591602001919060010190620000f0565b506200011b9291506200011f565b5090565b5b808211156200011b576000815560010162000120565b600181811c908216806200014b57607f821691505b602082108114156200016d57634e487b7160e01b600052602260045260246000fd5b50919050565b613b4980620001836000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80638da5cb5b11610146578063c87b56dd116100c3578063e985e9c511610087578063e985e9c5146105d9578063ee95821d14610615578063ef5b42e714610628578063f14fcbc81461063b578063f386ff711461064e578063fbcf855f1461065657600080fd5b8063c87b56dd1461056c578063c90e5ba51461057f578063cc33c87514610592578063df7e0856146105b3578063e053faed146105c657600080fd5b80639af51f6e1161010a5780639af51f6e1461050d578063a22cb46514610520578063afde435c14610533578063b88d4fde14610546578063be985ac91461055957600080fd5b80638da5cb5b146104ae5780638e23cb3f146104c457806392d7c52b146104d757806395d89b41146104fa5780639ae248941461050257600080fd5b8063438b6300116101d45780636ee6005b116101985780636ee6005b1461041c57806370a08231146104265780637b43a8e61461043957806381e679f6146104755780638696b8871461047d57600080fd5b8063438b63001461032c5780634f64b2be1461034c578063547b87d0146103d35780636352211e146103f6578063671ff7861461040957600080fd5b8063095ea7b31161021b578063095ea7b3146102e157806318160ddd146102f657806323b872dd146102fe5780633fb27b851461031157806342842e0e1461031957600080fd5b806301ffc9a7146102585780630450e10014610280578063053affac1461029857806306fdde03146102a1578063081812fc146102b6575b600080fd5b61026b610266366004612f53565b610669565b60405190151581526020015b60405180910390f35b61028a6202a30081565b604051908152602001610277565b61028a60095481565b6102a96106bb565b60405161027791906137fc565b6102c96102c4366004612f3a565b61074d565b6040516001600160a01b039091168152602001610277565b6102f46102ef366004612d11565b610774565b005b606e5461028a565b6102f461030c366004612c44565b61088f565b6102f46108c0565b6102f4610327366004612c44565b610930565b61033f61033a366004612bf6565b61094b565b60405161027791906137b8565b61039a61035a366004612f3a565b606f6020526000908152604090208054600182015460688301546069840154606a9094015460ff808516956101009095046001600160a01b031694911686565b6040805196151587526001600160a01b0390951660208701529385019290925260608401526080830152151560a082015260c001610277565b61026b6103e1366004612bf6565b60716020526000908152604090205460ff1681565b6102c9610404366004612f3a565b610a46565b6102a9610417366004612f8d565b610aa6565b61028a62ed4e0081565b61028a610434366004612bf6565b610c69565b610460610447366004612bf6565b6070602052600090815260409020805460019091015482565b60408051928352602083019190915201610277565b61028a600b81565b61046061048b366004612bf6565b6001600160a01b0316600090815260706020526040902080546001909101549091565b60085461010090046001600160a01b03166102c9565b6102f46104d2366004612d3b565b610cef565b61026b6104e5366004612f3a565b60726020526000908152604090205460ff1681565b6102a9610dbc565b61028a6301e1338081565b6102f461051b36600461309d565b610dcb565b6102f461052e366004612ce7565b611244565b6102f461054136600461307b565b611253565b6102f4610554366004612c80565b61156b565b6102a9610567366004612f3a565b61159d565b6102a961057a366004612f3a565b611852565b6102a961058d366004613037565b6119c3565b6105a56105a0366004612f3a565b611a37565b604051610277929190613741565b61033f6105c1366004612bf6565b611b7c565b6102f46105d4366004612eb3565b611cd2565b61026b6105e7366004612c11565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102f4610623366004612dae565b611dad565b6102f4610636366004612df2565b611e3f565b6102f4610649366004612f3a565b611ee5565b61028a60c081565b61028a610664366004612f3a565b611f93565b60006001600160e01b031982166380ac58cd60e01b148061069a57506001600160e01b03198216635b5e139f60e01b145b806106b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546106ca906139fb565b80601f01602080910402602001604051908101604052809291908181526020018280546106f6906139fb565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b5050505050905090565b6000610758826120b5565b506000908152600660205260409020546001600160a01b031690565b600061077f82610a46565b9050806001600160a01b0316836001600160a01b031614156107f25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061080e575061080e81336105e7565b6108805760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016107e9565b61088a8383612117565b505050565b6108993382612185565b6108b55760405162461bcd60e51b81526004016107e99061380f565b61088a838383612204565b60085461010090046001600160a01b031633146108dc57600080fd5b60085460ff16156109215760405162461bcd60e51b815260206004820152600f60248201526e20b63932b0b23c9039b2b0b632b21760891b60448201526064016107e9565b6008805460ff19166001179055565b61088a8383836040518060200160405280600081525061156b565b6060600061095883610c69565b90506000816001600160401b0381111561097457610974613aa7565b60405190808252806020026020018201604052801561099d578160200160208202803683370190505b5090506000805b83811080156109b35750606482105b15610a3c576000828152600460205260409020546001600160a01b031615610a2a5760006109e083610a46565b9050866001600160a01b0316816001600160a01b03161415610a285782848381518110610a0f57610a0f613a91565b602090810291909101015281610a2481613a36565b9250505b505b81610a3481613a36565b9250506109a4565b5090949350505050565b6000818152600460205260408120546001600160a01b0316806106b55760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107e9565b6060600082516002610ab89190613999565b6001600160401b03811115610acf57610acf613aa7565b6040519080825280601f01601f191660200182016040528015610af9576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b8451811015610c3f57818251868381518110610b4557610b45613a91565b0160200151610b57919060f81c613985565b81518110610b6757610b67613a91565b01602001516001600160f81b03191683610b82836002613999565b81518110610b9257610b92613a91565b60200101906001600160f81b031916908160001a905350818251868381518110610bbe57610bbe613a91565b0160200151610bd0919060f81c613a51565b81518110610be057610be0613a91565b01602001516001600160f81b03191683610bfb836002613999565b610c0690600161396d565b81518110610c1657610c16613a91565b60200101906001600160f81b031916908160001a90535080610c3781613a36565b915050610b27565b5081604051602001610c5191906134d5565b60405160208183030381529060405292505050919050565b60006001600160a01b038216610cd35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016107e9565b506001600160a01b031660009081526005602052604090205490565b60085461010090046001600160a01b031633148015610d11575060085460ff16155b610d1a57600080fd5b60005b8251811015610db6578160726000868481518110610d3d57610d3d613a91565b6020026020010151868581518110610d5757610d57613a91565b6020026020010151604051602001610d70929190613131565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905580610dae81613a36565b915050610d1d565b50505050565b6060600180546106ca906139fb565b60648360ff1610610e165760405162461bcd60e51b8152602060048201526015602482015274746f6b656e204944206f7574206f662072616e676560581b60448201526064016107e9565b60ff8084166000908152606f60205260409020541615610e785760405162461bcd60e51b815260206004820152601860248201527f746f6b656e20494420616c726561647920636c61696d6564000000000000000060448201526064016107e9565b60726000338560ff16604051602001610e92929190613131565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1680610ed5575062ed4e00600954610ed2919061396d565b42115b610f475760405162461bcd60e51b815260206004820152603d60248201527f5361666567756172643a2028616464726573732c746f6b656e6964292070616960448201527f72206e6f74206f6e2074656d706f7261727920616c6c6f77206c69737400000060648201526084016107e9565b33600081815260706020526040902060010154610fb75760405162461bcd60e51b815260206004820152602860248201527f4e6f20636f6d6d697420686173206265656e206d61646520666f722074686973604482015267206164647265737360c01b60648201526084016107e9565b6001600160a01b0381166000908152607060205260409020600101546202a30090610fe290426139b8565b1161103b5760405162461bcd60e51b815260206004820152602360248201527f6e6565642034386872206265747765656e20636f6d6d697420616e642072657660448201526219585b60ea1b60648201526084016107e9565b60008460f81b3385856040516020016110579493929190613153565b60408051601f1981840301815291815281516020928301206001600160a01b0385166000908152607090935291205490915081146110d75760405162461bcd60e51b815260206004820152601960248201527f436f6d6d6974206861736820646f65736e2774206d617463680000000000000060448201526064016107e9565b60ff85166000908152606f60205260408120600201015460408051602081018790520160405160208183030381529060405280519060200120146111505760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21039b7b63aba34b7b760811b60448201526064016107e9565b60ff85166000908152606f602052604081204260688201556301e133806069820155805460ff1916600190811782550180549161118c83613a36565b909155505060ff85166000908152606f602052604090206001810154859160020190606481106111be576111be613a91565b01556111cd3360ff8716612368565b60ff85166000908152606f602052604081208054610100600160a81b0319163361010002179055606e80549161120283613a36565b909155505060405160ff861681527fca7dabad069fb827f92fe8b4b03d5952fe36cca0793ec55d57ad5534502be9ab9060200160405180910390a15050505050565b61124f3383836124f3565b5050565b606482106112965760405162461bcd60e51b815260206004820152601060248201526f746964206f7574206f662072616e676560801b60448201526064016107e9565b6000828152606f602052604090205460ff166112ec5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081e595d0818db185a5b5959605a1b60448201526064016107e9565b6000828152606f60205260409020606a015460ff161561134e5760405162461bcd60e51b815260206004820152601a60248201527f6d6178696d756d2072656672657368657320657863656564656400000000000060448201526064016107e9565b6000828152606f602052604090206069810154606890910154611371919061396d565b42116113d05760405162461bcd60e51b815260206004820152602860248201527f4d75737420776169742074696c6c20706572696f64206578706972657320746f604482015267040e4cacce4cae6d60c31b60648201526084016107e9565b6000828152606f602052604090206001810154600290910190606481106113f9576113f9613a91565b0154604080516020810184905201604051602081830303815290604052805190602001201461145b5760405162461bcd60e51b815260206004820152600e60248201526d092dcc6dee4e4cac6e840d0c2e6d60931b60448201526064016107e9565b6000828152606f6020526040812060010180549161147883613a36565b90915550506000828152606f602052604090204260688201556001810154829160020190606481106114ac576114ac613a91565b01556000828152606f6020908152604091829020600101548251858152918201527fb12fff57dc63f5e10acb127d82321dedd2cd7cb6eb9add789dcf32fc1a2317a3910160405180910390a16000828152606f6020526040902060010154600b1161124f576000828152606f602052604090819020606a01805460ff19166001179055517fb87a29b1ae4534ad46ae76a7818de1a83135bd2f7791a5cd6d5cc77d1d5f743e9061155f9084815260200190565b60405180910390a15050565b6115753383612185565b6115915760405162461bcd60e51b81526004016107e99061380f565b610db6848484846125c2565b6060606482106115e75760405162461bcd60e51b8152602060048201526015602482015274546f6b656e204944206f7574206f662072616e676560581b60448201526064016107e9565b60006115f283611f93565b905060ff6116018260c0613999565b61160c8360646139b8565b6116169083613999565b611620919061396d565b905061162d606482613985565b9050600061163a826125f5565b90506000818283604051602001611653939291906133a3565b60408051601f198184030181528282018252600a8352691e17b39f1e17b9bb339f60b11b602084810191909152825180840190935260aa83526055908301529250600290606060005b8381101561181e5760008b8152606f6020526040812060660182600281106116c6576116c6613a91565b0160009054906101000a90046001600160a01b03166001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040160006040518083038186803b15801561171357600080fd5b505afa158015611727573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261174f9190810190612fc1565b60008d8152606f60205260409020600301549091506060908061177457829150611781565b61177e83826119c3565b91505b85846002811061179357611793613a91565b60200201519a506117a58c60c0613999565b6117b08d60646139b8565b6117ba908d613999565b6117c4919061396d565b9a506117d160648c613985565b9a506117dc8b6125f5565b995084828b8c8d6040516020016117f79594939291906131e2565b6040516020818303038152906040529450505050808061181690613a36565b91505061169c565b508481856040516020016118349392919061319f565b60408051601f198184030181529190529a9950505050505050505050565b606061185d826120b5565b60006118688361159d565b6000848152606f60205260408120600190810154929350909161188b91906139b8565b9050600061189885611f93565b905060006118a583612729565b6040516020016118b591906134ff565b60408051601f198184030181529181526000888152606f60205220606a015490915060ff161561190257806040516020016118f09190613348565b60405160208183030381529060405290505b8115611935578061191283612729565b6040516020016119239291906132d4565b60405160208183030381529060405290505b8060405160200161194691906132af565b6040516020818303038152906040529050600061199561196588612729565b8361196f88612826565b604051602001611981939291906135bb565b604051602081830303815290604052612826565b9050806040516020016119a89190613576565b60405160208183030381529060405295505050505050919050565b6060600083815b602086516119d89190613985565b811015611a2d5760408051602081018790529081018290526060016040516020818303038152906040528051906020012094506020820191508151925084831882528080611a2590613a36565b9150506119ca565b5093949350505050565b604080516002808252606082810190935282916000918160200160208202803683375050506000858152606f602052604081206066015482519293506001600160a01b031691839190611a8c57611a8c613a91565b6001600160a01b039283166020918202929092018101919091526000868152606f9091526040902060670154825191169082906001908110611ad057611ad0613a91565b6001600160a01b039290921660209283029190910182015260408051600b8082526101808201909252929450849260009290919082016101608036833701905050905060005b600b811015611b72576000868152606f602052604090206002018160648110611b4157611b41613a91565b0154828281518110611b5557611b55613a91565b602090810291909101015280611b6a81613a36565b915050611b16565b5092949293505050565b60606000805b6064811015611bf057607260008583604051602001611ba2929190613131565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615611bde5781611bda81613a36565b9250505b80611be881613a36565b915050611b82565b506000816001600160401b03811115611c0b57611c0b613aa7565b604051908082528060200260200182016040528015611c34578160200160208202803683370190505b5090506000915060005b6064811015611cca57607260008683604051602001611c5e929190613131565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615611cb85780828481518110611c9f57611c9f613a91565b602090810291909101015282611cb481613a36565b9350505b80611cc281613a36565b915050611c3e565b509392505050565b60085461010090046001600160a01b031633148015611cf4575060085460ff16155b611cfd57600080fd5b60005b8351811015610db657818181518110611d1b57611d1b613a91565b6020026020010151606f6000868481518110611d3957611d39613a91565b60200260200101518152602001908152602001600020606601848381518110611d6457611d64613a91565b602002602001015160028110611d7c57611d7c613a91565b0180546001600160a01b0319166001600160a01b039290921691909117905580611da581613a36565b915050611d00565b60085461010090046001600160a01b031633148015611dcf575060085460ff16155b611dd857600080fd5b60005b825181101561088a578160716000858481518110611dfb57611dfb613a91565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611e3781613a36565b915050611ddb565b60085461010090046001600160a01b031633148015611e61575060085460ff16155b611e6a57600080fd5b60005b825181101561088a57818181518110611e8857611e88613a91565b6020026020010151606f6000858481518110611ea657611ea6613a91565b60200260200101518152602001908152602001600020600201600060648110611ed157611ed1613a91565b015580611edd81613a36565b915050611e6d565b3360009081526071602052604090205460ff1680611f12575062ed4e00600954611f0f919061396d565b42115b611f785760405162461bcd60e51b815260206004820152603160248201527f5361666567756172643a206d73672e73656e646572206e6f74206f6e2074656d6044820152701c1bdc985c9e48185b1b1bddc81b1a5cdd607a1b60648201526084016107e9565b33600090815260706020526040902090815542600190910155565b600080600a8360648110611fa957611fa9613a91565b01541115611fcc57600a8260648110611fc457611fc4613a91565b015492915050565b6000828152606f602052604081206069810154606890910154611fef919061396d565b6000848152606f60205260408120606a01549192509060ff1615612012576120ae565b814211158061203057506000848152606f602052604090205460ff16155b1561203a576120ae565b6000848152606f602052604090206069015461205683426139b8565b612061906064613999565b61206b9190613985565b9050606481111561207a575060645b60006120878260646139b8565b905060646120958280613999565b61209f9190613985565b6120aa9060646139b8565b9150505b9392505050565b6000818152600460205260409020546001600160a01b03166121145760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107e9565b50565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061214c82610a46565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061219183610a46565b9050806001600160a01b0316846001600160a01b031614806121d857506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b806121fc5750836001600160a01b03166121f18461074d565b6001600160a01b0316145b949350505050565b826001600160a01b031661221782610a46565b6001600160a01b03161461223d5760405162461bcd60e51b81526004016107e9906138ae565b6001600160a01b03821661229f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107e9565b826001600160a01b03166122b282610a46565b6001600160a01b0316146122d85760405162461bcd60e51b81526004016107e9906138ae565b600081815260066020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260058552838620805460001901905590871680865283862080546001019055868652600490945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166123be5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e9565b6000818152600460205260409020546001600160a01b0316156124235760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e9565b6000818152600460205260409020546001600160a01b0316156124885760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e9565b6001600160a01b038216600081815260056020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031614156125555760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107e9565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125cd848484612204565b6125d98484848461298b565b610db65760405162461bcd60e51b81526004016107e99061385c565b60608161261a575050604080518082019091526002815261030360f41b602082015290565b6040805160028082528183019092526000916020820181803683370190505090506040518060400160405280601081526020016f181899199a1a9b1b9c1ca0a121a222a360811b81525083600f168151811061267857612678613a91565b602001015160f81c60f81b8160018151811061269657612696613a91565b60200101906001600160f81b031916908160001a9053506040518060400160405280601081526020016f181899199a1a9b1b9c1ca0a121a222a360811b815250600484901c600f16815181106126ee576126ee613a91565b602001015160f81c60f81b8160008151811061270c5761270c613a91565b60200101906001600160f81b031916908160001a90535092915050565b60608161274d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612777578061276181613a36565b91506127709050600a83613985565b9150612751565b6000816001600160401b0381111561279157612791613aa7565b6040519080825280601f01601f1916602001820160405280156127bb576020820181803683370190505b5090505b84156121fc576127d06001836139b8565b91506127dd600a86613a51565b6127e890603061396d565b60f81b8183815181106127fd576127fd613a91565b60200101906001600160f81b031916908160001a90535061281f600a86613985565b94506127bf565b805160609080612846575050604080516020810190915260008152919050565b6000600361285583600261396d565b61285f9190613985565b61286a906004613999565b9050600061287982602061396d565b6001600160401b0381111561289057612890613aa7565b6040519080825280601f01601f1916602001820160405280156128ba576020820181803683370190505b5090506000604051806060016040528060408152602001613ad4604091399050600181016020830160005b86811015612946576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016128e5565b50600386066001811461296057600281146129715761297d565b613d3d60f01b60011983015261297d565b603d60f81b6000198301525b505050918152949350505050565b60006001600160a01b0384163b15612a8d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129cf903390899088908890600401613704565b602060405180830381600087803b1580156129e957600080fd5b505af1925050508015612a19575060408051601f3d908101601f19168201909252612a1691810190612f70565b60015b612a73573d808015612a47576040519150601f19603f3d011682016040523d82523d6000602084013e612a4c565b606091505b508051612a6b5760405162461bcd60e51b81526004016107e99061385c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121fc565b506001949350505050565b6000612aab612aa684613946565b6138f3565b9050828152838383011115612abf57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612aed57600080fd5b919050565b600082601f830112612b0357600080fd5b81356020612b13612aa683613923565b80838252828201915082860187848660051b8901011115612b3357600080fd5b60005b85811015612b5957612b4782612ad6565b84529284019290840190600101612b36565b5090979650505050505050565b600082601f830112612b7757600080fd5b81356020612b87612aa683613923565b80838252828201915082860187848660051b8901011115612ba757600080fd5b60005b85811015612b5957813584529284019290840190600101612baa565b80358015158114612aed57600080fd5b600082601f830112612be757600080fd5b6120ae83833560208501612a98565b600060208284031215612c0857600080fd5b6120ae82612ad6565b60008060408385031215612c2457600080fd5b612c2d83612ad6565b9150612c3b60208401612ad6565b90509250929050565b600080600060608486031215612c5957600080fd5b612c6284612ad6565b9250612c7060208501612ad6565b9150604084013590509250925092565b60008060008060808587031215612c9657600080fd5b612c9f85612ad6565b9350612cad60208601612ad6565b92506040850135915060608501356001600160401b03811115612ccf57600080fd5b612cdb87828801612bd6565b91505092959194509250565b60008060408385031215612cfa57600080fd5b612d0383612ad6565b9150612c3b60208401612bc6565b60008060408385031215612d2457600080fd5b612d2d83612ad6565b946020939093013593505050565b600080600060608486031215612d5057600080fd5b83356001600160401b0380821115612d6757600080fd5b612d7387838801612af2565b94506020860135915080821115612d8957600080fd5b50612d9686828701612b66565b925050612da560408501612bc6565b90509250925092565b60008060408385031215612dc157600080fd5b82356001600160401b03811115612dd757600080fd5b612de385828601612af2565b925050612c3b60208401612bc6565b60008060408385031215612e0557600080fd5b82356001600160401b0380821115612e1c57600080fd5b612e2886838701612b66565b9350602091508185013581811115612e3f57600080fd5b85019050601f81018613612e5257600080fd5b8035612e60612aa682613923565b80828252848201915084840189868560051b8701011115612e8057600080fd5b600094505b83851015612ea3578035835260019490940193918501918501612e85565b5080955050505050509250929050565b600080600060608486031215612ec857600080fd5b83356001600160401b0380821115612edf57600080fd5b612eeb87838801612b66565b94506020860135915080821115612f0157600080fd5b612f0d87838801612b66565b93506040860135915080821115612f2357600080fd5b50612f3086828701612af2565b9150509250925092565b600060208284031215612f4c57600080fd5b5035919050565b600060208284031215612f6557600080fd5b81356120ae81613abd565b600060208284031215612f8257600080fd5b81516120ae81613abd565b600060208284031215612f9f57600080fd5b81356001600160401b03811115612fb557600080fd5b6121fc84828501612bd6565b600060208284031215612fd357600080fd5b81516001600160401b03811115612fe957600080fd5b8201601f81018413612ffa57600080fd5b8051613008612aa682613946565b81815285602083850101111561301d57600080fd5b61302e8260208301602086016139cf565b95945050505050565b6000806040838503121561304a57600080fd5b82356001600160401b0381111561306057600080fd5b61306c85828601612bd6565b95602094909401359450505050565b6000806040838503121561308e57600080fd5b50508035926020909101359150565b6000806000606084860312156130b257600080fd5b833560ff811681146130c357600080fd5b92506020840135915060408401356001600160401b038111156130e557600080fd5b8401601f810186136130f657600080fd5b612f3086823560208401612a98565b6000815180845261311d8160208601602086016139cf565b601f01601f19169290920160200192915050565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b60ff60f81b851681526bffffffffffffffffffffffff198460601b1660018201528260158201526000825161318f8160358501602087016139cf565b9190910160350195945050505050565b600084516131b18184602089016139cf565b8451908301906131c58183602089016139cf565b84519101906131d88183602088016139cf565b0195945050505050565b600086516131f4818460208b016139cf565b681e3830ba3410321e9160b91b908301908152865161321a816009840160208b016139cf565b6e22207374796c653d2266696c6c3a2360881b60099290910191820152855161324a816018840160208a016139cf565b85519101906132608160188401602089016139cf565b84519101906132768160188401602088016139cf565b7f3b7374726f6b652d77696474683a302e333222202f3e0a00000000000000000060189290910191820152602f01979650505050505050565b600082516132c18184602087016139cf565b605d60f81b920191825250600101919050565b600083516132e68184602088016139cf565b80830190507f2c207b2274726169745f74797065223a202246616465222c202276616c7565228152621d101160e91b6020820152835161332d8160238401602088016139cf565b61227d60f01b60239290910191820152602501949350505050565b6000825161335a8184602087016139cf565b7f2c207b2274726169745f74797065223a2022496d6d6f7274616c222c20227661920191825250706c7565223a2022496d6d6f7274616c227d60781b6020820152603101919050565b7f3c737667207072657365727665417370656374526174696f3d22784d696e594d81527f696e206d656574222076657273696f6e3d22312e31222076696577426f783d2260208201527f3020302039362039362220786d6c6e733d22687474703a2f2f7777772e77332e60408201527f6f72672f323030302f737667223e203c67207374726f6b652d77696474683d2260608201527f2e3332223e203c726563742077696474683d223130302522206865696768743d60808201526d2231303025222066696c6c3d222360901b60a08201526000845161348a8160ae8501602089016139cf565b8451908301906134a18160ae8401602089016139cf565b84519101906134b78160ae8401602088016139cf565b631110179f60e11b60ae929091019182015260b20195945050505050565b61060f60f31b8152600082516134f28160028501602087016139cf565b9190910160020192915050565b7f2c202261747472696275746573223a205b207b2274726169745f74797065223a81527f2022526566726573686573222c202276616c7565223a2022000000000000000060208201526000825161355d8160388501602087016139cf565b61227d60f01b6038939091019283015250603a01919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516135ae81601d8501602087016139cf565b91909101601d0192915050565b747b226e616d65223a2022484153484d41524b53202360581b815283516000906135ec8160158501602089016139cf565b7f222c20226465736372697074696f6e223a2022484153484d41524b53206279206015918401918201527f307844454146424545463a2031303020756e697175652068616e6420666f726760358201527f65642069726f6e207363756c70747572657320616e642063727970746f67726160558201527f70686963616c6c79206c696e6b6564206469676974616c20746f6b656e732e226075820152845161369b8160958401602089016139cf565b7f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626095929091019182015265185cd94d8d0b60d21b60b582015283516136e88160bb8401602088016139cf565b61227d60f01b60bb929091019182015260bd0195945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061373790830184613105565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b828110156137835781516001600160a01b03168452928401929084019060010161375e565b5050508381038285015284518082528583019183019060005b81811015612b595783518352928401929184019160010161379c565b6020808252825182820181905260009190848201906040850190845b818110156137f0578351835292840192918401916001016137d4565b50909695505050505050565b6020815260006120ae6020830184613105565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b604051601f8201601f191681016001600160401b038111828210171561391b5761391b613aa7565b604052919050565b60006001600160401b0382111561393c5761393c613aa7565b5060051b60200190565b60006001600160401b0382111561395f5761395f613aa7565b50601f01601f191660200190565b6000821982111561398057613980613a65565b500190565b60008261399457613994613a7b565b500490565b60008160001904831182151516156139b3576139b3613a65565b500290565b6000828210156139ca576139ca613a65565b500390565b60005b838110156139ea5781810151838201526020016139d2565b83811115610db65750506000910152565b600181811c90821680613a0f57607f821691505b60208210811415613a3057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a4a57613a4a613a65565b5060010190565b600082613a6057613a60613a7b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461211457600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122098574c711238e555fa5bfa7584f0fb09110aad33941bae2bd814d44041c3ac3664736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c80638da5cb5b11610146578063c87b56dd116100c3578063e985e9c511610087578063e985e9c5146105d9578063ee95821d14610615578063ef5b42e714610628578063f14fcbc81461063b578063f386ff711461064e578063fbcf855f1461065657600080fd5b8063c87b56dd1461056c578063c90e5ba51461057f578063cc33c87514610592578063df7e0856146105b3578063e053faed146105c657600080fd5b80639af51f6e1161010a5780639af51f6e1461050d578063a22cb46514610520578063afde435c14610533578063b88d4fde14610546578063be985ac91461055957600080fd5b80638da5cb5b146104ae5780638e23cb3f146104c457806392d7c52b146104d757806395d89b41146104fa5780639ae248941461050257600080fd5b8063438b6300116101d45780636ee6005b116101985780636ee6005b1461041c57806370a08231146104265780637b43a8e61461043957806381e679f6146104755780638696b8871461047d57600080fd5b8063438b63001461032c5780634f64b2be1461034c578063547b87d0146103d35780636352211e146103f6578063671ff7861461040957600080fd5b8063095ea7b31161021b578063095ea7b3146102e157806318160ddd146102f657806323b872dd146102fe5780633fb27b851461031157806342842e0e1461031957600080fd5b806301ffc9a7146102585780630450e10014610280578063053affac1461029857806306fdde03146102a1578063081812fc146102b6575b600080fd5b61026b610266366004612f53565b610669565b60405190151581526020015b60405180910390f35b61028a6202a30081565b604051908152602001610277565b61028a60095481565b6102a96106bb565b60405161027791906137fc565b6102c96102c4366004612f3a565b61074d565b6040516001600160a01b039091168152602001610277565b6102f46102ef366004612d11565b610774565b005b606e5461028a565b6102f461030c366004612c44565b61088f565b6102f46108c0565b6102f4610327366004612c44565b610930565b61033f61033a366004612bf6565b61094b565b60405161027791906137b8565b61039a61035a366004612f3a565b606f6020526000908152604090208054600182015460688301546069840154606a9094015460ff808516956101009095046001600160a01b031694911686565b6040805196151587526001600160a01b0390951660208701529385019290925260608401526080830152151560a082015260c001610277565b61026b6103e1366004612bf6565b60716020526000908152604090205460ff1681565b6102c9610404366004612f3a565b610a46565b6102a9610417366004612f8d565b610aa6565b61028a62ed4e0081565b61028a610434366004612bf6565b610c69565b610460610447366004612bf6565b6070602052600090815260409020805460019091015482565b60408051928352602083019190915201610277565b61028a600b81565b61046061048b366004612bf6565b6001600160a01b0316600090815260706020526040902080546001909101549091565b60085461010090046001600160a01b03166102c9565b6102f46104d2366004612d3b565b610cef565b61026b6104e5366004612f3a565b60726020526000908152604090205460ff1681565b6102a9610dbc565b61028a6301e1338081565b6102f461051b36600461309d565b610dcb565b6102f461052e366004612ce7565b611244565b6102f461054136600461307b565b611253565b6102f4610554366004612c80565b61156b565b6102a9610567366004612f3a565b61159d565b6102a961057a366004612f3a565b611852565b6102a961058d366004613037565b6119c3565b6105a56105a0366004612f3a565b611a37565b604051610277929190613741565b61033f6105c1366004612bf6565b611b7c565b6102f46105d4366004612eb3565b611cd2565b61026b6105e7366004612c11565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102f4610623366004612dae565b611dad565b6102f4610636366004612df2565b611e3f565b6102f4610649366004612f3a565b611ee5565b61028a60c081565b61028a610664366004612f3a565b611f93565b60006001600160e01b031982166380ac58cd60e01b148061069a57506001600160e01b03198216635b5e139f60e01b145b806106b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546106ca906139fb565b80601f01602080910402602001604051908101604052809291908181526020018280546106f6906139fb565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b5050505050905090565b6000610758826120b5565b506000908152600660205260409020546001600160a01b031690565b600061077f82610a46565b9050806001600160a01b0316836001600160a01b031614156107f25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061080e575061080e81336105e7565b6108805760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016107e9565b61088a8383612117565b505050565b6108993382612185565b6108b55760405162461bcd60e51b81526004016107e99061380f565b61088a838383612204565b60085461010090046001600160a01b031633146108dc57600080fd5b60085460ff16156109215760405162461bcd60e51b815260206004820152600f60248201526e20b63932b0b23c9039b2b0b632b21760891b60448201526064016107e9565b6008805460ff19166001179055565b61088a8383836040518060200160405280600081525061156b565b6060600061095883610c69565b90506000816001600160401b0381111561097457610974613aa7565b60405190808252806020026020018201604052801561099d578160200160208202803683370190505b5090506000805b83811080156109b35750606482105b15610a3c576000828152600460205260409020546001600160a01b031615610a2a5760006109e083610a46565b9050866001600160a01b0316816001600160a01b03161415610a285782848381518110610a0f57610a0f613a91565b602090810291909101015281610a2481613a36565b9250505b505b81610a3481613a36565b9250506109a4565b5090949350505050565b6000818152600460205260408120546001600160a01b0316806106b55760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107e9565b6060600082516002610ab89190613999565b6001600160401b03811115610acf57610acf613aa7565b6040519080825280601f01601f191660200182016040528015610af9576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b8451811015610c3f57818251868381518110610b4557610b45613a91565b0160200151610b57919060f81c613985565b81518110610b6757610b67613a91565b01602001516001600160f81b03191683610b82836002613999565b81518110610b9257610b92613a91565b60200101906001600160f81b031916908160001a905350818251868381518110610bbe57610bbe613a91565b0160200151610bd0919060f81c613a51565b81518110610be057610be0613a91565b01602001516001600160f81b03191683610bfb836002613999565b610c0690600161396d565b81518110610c1657610c16613a91565b60200101906001600160f81b031916908160001a90535080610c3781613a36565b915050610b27565b5081604051602001610c5191906134d5565b60405160208183030381529060405292505050919050565b60006001600160a01b038216610cd35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016107e9565b506001600160a01b031660009081526005602052604090205490565b60085461010090046001600160a01b031633148015610d11575060085460ff16155b610d1a57600080fd5b60005b8251811015610db6578160726000868481518110610d3d57610d3d613a91565b6020026020010151868581518110610d5757610d57613a91565b6020026020010151604051602001610d70929190613131565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905580610dae81613a36565b915050610d1d565b50505050565b6060600180546106ca906139fb565b60648360ff1610610e165760405162461bcd60e51b8152602060048201526015602482015274746f6b656e204944206f7574206f662072616e676560581b60448201526064016107e9565b60ff8084166000908152606f60205260409020541615610e785760405162461bcd60e51b815260206004820152601860248201527f746f6b656e20494420616c726561647920636c61696d6564000000000000000060448201526064016107e9565b60726000338560ff16604051602001610e92929190613131565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1680610ed5575062ed4e00600954610ed2919061396d565b42115b610f475760405162461bcd60e51b815260206004820152603d60248201527f5361666567756172643a2028616464726573732c746f6b656e6964292070616960448201527f72206e6f74206f6e2074656d706f7261727920616c6c6f77206c69737400000060648201526084016107e9565b33600081815260706020526040902060010154610fb75760405162461bcd60e51b815260206004820152602860248201527f4e6f20636f6d6d697420686173206265656e206d61646520666f722074686973604482015267206164647265737360c01b60648201526084016107e9565b6001600160a01b0381166000908152607060205260409020600101546202a30090610fe290426139b8565b1161103b5760405162461bcd60e51b815260206004820152602360248201527f6e6565642034386872206265747765656e20636f6d6d697420616e642072657660448201526219585b60ea1b60648201526084016107e9565b60008460f81b3385856040516020016110579493929190613153565b60408051601f1981840301815291815281516020928301206001600160a01b0385166000908152607090935291205490915081146110d75760405162461bcd60e51b815260206004820152601960248201527f436f6d6d6974206861736820646f65736e2774206d617463680000000000000060448201526064016107e9565b60ff85166000908152606f60205260408120600201015460408051602081018790520160405160208183030381529060405280519060200120146111505760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21039b7b63aba34b7b760811b60448201526064016107e9565b60ff85166000908152606f602052604081204260688201556301e133806069820155805460ff1916600190811782550180549161118c83613a36565b909155505060ff85166000908152606f602052604090206001810154859160020190606481106111be576111be613a91565b01556111cd3360ff8716612368565b60ff85166000908152606f602052604081208054610100600160a81b0319163361010002179055606e80549161120283613a36565b909155505060405160ff861681527fca7dabad069fb827f92fe8b4b03d5952fe36cca0793ec55d57ad5534502be9ab9060200160405180910390a15050505050565b61124f3383836124f3565b5050565b606482106112965760405162461bcd60e51b815260206004820152601060248201526f746964206f7574206f662072616e676560801b60448201526064016107e9565b6000828152606f602052604090205460ff166112ec5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081e595d0818db185a5b5959605a1b60448201526064016107e9565b6000828152606f60205260409020606a015460ff161561134e5760405162461bcd60e51b815260206004820152601a60248201527f6d6178696d756d2072656672657368657320657863656564656400000000000060448201526064016107e9565b6000828152606f602052604090206069810154606890910154611371919061396d565b42116113d05760405162461bcd60e51b815260206004820152602860248201527f4d75737420776169742074696c6c20706572696f64206578706972657320746f604482015267040e4cacce4cae6d60c31b60648201526084016107e9565b6000828152606f602052604090206001810154600290910190606481106113f9576113f9613a91565b0154604080516020810184905201604051602081830303815290604052805190602001201461145b5760405162461bcd60e51b815260206004820152600e60248201526d092dcc6dee4e4cac6e840d0c2e6d60931b60448201526064016107e9565b6000828152606f6020526040812060010180549161147883613a36565b90915550506000828152606f602052604090204260688201556001810154829160020190606481106114ac576114ac613a91565b01556000828152606f6020908152604091829020600101548251858152918201527fb12fff57dc63f5e10acb127d82321dedd2cd7cb6eb9add789dcf32fc1a2317a3910160405180910390a16000828152606f6020526040902060010154600b1161124f576000828152606f602052604090819020606a01805460ff19166001179055517fb87a29b1ae4534ad46ae76a7818de1a83135bd2f7791a5cd6d5cc77d1d5f743e9061155f9084815260200190565b60405180910390a15050565b6115753383612185565b6115915760405162461bcd60e51b81526004016107e99061380f565b610db6848484846125c2565b6060606482106115e75760405162461bcd60e51b8152602060048201526015602482015274546f6b656e204944206f7574206f662072616e676560581b60448201526064016107e9565b60006115f283611f93565b905060ff6116018260c0613999565b61160c8360646139b8565b6116169083613999565b611620919061396d565b905061162d606482613985565b9050600061163a826125f5565b90506000818283604051602001611653939291906133a3565b60408051601f198184030181528282018252600a8352691e17b39f1e17b9bb339f60b11b602084810191909152825180840190935260aa83526055908301529250600290606060005b8381101561181e5760008b8152606f6020526040812060660182600281106116c6576116c6613a91565b0160009054906101000a90046001600160a01b03166001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040160006040518083038186803b15801561171357600080fd5b505afa158015611727573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261174f9190810190612fc1565b60008d8152606f60205260409020600301549091506060908061177457829150611781565b61177e83826119c3565b91505b85846002811061179357611793613a91565b60200201519a506117a58c60c0613999565b6117b08d60646139b8565b6117ba908d613999565b6117c4919061396d565b9a506117d160648c613985565b9a506117dc8b6125f5565b995084828b8c8d6040516020016117f79594939291906131e2565b6040516020818303038152906040529450505050808061181690613a36565b91505061169c565b508481856040516020016118349392919061319f565b60408051601f198184030181529190529a9950505050505050505050565b606061185d826120b5565b60006118688361159d565b6000848152606f60205260408120600190810154929350909161188b91906139b8565b9050600061189885611f93565b905060006118a583612729565b6040516020016118b591906134ff565b60408051601f198184030181529181526000888152606f60205220606a015490915060ff161561190257806040516020016118f09190613348565b60405160208183030381529060405290505b8115611935578061191283612729565b6040516020016119239291906132d4565b60405160208183030381529060405290505b8060405160200161194691906132af565b6040516020818303038152906040529050600061199561196588612729565b8361196f88612826565b604051602001611981939291906135bb565b604051602081830303815290604052612826565b9050806040516020016119a89190613576565b60405160208183030381529060405295505050505050919050565b6060600083815b602086516119d89190613985565b811015611a2d5760408051602081018790529081018290526060016040516020818303038152906040528051906020012094506020820191508151925084831882528080611a2590613a36565b9150506119ca565b5093949350505050565b604080516002808252606082810190935282916000918160200160208202803683375050506000858152606f602052604081206066015482519293506001600160a01b031691839190611a8c57611a8c613a91565b6001600160a01b039283166020918202929092018101919091526000868152606f9091526040902060670154825191169082906001908110611ad057611ad0613a91565b6001600160a01b039290921660209283029190910182015260408051600b8082526101808201909252929450849260009290919082016101608036833701905050905060005b600b811015611b72576000868152606f602052604090206002018160648110611b4157611b41613a91565b0154828281518110611b5557611b55613a91565b602090810291909101015280611b6a81613a36565b915050611b16565b5092949293505050565b60606000805b6064811015611bf057607260008583604051602001611ba2929190613131565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615611bde5781611bda81613a36565b9250505b80611be881613a36565b915050611b82565b506000816001600160401b03811115611c0b57611c0b613aa7565b604051908082528060200260200182016040528015611c34578160200160208202803683370190505b5090506000915060005b6064811015611cca57607260008683604051602001611c5e929190613131565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615611cb85780828481518110611c9f57611c9f613a91565b602090810291909101015282611cb481613a36565b9350505b80611cc281613a36565b915050611c3e565b509392505050565b60085461010090046001600160a01b031633148015611cf4575060085460ff16155b611cfd57600080fd5b60005b8351811015610db657818181518110611d1b57611d1b613a91565b6020026020010151606f6000868481518110611d3957611d39613a91565b60200260200101518152602001908152602001600020606601848381518110611d6457611d64613a91565b602002602001015160028110611d7c57611d7c613a91565b0180546001600160a01b0319166001600160a01b039290921691909117905580611da581613a36565b915050611d00565b60085461010090046001600160a01b031633148015611dcf575060085460ff16155b611dd857600080fd5b60005b825181101561088a578160716000858481518110611dfb57611dfb613a91565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611e3781613a36565b915050611ddb565b60085461010090046001600160a01b031633148015611e61575060085460ff16155b611e6a57600080fd5b60005b825181101561088a57818181518110611e8857611e88613a91565b6020026020010151606f6000858481518110611ea657611ea6613a91565b60200260200101518152602001908152602001600020600201600060648110611ed157611ed1613a91565b015580611edd81613a36565b915050611e6d565b3360009081526071602052604090205460ff1680611f12575062ed4e00600954611f0f919061396d565b42115b611f785760405162461bcd60e51b815260206004820152603160248201527f5361666567756172643a206d73672e73656e646572206e6f74206f6e2074656d6044820152701c1bdc985c9e48185b1b1bddc81b1a5cdd607a1b60648201526084016107e9565b33600090815260706020526040902090815542600190910155565b600080600a8360648110611fa957611fa9613a91565b01541115611fcc57600a8260648110611fc457611fc4613a91565b015492915050565b6000828152606f602052604081206069810154606890910154611fef919061396d565b6000848152606f60205260408120606a01549192509060ff1615612012576120ae565b814211158061203057506000848152606f602052604090205460ff16155b1561203a576120ae565b6000848152606f602052604090206069015461205683426139b8565b612061906064613999565b61206b9190613985565b9050606481111561207a575060645b60006120878260646139b8565b905060646120958280613999565b61209f9190613985565b6120aa9060646139b8565b9150505b9392505050565b6000818152600460205260409020546001600160a01b03166121145760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107e9565b50565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061214c82610a46565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061219183610a46565b9050806001600160a01b0316846001600160a01b031614806121d857506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b806121fc5750836001600160a01b03166121f18461074d565b6001600160a01b0316145b949350505050565b826001600160a01b031661221782610a46565b6001600160a01b03161461223d5760405162461bcd60e51b81526004016107e9906138ae565b6001600160a01b03821661229f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107e9565b826001600160a01b03166122b282610a46565b6001600160a01b0316146122d85760405162461bcd60e51b81526004016107e9906138ae565b600081815260066020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260058552838620805460001901905590871680865283862080546001019055868652600490945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166123be5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e9565b6000818152600460205260409020546001600160a01b0316156124235760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e9565b6000818152600460205260409020546001600160a01b0316156124885760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e9565b6001600160a01b038216600081815260056020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031614156125555760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107e9565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125cd848484612204565b6125d98484848461298b565b610db65760405162461bcd60e51b81526004016107e99061385c565b60608161261a575050604080518082019091526002815261030360f41b602082015290565b6040805160028082528183019092526000916020820181803683370190505090506040518060400160405280601081526020016f181899199a1a9b1b9c1ca0a121a222a360811b81525083600f168151811061267857612678613a91565b602001015160f81c60f81b8160018151811061269657612696613a91565b60200101906001600160f81b031916908160001a9053506040518060400160405280601081526020016f181899199a1a9b1b9c1ca0a121a222a360811b815250600484901c600f16815181106126ee576126ee613a91565b602001015160f81c60f81b8160008151811061270c5761270c613a91565b60200101906001600160f81b031916908160001a90535092915050565b60608161274d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612777578061276181613a36565b91506127709050600a83613985565b9150612751565b6000816001600160401b0381111561279157612791613aa7565b6040519080825280601f01601f1916602001820160405280156127bb576020820181803683370190505b5090505b84156121fc576127d06001836139b8565b91506127dd600a86613a51565b6127e890603061396d565b60f81b8183815181106127fd576127fd613a91565b60200101906001600160f81b031916908160001a90535061281f600a86613985565b94506127bf565b805160609080612846575050604080516020810190915260008152919050565b6000600361285583600261396d565b61285f9190613985565b61286a906004613999565b9050600061287982602061396d565b6001600160401b0381111561289057612890613aa7565b6040519080825280601f01601f1916602001820160405280156128ba576020820181803683370190505b5090506000604051806060016040528060408152602001613ad4604091399050600181016020830160005b86811015612946576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016128e5565b50600386066001811461296057600281146129715761297d565b613d3d60f01b60011983015261297d565b603d60f81b6000198301525b505050918152949350505050565b60006001600160a01b0384163b15612a8d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129cf903390899088908890600401613704565b602060405180830381600087803b1580156129e957600080fd5b505af1925050508015612a19575060408051601f3d908101601f19168201909252612a1691810190612f70565b60015b612a73573d808015612a47576040519150601f19603f3d011682016040523d82523d6000602084013e612a4c565b606091505b508051612a6b5760405162461bcd60e51b81526004016107e99061385c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121fc565b506001949350505050565b6000612aab612aa684613946565b6138f3565b9050828152838383011115612abf57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612aed57600080fd5b919050565b600082601f830112612b0357600080fd5b81356020612b13612aa683613923565b80838252828201915082860187848660051b8901011115612b3357600080fd5b60005b85811015612b5957612b4782612ad6565b84529284019290840190600101612b36565b5090979650505050505050565b600082601f830112612b7757600080fd5b81356020612b87612aa683613923565b80838252828201915082860187848660051b8901011115612ba757600080fd5b60005b85811015612b5957813584529284019290840190600101612baa565b80358015158114612aed57600080fd5b600082601f830112612be757600080fd5b6120ae83833560208501612a98565b600060208284031215612c0857600080fd5b6120ae82612ad6565b60008060408385031215612c2457600080fd5b612c2d83612ad6565b9150612c3b60208401612ad6565b90509250929050565b600080600060608486031215612c5957600080fd5b612c6284612ad6565b9250612c7060208501612ad6565b9150604084013590509250925092565b60008060008060808587031215612c9657600080fd5b612c9f85612ad6565b9350612cad60208601612ad6565b92506040850135915060608501356001600160401b03811115612ccf57600080fd5b612cdb87828801612bd6565b91505092959194509250565b60008060408385031215612cfa57600080fd5b612d0383612ad6565b9150612c3b60208401612bc6565b60008060408385031215612d2457600080fd5b612d2d83612ad6565b946020939093013593505050565b600080600060608486031215612d5057600080fd5b83356001600160401b0380821115612d6757600080fd5b612d7387838801612af2565b94506020860135915080821115612d8957600080fd5b50612d9686828701612b66565b925050612da560408501612bc6565b90509250925092565b60008060408385031215612dc157600080fd5b82356001600160401b03811115612dd757600080fd5b612de385828601612af2565b925050612c3b60208401612bc6565b60008060408385031215612e0557600080fd5b82356001600160401b0380821115612e1c57600080fd5b612e2886838701612b66565b9350602091508185013581811115612e3f57600080fd5b85019050601f81018613612e5257600080fd5b8035612e60612aa682613923565b80828252848201915084840189868560051b8701011115612e8057600080fd5b600094505b83851015612ea3578035835260019490940193918501918501612e85565b5080955050505050509250929050565b600080600060608486031215612ec857600080fd5b83356001600160401b0380821115612edf57600080fd5b612eeb87838801612b66565b94506020860135915080821115612f0157600080fd5b612f0d87838801612b66565b93506040860135915080821115612f2357600080fd5b50612f3086828701612af2565b9150509250925092565b600060208284031215612f4c57600080fd5b5035919050565b600060208284031215612f6557600080fd5b81356120ae81613abd565b600060208284031215612f8257600080fd5b81516120ae81613abd565b600060208284031215612f9f57600080fd5b81356001600160401b03811115612fb557600080fd5b6121fc84828501612bd6565b600060208284031215612fd357600080fd5b81516001600160401b03811115612fe957600080fd5b8201601f81018413612ffa57600080fd5b8051613008612aa682613946565b81815285602083850101111561301d57600080fd5b61302e8260208301602086016139cf565b95945050505050565b6000806040838503121561304a57600080fd5b82356001600160401b0381111561306057600080fd5b61306c85828601612bd6565b95602094909401359450505050565b6000806040838503121561308e57600080fd5b50508035926020909101359150565b6000806000606084860312156130b257600080fd5b833560ff811681146130c357600080fd5b92506020840135915060408401356001600160401b038111156130e557600080fd5b8401601f810186136130f657600080fd5b612f3086823560208401612a98565b6000815180845261311d8160208601602086016139cf565b601f01601f19169290920160200192915050565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b60ff60f81b851681526bffffffffffffffffffffffff198460601b1660018201528260158201526000825161318f8160358501602087016139cf565b9190910160350195945050505050565b600084516131b18184602089016139cf565b8451908301906131c58183602089016139cf565b84519101906131d88183602088016139cf565b0195945050505050565b600086516131f4818460208b016139cf565b681e3830ba3410321e9160b91b908301908152865161321a816009840160208b016139cf565b6e22207374796c653d2266696c6c3a2360881b60099290910191820152855161324a816018840160208a016139cf565b85519101906132608160188401602089016139cf565b84519101906132768160188401602088016139cf565b7f3b7374726f6b652d77696474683a302e333222202f3e0a00000000000000000060189290910191820152602f01979650505050505050565b600082516132c18184602087016139cf565b605d60f81b920191825250600101919050565b600083516132e68184602088016139cf565b80830190507f2c207b2274726169745f74797065223a202246616465222c202276616c7565228152621d101160e91b6020820152835161332d8160238401602088016139cf565b61227d60f01b60239290910191820152602501949350505050565b6000825161335a8184602087016139cf565b7f2c207b2274726169745f74797065223a2022496d6d6f7274616c222c20227661920191825250706c7565223a2022496d6d6f7274616c227d60781b6020820152603101919050565b7f3c737667207072657365727665417370656374526174696f3d22784d696e594d81527f696e206d656574222076657273696f6e3d22312e31222076696577426f783d2260208201527f3020302039362039362220786d6c6e733d22687474703a2f2f7777772e77332e60408201527f6f72672f323030302f737667223e203c67207374726f6b652d77696474683d2260608201527f2e3332223e203c726563742077696474683d223130302522206865696768743d60808201526d2231303025222066696c6c3d222360901b60a08201526000845161348a8160ae8501602089016139cf565b8451908301906134a18160ae8401602089016139cf565b84519101906134b78160ae8401602088016139cf565b631110179f60e11b60ae929091019182015260b20195945050505050565b61060f60f31b8152600082516134f28160028501602087016139cf565b9190910160020192915050565b7f2c202261747472696275746573223a205b207b2274726169745f74797065223a81527f2022526566726573686573222c202276616c7565223a2022000000000000000060208201526000825161355d8160388501602087016139cf565b61227d60f01b6038939091019283015250603a01919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516135ae81601d8501602087016139cf565b91909101601d0192915050565b747b226e616d65223a2022484153484d41524b53202360581b815283516000906135ec8160158501602089016139cf565b7f222c20226465736372697074696f6e223a2022484153484d41524b53206279206015918401918201527f307844454146424545463a2031303020756e697175652068616e6420666f726760358201527f65642069726f6e207363756c70747572657320616e642063727970746f67726160558201527f70686963616c6c79206c696e6b6564206469676974616c20746f6b656e732e226075820152845161369b8160958401602089016139cf565b7f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626095929091019182015265185cd94d8d0b60d21b60b582015283516136e88160bb8401602088016139cf565b61227d60f01b60bb929091019182015260bd0195945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061373790830184613105565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b828110156137835781516001600160a01b03168452928401929084019060010161375e565b5050508381038285015284518082528583019183019060005b81811015612b595783518352928401929184019160010161379c565b6020808252825182820181905260009190848201906040850190845b818110156137f0578351835292840192918401916001016137d4565b50909695505050505050565b6020815260006120ae6020830184613105565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b604051601f8201601f191681016001600160401b038111828210171561391b5761391b613aa7565b604052919050565b60006001600160401b0382111561393c5761393c613aa7565b5060051b60200190565b60006001600160401b0382111561395f5761395f613aa7565b50601f01601f191660200190565b6000821982111561398057613980613a65565b500190565b60008261399457613994613a7b565b500490565b60008160001904831182151516156139b3576139b3613a65565b500290565b6000828210156139ca576139ca613a65565b500390565b60005b838110156139ea5781810151838201526020016139d2565b83811115610db65750506000910152565b600181811c90821680613a0f57607f821691505b60208210811415613a3057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a4a57613a4a613a65565b5060010190565b600082613a6057613a60613a7b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461211457600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122098574c711238e555fa5bfa7584f0fb09110aad33941bae2bd814d44041c3ac3664736f6c63430008070033
Deployed Bytecode Sourcemap
42576:13824:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14308:305;;;;;;:::i;:::-;;:::i;:::-;;;23649:14:1;;23642:22;23624:41;;23612:2;23597:18;14308:305:0;;;;;;;;42900:49;;42941:7;42900:49;;;;;34755:25:1;;;34743:2;34728:18;42900:49:0;34609:177:1;43153:26:0;;;;;;15236:100;;;:::i;:::-;;;;;;;:::i;16579:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;21127:32:1;;;21109:51;;21097:2;21082:18;16579:171:0;20963:203:1;16097:416:0;;;;;;:::i;:::-;;:::i;:::-;;44518:82;44585:9;;44518:82;;17279:335;;;;;;:::i;:::-;;:::i;45337:113::-;;;:::i;17685:185::-;;;;;;:::i;:::-;;:::i;44608:609::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43693:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43693:45:0;;;;;;;;;;23976:14:1;;23969:22;23951:41;;-1:-1:-1;;;;;24028:32:1;;;24023:2;24008:18;;24001:60;24077:18;;;24070:34;;;;24135:2;24120:18;;24113:34;24178:3;24163:19;;24156:35;24235:14;24228:22;24048:3;24207:19;;24200:51;23938:3;23923:19;43693:45:0;23676:581:1;43797:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;14946:223;;;;;;:::i;:::-;;:::i;47299:493::-;;;;;;:::i;:::-;;:::i;43092:52::-;;43135:9;43092:52;;14677:207;;;;;;:::i;:::-;;:::i;43743:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;24436:25:1;;;24492:2;24477:18;;24470:34;;;;24409:18;43743:47:0;24262:248:1;42703:39:0;;42740:2;42703:39;;49006:133;;;;;;:::i;:::-;-1:-1:-1;;;;;49098:10:0;49057:12;49098:10;;;:7;:10;;;;;:15;;49115:13;;;;;49098:15;;49006:133;44429:81;44498:6;;;;;-1:-1:-1;;;;;44498:6:0;44429:81;;46070:207;;;;;;:::i;:::-;;:::i;43908:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15405:104;;;:::i;42747:49::-;;42786:9;42747:49;;49147:1559;;;;;;:::i;:::-;;:::i;16822:155::-;;;;;;:::i;:::-;;:::i;50929:1018::-;;;;;;:::i;:::-;;:::i;17941:322::-;;;;;;:::i;:::-;;:::i;52651:1965::-;;;;;;:::i;:::-;;:::i;55115:1280::-;;;;;;:::i;:::-;;:::i;54724:384::-;;;;;;:::i;:::-;;:::i;46351:446::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;46861:430::-;;;;;;:::i;:::-;;:::i;47867:213::-;;;;;;:::i;:::-;;:::i;17048:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;17169:25:0;;;17145:4;17169:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17048:164;45773:147;;;;;;:::i;:::-;;:::i;45458:178::-;;;;;;:::i;:::-;;:::i;48599:399::-;;;;;;:::i;:::-;;:::i;42849:40::-;;42885:4;42849:40;;51953:690;;;;;;:::i;:::-;;:::i;14308:305::-;14410:4;-1:-1:-1;;;;;;14447:40:0;;-1:-1:-1;;;14447:40:0;;:105;;-1:-1:-1;;;;;;;14504:48:0;;-1:-1:-1;;;14504:48:0;14447:105;:158;;;-1:-1:-1;;;;;;;;;;5349:40:0;;;14569:36;14427:178;14308:305;-1:-1:-1;;14308:305:0:o;15236:100::-;15290:13;15323:5;15316:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15236:100;:::o;16579:171::-;16655:7;16675:23;16690:7;16675:14;:23::i;:::-;-1:-1:-1;16718:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;16718:24:0;;16579:171::o;16097:416::-;16178:13;16194:23;16209:7;16194:14;:23::i;:::-;16178:39;;16242:5;-1:-1:-1;;;;;16236:11:0;:2;-1:-1:-1;;;;;16236:11:0;;;16228:57;;;;-1:-1:-1;;;16228:57:0;;31832:2:1;16228:57:0;;;31814:21:1;31871:2;31851:18;;;31844:30;31910:34;31890:18;;;31883:62;-1:-1:-1;;;31961:18:1;;;31954:31;32002:19;;16228:57:0;;;;;;;;;6082:10;-1:-1:-1;;;;;16320:21:0;;;;:62;;-1:-1:-1;16345:37:0;16362:5;6082:10;17048:164;:::i;16345:37::-;16298:173;;;;-1:-1:-1;;;16298:173:0;;32577:2:1;16298:173:0;;;32559:21:1;32616:2;32596:18;;;32589:30;32655:34;32635:18;;;32628:62;32726:31;32706:18;;;32699:59;32775:19;;16298:173:0;32375:425:1;16298:173:0;16484:21;16493:2;16497:7;16484:8;:21::i;:::-;16167:346;16097:416;;:::o;17279:335::-;17474:41;6082:10;17507:7;17474:18;:41::i;:::-;17466:99;;;;-1:-1:-1;;;17466:99:0;;;;;;;:::i;:::-;17578:28;17588:4;17594:2;17598:7;17578:9;:28::i;45337:113::-;44275:6;;;;;-1:-1:-1;;;;;44275:6:0;44263:10;:18;44255:27;;;;;;45385:8:::1;::::0;::::1;;:17;45377:45;;;::::0;-1:-1:-1;;;45377:45:0;;29593:2:1;45377:45:0::1;::::0;::::1;29575:21:1::0;29632:2;29612:18;;;29605:30;-1:-1:-1;;;29651:18:1;;;29644:45;29706:18;;45377:45:0::1;29391:339:1::0;45377:45:0::1;45429:8;:15:::0;;-1:-1:-1;;45429:15:0::1;45440:4;45429:15;::::0;;45337:113::o;17685:185::-;17823:39;17840:4;17846:2;17850:7;17823:39;;;;;;;;;;;;:16;:39::i;44608:609::-;44663:16;44688:23;44714:12;44724:1;44714:9;:12::i;:::-;44688:38;;44733:30;44780:15;-1:-1:-1;;;;;44766:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44766:30:0;;44733:63;;44803:22;44836:23;44872:313;44897:15;44879;:33;:57;;;;;44933:3;44916:14;:20;44879:57;44872:313;;;20066:4;19664:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19664:16:0;20090:31;44947:206;;44980:25;45008:23;45016:14;45008:7;:23::i;:::-;44980:51;;45060:1;-1:-1:-1;;;;;45039:22:0;:17;-1:-1:-1;;;;;45039:22:0;;45035:109;;;45102:14;45069:13;45083:15;45069:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;45122:17;;;;:::i;:::-;;;;45035:109;44976:177;44947:206;45161:16;;;;:::i;:::-;;;;44872:313;;;-1:-1:-1;45198:13:0;;44608:609;-1:-1:-1;;;;44608:609:0:o;14946:223::-;15018:7;19664:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19664:16:0;;15082:56;;;;-1:-1:-1;;;15082:56:0;;31061:2:1;15082:56:0;;;31043:21:1;31100:2;31080:18;;;31073:30;-1:-1:-1;;;31119:18:1;;;31112:54;31183:18;;15082:56:0;30859:348:1;47299:493:0;47357:13;47432:22;47467:6;:13;47483:1;47467:17;;;;:::i;:::-;-1:-1:-1;;;;;47457:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47457:28:0;-1:-1:-1;47494:39:0;;;;;;;;;;;;-1:-1:-1;;;47494:39:0;;;;47432:53;;-1:-1:-1;47494:18:0;47542:188;47566:6;:13;47562:1;:17;47542:188;;;47614:5;47639;:12;47626:6;47633:1;47626:9;;;;;;;;:::i;:::-;;;;;47620:31;;;47626:9;;47620:31;:::i;:::-;47614:38;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;47614:38:0;47595:9;47605:5;:1;47609;47605:5;:::i;:::-;47595:16;;;;;;;;:::i;:::-;;;;:57;-1:-1:-1;;;;;47595:57:0;;;;;;;;;47684:5;47709;:12;47696:6;47703:1;47696:9;;;;;;;;:::i;:::-;;;;;47690:31;;;47696:9;;47690:31;:::i;:::-;47684:38;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;47684:38:0;47661:9;47671:5;:1;47675;47671:5;:::i;:::-;:9;;47679:1;47671:9;:::i;:::-;47661:20;;;;;;;;:::i;:::-;;;;:61;-1:-1:-1;;;;;47661:61:0;;;;;;;;-1:-1:-1;47581:3:0;;;;:::i;:::-;;;;47542:188;;;;47775:9;47752:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;47738:48;;;;47299:493;;;:::o;14677:207::-;14749:7;-1:-1:-1;;;;;14777:19:0;;14769:73;;;;-1:-1:-1;;;14769:73:0;;29183:2:1;14769:73:0;;;29165:21:1;29222:2;29202:18;;;29195:30;29261:34;29241:18;;;29234:62;-1:-1:-1;;;29312:18:1;;;29305:39;29361:19;;14769:73:0;28981:405:1;14769:73:0;-1:-1:-1;;;;;;14860:16:0;;;;;:9;:16;;;;;;;14677:207::o;46070:::-;44141:6;;;;;-1:-1:-1;;;;;44141:6:0;44129:10;:18;:39;;;;-1:-1:-1;44151:8:0;;;;:17;44129:39;44121:48;;;;;;46174:9:::1;46169:102;46190:3;:10;46188:1;:12;46169:102;;;46270:1;46213:12;:54;46253:1;46255;46253:4;;;;;;;;:::i;:::-;;;;;;;46258:3;46262:1;46258:6;;;;;;;;:::i;:::-;;;;;;;46236:29;;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;46236:29:0;;;;;;46226:40;;46236:29:::1;46226:40:::0;;::::1;::::0;46213:54;;;;::::1;::::0;;;;;-1:-1:-1;46213:54:0;:58;;-1:-1:-1;;46213:58:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46201:3;::::1;::::0;::::1;:::i;:::-;;;;46169:102;;;;46070:207:::0;;;:::o;15405:104::-;15461:13;15494:7;15487:14;;;;;:::i;49147:1559::-;49240:3;49234;:9;;;49226:42;;;;-1:-1:-1;;;49226:42:0;;25355:2:1;49226:42:0;;;25337:21:1;25394:2;25374:18;;;25367:30;-1:-1:-1;;;25413:18:1;;;25406:51;25474:18;;49226:42:0;25153:345:1;49226:42:0;49284:11;;;;;;;;:6;:11;;;;;:19;;49283:20;49275:56;;;;-1:-1:-1;;;49275:56:0;;27296:2:1;49275:56:0;;;27278:21:1;27335:2;27315:18;;;27308:30;27374:26;27354:18;;;27347:54;27418:18;;49275:56:0;27094:348:1;49275:56:0;49661:12;:66;49701:10;49720:3;49712:12;;49684:41;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;49684:41:0;;;;;;;;;49674:52;;49684:41;49674:52;;;;49661:66;;;;;;;;;;-1:-1:-1;49661:66:0;;;;;:118;;;43135:9;49749:11;;:30;;;;:::i;:::-;49731:15;:48;49661:118;49653:192;;;;-1:-1:-1;;;49653:192:0;;28753:2:1;49653:192:0;;;28735:21:1;28792:2;28772:18;;;28765:30;28831:34;28811:18;;;28804:62;28902:31;28882:18;;;28875:59;28951:19;;49653:192:0;28551:425:1;49653:192:0;49870:10;49858:9;49895:10;;;:7;:10;;;;;:13;;;49887:70;;;;-1:-1:-1;;;49887:70:0;;26887:2:1;49887:70:0;;;26869:21:1;26926:2;26906:18;;;26899:30;26965:34;26945:18;;;26938:62;-1:-1:-1;;;27016:18:1;;;27009:38;27064:19;;49887:70:0;26685:404:1;49887:70:0;-1:-1:-1;;;;;49990:10:0;;;;;;:7;:10;;;;;:13;;;42941:7;;49972:31;;:15;:31;:::i;:::-;:47;49964:95;;;;-1:-1:-1;;;49964:95:0;;33702:2:1;49964:95:0;;;33684:21:1;33741:2;33721:18;;;33714:30;33780:34;33760:18;;;33753:62;-1:-1:-1;;;33831:18:1;;;33824:33;33874:19;;49964:95:0;33500:399:1;49964:95:0;50068:9;50114:3;50107:11;;50120:10;50132:8;50142:4;50090:57;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50090:57:0;;;;;;;;;50080:68;;50090:57;50080:68;;;;-1:-1:-1;;;;;50166:10:0;;;;;;:7;:10;;;;;:15;50080:68;;-1:-1:-1;50163:18:0;;50155:56;;;;-1:-1:-1;;;50155:56:0;;29937:2:1;50155:56:0;;;29919:21:1;29976:2;29956:18;;;29949:30;30015:27;29995:18;;;29988:55;30060:18;;50155:56:0;29735:349:1;50155:56:0;50265:11;;;;;;;:6;:11;;;;;:21;;:24;;50236:26;;;;;;11606:19:1;;;11641:12;50236:26:0;;;;;;;;;;;;50226:37;;;;;;:63;50218:91;;;;-1:-1:-1;;;50218:91:0;;28408:2:1;50218:91:0;;;28390:21:1;28447:2;28427:18;;;28420:30;-1:-1:-1;;;28466:18:1;;;28459:46;28522:18;;50218:91:0;28206:340:1;50218:91:0;50322:11;;;;;;;:6;:11;;;;;50349:15;50322:24;;;:42;42786:9;50371:18;;;:32;50421:26;;-1:-1:-1;;50421:26:0;50443:4;50421:26;;;;;50454:18;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;50485:11:0;;;;;;;:6;:11;;;;;50507:18;;;;50529:8;;50485:21;;;:41;;;;;;;:::i;:::-;;:52;50586:22;50592:10;50586:22;;;:5;:22::i;:::-;50615:11;;;;;;;:6;:11;;;;;:32;;-1:-1:-1;;;;;;50615:32:0;50637:10;50615:32;;;;;50660:9;:11;;;;;;:::i;:::-;;;;-1:-1:-1;;50689:11:0;;35218:4:1;35206:17;;35188:36;;50689:11:0;;35176:2:1;35161:18;50689:11:0;;;;;;;49219:1487;;49147:1559;;;:::o;16822:155::-;16917:52;6082:10;16950:8;16960;16917:18;:52::i;:::-;16822:155;;:::o;50929:1018::-;51005:3;50999;:9;50991:38;;;;-1:-1:-1;;;50991:38:0;;33357:2:1;50991:38:0;;;33339:21:1;33396:2;33376:18;;;33369:30;-1:-1:-1;;;33415:18:1;;;33408:46;33471:18;;50991:38:0;33155:340:1;50991:38:0;51044:11;;;;:6;:11;;;;;:19;;;51036:52;;;;-1:-1:-1;;;51036:52:0;;33007:2:1;51036:52:0;;;32989:21:1;33046:2;33026:18;;;33019:30;-1:-1:-1;;;33065:18:1;;;33058:51;33126:18;;51036:52:0;32805:345:1;51036:52:0;51104:11;;;;:6;:11;;;;;:20;;;;;51103:21;51095:59;;;;-1:-1:-1;;;51095:59:0;;34456:2:1;51095:59:0;;;34438:21:1;34495:2;34475:18;;;34468:30;34534:28;34514:18;;;34507:56;34580:18;;51095:59:0;34254:350:1;51095:59:0;51271:11;;;;:6;:11;;;;;:18;;;;51244:24;;;;;:45;;51271:18;51244:45;:::i;:::-;51226:15;:63;51218:116;;;;-1:-1:-1;;;51218:116:0;;30652:2:1;51218:116:0;;;30634:21:1;30691:2;30671:18;;;30664:30;30730:34;30710:18;;;30703:62;-1:-1:-1;;;30781:18:1;;;30774:38;30829:19;;51218:116:0;30450:404:1;51218:116:0;51396:11;;;;:6;:11;;;;;51418:18;;;;51396:21;;;;;:41;;;;;;;:::i;:::-;;;51365:26;;;;;;11606:19:1;;;11641:12;51365:26:0;;;;;;;;;;;;51355:37;;;;;;:82;51347:109;;;;-1:-1:-1;;;51347:109:0;;32234:2:1;51347:109:0;;;32216:21:1;32273:2;32253:18;;;32246:30;-1:-1:-1;;;32292:18:1;;;32285:44;32346:18;;51347:109:0;32032:338:1;51347:109:0;51469:11;;;;:6;:11;;;;;:18;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;51496:11:0;;;;:6;:11;;;;;51523:15;51496:24;;;:42;51571:18;;;;51593:8;;51549:21;;;:41;;;;;;;:::i;:::-;;:52;51626:11;;;;:6;:11;;;;;;;;;:18;;;51613:32;;24436:25:1;;;24477:18;;;24470:34;51613:32:0;;24409:18:1;51613:32:0;;;;;;;51837:11;;;;:6;:11;;;;;:18;;;42740:2;-1:-1:-1;51833:109:0;;51878:11;;;;:6;:11;;;;;;;:20;;:27;;-1:-1:-1;;51878:27:0;51901:4;51878:27;;;51919:15;;;;;51885:3;34755:25:1;;34743:2;34728:18;;34609:177;51919:15:0;;;;;;;;50929:1018;;:::o;17941:322::-;18115:41;6082:10;18148:7;18115:18;:41::i;:::-;18107:99;;;;-1:-1:-1;;;18107:99:0;;;;;;;:::i;:::-;18217:38;18231:4;18237:2;18241:7;18250:4;18217:13;:38::i;52651:1965::-;52701:13;52737:3;52731;:9;52723:43;;;;-1:-1:-1;;;52723:43:0;;34106:2:1;52723:43:0;;;34088:21:1;34145:2;34125:18;;;34118:30;-1:-1:-1;;;34164:18:1;;;34157:51;34225:18;;52723:43:0;33904:345:1;52723:43:0;52848:10;52861:16;52873:3;52861:11;:16::i;:::-;52848:29;-1:-1:-1;52957:3:0;52992:14;52848:29;42885:4;52992:14;:::i;:::-;52982:6;52986:2;52982:3;:6;:::i;:::-;52974:15;;:4;:15;:::i;:::-;:32;;;;:::i;:::-;52967:39;-1:-1:-1;53013:11:0;53021:3;52967:39;53013:11;:::i;:::-;;;53031:20;53054;53069:4;53054:14;:20::i;:::-;53031:43;;53087:16;53307:6;53314;53321;53113:222;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53113:222:0;;;;;;53349:31;;;;;;;;-1:-1:-1;;;53113:222:0;53349:31;;;;;;;53421:49;;;;;;;;53461:4;53421:49;;53467:2;53421:49;;;;53113:222;-1:-1:-1;53413:1:0;;53477:17;53349:16;53507:1037;53525:9;53522:2;:12;53507:1037;;;53592:14;53609:11;;;:6;:11;;;;;:17;;53627:2;53609:21;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;53609:21:0;-1:-1:-1;;;;;53609:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53609:28:0;;;;;;;;;;;;:::i;:::-;53719:9;53731:11;;;:6;:11;;;;;:24;;;53592:45;;-1:-1:-1;53648:22:0;;53731:24;53764:91;;53800:1;53782:20;;53764:91;;;53833:12;53841:1;53843;53833:7;:12::i;:::-;53822:23;;53764:91;53879:10;53890:2;53879:14;;;;;;;:::i;:::-;;;;;;-1:-1:-1;53989:14:0;54001:2;42885:4;53989:14;:::i;:::-;53979:6;53983:2;53979:3;:6;:::i;:::-;53971:15;;:4;:15;:::i;:::-;:32;;;;:::i;:::-;53964:39;-1:-1:-1;54012:11:0;54020:3;53964:39;54012:11;:::i;:::-;;;54041:20;54056:4;54041:14;:20::i;:::-;54032:29;;54108:3;54125:8;54154:6;54161;54168;54091:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54078:126;;53541:1003;;;53535:4;;;;;:::i;:::-;;;;53507:1037;;;;54582:2;54585:3;54589:2;54565:27;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;54565:27:0;;;;;;;;;;52651:1965;-1:-1:-1;;;;;;;;;;52651:1965:0:o;55115:1280::-;55180:13;55203:23;55218:7;55203:14;:23::i;:::-;55236:17;55256:15;55263:7;55256:6;:15::i;:::-;55356:17;55376:15;;;:6;:15;;;;;55401:1;55376:22;;;;55236:35;;-1:-1:-1;55356:17:0;;55376:26;;55401:1;55376:26;:::i;:::-;55356:46;;55410:10;55423:20;55435:7;55423:11;:20::i;:::-;55410:33;;55453:24;55572:28;55590:9;55572:17;:28::i;:::-;55487:120;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55487:120:0;;;;;;;;;55620:15;;;;:6;55487:120;55620:15;;:24;;;55487:120;;-1:-1:-1;55620:24:0;;55616:139;;;55683:10;55666:88;;;;;;;;:::i;:::-;;;;;;;;;;;;;55646:109;;55616:139;55767:6;;55763:134;;55812:10;55868:21;55886:2;55868:17;:21::i;:::-;55795:101;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55775:122;;55763:134;55942:10;55925:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;55905:53;;55973:18;55994:318;56063:26;56081:7;56063:17;:26::i;:::-;56223:10;56277:25;56297:3;56277:13;:25::i;:::-;56021:288;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55994:13;:318::i;:::-;55973:339;;56383:4;56333:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;56319:70;;;;;;;55115:1280;;;:::o;54724:384::-;54789:13;54811:9;54870:1;54811:9;54890:187;54915:2;54906:1;:8;:11;;;;:::i;:::-;54904:1;:13;54890:187;;;54946:21;;;;;;11821:19:1;;;11856:12;;;11849:28;;;11893:12;;54946:21:0;;;;;;;;;;;;54936:32;;;;;;54932:36;;55014:2;55012:1;55008:9;55003:14;;55038:1;55032:8;55027:13;;55058:1;55056;55052:8;55050:1;55043:18;54918:3;;;;;:::i;:::-;;;;54890:187;;;-1:-1:-1;55099:1:0;;54724:384;-1:-1:-1;;;;54724:384:0:o;46351:446::-;46489:16;;;46503:1;46489:16;;;46403:22;46489:16;;;;;;46403:22;;46464;;46489:16;;;;;;;;;;-1:-1:-1;;;46531:11:0;;;;:6;:11;;;;;:17;;:20;46512:8;;;;-1:-1:-1;;;;;;46531:20:0;;46512:8;;46531:11;46512:8;;;;:::i;:::-;-1:-1:-1;;;;;46512:40:0;;;:8;;;;;;;;;;:40;;;;46578:11;;;;:6;:11;;;;;;:20;;;46559:8;;46578:20;;;46559:8;;46596:1;;46559:8;;;;;;:::i;:::-;-1:-1:-1;;;;;46559:40:0;;;;:8;;;;;;;;;;:40;46659:17;;;46673:2;46659:17;;;;;;;;;46616:5;;-1:-1:-1;46616:5:0;;46634:22;;46659:17;;46673:2;46659:17;;;;;;;;;-1:-1:-1;46659:17:0;46634:42;;46694:9;46689:77;46708:2;46706:1;:4;46689:77;;;46734:11;;;;:6;:11;;;;;:21;;46756:1;46734:24;;;;;;;:::i;:::-;;;46725:5;46731:1;46725:8;;;;;;;;:::i;:::-;;;;;;;;;;:33;46711:3;;;;:::i;:::-;;;;46689:77;;;-1:-1:-1;46351:446:0;;46786:5;;-1:-1:-1;;;46351:446:0:o;46861:430::-;46918:16;46943:6;46963:11;46958:98;46981:3;46977;:7;46958:98;;;47003:12;:48;47043:1;47045:3;47026:23;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47026:23:0;;;;;;;;;47016:34;;47026:23;47016:34;;;;47003:48;;;;;;;;;;-1:-1:-1;47003:48:0;;;;46999:57;;;47053:3;;;;:::i;:::-;;;;46999:57;46985:5;;;;:::i;:::-;;;;46958:98;;;;47069:22;47108:1;-1:-1:-1;;;;;47094:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47094:16:0;;47069:41;;47121:1;47119:3;;47134:11;47129:138;47152:3;47148;:7;47129:138;;;47177:12;:48;47217:1;47219:3;47200:23;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47200:23:0;;;;;;;;;47190:34;;47200:23;47190:34;;;;47177:48;;;;;;;;;;-1:-1:-1;47177:48:0;;;;47173:87;;;47240:3;47231:5;47237:1;47231:8;;;;;;;;:::i;:::-;;;;;;;;;;:12;47247:3;;;;:::i;:::-;;;;47173:87;47156:5;;;;:::i;:::-;;;;47129:138;;;-1:-1:-1;47280:5:0;46861:430;-1:-1:-1;;;46861:430:0:o;47867:213::-;44141:6;;;;;-1:-1:-1;;;;;44141:6:0;44129:10;:18;:39;;;;-1:-1:-1;44151:8:0;;;;:17;44129:39;44121:48;;;;;;47977:9:::1;47972:103;47993:3;:10;47991:1;:12;47972:103;;;48062:1;48064;48062:4;;;;;;;;:::i;:::-;;;;;;;48018:6;:14;48025:3;48029:1;48025:6;;;;;;;;:::i;:::-;;;;;;;48018:14;;;;;;;;;;;:20;;48039:3;48043:1;48039:6;;;;;;;;:::i;:::-;;;;;;;48018:28;;;;;;;:::i;:::-;;:49:::0;;-1:-1:-1;;;;;;48018:49:0::1;-1:-1:-1::0;;;;;48018:49:0;;;::::1;::::0;;;::::1;::::0;;48004:3;::::1;::::0;::::1;:::i;:::-;;;;47972:103;;45773:147:::0;44141:6;;;;;-1:-1:-1;;;;;44141:6:0;44129:10;:18;:39;;;;-1:-1:-1;44151:8:0;;;;:17;44129:39;44121:48;;;;;;45855:9:::1;45850:64;45871:1;:8;45869:1;:10;45850:64;;;45913:1;45892:12;:18;45905:1;45907;45905:4;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;45892:18:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;45892:18:0;:22;;-1:-1:-1;;45892:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45880:3;::::1;::::0;::::1;:::i;:::-;;;;45850:64;;45458:178:::0;44141:6;;;;;-1:-1:-1;;;;;44141:6:0;44129:10;:18;:39;;;;-1:-1:-1;44151:8:0;;;;:17;44129:39;44121:48;;;;;;45548:9:::1;45543:88;45564:3;:10;45562:1;:12;45543:88;;;45619:1;45621;45619:4;;;;;;;;:::i;:::-;;;;;;;45589:6;:14;45596:3;45600:1;45596:6;;;;;;;;:::i;:::-;;;;;;;45589:14;;;;;;;;;;;:24;;45614:1;45589:27;;;;;;;:::i;:::-;;:34:::0;45575:3;::::1;::::0;::::1;:::i;:::-;;;;45543:88;;48599:399:::0;48743:10;48730:24;;;;:12;:24;;;;;;;;;:76;;;43135:9;48776:11;;:30;;;;:::i;:::-;48758:15;:48;48730:76;48722:138;;;;-1:-1:-1;;;48722:138:0;;31414:2:1;48722:138:0;;;31396:21:1;31453:2;31433:18;;;31426:30;31492:34;31472:18;;;31465:62;-1:-1:-1;;;31543:18:1;;;31536:47;31600:19;;48722:138:0;31212:413:1;48722:138:0;48881:10;48873:19;;;;:7;:19;;;;;:28;;;48933:15;48908:22;;;;:40;48599:399::o;51953:690::-;52008:7;52047:1;52028:11;52040:3;52028:16;;;;;;;:::i;:::-;;;:20;52024:49;;;52057:11;52069:3;52057:16;;;;;;;:::i;:::-;;;;51953:690;-1:-1:-1;;51953:690:0:o;52024:49::-;52129:9;52168:11;;;:6;:11;;;;;:18;;;;52141:24;;;;;:45;;52168:18;52141:45;:::i;:::-;52193:10;52242:11;;;:6;:11;;;;;:20;;;52129:57;;-1:-1:-1;52193:10:0;52242:20;;52238:384;;;;;;52330:1;52311:15;:20;;:50;;;-1:-1:-1;52335:11:0;;;;:6;:11;;;;;:19;;;:26;52311:50;52307:315;;;;;;52460:11;;;;:6;:11;;;;;:18;;;52432:19;52450:1;52432:15;:19;:::i;:::-;52431:25;;52453:3;52431:25;:::i;:::-;52430:48;;;;:::i;:::-;52425:53;;52496:3;52491:2;:8;52487:23;;;-1:-1:-1;52507:3:0;52487:23;52557:11;52572:6;52576:2;52572:3;:6;:::i;:::-;52557:22;-1:-1:-1;52610:3:0;52601:7;52557:22;;52601:7;:::i;:::-;52600:13;;;;:::i;:::-;52593:21;;:3;:21;:::i;:::-;52588:26;;52416:206;52307:315;52635:2;51953:690;-1:-1:-1;;;51953:690:0:o;26398:135::-;20066:4;19664:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19664:16:0;26472:53;;;;-1:-1:-1;;;26472:53:0;;31061:2:1;26472:53:0;;;31043:21:1;31100:2;31080:18;;;31073:30;-1:-1:-1;;;31119:18:1;;;31112:54;31183:18;;26472:53:0;30859:348:1;26472:53:0;26398:135;:::o;25677:174::-;25752:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;25752:29:0;-1:-1:-1;;;;;25752:29:0;;;;;;;;:24;;25806:23;25752:24;25806:14;:23::i;:::-;-1:-1:-1;;;;;25797:46:0;;;;;;;;;;;25677:174;;:::o;20296:264::-;20389:4;20406:13;20422:23;20437:7;20422:14;:23::i;:::-;20406:39;;20475:5;-1:-1:-1;;;;;20464:16:0;:7;-1:-1:-1;;;;;20464:16:0;;:52;;;-1:-1:-1;;;;;;17169:25:0;;;17145:4;17169:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;20484:32;20464:87;;;;20544:7;-1:-1:-1;;;;;20520:31:0;:20;20532:7;20520:11;:20::i;:::-;-1:-1:-1;;;;;20520:31:0;;20464:87;20456:96;20296:264;-1:-1:-1;;;;20296:264:0:o;24295:1263::-;24454:4;-1:-1:-1;;;;;24427:31:0;:23;24442:7;24427:14;:23::i;:::-;-1:-1:-1;;;;;24427:31:0;;24419:81;;;;-1:-1:-1;;;24419:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24519:16:0;;24511:65;;;;-1:-1:-1;;;24511:65:0;;27649:2:1;24511:65:0;;;27631:21:1;27688:2;27668:18;;;27661:30;27727:34;27707:18;;;27700:62;-1:-1:-1;;;27778:18:1;;;27771:34;27822:19;;24511:65:0;27447:400:1;24511:65:0;24761:4;-1:-1:-1;;;;;24734:31:0;:23;24749:7;24734:14;:23::i;:::-;-1:-1:-1;;;;;24734:31:0;;24726:81;;;;-1:-1:-1;;;24726:81:0;;;;;;;:::i;:::-;24879:24;;;;:15;:24;;;;;;;;24872:31;;-1:-1:-1;;;;;;24872:31:0;;;;;;-1:-1:-1;;;;;25355:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;25355:20:0;;;25390:13;;;;;;;;;:18;;24872:31;25390:18;;;25430:16;;;:7;:16;;;;;;:21;;;;;;;;;;25469:27;;24895:7;;25469:27;;;16167:346;16097:416;;:::o;21894:942::-;-1:-1:-1;;;;;21974:16:0;;21966:61;;;;-1:-1:-1;;;21966:61:0;;30291:2:1;21966:61:0;;;30273:21:1;;;30310:18;;;30303:30;30369:34;30349:18;;;30342:62;30421:18;;21966:61:0;30089:356:1;21966:61:0;20066:4;19664:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19664:16:0;20090:31;22038:58;;;;-1:-1:-1;;;22038:58:0;;26530:2:1;22038:58:0;;;26512:21:1;26569:2;26549:18;;;26542:30;26608;26588:18;;;26581:58;26656:18;;22038:58:0;26328:352:1;22038:58:0;20066:4;19664:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19664:16:0;20090:31;22247:58;;;;-1:-1:-1;;;22247:58:0;;26530:2:1;22247:58:0;;;26512:21:1;26569:2;26549:18;;;26542:30;26608;26588:18;;;26581:58;26656:18;;22247:58:0;26328:352:1;22247:58:0;-1:-1:-1;;;;;22654:13:0;;;;;;:9;:13;;;;;;;;:18;;22671:1;22654:18;;;22696:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;22696:21:0;;;;;22735:33;22704:7;;22654:13;;22735:33;;22654:13;;22735:33;16822:155;;:::o;25994:315::-;26149:8;-1:-1:-1;;;;;26140:17:0;:5;-1:-1:-1;;;;;26140:17:0;;;26132:55;;;;-1:-1:-1;;;26132:55:0;;28054:2:1;26132:55:0;;;28036:21:1;28093:2;28073:18;;;28066:30;28132:27;28112:18;;;28105:55;28177:18;;26132:55:0;27852:349:1;26132:55:0;-1:-1:-1;;;;;26198:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;26198:46:0;;;;;;;;;;26260:41;;23624::1;;;26260::0;;23597:18:1;26260:41:0;;;;;;;25994:315;;;:::o;19144:313::-;19300:28;19310:4;19316:2;19320:7;19300:9;:28::i;:::-;19347:47;19370:4;19376:2;19380:7;19389:4;19347:22;:47::i;:::-;19339:110;;;;-1:-1:-1;;;19339:110:0;;;;;;;:::i;40481:242::-;40532:13;40558:6;40554:23;;-1:-1:-1;;40566:11:0;;;;;;;;;;;;-1:-1:-1;;;40566:11:0;;;;;40481:242::o;40554:23::-;40611:12;;;40621:1;40611:12;;;;;;;;;40592:16;;40611:12;;;;;;;;;;-1:-1:-1;40611:12:0;40592:31;;40639:5;;;;;;;;;;;;;-1:-1:-1;;;40639:5:0;;;40645:3;40651;40645:9;40639:16;;;;;;;;:::i;:::-;;;;;;;;;40630:3;40634:1;40630:6;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;40630:25:0;;;;;;;;;40671:5;;;;;;;;;;;;;-1:-1:-1;;;40671:5:0;;;40684:1;40677:3;:8;;40688:3;40677:14;40671:21;;;;;;;;:::i;:::-;;;;;;;;;40662:3;40666:1;40662:6;;;;;;;;:::i;:::-;;;;:30;-1:-1:-1;;;;;40662:30:0;;;;;;;;-1:-1:-1;40713:3:0;40481:242;-1:-1:-1;;40481:242:0:o;39736:637::-;39792:13;40001:10;39997:43;;-1:-1:-1;;40022:10:0;;;;;;;;;;;;-1:-1:-1;;;40022:10:0;;;;;39736:637::o;39997:43::-;40061:5;40046:12;40094:62;40101:9;;40094:62;;40121:8;;;;:::i;:::-;;-1:-1:-1;40138:10:0;;-1:-1:-1;40146:2:0;40138:10;;:::i;:::-;;;40094:62;;;40162:19;40194:6;-1:-1:-1;;;;;40184:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40184:17:0;;40162:39;;40208:132;40215:10;;40208:132;;40236:11;40246:1;40236:11;;:::i;:::-;;-1:-1:-1;40299:10:0;40307:2;40299:5;:10;:::i;:::-;40286:24;;:2;:24;:::i;:::-;40273:39;;40256:6;40263;40256:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;40256:56:0;;;;;;;;-1:-1:-1;40321:11:0;40330:2;40321:11;;:::i;:::-;;;40208:132;;40924:1645;41060:11;;40982:13;;41086:8;41082:23;;-1:-1:-1;;41096:9:0;;;;;;;;;-1:-1:-1;41096:9:0;;;40924:1645;-1:-1:-1;40924:1645:0:o;41082:23::-;41157:18;41195:1;41184:7;:3;41190:1;41184:7;:::i;:::-;41183:13;;;;:::i;:::-;41178:19;;:1;:19;:::i;:::-;41157:40;-1:-1:-1;41255:19:0;41287:15;41157:40;41300:2;41287:15;:::i;:::-;-1:-1:-1;;;;;41277:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41277:26:0;;41255:48;;41316:18;41337:5;;;;;;;;;;;;;;;;;41316:26;;41406:1;41399:5;41395:13;41451:2;41443:6;41439:15;41502:1;41470:777;41525:3;41522:1;41519:10;41470:777;;;41580:1;41623:12;;;;;41617:19;41718:4;41706:2;41702:14;;;;;41684:40;;41678:47;41827:2;41823:14;;;41819:25;;41805:40;;41799:47;41956:1;41952:13;;;41948:24;;41934:39;;41928:46;42076:16;;;;42062:31;;42056:38;41754:1;41750:11;;;41848:4;41795:58;;;41786:68;41879:11;;41924:57;;;41915:67;;;;42007:11;;42052:49;;42043:59;42131:3;42127:13;42160:22;;42230:1;42215:17;;;;41573:9;41470:777;;;41474:44;42279:1;42274:3;42270:11;42300:1;42295:84;;;;42398:1;42393:82;;;;42263:212;;42295:84;-1:-1:-1;;;;;42328:17:0;;42321:43;42295:84;;42393:82;-1:-1:-1;;;;;42426:17:0;;42419:41;42263:212;-1:-1:-1;;;42491:26:0;;;42498:6;40924:1645;-1:-1:-1;;;;40924:1645:0:o;27097:853::-;27251:4;-1:-1:-1;;;;;27272:13:0;;31785:19;:23;27268:675;;27308:71;;-1:-1:-1;;;27308:71:0;;-1:-1:-1;;;;;27308:36:0;;;;;:71;;6082:10;;27359:4;;27365:7;;27374:4;;27308:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27308:71:0;;;;;;;;-1:-1:-1;;27308:71:0;;;;;;;;;;;;:::i;:::-;;;27304:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27549:13:0;;27545:328;;27592:60;;-1:-1:-1;;;27592:60:0;;;;;;;:::i;27545:328::-;27823:6;27817:13;27808:6;27804:2;27800:15;27793:38;27304:584;-1:-1:-1;;;;;;27430:51:0;-1:-1:-1;;;27430:51:0;;-1:-1:-1;27423:58:0;;27268:675;-1:-1:-1;27927:4:0;27097:853;;;;;;:::o;14:336:1:-;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:173::-;423:20;;-1:-1:-1;;;;;472:31:1;;462:42;;452:70;;518:1;515;508:12;452:70;355:173;;;:::o;533:679::-;587:5;640:3;633:4;625:6;621:17;617:27;607:55;;658:1;655;648:12;607:55;694:6;681:20;720:4;744:60;760:43;800:2;760:43;:::i;744:60::-;826:3;850:2;845:3;838:15;878:2;873:3;869:12;862:19;;913:2;905:6;901:15;965:3;960:2;954;951:1;947:10;939:6;935:23;931:32;928:41;925:61;;;982:1;979;972:12;925:61;1004:1;1014:169;1028:2;1025:1;1022:9;1014:169;;;1085:23;1104:3;1085:23;:::i;:::-;1073:36;;1129:12;;;;1161;;;;1046:1;1039:9;1014:169;;;-1:-1:-1;1201:5:1;;533:679;-1:-1:-1;;;;;;;533:679:1:o;1217:673::-;1271:5;1324:3;1317:4;1309:6;1305:17;1301:27;1291:55;;1342:1;1339;1332:12;1291:55;1378:6;1365:20;1404:4;1428:60;1444:43;1484:2;1444:43;:::i;1428:60::-;1510:3;1534:2;1529:3;1522:15;1562:2;1557:3;1553:12;1546:19;;1597:2;1589:6;1585:15;1649:3;1644:2;1638;1635:1;1631:10;1623:6;1619:23;1615:32;1612:41;1609:61;;;1666:1;1663;1656:12;1609:61;1688:1;1698:163;1712:2;1709:1;1706:9;1698:163;;;1769:17;;1757:30;;1807:12;;;;1839;;;;1730:1;1723:9;1698:163;;1895:160;1960:20;;2016:13;;2009:21;1999:32;;1989:60;;2045:1;2042;2035:12;2060:220;2102:5;2155:3;2148:4;2140:6;2136:17;2132:27;2122:55;;2173:1;2170;2163:12;2122:55;2195:79;2270:3;2261:6;2248:20;2241:4;2233:6;2229:17;2195:79;:::i;2285:186::-;2344:6;2397:2;2385:9;2376:7;2372:23;2368:32;2365:52;;;2413:1;2410;2403:12;2365:52;2436:29;2455:9;2436:29;:::i;2476:260::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;;2692:38;2726:2;2715:9;2711:18;2692:38;:::i;:::-;2682:48;;2476:260;;;;;:::o;2741:328::-;2818:6;2826;2834;2887:2;2875:9;2866:7;2862:23;2858:32;2855:52;;;2903:1;2900;2893:12;2855:52;2926:29;2945:9;2926:29;:::i;:::-;2916:39;;2974:38;3008:2;2997:9;2993:18;2974:38;:::i;:::-;2964:48;;3059:2;3048:9;3044:18;3031:32;3021:42;;2741:328;;;;;:::o;3074:537::-;3169:6;3177;3185;3193;3246:3;3234:9;3225:7;3221:23;3217:33;3214:53;;;3263:1;3260;3253:12;3214:53;3286:29;3305:9;3286:29;:::i;:::-;3276:39;;3334:38;3368:2;3357:9;3353:18;3334:38;:::i;:::-;3324:48;;3419:2;3408:9;3404:18;3391:32;3381:42;;3474:2;3463:9;3459:18;3446:32;-1:-1:-1;;;;;3493:6:1;3490:30;3487:50;;;3533:1;3530;3523:12;3487:50;3556:49;3597:7;3588:6;3577:9;3573:22;3556:49;:::i;:::-;3546:59;;;3074:537;;;;;;;:::o;3616:254::-;3681:6;3689;3742:2;3730:9;3721:7;3717:23;3713:32;3710:52;;;3758:1;3755;3748:12;3710:52;3781:29;3800:9;3781:29;:::i;:::-;3771:39;;3829:35;3860:2;3849:9;3845:18;3829:35;:::i;3875:254::-;3943:6;3951;4004:2;3992:9;3983:7;3979:23;3975:32;3972:52;;;4020:1;4017;4010:12;3972:52;4043:29;4062:9;4043:29;:::i;:::-;4033:39;4119:2;4104:18;;;;4091:32;;-1:-1:-1;;;3875:254:1:o;4134:663::-;4258:6;4266;4274;4327:2;4315:9;4306:7;4302:23;4298:32;4295:52;;;4343:1;4340;4333:12;4295:52;4383:9;4370:23;-1:-1:-1;;;;;4453:2:1;4445:6;4442:14;4439:34;;;4469:1;4466;4459:12;4439:34;4492:61;4545:7;4536:6;4525:9;4521:22;4492:61;:::i;:::-;4482:71;;4606:2;4595:9;4591:18;4578:32;4562:48;;4635:2;4625:8;4622:16;4619:36;;;4651:1;4648;4641:12;4619:36;;4674:63;4729:7;4718:8;4707:9;4703:24;4674:63;:::i;:::-;4664:73;;;4756:35;4787:2;4776:9;4772:18;4756:35;:::i;:::-;4746:45;;4134:663;;;;;:::o;4802:416::-;4892:6;4900;4953:2;4941:9;4932:7;4928:23;4924:32;4921:52;;;4969:1;4966;4959:12;4921:52;5009:9;4996:23;-1:-1:-1;;;;;5034:6:1;5031:30;5028:50;;;5074:1;5071;5064:12;5028:50;5097:61;5150:7;5141:6;5130:9;5126:22;5097:61;:::i;:::-;5087:71;;;5177:35;5208:2;5197:9;5193:18;5177:35;:::i;5223:1149::-;5341:6;5349;5402:2;5390:9;5381:7;5377:23;5373:32;5370:52;;;5418:1;5415;5408:12;5370:52;5458:9;5445:23;-1:-1:-1;;;;;5528:2:1;5520:6;5517:14;5514:34;;;5544:1;5541;5534:12;5514:34;5567:61;5620:7;5611:6;5600:9;5596:22;5567:61;:::i;:::-;5557:71;;5647:2;5637:12;;5702:2;5691:9;5687:18;5674:32;5731:2;5721:8;5718:16;5715:36;;;5747:1;5744;5737:12;5715:36;5770:24;;;-1:-1:-1;5825:4:1;5817:13;;5813:27;-1:-1:-1;5803:55:1;;5854:1;5851;5844:12;5803:55;5890:2;5877:16;5913:60;5929:43;5969:2;5929:43;:::i;5913:60::-;5995:3;6019:2;6014:3;6007:15;6047:2;6042:3;6038:12;6031:19;;6078:2;6074;6070:11;6126:7;6121:2;6115;6112:1;6108:10;6104:2;6100:19;6096:28;6093:41;6090:61;;;6147:1;6144;6137:12;6090:61;6169:1;6160:10;;6179:163;6193:2;6190:1;6187:9;6179:163;;;6250:17;;6238:30;;6211:1;6204:9;;;;;6288:12;;;;6320;;6179:163;;;6183:3;6361:5;6351:15;;;;;;;5223:1149;;;;;:::o;6377:821::-;6529:6;6537;6545;6598:2;6586:9;6577:7;6573:23;6569:32;6566:52;;;6614:1;6611;6604:12;6566:52;6654:9;6641:23;-1:-1:-1;;;;;6724:2:1;6716:6;6713:14;6710:34;;;6740:1;6737;6730:12;6710:34;6763:61;6816:7;6807:6;6796:9;6792:22;6763:61;:::i;:::-;6753:71;;6877:2;6866:9;6862:18;6849:32;6833:48;;6906:2;6896:8;6893:16;6890:36;;;6922:1;6919;6912:12;6890:36;6945:63;7000:7;6989:8;6978:9;6974:24;6945:63;:::i;:::-;6935:73;;7061:2;7050:9;7046:18;7033:32;7017:48;;7090:2;7080:8;7077:16;7074:36;;;7106:1;7103;7096:12;7074:36;;7129:63;7184:7;7173:8;7162:9;7158:24;7129:63;:::i;:::-;7119:73;;;6377:821;;;;;:::o;7203:180::-;7262:6;7315:2;7303:9;7294:7;7290:23;7286:32;7283:52;;;7331:1;7328;7321:12;7283:52;-1:-1:-1;7354:23:1;;7203:180;-1:-1:-1;7203:180:1:o;7388:245::-;7446:6;7499:2;7487:9;7478:7;7474:23;7470:32;7467:52;;;7515:1;7512;7505:12;7467:52;7554:9;7541:23;7573:30;7597:5;7573:30;:::i;7638:249::-;7707:6;7760:2;7748:9;7739:7;7735:23;7731:32;7728:52;;;7776:1;7773;7766:12;7728:52;7808:9;7802:16;7827:30;7851:5;7827:30;:::i;7892:320::-;7960:6;8013:2;8001:9;7992:7;7988:23;7984:32;7981:52;;;8029:1;8026;8019:12;7981:52;8069:9;8056:23;-1:-1:-1;;;;;8094:6:1;8091:30;8088:50;;;8134:1;8131;8124:12;8088:50;8157:49;8198:7;8189:6;8178:9;8174:22;8157:49;:::i;8217:634::-;8296:6;8349:2;8337:9;8328:7;8324:23;8320:32;8317:52;;;8365:1;8362;8355:12;8317:52;8398:9;8392:16;-1:-1:-1;;;;;8423:6:1;8420:30;8417:50;;;8463:1;8460;8453:12;8417:50;8486:22;;8539:4;8531:13;;8527:27;-1:-1:-1;8517:55:1;;8568:1;8565;8558:12;8517:55;8597:2;8591:9;8622:48;8638:31;8666:2;8638:31;:::i;8622:48::-;8693:2;8686:5;8679:17;8733:7;8728:2;8723;8719;8715:11;8711:20;8708:33;8705:53;;;8754:1;8751;8744:12;8705:53;8767:54;8818:2;8813;8806:5;8802:14;8797:2;8793;8789:11;8767:54;:::i;:::-;8840:5;8217:634;-1:-1:-1;;;;;8217:634:1:o;8856:388::-;8933:6;8941;8994:2;8982:9;8973:7;8969:23;8965:32;8962:52;;;9010:1;9007;9000:12;8962:52;9050:9;9037:23;-1:-1:-1;;;;;9075:6:1;9072:30;9069:50;;;9115:1;9112;9105:12;9069:50;9138:49;9179:7;9170:6;9159:9;9155:22;9138:49;:::i;:::-;9128:59;9234:2;9219:18;;;;9206:32;;-1:-1:-1;;;;8856:388:1:o;9434:248::-;9502:6;9510;9563:2;9551:9;9542:7;9538:23;9534:32;9531:52;;;9579:1;9576;9569:12;9531:52;-1:-1:-1;;9602:23:1;;;9672:2;9657:18;;;9644:32;;-1:-1:-1;9434:248:1:o;9687:675::-;9772:6;9780;9788;9841:2;9829:9;9820:7;9816:23;9812:32;9809:52;;;9857:1;9854;9847:12;9809:52;9896:9;9883:23;9946:4;9939:5;9935:16;9928:5;9925:27;9915:55;;9966:1;9963;9956:12;9915:55;9989:5;-1:-1:-1;10041:2:1;10026:18;;10013:32;;-1:-1:-1;10096:2:1;10081:18;;10068:32;-1:-1:-1;;;;;10112:30:1;;10109:50;;;10155:1;10152;10145:12;10109:50;10178:22;;10231:4;10223:13;;10219:27;-1:-1:-1;10209:55:1;;10260:1;10257;10250:12;10209:55;10283:73;10348:7;10343:2;10330:16;10325:2;10321;10317:11;10283:73;:::i;10367:257::-;10408:3;10446:5;10440:12;10473:6;10468:3;10461:19;10489:63;10545:6;10538:4;10533:3;10529:14;10522:4;10515:5;10511:16;10489:63;:::i;:::-;10606:2;10585:15;-1:-1:-1;;10581:29:1;10572:39;;;;10613:4;10568:50;;10367:257;-1:-1:-1;;10367:257:1:o;10629:294::-;10806:2;10802:15;;;;-1:-1:-1;;10798:53:1;10786:66;;10877:2;10868:12;;10861:28;10914:2;10905:12;;10629:294::o;10928:544::-;11192:3;11187;11183:13;11175:6;11171:26;11166:3;11159:39;11252:26;11248:31;11239:6;11235:2;11231:15;11227:53;11223:1;11218:3;11214:11;11207:74;11311:6;11306:2;11301:3;11297:12;11290:28;11141:3;11347:6;11341:13;11363:62;11418:6;11413:2;11408:3;11404:12;11397:4;11389:6;11385:17;11363:62;:::i;:::-;11445:16;;;;11463:2;11441:25;;10928:544;-1:-1:-1;;;;;10928:544:1:o;11916:664::-;12143:3;12181:6;12175:13;12197:53;12243:6;12238:3;12231:4;12223:6;12219:17;12197:53;:::i;:::-;12313:13;;12272:16;;;;12335:57;12313:13;12272:16;12369:4;12357:17;;12335:57;:::i;:::-;12459:13;;12414:20;;;12481:57;12459:13;12414:20;12515:4;12503:17;;12481:57;:::i;:::-;12554:20;;11916:664;-1:-1:-1;;;;;11916:664:1:o;12585:1614::-;13211:3;13249:6;13243:13;13265:53;13311:6;13306:3;13299:4;13291:6;13287:17;13265:53;:::i;:::-;-1:-1:-1;;;13340:16:1;;;13365:45;;;13435:13;;13457:65;13435:13;13509:1;13498:13;;13491:4;13479:17;;13457:65;:::i;:::-;-1:-1:-1;;;13585:1:1;13541:20;;;;13577:10;;;13570:62;13657:13;;13679:63;13657:13;13728:2;13720:11;;13713:4;13701:17;;13679:63;:::i;:::-;13803:13;;13761:17;;;13825:63;13803:13;13874:2;13866:11;;13859:4;13847:17;;13825:63;:::i;:::-;13949:13;;13907:17;;;13971:63;13949:13;14020:2;14012:11;;14005:4;13993:17;;13971:63;:::i;:::-;14099:66;14094:2;14053:17;;;;14086:11;;;14079:87;14190:2;14182:11;;12585:1614;-1:-1:-1;;;;;;;12585:1614:1:o;14204:439::-;14436:3;14474:6;14468:13;14490:53;14536:6;14531:3;14524:4;14516:6;14512:17;14490:53;:::i;:::-;-1:-1:-1;;;14565:16:1;;14590:18;;;-1:-1:-1;14635:1:1;14624:13;;14204:439;-1:-1:-1;14204:439:1:o;14648:897::-;15029:3;15067:6;15061:13;15083:53;15129:6;15124:3;15117:4;15109:6;15105:17;15083:53;:::i;:::-;15167:6;15162:3;15158:16;15145:29;;15197:66;15190:5;15183:81;15307:7;15302:3;15298:17;15291:4;15284:5;15280:16;15273:43;15347:6;15341:13;15363:66;15420:8;15415:2;15408:5;15404:14;15397:4;15389:6;15385:17;15363:66;:::i;:::-;-1:-1:-1;;;15492:2:1;15448:20;;;;15484:11;;;15477:35;15536:2;15528:11;;14648:897;-1:-1:-1;;;;14648:897:1:o;15550:584::-;15782:3;15820:6;15814:13;15836:53;15882:6;15877:3;15870:4;15862:6;15858:17;15836:53;:::i;:::-;15950:66;15911:16;;15936:81;;;-1:-1:-1;;;;16044:4:1;16033:16;;16026:72;16125:2;16114:14;;15550:584;-1:-1:-1;15550:584:1:o;16139:1503::-;16598:66;16593:3;16586:79;16695:66;16690:2;16685:3;16681:12;16674:88;16792:66;16787:2;16782:3;16778:12;16771:88;16889:66;16884:2;16879:3;16875:12;16868:88;16987:66;16981:3;16976;16972:13;16965:89;17094:30;17089:3;17085:40;17079:3;17074;17070:13;17063:63;16568:3;17155:6;17149:13;17171:61;17225:6;17219:3;17214;17210:13;17205:2;17197:6;17193:15;17171:61;:::i;:::-;17292:13;;17251:16;;;;17314:62;17292:13;17361:3;17353:12;;17348:2;17336:15;;17314:62;:::i;:::-;17437:13;;17395:17;;;17459:62;17437:13;17506:3;17498:12;;17493:2;17481:15;;17459:62;:::i;:::-;-1:-1:-1;;;17581:3:1;17540:17;;;;17573:12;;;17566:42;17632:3;17624:12;;16139:1503;-1:-1:-1;;;;;16139:1503:1:o;17647:417::-;-1:-1:-1;;;17902:3:1;17895:17;17877:3;17941:6;17935:13;17957:61;18011:6;18007:1;18002:3;17998:11;17991:4;17983:6;17979:17;17957:61;:::i;:::-;18038:16;;;;18056:1;18034:24;;17647:417;-1:-1:-1;;17647:417:1:o;18069:744::-;18432:66;18427:3;18420:79;18529:66;18524:2;18519:3;18515:12;18508:88;18402:3;18625:6;18619:13;18641:60;18694:6;18689:2;18684:3;18680:12;18675:2;18667:6;18663:15;18641:60;:::i;:::-;-1:-1:-1;;;18760:2:1;18720:16;;;;18752:11;;;18745:35;-1:-1:-1;18804:2:1;18796:11;;18069:744;-1:-1:-1;18069:744:1:o;18818:448::-;19080:31;19075:3;19068:44;19050:3;19141:6;19135:13;19157:62;19212:6;19207:2;19202:3;19198:12;19191:4;19183:6;19179:17;19157:62;:::i;:::-;19239:16;;;;19257:2;19235:25;;18818:448;-1:-1:-1;;18818:448:1:o;19271:1687::-;-1:-1:-1;;;19920:66:1;;20009:13;;19902:3;;20031:62;20009:13;20081:2;20072:12;;20065:4;20053:17;;20031:62;:::i;:::-;20157:66;20152:2;20112:16;;;20144:11;;;20137:87;20253:34;20248:2;20240:11;;20233:55;20317:34;20312:2;20304:11;;20297:55;20382:66;20376:3;20368:12;;20361:88;20474:13;;20496:64;20474:13;20545:3;20537:12;;20530:4;20518:17;;20496:64;:::i;:::-;20626:66;20620:3;20579:17;;;;20612:12;;;20605:88;-1:-1:-1;;;20717:3:1;20709:12;;20702:30;20757:13;;20779:64;20757:13;20828:3;20820:12;;20813:4;20801:17;;20779:64;:::i;:::-;-1:-1:-1;;;20903:3:1;20862:17;;;;20895:12;;;20888:36;20948:3;20940:12;;19271:1687;-1:-1:-1;;;;;19271:1687:1:o;21171:488::-;-1:-1:-1;;;;;21440:15:1;;;21422:34;;21492:15;;21487:2;21472:18;;21465:43;21539:2;21524:18;;21517:34;;;21587:3;21582:2;21567:18;;21560:31;;;21365:4;;21608:45;;21633:19;;21625:6;21608:45;:::i;:::-;21600:53;21171:488;-1:-1:-1;;;;;;21171:488:1:o;21664:1178::-;21932:2;21944:21;;;22014:13;;21917:18;;;22036:22;;;21884:4;;22111;;22089:2;22074:18;;;22138:15;;;21884:4;22181:195;22195:6;22192:1;22189:13;22181:195;;;22260:13;;-1:-1:-1;;;;;22256:39:1;22244:52;;22316:12;;;;22351:15;;;;22292:1;22210:9;22181:195;;;-1:-1:-1;;;22412:19:1;;;22392:18;;;22385:47;22482:13;;22504:21;;;22580:15;;;;22543:12;;;22615:1;22625:189;22641:8;22636:3;22633:17;22625:189;;;22710:15;;22696:30;;22787:17;;;;22748:14;;;;22669:1;22660:11;22625:189;;22847:632;23018:2;23070:21;;;23140:13;;23043:18;;;23162:22;;;22989:4;;23018:2;23241:15;;;;23215:2;23200:18;;;22989:4;23284:169;23298:6;23295:1;23292:13;23284:169;;;23359:13;;23347:26;;23428:15;;;;23393:12;;;;23320:1;23313:9;23284:169;;;-1:-1:-1;23470:3:1;;22847:632;-1:-1:-1;;;;;;22847:632:1:o;24515:219::-;24664:2;24653:9;24646:21;24627:4;24684:44;24724:2;24713:9;24709:18;24701:6;24684:44;:::i;24739:409::-;24941:2;24923:21;;;24980:2;24960:18;;;24953:30;25019:34;25014:2;24999:18;;24992:62;-1:-1:-1;;;25085:2:1;25070:18;;25063:43;25138:3;25123:19;;24739:409::o;25503:414::-;25705:2;25687:21;;;25744:2;25724:18;;;25717:30;25783:34;25778:2;25763:18;;25756:62;-1:-1:-1;;;25849:2:1;25834:18;;25827:48;25907:3;25892:19;;25503:414::o;25922:401::-;26124:2;26106:21;;;26163:2;26143:18;;;26136:30;26202:34;26197:2;26182:18;;26175:62;-1:-1:-1;;;26268:2:1;26253:18;;26246:35;26313:3;26298:19;;25922:401::o;35235:275::-;35306:2;35300:9;35371:2;35352:13;;-1:-1:-1;;35348:27:1;35336:40;;-1:-1:-1;;;;;35391:34:1;;35427:22;;;35388:62;35385:88;;;35453:18;;:::i;:::-;35489:2;35482:22;35235:275;;-1:-1:-1;35235:275:1:o;35515:183::-;35575:4;-1:-1:-1;;;;;35600:6:1;35597:30;35594:56;;;35630:18;;:::i;:::-;-1:-1:-1;35675:1:1;35671:14;35687:4;35667:25;;35515:183::o;35703:186::-;35751:4;-1:-1:-1;;;;;35776:6:1;35773:30;35770:56;;;35806:18;;:::i;:::-;-1:-1:-1;35872:2:1;35851:15;-1:-1:-1;;35847:29:1;35878:4;35843:40;;35703:186::o;35894:128::-;35934:3;35965:1;35961:6;35958:1;35955:13;35952:39;;;35971:18;;:::i;:::-;-1:-1:-1;36007:9:1;;35894:128::o;36027:120::-;36067:1;36093;36083:35;;36098:18;;:::i;:::-;-1:-1:-1;36132:9:1;;36027:120::o;36152:168::-;36192:7;36258:1;36254;36250:6;36246:14;36243:1;36240:21;36235:1;36228:9;36221:17;36217:45;36214:71;;;36265:18;;:::i;:::-;-1:-1:-1;36305:9:1;;36152:168::o;36325:125::-;36365:4;36393:1;36390;36387:8;36384:34;;;36398:18;;:::i;:::-;-1:-1:-1;36435:9:1;;36325:125::o;36455:258::-;36527:1;36537:113;36551:6;36548:1;36545:13;36537:113;;;36627:11;;;36621:18;36608:11;;;36601:39;36573:2;36566:10;36537:113;;;36668:6;36665:1;36662:13;36659:48;;;-1:-1:-1;;36703:1:1;36685:16;;36678:27;36455:258::o;36718:380::-;36797:1;36793:12;;;;36840;;;36861:61;;36915:4;36907:6;36903:17;36893:27;;36861:61;36968:2;36960:6;36957:14;36937:18;36934:38;36931:161;;;37014:10;37009:3;37005:20;37002:1;36995:31;37049:4;37046:1;37039:15;37077:4;37074:1;37067:15;36931:161;;36718:380;;;:::o;37103:135::-;37142:3;-1:-1:-1;;37163:17:1;;37160:43;;;37183:18;;:::i;:::-;-1:-1:-1;37230:1:1;37219:13;;37103:135::o;37243:112::-;37275:1;37301;37291:35;;37306:18;;:::i;:::-;-1:-1:-1;37340:9:1;;37243:112::o;37360:127::-;37421:10;37416:3;37412:20;37409:1;37402:31;37452:4;37449:1;37442:15;37476:4;37473:1;37466:15;37492:127;37553:10;37548:3;37544:20;37541:1;37534:31;37584:4;37581:1;37574:15;37608:4;37605:1;37598:15;37624:127;37685:10;37680:3;37676:20;37673:1;37666:31;37716:4;37713:1;37706:15;37740:4;37737:1;37730:15;37756:127;37817:10;37812:3;37808:20;37805:1;37798:31;37848:4;37845:1;37838:15;37872:4;37869:1;37862:15;37888:131;-1:-1:-1;;;;;;37962:32:1;;37952:43;;37942:71;;38009:1;38006;37999:12
Swarm Source
ipfs://98574c711238e555fa5bfa7584f0fb09110aad33941bae2bd814d44041c3ac36
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.